{"workflow":null,"planning":null,"id":"85e58ec1-1ee5-4b04-8133-d8bb9ae15f1c","state":"completed","template":"skill:build-contract-project","objective":"Sorphera - contract review, executable testing and operations\n\nSelect CONTRACTS and continue the latest Sorphera project.\nRepo: Sorphera\nReviewed PR: #2, merged.\nReviewed commit: 6a6b3e57adcbfac8063aaa0d734c055c4fcff940\nLatest completed job: 76506bc8-6d8a-4fe0-95cb-6384a0801040\n\nName: Sorphera\nTagline: Weekly ETH & NFT lottery ball jackpots. Powered by FWA.\n\nUse the current project head. Implement fixes, tests and contract execution tools in this repo. Supporting docs belong with the code; this is not a website or standalone report assignment.\n\nMainnet is the production target. Do not broadcast mainnet transactions, spend real funds, open a new paid launch or enable public sales. Complete local/fork work despite missing external access.\n\nPRESERVE THE BASELINE\n\nRead the existing test evidence, deployment docs and interfaces before editing. Preserve the passing mainnet integration and separate NFT tie-break VRF.\n\nKeep two weekly games, uncapped total ticket sales, bounded transactions, three distinct unordered main numbers 1-20 plus bonus 1-5, default 0.005 ETH tickets and fixed 10% operator fee / 90% acquisition allocation. ETH matches split equally; no matches roll over. NFT no-match inventory rolls; one matching ticket wins all; multiple matches use a separate VRF request to select one ticket for all inventory. Separate company builder rewards from purchaser prizes/rewards/refunds.\n\nADVERSARIAL CONTRACT REVIEW AND FIXES\n\nReview the latest code, especially tie states, callbacks, accounting and external dependencies. Use a separate reviewer if supported and disclose reviewer roles. Automated review is not a professional audit.\n\nFor reproducible bugs, add a failing regression test and a minimal fix. Cover:\n\nRound isolation, immutable sold terms, fee release, rounding, rollovers and late recoveries.\n\nDraw/tie request binding, replay/out-of-order callbacks, subscription changes, funding depletion and callback gas.\n\nFWA settlement deadlines, forced outcomes, stuck NFTs, helper permissions and reward delivery.\n\nUnauthorized withdrawals, reentrancy and bounded processing at large ticket/inventory counts.\n\nPreserve economics and safeguards; avoid unrelated rewrites.\n\nHANDLE ORACLE FAILURE WITHOUT COMPROMISING FAIRNESS\n\nCurrent draw/tie VRF failure can lock funds indefinitely. Review against Chainlink security guidance.\n\nTest underfunding followed by top-up, delayed callbacks, insufficient gas, legitimate callback completion without external payouts and permanent nonfulfillment. Distinguish a reverted request transaction from an accepted request awaiting fulfillment.\n\nImplement compatible reserve checks, monitoring and safeguards where justified. Do not silently add cancellation, new randomness, fallback seeds, winner replacement or operator-selected results after a successful request. A timeout must not let anyone discard unfavorable randomness.\n\nIf a remedy changes refund/payout rights or trust assumptions, leave it out of the production candidate and present the exact proposed rule, attack analysis and decision required. Do not mark the lockup resolved merely because it is documented.\n\nDELIVER AN EXECUTABLE LIVE SEPOLIA VRF WORKFLOW\n\nSepoliaCanary.s.sol currently simulates deployment. Add a resumable CLI/script with explicit dry-run and live-Sepolia modes, controlled FWA test dependencies, the real coordinator and production lottery callbacks.\n\nSupport deployment, factory/router binding, company subscription creation or supplied ID, consumer registration, funding/configuration checks, test tickets, both draws, independent NFT tie-break, finalization and claims. Persist addresses/receipts for restart. Clearly label mock dependencies.\n\nUse a small pre-sale test ticket price and coverage of all 5,700 combinations when needed to guarantee winners/ties. Never assume the random result or impersonate the coordinator in a live test.\n\nExecute live transactions only with company test-wallet authorization/access and test funds supplied for this task. Use secure signers; never request, print or commit secrets. Otherwise finish/test the workflow locally and mark live execution NOT RUN with exact missing inputs. Prank-only simulation is not an executable live workflow.\n\nLive evidence must include actual coordinator request/fulfillment receipts, callback success, billing, distinct draw/tie request IDs and claims. Keep it separate from simulated evidence.\n\nBUILD A RUNNABLE CONTRACT KEEPER\n\nOperations.s.sol only returns unsigned calldata. Add a minimal restart-safe keeper CLI/worker, defaulting to dry-run with live submission explicitly gated.\n\nSupport opening rounds, bounded purchases, FWA processing, urgent settlement, reconciliation/refunds, closing, draw/tie requests and finalization. Prioritize settlement deadlines. Enforce frozen budgets/slippage bounds and never replace accepted VRF requests.\n\nReconcile chain state before retries; persist cursors/checkpoints; prevent unsafe duplicate-worker/nonce behavior. Handle RPC outages, pending/replaced/reverted transactions and chain reorganizations. Add gas/spend ceilings, funding alerts, structured logs and a supervisor/container configuration.\n\nSeparate permissionless maintenance from owner-only treasury/configuration actions; do not give the keeper unrestricted ownership. Test both game lifecycles on a local fork, including restart and delayed callbacks. Supply start/dry-run/stop/recovery commands. Hosting and real operating funds remain external prerequisites.\n\nADDRESS THE IMD GATE WITH AVAILABLE ACCESS\n\nLaunch 961 remains parked on the original code. Empty-chain constructor rejection and genuine-fork success are already documented in docs/REHEARSAL.md.\n\nIf the private runner is accessible, rerun against the latest source and correct chain/manifest. Capture resolved arguments, dependency order/code, chain/block and inner revert. Fix demonstrated application faults while preserving dependency checks.\n\nIf unavailable, retain the public reproduction and provide one concise support-request draft listing the necessary evidence. Do not repeatedly probe inaccessible endpoints or claim local tests cleared the private gate. Do not contact support on my behalf.\n\nKeep the historical Sepolia manifest separate from mainnet preparation. A continuation must not silently deploy or retarget the old launch.\n\nVERIFY AND HAND OFF THE CONTRACT VERSION\n\nRun build/format checks, regression/invariant tests, relevant mainnet/Sepolia fork tests and new tooling tests. Record exact commands, source commit, toolchain, fork blocks and pass/fail/skip counts. Distinguish live oracle results from simulation.\n\nUpdate ABIs, events/status mappings, configuration schemas and deployment/setup commands after fixes. Leave undeployed addresses null. Identify interface/policy decisions affecting future website integration.\n\nPublish through IMD's supported artifact mechanism to the existing repo/PR. Respect worker git restrictions; distinguish those from the platform's final publication status.\n\nFinish with a concise summary of code changes, actual test results, unresolved findings, private-gate status, live-VRF status and one external-action checklist naming who must supply each item. State whether interfaces are ready for website integration. Complete all unblocked implementation; do not stop at recommendations or claim public-launch readiness.","blockedReason":null,"createdAt":"2026-10-08T14:57:18.250Z","updatedAt":"2026-10-08T15:39:05.625Z","paidBy":"0xea18227840e0b7de103a6756020168c5bb7b13d2","parentJobId":"76506bc8-6d8a-4fe0-95cb-6384a0801040","project":{"id":"a3707b79-51b8-4d04-9e32-3e786d91c1d9","head":"bebfac54-d7fa-46fe-accb-c9fb9c66aaf6","running":null,"versions":[{"jobId":"a3707b79-51b8-4d04-9e32-3e786d91c1d9","workflowId":null,"objective":"Build Sorphera smart contracts on Ethereum Sepolia.\nTagline: Weekly ETH & NFT lottery ball jackpots. Powered by FWA.\nUse Sorphera branding throughout. Deliver contracts, Foundry tests and docs; website later. No new ERC20 or liquidity pool.\n\nGAMES\n\nSorphera ETH Jackpot and Sorphera NFT Jackpot each draw weekly (two draws total), with separate rounds, tickets, schedules and accounting.\nEach nontransferable ticket enters one game/round. Default: 0.005 Sepolia ETH. Players pick 3 distinct unordered numbers from 1-20 and 1 bonus from 1-5. Duplicate combinations and multiple tickets per wallet are allowed.\nUncapped sales; bounded transaction batches. Configure seven-day windows, separate initial cutoffs and earliest draw-request times. Freeze price, fees, number format and deadlines before first sale; changes affect future rounds only.\n\nMONEY\n\nSplit new sales: 10% operator fee, 90% round-specific FWA acquisition budget, including FWA acquisition/VRF charges. Operator resources separately fund lottery VRF and gas.\nIsolate fees, budgets, pending requests, refunds, carryovers and winner liabilities by game/round. No cross-subsidies or spending reserved assets. Charge fees once on new sales, never on prizes, refunds or carryovers.\nBuilder rewards belong to the company. Purchaser rewards/refunds are prizes. Late recoveries follow the originating round's winner, rollover or refund entitlements. Operator withdrawals cannot consume player assets.\n\nFWA\n\nVerify Sepolia addresses, ABIs and dependencies using:\n[Sepolia](https://www.fwa.fun/docs/v2-sepolia)\n[Builder rewards](https://www.fwa.fun/docs/builder-revenue)\n[Settlement](https://www.fwa.fun/docs/winning)\n[Reference contracts](https://github.com/adamlizek/fwa-examples)\nMake a builder router the immediate caller of FWAV2.acquire and a separate prize vault the purchaser. Preserve builder attribution and purchaser rights.\nRead live quotes, fees, settings and settlement windows; never hardcode 0.06 ETH/spin. Enforce budgets, slippage limits and deadlines. Attribute all requests, allocations, settlements and recoveries to game/round.\nRecover expired requests and overpayments. Claim builder rewards only against actual allowances; assume no fixed emissions or guaranteed revenue.\nPermissionless settlement enforces the game's fixed outcome. Document keepers, deadlines, missed windows and pending delivery. Verify NFT custody, not just notifications.\n\nETH JACKPOT\n\nUse its acquisition budget for FWA pulls; settle successful allocations to ETH.\nPrize = actual cashouts + unused budget + refunds + ETH carryover. Prize value is not guaranteed.\nAfter cutoff and reconciliation, draw numbers. Match all 3 main numbers and the bonus to qualify.\nOne match wins everything. Multiple matches split equally per winning ticket, including repeats per wallet. No match rolls the prize into the next ETH round. Old tickets expire; never buy pulls with carryover.\nUse claim-based payouts, reserve unpaid winnings and carry division dust forward.\n\nNFT JACKPOT\n\nUse its acquisition budget for FWA pulls; always choose \"keep the NFT\" and secure assets promptly in the vault. No voluntary cashouts, sales, relisting, substitution or cherry-picking. Track collection, token ID, acquisition, round and custody.\nUse the same selected numbers and exact-match rule:\n\n- No match: roll all inventory and residual prize funds into the next NFT round; old tickets expire.\n- One match: that ticket wins all inventory and residual prize funds.\n- Multiple matches: uniformly select ONE matching ticket to win everything, using a domain-separated stream of verified round randomness. Each matching ticket has equal probability, including repeats per wallet. Disclose the tie-break.\n\nAdd acquisitions to carryover; never respin or re-fee carryover. Freeze secured inventory before requesting lottery randomness.\nAllow individual/batched claims to the winner's nominated compatible recipient. Isolate transfer failures, prevent double claims and reserve unclaimed assets.\nUnexpected ETH recoveries remain incidental NFT-round prize funds; never label them NFTs or guarantee resale value.\nIf no NFT, including carryover, is secured by the published settlement deadline, cancel BEFORE requesting lottery randomness. Refund available unspent/recovered funds plus reserved operator fees pro rata to ticket holders; preserve late-recovery entitlements. Do not guarantee full refunds after third-party charges/losses. Hold this round's operator fees until success/cancellation is established.\n\nRANDOMNESS AND REPLAY\n\nUse independent Chainlink VRF for lottery draws, separate from FWA randomness. Bind callbacks to game, round and request ID. Uniformly sample 3 distinct main balls and 1 bonus. Store ordered balls for replay and normalized combinations for matching.\nClose sales and reconcile required prize accounting before requesting randomness, never before the published earliest request time. Specify settlement/VRF delay handling.\nNo rerolls, replacement requests, admin-selected results, post-cutoff purchases or outcome-dependent cancellation. Store randomness in callbacks; finalize and claim separately.\nExpose persistent state/events for schedules, closure, prizes, randomness, ordered results, match counts, tie-breaks, rollovers and claims for replay/reconnection.\nFrontend globe-ball animations show recorded results, never determine outcomes. Document that onchain results may be readable before animation ends; no secret per-ball releases.\nWith zero tickets, skip randomness and retain carryover.\n\nSECURITY AND DELIVERY\n\nIndex combinations/matching tickets so finalization and selection never scan all sales. Never require transferring the full NFT inventory in one transaction.\nPrevent reentrancy, stale/duplicate callbacks, double claims, rejected-transfer losses and cross-round accounting errors. Admins cannot seize prizes or change active-round rules. Pausing sales preserves claims.\nTest zero/one/multiple matches, duplicates, both rollovers, NFT tie-break, large ticket/inventory counts, failed acquisitions, delayed settlement, custody recovery, late refunds, partial claims, rounding and conservation of funds.\nProvide reproducible mocks and separate FWA Sepolia integration tests. Distinguish verified behavior, assumptions and mocks; never silently substitute mocks.\nDeploy with sales disabled until dependencies, configuration and randomness funding are validated.\nExport source, ABIs, addresses, deployment blocks, configuration and frontend interfaces; document setup, remaining dependencies and both lifecycles.","baseCommit":"0243d7da4a4337ae8b16bcdf15bb4ead736fd68f","state":"completed","createdAt":"2026-10-08T01:35:15.425Z"},{"jobId":"76506bc8-6d8a-4fe0-95cb-6384a0801040","workflowId":null,"objective":"Sorphera - contract hardening, integration tests and deployment preparation\n\nTagline: Weekly ETH & NFT lottery ball jackpots. Powered by FWA.\nRepo: Sorphera repository\nIMD launch: 961\nParent job: a3707b79-51b8-4d04-9e32-3e786d91c1d9\nReviewed commit: b06997d42012b7ad7ffe943b3acdd816b2092c4e\n\nContinue from the current repo head; check changes since the reviewed commit. Keep this contracts-only: implement contracts, tests, deployment scripts, docs and integration artifacts. Target Ethereum mainnet, testing FWA on a pinned mainnet fork. Do not broadcast mainnet transactions, spend real funds or enable public sales.\n\nPRESERVE PRODUCT RULES\n\nTwo separate weekly lottery-ball games:\n\nETH Jackpot: settle FWA acquisitions to ETH. Winning tickets split distributable ETH equally; no winners means rollover.\n\nNFT Jackpot: take the NFTs. No winners means inventory rollover; one winning ticket receives all inventory. Multiple winning tickets trigger a separate verifiable random tie-break selecting ONE winning ticket for all inventory.\n\nKeep three distinct unordered main numbers 1-20 plus bonus 1-5, existing ticket ownership, 0.005 ETH default tickets and 10% operator fee / 90% acquisition defaults.\n\nTotal ticket sales remain uncapped; transaction batches and processing remain bounded.\n\nCompany builder rewards stay separate from purchaser reward entitlements, prizes and refunds.\n\nPreserve custody/refund/claim/rollover guarantees and economics; explain necessary changes.\n\nUse verifiable randomness and expose draw/tie-break events for future animations. No website work.\n\nFIX THE FAILED DEPLOYMENT REHEARSAL\n\nLaunch was parked after 6/7 gates passed. protected_invariants failed with \"application constructor failed\" in setUp(), gas 0. Sorphera checks for code at the factory and VRF coordinator; the factory checks router code.\n\nCapture the failing contract, resolved constructor arguments, chain state and revert trace. Check dependency order, $owner/$contract substitutions and coordinator code. Match IMD compiler/optimizer/EVM settings. Local tests passed 64/64 on Forge 1.7.1; IMD reported 1.8.3. Investigate, rather than assume, the cause.\n\nFix the cause without weakening safeguards or mocking production dependencies. If IMD's private harness is unavailable, supply a public reproduction and exact platform follow-up. Never claim its gate passed without evidence.\n\nVERIFY MAINNET INTEGRATION AND NETWORK CONFIGURATION\n\nPrimary references:\n\nFWA deployments\n\nBuilder revenue\n\nFWA testing\n\nBuilder examples\n\nChainlink networks\n\nPublished mainnet pool: 0x958C41181182e76F221331b2755b77D9e1426A98\nPublished mainnet rewards: 0xA54b44C7a894AA19C49734A753D01f9B8C5f6516\n\nReviewed Sepolia lacked builder attribution. Mainnet source/ABI includes it; an explorer read reported builderRewardBps() = 1500. Reverify compatibility and current settings; the rate can change.\n\nRecord chain/block, bytecode, ABIs and pool/rewards/token/randomness bindings. Verify the transfer helper, Permit2, distributor/deposit permissions and liquidity. Prove router builder attribution as immediate acquire caller, with round vaults retaining purchaser rights.\n\nReplace the Sepolia-only restriction with validated network configuration: chain ID, dependencies, coordinator, key hash and subscription. Fail closed on wrong chains/incompatible dependencies. Separate production and test-only simulation.\n\nRead live quotes, VRF charges, gas-price assumptions, slippage limits and settlement windows. Do not hardcode 0.06 ETH pulls or source defaults.\n\nTEST COMPLETE LIFECYCLES AND FAILURE PATHS\n\nRun existing tests and add pinned mainnet-fork tests using deployed FWA code unchanged. Record commands/RPC requirements; disclose fork-only balances, impersonation and oracle simulation.\n\nCover both games: tickets -> FWA requests -> allocation -> ETH/NFT settlement -> draw -> finalization -> claims. Verify real builder allowance accounting, eligible acquisition/settlement credits, reward purchase, transfer-helper queueing and next-block treasury delivery. Test purchaser rewards separately.\n\nRequired coverage:\n\nETH prize splits, duplicate winning tickets, no-winner rollover and rounding dust.\n\nNFT single winner, multiwinner tie-break, rollover and bounded delivery/recovery.\n\nFailed/expired acquisitions, immediate/deferred refunds, stale/slipping quotes, unavailable inventory, delayed allocation and missed settlement windows.\n\nCross-round isolation, conservation of funds/inventory, locked liabilities, correct fee accounting and prevention of operator withdrawal of prizes/refunds/purchaser rewards.\n\nNumber validation/canonical ordering, quick-pick/draw sampling bias, bonus independence, cutoff boundaries and immutable terms for sold tickets.\n\nUnauthorized, duplicate, delayed and out-of-order VRF callbacks; request-to-round binding and separate tie-break requests.\n\nReentrancy, reverting recipients, NFT receiver failures, unauthorized administration, paused paths and changed dependency/helper permissions.\n\nLarge ticket/inventory counts: demonstrate bounded gas and progress without processing every ticket in one transaction.\n\nForks receive no automatic live Chainlink callbacks. Document test-only fulfillment for FWA and lottery VRF. Separately test lottery VRF on Sepolia with controlled FWA test dependencies and the real coordinator if test funding/access exists. Otherwise deliver scripts, exact prerequisites and a NOT RUN result. Never label simulation as live VRF verification.\n\nReview lockups from permanent VRF failure, pending acquisitions and missed settlement windows. Document fair recovery options; prohibit discretionary rerolls, winner replacement and post-sale rule changes.\n\nPREPARE DEPLOYMENT AND OPERATIONS\n\nDeliver build/deployment rehearsals, owner/treasury inputs, dependency order, factory binding, router setup, company VRF subscription/consumer setup and funding/preflight checks. Sales default to disabled.\n\nSeparate mainnet/Sepolia/fork artifacts. Check current IMD rules: a continuation may update code without redeploying or retargeting the parked Sepolia launch. Document the supported mainnet route and any new launch/platform action required.\n\nProvide keeper/operations scripts and a runbook for acquisitions, allocation processing, timely settlement, closing rounds, randomness requests, finalization and reward claims. Specify permissions, funding, monitoring and safe retries.\n\nDELIVER EVIDENCE\n\nCommit fixes/tests to the existing project and summarize the changes. Update dependency records, test reports, manifests, ABIs, events and configuration schemas. Leave undeployed addresses null and label simulated/example artifacts.\n\nReport:\n\nRoot cause, fix, files changed and protected-gate status.\n\nExact commands and passed/failed/skipped test counts.\n\nMainnet fork block/dependencies and real vs simulated oracle coverage.\n\nGas/scaling results and supported deployment procedure.\n\nRemaining blockers, each with the exact external input/action required.\n\nComplete all unblocked work. Distinguish verified, unrun and blocked steps. State readiness for independent security review/deployment rehearsal; passing tests is not an audit or approval for public sales.","baseCommit":"b06997d42012b7ad7ffe943b3acdd816b2092c4e","state":"completed","createdAt":"2026-10-08T04:15:44.059Z"},{"jobId":"85e58ec1-1ee5-4b04-8133-d8bb9ae15f1c","workflowId":null,"objective":"Sorphera - contract review, executable testing and operations\n\nSelect CONTRACTS and continue the latest Sorphera project.\nRepo: Sorphera\nReviewed PR: #2, merged.\nReviewed commit: 6a6b3e57adcbfac8063aaa0d734c055c4fcff940\nLatest completed job: 76506bc8-6d8a-4fe0-95cb-6384a0801040\n\nName: Sorphera\nTagline: Weekly ETH & NFT lottery ball jackpots. Powered by FWA.\n\nUse the current project head. Implement fixes, tests and contract execution tools in this repo. Supporting docs belong with the code; this is not a website or standalone report assignment.\n\nMainnet is the production target. Do not broadcast mainnet transactions, spend real funds, open a new paid launch or enable public sales. Complete local/fork work despite missing external access.\n\nPRESERVE THE BASELINE\n\nRead the existing test evidence, deployment docs and interfaces before editing. Preserve the passing mainnet integration and separate NFT tie-break VRF.\n\nKeep two weekly games, uncapped total ticket sales, bounded transactions, three distinct unordered main numbers 1-20 plus bonus 1-5, default 0.005 ETH tickets and fixed 10% operator fee / 90% acquisition allocation. ETH matches split equally; no matches roll over. NFT no-match inventory rolls; one matching ticket wins all; multiple matches use a separate VRF request to select one ticket for all inventory. Separate company builder rewards from purchaser prizes/rewards/refunds.\n\nADVERSARIAL CONTRACT REVIEW AND FIXES\n\nReview the latest code, especially tie states, callbacks, accounting and external dependencies. Use a separate reviewer if supported and disclose reviewer roles. Automated review is not a professional audit.\n\nFor reproducible bugs, add a failing regression test and a minimal fix. Cover:\n\nRound isolation, immutable sold terms, fee release, rounding, rollovers and late recoveries.\n\nDraw/tie request binding, replay/out-of-order callbacks, subscription changes, funding depletion and callback gas.\n\nFWA settlement deadlines, forced outcomes, stuck NFTs, helper permissions and reward delivery.\n\nUnauthorized withdrawals, reentrancy and bounded processing at large ticket/inventory counts.\n\nPreserve economics and safeguards; avoid unrelated rewrites.\n\nHANDLE ORACLE FAILURE WITHOUT COMPROMISING FAIRNESS\n\nCurrent draw/tie VRF failure can lock funds indefinitely. Review against Chainlink security guidance.\n\nTest underfunding followed by top-up, delayed callbacks, insufficient gas, legitimate callback completion without external payouts and permanent nonfulfillment. Distinguish a reverted request transaction from an accepted request awaiting fulfillment.\n\nImplement compatible reserve checks, monitoring and safeguards where justified. Do not silently add cancellation, new randomness, fallback seeds, winner replacement or operator-selected results after a successful request. A timeout must not let anyone discard unfavorable randomness.\n\nIf a remedy changes refund/payout rights or trust assumptions, leave it out of the production candidate and present the exact proposed rule, attack analysis and decision required. Do not mark the lockup resolved merely because it is documented.\n\nDELIVER AN EXECUTABLE LIVE SEPOLIA VRF WORKFLOW\n\nSepoliaCanary.s.sol currently simulates deployment. Add a resumable CLI/script with explicit dry-run and live-Sepolia modes, controlled FWA test dependencies, the real coordinator and production lottery callbacks.\n\nSupport deployment, factory/router binding, company subscription creation or supplied ID, consumer registration, funding/configuration checks, test tickets, both draws, independent NFT tie-break, finalization and claims. Persist addresses/receipts for restart. Clearly label mock dependencies.\n\nUse a small pre-sale test ticket price and coverage of all 5,700 combinations when needed to guarantee winners/ties. Never assume the random result or impersonate the coordinator in a live test.\n\nExecute live transactions only with company test-wallet authorization/access and test funds supplied for this task. Use secure signers; never request, print or commit secrets. Otherwise finish/test the workflow locally and mark live execution NOT RUN with exact missing inputs. Prank-only simulation is not an executable live workflow.\n\nLive evidence must include actual coordinator request/fulfillment receipts, callback success, billing, distinct draw/tie request IDs and claims. Keep it separate from simulated evidence.\n\nBUILD A RUNNABLE CONTRACT KEEPER\n\nOperations.s.sol only returns unsigned calldata. Add a minimal restart-safe keeper CLI/worker, defaulting to dry-run with live submission explicitly gated.\n\nSupport opening rounds, bounded purchases, FWA processing, urgent settlement, reconciliation/refunds, closing, draw/tie requests and finalization. Prioritize settlement deadlines. Enforce frozen budgets/slippage bounds and never replace accepted VRF requests.\n\nReconcile chain state before retries; persist cursors/checkpoints; prevent unsafe duplicate-worker/nonce behavior. Handle RPC outages, pending/replaced/reverted transactions and chain reorganizations. Add gas/spend ceilings, funding alerts, structured logs and a supervisor/container configuration.\n\nSeparate permissionless maintenance from owner-only treasury/configuration actions; do not give the keeper unrestricted ownership. Test both game lifecycles on a local fork, including restart and delayed callbacks. Supply start/dry-run/stop/recovery commands. Hosting and real operating funds remain external prerequisites.\n\nADDRESS THE IMD GATE WITH AVAILABLE ACCESS\n\nLaunch 961 remains parked on the original code. Empty-chain constructor rejection and genuine-fork success are already documented in docs/REHEARSAL.md.\n\nIf the private runner is accessible, rerun against the latest source and correct chain/manifest. Capture resolved arguments, dependency order/code, chain/block and inner revert. Fix demonstrated application faults while preserving dependency checks.\n\nIf unavailable, retain the public reproduction and provide one concise support-request draft listing the necessary evidence. Do not repeatedly probe inaccessible endpoints or claim local tests cleared the private gate. Do not contact support on my behalf.\n\nKeep the historical Sepolia manifest separate from mainnet preparation. A continuation must not silently deploy or retarget the old launch.\n\nVERIFY AND HAND OFF THE CONTRACT VERSION\n\nRun build/format checks, regression/invariant tests, relevant mainnet/Sepolia fork tests and new tooling tests. Record exact commands, source commit, toolchain, fork blocks and pass/fail/skip counts. Distinguish live oracle results from simulation.\n\nUpdate ABIs, events/status mappings, configuration schemas and deployment/setup commands after fixes. Leave undeployed addresses null. Identify interface/policy decisions affecting future website integration.\n\nPublish through IMD's supported artifact mechanism to the existing repo/PR. Respect worker git restrictions; distinguish those from the platform's final publication status.\n\nFinish with a concise summary of code changes, actual test results, unresolved findings, private-gate status, live-VRF status and one external-action checklist naming who must supply each item. State whether interfaces are ready for website integration. Complete all unblocked implementation; do not stop at recommendations or claim public-launch readiness.","baseCommit":"6a6b3e57adcbfac8063aaa0d734c055c4fcff940","state":"completed","createdAt":"2026-10-08T14:57:18.250Z"},{"jobId":"bebfac54-d7fa-46fe-accb-c9fb9c66aaf6","workflowId":null,"objective":"Name: Sorphera\nExact tagline: Weekly ETH & NFT lottery ball jackpots. Powered by FWA.\n\nSOURCE\nRepo: https://github.com/identity-md-launches/launch-961-build-sorphera-smart-contracts\nContract baseline: merged PR #3, ed68e960dc3b9f0847caa637b5d3ea0c082bcfe3.\nRead README.md, frontend/README.md, frontend/configuration.json, frontend/deployment.json, frontend/abi/* and docs/OPERATIONS.md. Preserve contracts/tests/ABI exports. Build in web/ or the website workspace. No contract deployments, tokens/pools, keepers, fund spending or public sales. Deliver a working website, preview and source.\n\nBRAND FILES\nDownload and extract this public ZIP:\nhttps://drive.google.com/uc?export=download&id=1V7yG0VSd3ljKTaqaFYuJO6kH3XQobj7W\nUse its four branding/ PNGs listed below. This prompt supersedes the bundled prompt/README; no GitHub asset upload is needed.\n- sorphera-brand-board-ice-blue.png: art direction/palette.\n- sorphera-wordmark-ice-blue.png: primary wordmark.\n- sorphera-banner-ice-blue.png: campaign/social art.\n- sorphera-globe-icon-ice-blue.png: primary icon/favicon.\nThe ice-blue icon supersedes the board's pink badge. Pink remains prominent. Inspect all four images; preserve proportions/transparency and bundle optimized copies. No emoji substitutes or redrawn wordmark. The board is a reference; omit \"BRAND CONCEPT 01\". Identify inaccessible files and continue unblocked work without claiming they were used.\n\nDESIGN\nFWA-inspired plush ice-blue lettering, tactile 3D globe lottery balls, pink continents, cream number badges, charcoal backgrounds and restrained iridescent crystals. Context: https://www.fwa.fun/ ; supplied Sorphera art controls the design.\nIce-blue wordmark/headlines; prominent pink accents/bonus balls; readable cream text, restrained lavender, clean UI typography. Blue/pink globes identify ETH; pink/cream identify NFT. Reuse globe-ball components across tickets, results and draws. Premium, playful, spacious and mobile-first; avoid generic crypto dashboards, excessive neon and repetitive cards.\n\nCONTRACT RULES\nIndependent weekly ETH (game 0) and NFT (game 1) jackpots. A ticket enters ONE game/round. Pick 3 distinct UNORDERED numbers 1-20 plus bonus 1-5; match all four. 1-in-5,700 is the number-match chance, not necessarily sole NFT victory.\nUncapped total sales; maximum 100 tickets per transaction. Duplicate combinations allowed; tickets nontransferable. Default price 0.005 ETH; live price/status/deadlines come from the round.\n90% of new sales funds that round's FWA acquisitions; 10% is held as operator fees under contract rules. ETH pulls normally cash out; NFT pulls normally retain NFTs; read the documented exceptions. Do not hardcode a 0.06 ETH spin price, returns or FWA emissions.\nETH matches split equally; no matches roll over. NFT: one match wins all inventory; multiple matches need a SEPARATE VRF tie-break selecting ONE ticket for all inventory. No matches roll over. Old tickets expire.\nCount secured NFTs only. Separate pending pulls, actual/incidental ETH, purchaser rewards and company revenue. Exclude company rewards from jackpots; NFT valuations need estimate labels and source/time.\nAn empty NFT round can cancel BEFORE lottery randomness is requested; actual refunds may be below ticket cost. Accepted draw/tie requests cannot be cancelled or replaced. Permanent oracle nonfulfillment remains an unresolved lockup risk. Do not promise automatic refunds or redraws.\n\nEXPERIENCES\nHome: globe hero, exact tagline, two prominent jackpots with cutoff/countdown and ETH amount/NFT count, play/watch actions, three-step explanation, recent results and NFT gallery.\nPlay: ETH/NFT views, accessible globe number picker, Quick Pick, editable ticket lines, quantity, ETH total and round identity. Review before signing; show wallet rejection/pending/confirmed/failed states. Quick Pick chooses entries only. Enforce transaction limits and recheck round eligibility/price before submission.\nDraw room: theatrical globe-ball chamber, countdown, settlement/oracle progress, three main-ball reveals and distinct bonus reveal, result and replay. Give NFT ties their own sequence ending at the confirmed winning ticket. Include mute, reduced motion and skip-to-results; sound needs user interaction. Lazy-load heavy graphics with a lightweight fallback.\nMy tickets: game/round filters, numbers, status and actual entitlements. Implement ABI-based ETH/NFT/purchaser-reward/refund claims. NFT claims: compatible recipient, batches up to 20, per-asset success/retry. Paused sales must preserve valid claims.\nHistory: numbers, matches, rollover, tie result, prizes, explorer links. FAQ: rules, fees, custody, randomness, delays, refunds, claims, FWA relationship. Technical proofs belong in expandable details. No invented audits, licensing, endorsements or testimonials.\n\nDEMO AND INTEGRATION\nClickable demo by default, persistently labelled \"Demo - no real tickets or prizes\", with \"Watch demo draw\". Label synthetic data; use owned/licensed art. Exercise ETH splits, both rollovers, NFT ties, cancellation review, oracle delays and failed claims. Demo never signs/broadcasts; wallet connection alone cannot activate purchases.\nUse typed contract and fixture adapters. Addresses remain null until supplied; missing configuration gives demo/unavailable UI, never guessed deployments. Separate read-only and transaction-enabled modes. Transactions need verified chain/addresses/ABI, an explicit deployment activation setting and action-specific onchain checks. Production target is Ethereum mainnet; any isolated Sepolia mode must say TESTNET and identify synthetic FWA dependencies.\nPage/cache/deduplicate logs from deployment block and recover from reorgs. Key data by chain/lottery/game/round/request ID. Handle wallet/network changes and RPC failures; bound ticket/inventory reads. Support static/IPFS hosting, reload-safe routes and relative assets; no embedded secrets or assumed backend. Document optional indexers.\n\nDRAW ACCURACY\nReveal confirmed contract results; physics/timers/client randomness never choose winners. At cutoff show settlement/oracle progress. Synchronize viewers to confirmed events and label replays.\nFollow frontend/README.md: DrawRequested -> RandomnessStored -> Result. An NFT Result with multiple matches and winningTicket 0 is provisional. Wait for TieBreakRequired -> TieBreakRequested -> TieBreakRandomnessStored -> TieBreakResult before announcing its winner/claims.\nMap statuses explicitly: only Won, Rolled, Cancelled are terminal; numeric >= Won is WRONG because tie states were appended. requestDraw can advance CancellationReviewed while remaining Closed: show review progress and wait for actual DrawRequested/Cancelled evidence. Requested/TieBreakRequested can wait indefinitely; never offer replacement randomness or invented refund deadlines. Reward queueing is not delivery; reflect actual delivery.\n\nDELIVERY\nPrefer platform-supported React/TypeScript with an EVM wallet library. Ensure keyboard/focus/contrast, accessible numeric results, alt text, reduced motion and optimized assets. Treat NFT metadata as untrusted.\nRun build/type checks and tests for number validation, value/batch calculations, demo isolation, activation, statuses, NFT ties, replay and claims. Exercise mobile/desktop flows; provide screenshots. Publish the labelled demo via the Website workflow. Return preview/source, assets used, checks, missing integration inputs and setup instructions. Hide operational/debug controls from customers. Do not claim launch readiness.","baseCommit":"ed68e960dc3b9f0847caa637b5d3ea0c082bcfe3","state":"completed","createdAt":"2026-10-08T20:41:52.118Z"}]},"deliver":true,"host":false,"site":null,"launch":{"requested":false,"kind":null,"id":null,"status":null,"chainId":null},"oracleRequestId":null,"delivery":{"repoUrl":"https://github.com/identity-md-launches/launch-961-build-sorphera-smart-contracts","pullRequestUrl":"https://github.com/identity-md-launches/launch-961-build-sorphera-smart-contracts/pull/3","commit":"ed68e960dc3b9f0847caa637b5d3ea0c082bcfe3","deliveredAt":"2026-10-08T15:39:31.493Z","media":null},"media":null,"nodes":[{"key":"build_contract_project","role":"implement","state":"accepted","attempt":1,"revisions":0,"judgeRevisions":0,"dependsOn":[],"allowedPaths":[],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-10-08T15:39:05.625Z","verdict":{"status":"accepted","profile":"foundry","evaluation":"checks","rejectionCode":null,"detail":"all checks passed","verifierVersion":"0.1.0+ad90ce4c","verifiedTreeHash":"b05bab360ebf837db7731602ef2be797c1cc3ba3","at":"2026-10-08T15:39:05.623Z","failedChecks":[]},"seat":{"tokenId":"401","agentId":"51197"},"live":null}],"reviews":[{"status":"queued","chainId":1,"txHash":null,"blockNumber":null,"sentAt":null,"entries":[{"nodeKey":"build_contract_project","agentId":"51197","value":1,"role":"verification:checks"}]}]}