{"workflow":{"id":"dc212460-0a28-4e3f-9485-2340b7051f1e","objective":"Swarm Harvester (HARVEST), second launch attempt. START FROM EXISTING CODE: reuse https://github.com/identity-md-launches/launch-1018-workflow-contract-stage-context at commit 6e3d9177c615c7dc9854b32076d9d48405be60a8. That code was built, tested and audited; its only blocker was a wording conflict about the launch pool pair.\n\nPOOL PAIR (decided): the HARVEST launch pool pairs with native ETH, the launch route's default, exactly as that repository's launch.json already says. Any earlier wording that the HARVEST pool pairs with IMD is withdrawn. Update README.md and docs so they say the HARVEST pool pairs with native ETH. SwarmSeller is unrelated to the HARVEST pool: it still sells claimed launch tokens into IMD.\n\nDO NOT CHANGE the logic of src/SwarmHarvester.sol or src/SwarmSeller.sol, their constructor arguments (Uniswap v4 PoolManager 0x000000000004444c5dc75cB358380D2e3dE08A90, IMD 0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7), or their tests. Token: name \"Swarm Harvester\", symbol \"HARVEST\", the launch's standard token.\n\nWHAT IT DOES. SwarmHarvester.claimMany submits many identity.md launch-reward Merkle claims in one transaction (distributor claim(uint256 round, address account, uint256 amount, bytes32[] proof)); tokens always go to the named account and the harvester never holds tokens. SwarmSeller.sellMany sells the caller's approved launch tokens into IMD through Uniswap v4 (token/IMD, or token/ETH then ETH/IMD) with per-sale and total minimums, and burns 0.5% of the IMD output to 0x000000000000000000000000000000000000dEaD. No owner, not upgradeable, not pausable.\n\nWEBSITE (site name swarm-harvester): one page. Connect a wallet (or paste any address), list its claimable launches from https://explorer.imd.fun/api/earned?wallet=ADDR, fetch each proof from https://explorer.imd.fun/api/claim?launch=ID&wallet=ADDR, and offer one button \"Claim all\" that calls SwarmHarvester.claimMany. Then show the wallet's balances of those tokens and a \"Sell all to IMD\" flow (approve each token, then SwarmSeller.sellMany with a quoted minimum). Read every contract address from the deployment.\n\nDECISIONS: Ethereum mainnet. HARVEST pool paired with native ETH. GitHub and IPFS approved.","status":"completed","brief":"# Approved workflow\n\nSwarm Harvester (HARVEST), second launch attempt. START FROM EXISTING CODE: reuse https://github.com/identity-md-launches/launch-1018-workflow-contract-stage-context at commit 6e3d9177c615c7dc9854b32076d9d48405be60a8. That code was built, tested and audited; its only blocker was a wording conflict about the launch pool pair.\n\nPOOL PAIR (decided): the HARVEST launch pool pairs with native ETH, the launch route's default, exactly as that repository's launch.json already says. Any earlier wording that the HARVEST pool pairs with IMD is withdrawn. Update README.md and docs so they say the HARVEST pool pairs with native ETH. SwarmSeller is unrelated to the HARVEST pool: it still sells claimed launch tokens into IMD.\n\nDO NOT CHANGE the logic of src/SwarmHarvester.sol or src/SwarmSeller.sol, their constructor arguments (Uniswap v4 PoolManager 0x000000000004444c5dc75cB358380D2e3dE08A90, IMD 0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7), or their tests. Token: name \"Swarm Harvester\", symbol \"HARVEST\", the launch's standard token.\n\nWHAT IT DOES. SwarmHarvester.claimMany submits many identity.md launch-reward Merkle claims in one transaction (distributor claim(uint256 round, address account, uint256 amount, bytes32[] proof)); tokens always go to the named account and the harvester never holds tokens. SwarmSeller.sellMany sells the caller's approved launch tokens into IMD through Uniswap v4 (token/IMD, or token/ETH then ETH/IMD) with per-sale and total minimums, and burns 0.5% of the IMD output to 0x000000000000000000000000000000000000dEaD. No owner, not upgradeable, not pausable.\n\nWEBSITE (site name swarm-harvester): one page. Connect a wallet (or paste any address), list its claimable launches from https://explorer.imd.fun/api/earned?wallet=ADDR, fetch each proof from https://explorer.imd.fun/api/claim?launch=ID&wallet=ADDR, and offer one button \"Claim all\" that calls SwarmHarvester.claimMany. Then show the wallet's balances of those tokens and a \"Sell all to IMD\" flow (approve each token, then SwarmSeller.sellMany with a quoted minimum). Read every contract address from the deployment.\n\nDECISIONS: Ethereum mainnet. HARVEST pool paired with native ETH. GitHub and IPFS approved.\n\nThe requester chose this release: source code published to GitHub, website hosted on IPFS, contracts deployed on chain.\n\nSwarm Harvester (HARVEST), second launch attempt. START FROM EXISTING CODE: reuse https://github.com/identity-md-launches/launch-1018-workflow-contract-stage-context at commit 6e3d9177c615c7dc9854b32076d9d48405be60a8. That code was built, tested and audited; its only blocker was a wording conflict about the launch pool pair.\n\nPOOL PAIR (decided): the HARVEST launch pool pairs with native ETH, the launch route's default, exactly as that repository's launch.json already says. Any earlier wording that the HARVEST pool pairs with IMD is withdrawn. Update README.md and docs so they say the HARVEST pool pairs with native ETH. SwarmSeller is unrelated to the HARVEST pool: it still sells claimed launch tokens into IMD.\n\nDO NOT CHANGE the logic of src/SwarmHarvester.sol or src/SwarmSeller.sol, their constructor arguments (Uniswap v4 PoolManager 0x000000000004444c5dc75cB358380D2e3dE08A90, IMD 0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7), or their tests. Token: name \"Swarm Harvester\", symbol \"HARVEST\", the launch's standard token.\n\nWHAT IT DOES. SwarmHarvester.claimMany submits many identity.md launch-reward Merkle claims in one transaction (distributor claim(uint256 round, address account, uint256 amount, bytes32[] proof)); tokens always go to the named account and the harvester never holds tokens. SwarmSeller.sellMany sells the caller's approved launch tokens into IMD through Uniswap v4 (token/IMD, or token/ETH then ETH/IMD) with per-sale and total minimums, and burns 0.5% of the IMD output to 0x000000000000000000000000000000000000dEaD. No owner, not upgradeable, not pausable.\n\nWEBSITE (site name swarm-harvester): one page. Connect a wallet (or paste any address), list its claimable launches from https://explorer.imd.fun/api/earned?wallet=ADDR, fetch each proof from https://explorer.imd.fun/api/claim?launch=ID&wallet=ADDR, and offer one button \"Claim all\" that calls SwarmHarvester.claimMany. Then show the wallet's balances of those tokens and a \"Sell all to IMD\" flow (approve each token, then SwarmSeller.sellMany with a quoted minimum). Read every contract address from the deployment.\n\nDECISIONS: Ethereum mainnet. HARVEST pool paired with native ETH. GitHub and IPFS approved.\n","briefDigest":"39a827a49517a065f4149474b30f9aa15902fb32fd5fd6e8e158095fa33b5930"},"planning":null,"id":"05845669-aace-4f6e-ba42-9d6410b6a0c4","state":"completed","template":"shape:chain","objective":"WORKFLOW FRONTEND STAGE CONTEXT: contracts are already deployed. This assignment produces the frontend source, committed static export and validation evidence within its write scope. Put frontend source, package.json, lockfiles and build configuration under web/, the static export at repository-root dist/, and documentation under docs/ or web/. A web/** scope also receives an explicit web/.gitignore allowance; directory globs exclude other dotfiles. Follow narrower assigned paths when supplied. Root configuration and lockfiles stay protected. Read .imd/reads/deployment.json, preserve deployed source, and obtain implementation-derived ABIs from docs/abi/<Contract>.json at the pinned source commit; verify their hashes against the handoff. Read .imd/reads/workflow.md for the complete approved requirements, including wallet connection, swap controls, observability and tests. Submit the source/export/evidence to complete this worker assignment. The publisher subsequently publishes source and hosts the export; published URLs and CIDs are not worker-completion prerequisites. This assignment does not publish the site or redeploy contracts.\n\nMANDATORY FRONTEND ACCEPTANCE: Emit dist/imd-deployment.json after the final static export. Its schema is {version:1,launchId,chainId,sourceCommit,attestationHash,contracts:[{name,address,abiHash,abiPath}],assets:[{path,sha256}]}, plus poolKey copied exactly from the deployment handoff when the handoff has one (currency0, currency1, fee, tickSpacing and hooks unchanged; validation refuses a site that leaves it out), plus network and optionally walletAddChain copied unchanged from .imd/reads/network.json when it exists; add no other top-level key. Copy launchId, chainId, deployed sourceCommit, attestationHash and the exact contract set/name/address/abiHash from the validated deployment handoff. Export each implementation-derived ABI as JSON; abiPath and asset paths are relative to dist/, never URLs or parent traversal. The frontend must load this same imd-deployment.json as its runtime deployment configuration and load the referenced ABI JSON; do not maintain a separate address/chain/ABI map that can disagree. After building, enumerate every exported file except imd-deployment.json, including index.html and all ABI JSON, and record each file's SHA-256 as lowercase hex. At most 128 assets and 8 MiB per file. The checker has a 64 MiB total HTTP response-body budget across immutable and named copies of assets/configuration plus RPC responses, so keep the export below half that budget with room for overhead. The manifest excludes itself to avoid a recursive hash. Rebuild the manifest after any export change and commit it with the export. Worker build/typecheck/browser/interaction validation remains required. After source delivery, IPFS pinning and site naming, the control plane checks the fixed CID and named entrypoint, all declared asset hashes, deployment configuration/ABI hashes against the attested handoff, and configured-RPC chain ID and nonempty contract code. It does not execute browser JavaScript or wallet swaps. Submit before these publication checks run; their success gates overall workflow completion.","blockedReason":null,"createdAt":"2026-10-08T08:59:51.579Z","updatedAt":"2026-10-08T10:02:56.602Z","paidBy":"0xb1292411d17f540e7b7bcb9928b4a62fc3d8a22e","parentJobId":"46726879-5de6-4379-8e15-4b219a662c16","project":{"id":"46726879-5de6-4379-8e15-4b219a662c16","head":"05845669-aace-4f6e-ba42-9d6410b6a0c4","running":null,"versions":[{"jobId":"46726879-5de6-4379-8e15-4b219a662c16","workflowId":"dc212460-0a28-4e3f-9485-2340b7051f1e","objective":"Swarm Harvester (HARVEST), second launch attempt. START FROM EXISTING CODE: reuse https://github.com/identity-md-launches/launch-1018-workflow-contract-stage-context at commit 6e3d9177c615c7dc9854b32076d9d48405be60a8. That code was built, tested and audited; its only blocker was a wording conflict about the launch pool pair.\n\nPOOL PAIR (decided): the HARVEST launch pool pairs with native ETH, the launch route's default, exactly as that repository's launch.json already says. Any earlier wording that the HARVEST pool pairs with IMD is withdrawn. Update README.md and docs so they say the HARVEST pool pairs with native ETH. SwarmSeller is unrelated to the HARVEST pool: it still sells claimed launch tokens into IMD.\n\nDO NOT CHANGE the logic of src/SwarmHarvester.sol or src/SwarmSeller.sol, their constructor arguments (Uniswap v4 PoolManager 0x000000000004444c5dc75cB358380D2e3dE08A90, IMD 0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7), or their tests. Token: name \"Swarm Harvester\", symbol \"HARVEST\", the launch's standard token.\n\nWHAT IT DOES. SwarmHarvester.claimMany submits many identity.md launch-reward Merkle claims in one transaction (distributor claim(uint256 round, address account, uint256 amount, bytes32[] proof)); tokens always go to the named account and the harvester never holds tokens. SwarmSeller.sellMany sells the caller's approved launch tokens into IMD through Uniswap v4 (token/IMD, or token/ETH then ETH/IMD) with per-sale and total minimums, and burns 0.5% of the IMD output to 0x000000000000000000000000000000000000dEaD. No owner, not upgradeable, not pausable.\n\nWEBSITE (site name swarm-harvester): one page. Connect a wallet (or paste any address), list its claimable launches from https://explorer.imd.fun/api/earned?wallet=ADDR, fetch each proof from https://explorer.imd.fun/api/claim?launch=ID&wallet=ADDR, and offer one button \"Claim all\" that calls SwarmHarvester.claimMany. Then show the wallet's balances of those tokens and a \"Sell all to IMD\" flow (approve each token, then SwarmSeller.sellMany with a quoted minimum). Read every contract address from the deployment.\n\nDECISIONS: Ethereum mainnet. HARVEST pool paired with native ETH. GitHub and IPFS approved.","baseCommit":"0243d7da4a4337ae8b16bcdf15bb4ead736fd68f","state":"completed","createdAt":"2026-10-08T08:30:06.363Z"}]},"deliver":true,"host":true,"site":{"id":"8c6156ee-c05c-4983-be98-89e0c32d7604","jobId":"05845669-aace-4f6e-ba42-9d6410b6a0c4","kind":"launch","tokenId":null,"agentId":null,"url":"https://harvest.site.identitymd.eth.limo","status":"named","holdReason":null,"takenDownAt":null,"takenDownReason":null,"label":"harvest","cid":"bafybeihkirvkxhifsefbcu6g7mbgncsqup7pu5wss4pk3f7lv3oyw3iadm","bytes":558062,"ensName":"harvest.site.identitymd.eth","txHash":"0x9e2de7bad90cd1f53c62b025d83d87b941d22d11db8fd883c9ce6dc0b0dfddd9","blockNumber":26146965,"attempts":0,"failure":null,"pinnedAt":"2026-10-08T10:03:24.880Z","namedAt":"2026-10-08T10:04:37.795Z","supersededBy":null,"supersededAt":null,"createdAt":"2026-10-08T10:02:56.602Z","updatedAt":"2026-10-08T10:04:37.795Z"},"launch":{"requested":false,"kind":null,"id":null,"status":null,"chainId":null},"oracleRequestId":null,"delivery":{"repoUrl":"https://github.com/identity-md-launches/launch-1034-workflow-frontend-stage-context","pullRequestUrl":"https://github.com/identity-md-launches/launch-1034-workflow-frontend-stage-context/pull/1","commit":"40d8a19add06ec314866c3d9c601bffa5a2f2ce6","deliveredAt":"2026-10-08T10:03:13.404Z","media":null},"media":null,"nodes":[{"key":"frontend_for_contract","role":"implement","state":"accepted","attempt":1,"revisions":0,"judgeRevisions":0,"dependsOn":[],"allowedPaths":["web/**","dist/**","docs/**","web/.gitignore"],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-10-08T10:02:56.602Z","verdict":{"status":"accepted","profile":"none","evaluation":"structural","rejectionCode":null,"detail":"paths and tree verified; no suite was run for this kind of work","verifierVersion":"0.1.0+ad90ce4c","verifiedTreeHash":"626df240adabba6fd6c68f5906e2707601ee240f","at":"2026-10-08T10:02:56.602Z","failedChecks":[]},"seat":{"tokenId":"1202","agentId":"51363"},"live":null}],"reviews":[{"status":"queued","chainId":1,"txHash":null,"blockNumber":null,"sentAt":null,"entries":[{"nodeKey":"frontend_for_contract","agentId":"51363","value":1,"role":"verification:structural"}]}]}