{"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":"dbc127af-38e9-4ca0-a251-1247235dbde4","kind":"skill:build-website","nodes":[{"acceptedSubmissionHash":"d179ef9d7c0ea07bff5592774b6af49f2ef69cec1a020c4002e76275485565be","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":"f0254ed50d8f879008b55719f40b140628affd34b00888e027676469a1d3eee1","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":"Build and publish a complete English React/TypeScript website for EXISTING UNLOCK (UNLK), Sepolia launch 1560, parent job 407c3cbb-d967-4666-99e6-0ab7139c141f. Use the project's latest accepted source and verified ABIs. Scope: frontend, live data, tests, GitHub and IPFS hosting. Preserve deployed contracts; no new token/pool/deployment or mainnet transactions. This site does not modify IMD Explorer.\n\nCONFIG: chainId 11155111; repo https://github.com/identity-md-launches/launch-1560-unlock, inspected commit ea89426f3fe9df79096a5e02345fc8821bd1c783; reconcile newer work. Token 0x20978223b637fec0c6276ab0184cf7011dd1d483; hook 0xbbb78a4898e903b082ccd09efc7823ca7339bfc0; router 0x28f04118fe5d940fe9a81740e74d611313b3004b; distributor 0xf55d5bacbf3ce5464921a94708c08a99bea99cdd. Discover and verify hook.rewards(), oracle(), poolKey() and reciprocal bindings from actual deployed code. Pool: native ETH currency0, UNLK currency1, fee 12500, tickSpacing 60, this hook. Existing public buy proof: https://sepolia.etherscan.io/tx/0x595a858a472215ec90b12ef0f30fa193daae4f17fa9ddb83269b6a1214e101ab . Sell/claim tests remain pending.\n\nDESIGN: Distinctive, carefully composed, premium financial experiment. Deep ink, warm white, restrained cyan/champagne gold, precise tabular numbers, expressive typography, generous spacing and a custom geometric unlock/diamond emblem. Subtle brand line: \"Diamond hands. Transparent rules.\" Never imply guaranteed returns or pressure users to hold. Avoid generic AI copy, template card walls, cartoon coins and excessive glow. Editorial homepage plus polished trading workspace. Responsive mobile-first, accessible contrast/keyboard/focus/touch targets and reduced motion. Natural concise English, explain terms beside numbers. Always visibly label \"Sepolia testnet - test assets, no real monetary value\".\n\nSECTIONS: Home/experiment and verified progress; Trade; My Unlock; Milestones/scenarios; Holders/activity; How It Works/FAQ; Contracts/Transparency. Public pages work without a wallet. Mainnet plans may include more tiers/higher targets, but values/date are undecided and not current rules.\n\nMY UNLOCK: Read W=balance, E=eligible(wallet), S=sold(wallet), p, tier and fullyUnlocked. Before full unlock Q=max(0,floor(E*p/10000)-S), C=min(W,Q). Show C as \"Within your current sell allowance\", W-C as \"Outside your current allowance\", never escrowed/locked. Full unlock C=W for everyone; do not display max-uint remainingQuota. Execution also depends on liquidity, fees, approvals and pending trades. E credits authenticated official buys, proven payer allocation and synchronized proven native claims. Ordinary transfers/donations/liquidity never move/create/reset E or S. Transfer-only E=0 holders cannot sell here before full unlock. Use BigInt and exact units.\n\nMILESTONES: Initially 25%; verified USD FDV $100K:35%, $250K:45%, $500K:55%, $1M:70%, $2.5M:85%; $5M permanently removes quotas, including transfer-only holders. Falling prices never revoke rights. Separate achieved tier, current FDV and pending confirmation. Interactive future scenarios hold W,E,S fixed: C_r=min(W,max(0,floor(E*r/10000)-S)), increase over current C; final scenario uses W. Clearly label hypothetical results; avoid negative comparisons for achieved tiers. Include a worked numerical explanation of cumulative acquisitions and used quota.\n\nORACLE: Use deployed constants/state, fdvUsd(), observations, qualifyingSince and lastConfirmation. Distinguish indicative spot price from verified milestone FDV; invalid data is unavailable, never zero. Current rules: 2h TWAP/warm-up, 5m checkpoint freshness, 90m ETH/USD freshness, sequential 6h confirmations, 24h final confirmation, 4m minimum interval, 10m maximum valid-confirmation gap. Show real progress/reset/gap states, not promised dates or automatic unlock at timer expiry. Explain actual liquidity validation; seed quote capacity is not ETH reserves. Expose permissionless checkpoint/update actions with gas costs and explicit signing. A static site does not maintain observations when nobody calls. Invalid data blocks new tiers, not earned rights or otherwise valid trades. Targets may never occur.\n\nSWAP: Use ONLY the bound UnlkSwapRouter, not IMD's generic quoter/Universal Router with empty hookData. Simulate the actual swap from the connected trader; support Buy/Sell, correct currency order/price bounds, exact fees/deltas, partial fills, selected slippage, minOutput/maxInput and deadline. Re-simulate/estimate gas before signing and invalidate stale quotes. Buy spends test ETH; sell approval is directly to this router for the needed amount. Handle missing allowance quote prerequisites honestly. Show spender/approval amount, expected/minimum receipt, trading fee and gas. Track rejection/revert/pending/confirmed receipts; never automatically resend. router.nativeCredit(wallet) contains sale proceeds/unused buy prefunding: show ETH available to withdraw and provide withdrawNative(), not a false claim of immediate wallet ETH delivery. Connection triggers no signatures/approvals/trades. Support MetaMask/Rabby discovery, correct network/account changes and actual direct-route smart-wallet compatibility.\n\nREWARDS: Verify IMD proofs against native distributor roots, amounts, claimed/swept flags and release times. Separate unclaimed entitlement, native claims, evidence attestation and pending quota credit. Native claim is independent of credit synchronization. Implement verified claim -> evidence.attest -> hook.syncRewards as separate recoverable steps, with deduplication; show syncPayer if applicable. Uncertified rounds need the actual certification process, not invented claims or bypasses.\n\nDATA: Real 1B supply/18 decimals, 10/87/3 allocation, price/FDV, pool-specific liquidity and principal-protection evidence, 1.25% pool fee (1% payer/0.25% IMD), zero extra hook fee, oracle health, rewards, holders and activity. PoolManager's total token balance is not this pool's reserves. Implement verified event indexing, current balances and pagination: holder count means nonzero-balance addresses excluding zero address; label infrastructure and distinguish wallets from people. Holder rows show address, balance, supply share and verified allowance status when available. Chart prices/volume/history only from real covered events. Provide block/time, freshness, partial-history and unavailable states; refresh on blocks/receipts/account/network changes, cache and use read-only RPC fallback. Any necessary data service must be public and working, not a placeholder.\n\nEXPLAIN: Quotas, transfers, fees, rewards, ETH withdrawal, immutable setup and permanent unlock in clear FAQs. Disclose official-pool scope/other-pool bypass, sustained-price manipulation, protocol-fee-triggered halt and treasury reward-round powers. No safety/return guarantees. Link actual contracts, source/ABIs, PoolKey/PoolId and review findings; substantiate audit claims.\n\nTEST/DELIVER: Test wallet arithmetic against contract","parentJobId":"407c3cbb-d967-4666-99e6-0ab7139c141f","planHash":"b896cb973640cf6f341bd8795f5f20e088edba6f187dde6c3bf10de89296fa66","previousHash":"903792be8195cf27660dbc8d29420d1a53c68b9594380a615c4b3f9e6ea16de4","projectId":"407c3cbb-d967-4666-99e6-0ab7139c141f","publication":{"commit":"b01b41bfdf20a20519c5902eda3d0677b7f2b6df","deliveredAt":"2026-10-14T09:47:36.001Z","repoUrl":"https://github.com/identity-md-launches/launch-1560-unlock"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[],"site":{"cid":"bafybeiaukcyc4kfjvxeprtknwkmnhtzjsusnimqjdrqlq2j2brctljbf3y","ensName":"unlk.site.identitymd.eth","namingTransaction":"0x2788f7ca4ed8468cd7cf930c0eb06decd3d391451ba14131aa2d9f4c7183f316"},"snapshotHash":"3b90a4007d36bef78ebab8fab50d78682ee11e65a9ae4d7373c5f0acf31dbffc","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"588eb17ec7961b0e14b856fbaaa33aa1ed6d5efe9bb3d2bfdf75a77ca0566d5f","device":"2fe9efd0790ef9c3","findings":[],"hash":"d179ef9d7c0ea07bff5592774b6af49f2ef69cec1a020c4002e76275485565be","nodeId":"27c008fe-2dec-4864-bcf1-e25fd1b6bd20","outcome":"completed","summary":"Implemented the site with complete [static export](dist/index.html), source, lockfile, [README](README.md), and [design documentation](DESIGN.md).\n\nBuild/typecheck, 8 frontend tests, 66 Solidity tests, wallet/recovery checks, and 16/16 design checks passed. Submission files total 7.08 MiB, below 8 MiB.\n\nThe export is ready for contributor GitHub/IPFS publication. No transactions were broadcast. Public sell/full reward-flow execution remains unverified; WebKit testing failed to initialize its EGL display.\n\nNot delivered: artifacts/allowance-vectors.json, artifacts/browser-validation.json, artifacts/chain-verification.json, artifacts/live-interactions.json, artifacts/recovery-validation.json, artifacts/rpc-check.json, artifacts/submission-check.json, artifacts/swap-math-vectors.json and 3 more. Under artifacts/, only this step's named outputs leave the machine.","treeHash":"0072c1a074c4035053118c90949c4ce451d54c5a","usage":{"cachedInputTokens":15059072,"inputTokens":401787,"model":"gpt-6-astra","outputTokens":131208,"runtime":"codex","turns":15,"wallClockMs":5113852}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"563355f47e653bac","findings":[{"citation":"resolved","description":"Now: The home readout calls p an \"acquisition allowance\"; My Unlock repeats \"25% acquisition rate\" and \"p · Achieved acquisition rate\". p limits cumulative sales from eligible acquisitions; it does not limit acquisitions or describe an acquisition rate.\nChange to: Use \"Sell allowance rate\" above the home percentage, \"25% of eligible acquisitions\" for the connected-wallet badge (derive the percentage from p), and \"p · Achieved sell allowance rate\" in the ledger. Keep the existing explanation that prior sales consume the allowance.\nWhy: The brief requires concise English and terms explained beside numbers, and defines p as the percentage used in Q=max(0,floor(E*p/10000)-S). The prominent current labels name the wrong side of the trade.","line":72,"path":"web/src/pages.tsx","reproduction":"At 390×844 or 1440×1000, open /#/ and wait for the live readout. It displays \"Current acquisition allowance\" immediately above \"25%\" (verified p=2500, tier=0 at block 11912385). Open /#/unlock with read-only EIP-6963 account 0x48E4E74fE1d0c14404cEB57B9fec5b21329C6ec9: the badge says \"25% acquisition rate\" and the ledger says \"p · Achieved acquisition rate\", while the same page computes the sell allowance as 122,823.7479 UNLK from E=491,294.9918… UNLK and S=0. Expected labels describe the sell allowance, not an acquisition restriction. No signature or transaction is needed.","severity":"medium","snippet":"            <span>Current acquisition allowance</span>","title":"fidelity: the sell-percentage is labelled as an acquisition allowance"},{"citation":"resolved","description":"Now: If all RPCs fail before the first snapshot, history indexing never starts, so historyError remains empty. The trade chart says \"No valid swap prices in the covered history\"; Holders & activity simultaneously shows \"Reading…\", \"Loading…\", \"No records available in the covered interval\" and \"0 matching addresses\". The global error notice is correct, but these local states imply an empty dataset or continued initial loading although no interval was read.\nChange to: When no index/snapshot exists and d.error is set, display \"Price history unavailable\" and \"Holder and activity data unavailable\"; use \"Unavailable\" for the coverage/count summaries and withhold the zero-results pager until a dataset exists. Reserve the current empty-history messages for a successfully read interval with zero records. Reuse the existing retry control.\nWhy: The brief explicitly requires freshness, partial-history and unavailable states; a first visitor must be able to distinguish a failed read from a verified absence of trading activity.","line":48,"path":"web/src/charts.tsx","reproduction":"At 390×844 (also applicable at 1440px), start a fresh browser context and abort requests to all three configured RPC hosts: ethereum-sepolia-rpc.publicnode.com, rpc.sepolia.ethpandaops.io and sepolia.rpc.sentio.xyz. In Playwright use context.route(/publicnode|ethpandaops|sentio/, route => route.abort(\"failed\")), then load /#/activity. Wait for \"Live reads interrupted.\" and another 3 seconds. Measured DOM: the coverage value remains \"Loading…\", the table says \"No records available in the covered interval.\", and the pager says \"0 matching addresses · page 1 of 1\" while the data stamp says \"Chain data unavailable\". Navigate to /#/trade: its chart says \"No valid swap prices in the covered history\" instead of unavailable. No wallet is needed. Restore RPC access and retry: real data contains 3 holders and 1 swap, proving the failed-read state was not a verified empty result.","severity":"medium","snippet":"              : d.historyError\n                ? \"Price history unavailable\"\n                : \"No valid swap prices in the covered history\"}","title":"bug: failed initial RPC reads are presented as empty history"}],"hash":"f0254ed50d8f879008b55719f40b140628affd34b00888e027676469a1d3eee1","nodeId":"1890a1f5-3e6b-4609-94f4-90a49ec23314","outcome":"completed","summary":"| Area | Result |\n|---|---|\n| Requirements | 85 grouped checks: **81 met, 2 missing, 0 faked, 2 after review, 0 needing requester input** |\n| Broken features | **1** error-state defect |\n| First screen | **Pass**: product and main action visible at 390×844 |\n| taste@1 | **16/16 passed** |\n| Copy | **1** finding |\n| Share card | **Present**: 1200×630 image and required metadata |\n\nSaved **two medium findings**, with exact source snippets and concrete reproductions, to [.imd-findings.json](/home/imd-worker/.identitymd/work/dbc127af-38e9-4ca0-a251-1247235dbde4/1890a1f5-3e6b-4609-94f4-90a49ec23314/.imd-findings.json). No high or critical defects found. Website files remain unchanged.\n\n- **Fidelity: the sell percentage is labelled as an acquisition allowance.** The live 25% readout and wallet ledger use acquisition terminology. Rename these labels to describe the sell allowance rate.\n- **Bug: failed initial RPC reads appear as empty history.** Blocking all three RPCs produces “Loading,” “No records” and zero matching addresses despite unavailable data. Show unavailable states until an interval has actually been read. Restoring access and retrying recovered three holders and one swap.\n\nEight arithmetic/proof tests passed. Independent live checks matched three holder quotas, three buy simulations and all 459 reward proofs. All seven routes passed automated accessibility checks at 390px; 56 browser/width combinations had no horizontal overflow. WebKit rendered and supported the tested controls, but its live reads were limited by missing TLS support in this machine’s browser runtime. No public transaction was signed.\n\nUNLOCK is a Sepolia sell-allowance experiment carried visually by a precise geometric diamond and restrained editorial typography.\n\nThe requirement coverage below uses filenames relative to `web/src/` unless stated otherwise. “Met” denotes inspected implementation and supporting evidence; it does not claim public execution of unsigned transactions.\n\n| # | Requirement | Status | Evidence |\n|---|---|---|---|\n| 1 | “complete English React/TypeScript website” | Met | `main.tsx`, `App.tsx` |\n| 2 | Existing UNLOCK, launch 1560 and specified parent job | Met | `config.ts`; Contracts page |\n| 3 | Latest accepted source, verified ABIs, reconcile newer work | Met | Remote HEAD matches `ea89426…`; token/hook ABI hashes independently match |\n| 4 | Frontend, live data and tests | Met | `web/src/`, `web/tests/`, `web/scripts/` |\n| 5 | GitHub hosting | After review | Publishing handoff in `README.md`; `dist/` |\n| 6 | IPFS hosting | After review | Relative assets and hash routes in `dist/` |\n| 7 | Preserve contracts; no new token/pool/deployment or mainnet transactions | Met | Solidity/configuration unchanged; read-only review |\n| 8 | Do not modify IMD Explorer | Met | Separate website implementation |\n| 9 | Specified chain, repository, commit and four addresses | Met | `config.ts`; live binding verification |\n| 10 | Discover rewards, oracle, PoolKey and reciprocal bindings | Met | `live.ts`, `verified.json` |\n| 11 | Native ETH/UNLK, fee 12500, spacing 60, specified hook | Met | Exact PoolKey validation in `live.ts` |\n| 12 | Existing buy proof; pending sell/complete claim-flow evidence | Met | Home progress list; discovered native claim distinguished from complete flow |\n| 13 | Distinctive, composed premium financial experiment | Met | Inspected Home and Trade composition |\n| 14 | Ink, warm white, cyan/gold, tabular numbers, typography, spacing, emblem | Met | `styles.css`; `components.tsx` |\n| 15 | “Diamond hands. Transparent rules.” | Met | Home and footer |\n| 16 | No guaranteed returns or holding pressure | Met | Home, FAQs and footer |\n| 17 | Avoid generic copy, card walls, cartoon coins and excessive glow | Met | Inspected composition, copy and assets |\n| 18 | Editorial homepage and polished trading workspace | Met | Home; `Trade.tsx` |\n| 19 | Responsive mobile-first layout | Met | 320/390/768/1440px browser checks |\n| 20 | Accessib","treeHash":null,"usage":{"cachedInputTokens":5606912,"inputTokens":175809,"model":"gpt-6-astra","outputTokens":31593,"runtime":"codex","turns":9,"wallClockMs":1024346}}],"verification":[{"checks":[],"detail":"paths and tree verified; no suite was run for this kind of work","evaluation":"structural","profile":"none","status":"accepted","submissionHash":"d179ef9d7c0ea07bff5592774b6af49f2ef69cec1a020c4002e76275485565be","verifiedTreeHash":"0072c1a074c4035053118c90949c4ce451d54c5a","verifierVersion":"0.1.0+67c588fa"}]}