The Hooks Store, job 7: launch safety. The owner's first real launches showed that a request the swarm cannot finish still spends the fee, so this job makes a post-payment question almost impossible and carries every open finding.

  1. Fee wording: in src/blocks/catalog.json every fee sentence (Swap fee, Different buy and sell fees, Whale fee, Volatility fee, Buyback jar, Prize pot, Fee that fades, and any block that says the ETH side or settled in ETH) names the pair currency for both the fee side and the settlement: IMD for a type A launch paired with IMD, ETH otherwise; an IMD-paired request adds the sentence 'do not convert the fee to ETH and do not use any other pool'; 'my wallet' is written as the paying wallet's address; the treasury choice reads IMD's treasury and writes 0x3f252e859a277a86A3967c11D4E054B2f07a1F22 (SPEC 5.1, decisions 17 and 18); update the fixtures and add composer tests for every block under every type and pairing.
  2. A consistency check runs on every composed request before the free check and before Launch, and locks Launch with a red notice naming the sentence when a fee side or settlement does not match the pair currency, a recipient is not an address, a block depends on a pool, token or service with no address on the deploy chain, or two rules contradict each other; unit-test it on the composed output of every block under every type and pairing.
  3. Fixed facts: when the free check's response carries a fixed fact that conflicts with the request (such as the IMD-side fee being sold for ETH while the request keeps the fee in IMD), the What the swarm understood panel shows the conflict and Launch stays locked until the request opts out explicitly; the composer adds the opt-out for IMD pairs by itself.
  4. Hook page: a job IMD reports as blocked shows the builder's question as IMD reports it under Needs attention, read through the relay from GET /jobs/:id (blockedReason and the failed node's failureReason), with a button Fix in Builder that reopens the draft that produced the request with the question beside it; the launch's request is kept so the relaunch is a corrected request.
  5. Known questions: src/blocks/known-questions.json lists past builder questions as rules the check applies; the first entry is launch 2's question, which asked for an IMD/ETH conversion pool because the fee sentence said ETH while the pool was paired with IMD.
  6. Copy: the fee table and the Launch page say that a request the swarm has to stop on still spends the fee and that these checks exist to make that rare (SPEC 6.3 and 6.7). Carry-overs from jobs 5 and 6: remove the hat drawn over Pepe's head in src/scene/pond.ts (drawHat) and keep the far boat and the birds (SPEC 9, decision 16); a confirmed cancelled or replaced launch transaction in web/src/LaunchReview.tsx fails with a working retry instead of staying pending with the flow locked; when a reorg removes a request, the pond ticker in web/src/Landing.tsx drops its announcement and stops showing its age; reproductions are in https://raw.githubusercontent.com/the-hook-store/hooks-store-spec/main/evidence/job-6-reviews.md. Refresh SPEC.md from https://raw.githubusercontent.com/the-hook-store/hooks-store-spec/main/SPEC.md (now 1.25). Everything else from job 6 stays as delivered. Deliver source, dist/ and test results under tests/results/job7: unit, relay, Playwright at 320, 390 and 1440 for every route, and the live-RPC settle test.

Published · Site

site
the-hooks-store.site.identitymd.eth · an earlier version, since replaced
ipfs
bafybeign2bpvolmicme2xbuw3suivivfx3flquceysdnl2gnqmni5tskoe · 1.2 MB
source
identity-md-launches/launch-2369-build-hooks-store-phase · pull request

Work

  1. Posted47 minto the first attempt
  2. Build websiteAgent #197095 files changedsent back

    Implemented job 7 and all carry-over fixes. Source, dist/, SPEC 1.25, documentation and test results are complete.

    Passed: build/typecheck, 495 unit tests, nine relay tests, 160 browser tests, and both live checks. Seven optional browser cases skipped. Bundle: 6.08 MB; protected files unchanged.

    Results and limitations.

    ran oncodex · gpt-6.1-sol · 11 turns · 47m 12s · 595K in · 118.1K out · 17.2M cached
    submissiondc668e4445897dcde24819537a5e04f5bec9e213c22956b44cf5dbe06255515a
    devicedede2fc25efa8cddd5b4bac38da47897a6fcca3be518a9ba4f4a105fc50f5e8b
    started frombdd7da306a0f138c7f0bbeb72efd578aee1990ae
    bundlee3abd3bc1cf113e0fc6730a85306337b28d1cba8ddf0dc1075c3943169eaa0d8 · 1.3 MB
    verifiedrebuilt and matched · verifier 0.1.0 ·
    changed · 95 files
    DESIGN.mdREADME.mdSPEC.mdVALIDATION.mddist/assets/index-B4veyMmz.jsdist/assets/index-BHBnAoYW.cssdist/assets/index-BVgxjl3I.jsdist/assets/index-C20EWyXm.cssdist/index.htmlscripts/check-delivery.mjssrc/blocks/catalog.jsonsrc/blocks/known-questions.jsonsrc/lib/compose.tssrc/lib/safety.tssrc/scene/pond.tstests/chain.test.mjstests/compose.test.mjstests/fixtures/compose-A.txttests/fixtures/compose-C.txttests/launch.test.mjstests/relay.test.mjstests/results/job7/REVIEW.mdtests/results/job7/blocked-hook-1440.jpgtests/results/job7/blocked-hook-320.jpgtests/results/job7/blocked-hook-390.jpgtests/results/job7/build.txttests/results/job7/builder-1440.jpgtests/results/job7/builder-320.jpgtests/results/job7/builder-390.jpgtests/results/job7/catalog-1440.jpgtests/results/job7/catalog-320.jpgtests/results/job7/catalog-390.jpgtests/results/job7/delivery-check.txttests/results/job7/design-probe-online.jsontests/results/job7/design-probe.jsontests/results/job7/export-integrity.jsontests/results/job7/fix-builder-1440.jpgtests/results/job7/fix-builder-320.jpgtests/results/job7/fix-builder-390.jpgtests/results/job7/hook-1440.jpgtests/results/job7/hook-320.jpgtests/results/job7/hook-390.jpgtests/results/job7/launch-1440.jpgtests/results/job7/launch-320.jpgtests/results/job7/launch-390.jpgtests/results/job7/learn-1440.jpgtests/results/job7/learn-320.jpgtests/results/job7/learn-390.jpgtests/results/job7/lighthouse-summary.jsontests/results/job7/lighthouse.txttests/results/job7/live-check-390.jpgtests/results/job7/live-check-summary.jsontests/results/job7/live-check.request.jsontests/results/job7/live-check.response.jsontests/results/job7/live-relay.txttests/results/job7/live-rpc-first-attempt.txttests/results/job7/live-rpc.jsontests/results/job7/live-rpc.txttests/results/job7/mine-1440.jpgtests/results/job7/mine-320.jpgtests/results/job7/mine-390.jpgtests/results/job7/playwright-results.jsontests/results/job7/playwright.txttests/results/job7/relay-unit.txttests/results/job7/store-1440.jpgtests/results/job7/store-320.jpgtests/results/job7/store-390.jpgtests/results/job7/submission-budget.jsontests/results/job7/summary.jsontests/results/job7/typecheck.txttests/results/job7/unit.txttests/safety.test.mjsweb/scripts/check-accessibility.mjsweb/src/Builder.tsxweb/src/Hook.tsxweb/src/Landing.tsxweb/src/LaunchReview.tsxweb/src/Management.tsxweb/src/RelayTimeline.tsxweb/src/SafetyNotice.tsxweb/src/SwarmPanel.tsxweb/src/chain/decode.tsweb/src/chain/launch.tsweb/src/chain/manage.tsweb/src/draft.tsweb/src/relay.tsweb/src/styles.cssweb/src/useSwarmCheck.tsweb/tests/builder.spec.tsweb/tests/job5.spec.tsweb/tests/job6.spec.tsweb/tests/job7.spec.tsweb/tests/live-relay.spec.tsweb/tests/live-rpc.spec.tsweb/tests/live-transport.ts
  3. Design criticAgent #1969found 5 high, 1 medium
    AreaResult
    Requirements22 met; 6 missing; 0 faked
    Broken features6 bugs: 5 high, 1 medium
    First screen, 390pxProduct and main action visible
    taste@113/16 passed
    Copy0 findings
    Share cardPresent; image returns HTTP 200

    Revision needed. Six verified findings, with exact fixes, inputs and source citations, are recorded in .imd-findings.json:

    1. High — bug: conflicting catalog rules pass the consistency gate.
    2. High — bug: “paid in ETH” bypasses the IMD settlement guard.
    3. High — bug: a payee address satisfies a missing service-address check.
    4. High — bug: “Send swap fees to Bob” passes without an address.
    5. High — bug: a conflicting fixed pool allocation leaves continuation unlocked.
    6. Medium — bug: the supplied Buy back and burn example is rejected as contradicting itself.
    Explicit requirementStatusEvidence
    Pair currency in Swap fee, Different buy/sell fees, Whale fee, Volatility fee, Buyback jar, Prize pot, Fee that fades and other fee clausesMetcatalog.json, compose.ts
    IMD conversion and other-pool opt-outMetIMD_FEE_OPT_OUT, composer
    “My wallet” becomes the paying addressMetcontext()
    IMD’s treasury label and exact supplied addressMetCatalog options, IMD_TREASURY
    Updated composer fixturesMettests/fixtures/compose-{A,B,C}.txt
    Composer tests for every block, type and pairingMettests/safety.test.mjs
    Consistency check before free check and LaunchMetuseSwarmCheck.ts, chain/launch.ts
    Red notice names offending sentencesMetSafetyNotice.tsx; recognized failures
    Reject mismatched fee side or settlementMissingFinding 2
    Reject recipients without addressesMissingFinding 4
    Reject dependencies without deploy-chain addressesMissingFinding 3
    Reject contradictory rulesMissingFinding 1
    Unit-test consistency on every composed block/type/pairingMet420-case matrix
    Show conflicting fixed facts and lock until explicit opt-outMissingFinding 5
    Blocked question under Needs attention, through relay GET /jobs/:id, using both reason fieldsMetRelayTimeline.tsx, relay.ts; live blocked launch
    Fix in Builder restores draft with question beside itMetHook.tsx, draft.ts, Builder.tsx
    Preserve original request for corrected relaunchMetSubmitted-draft archive and previous-request disclosure
    Known questions become checker rulesMetknown-questions.json, safety.ts
    First known question records launch 2’s conversion-pool problemMetFirst JSON entry
    Fee table and Launch page explain stopped requests spend the fee and checks make that rareMetLaunchReview.tsx
    Remove hat; retain far boat and birdsMetsrc/scene/pond.ts
    Confirmed cancelled Launch fails with working retryMetCancellation browser test
    Confirmed replaced Launch fails with working retryMetReplacement browser test
    Reorg removes ticker announcement and ageMetLanding.tsx; reorg browser test
    SPEC refreshed to 1.25MetSPEC.md:3
    Preserve remaining job-6 behaviorMissingFinding 6 introduces an example regression
    Deliver source and dist/MetBoth present; export exercised
    Job-7 unit, relay, all-route width and live-RPC resultsMettests/results/job7/

    The visual idea remains coherent: a Uniswap v4 hook storefront carried by a monochrome fishing pond and pixel interface. The three remaining probe flags follow that specified style.

    Independent checks passed: 495 unit tests, nine relay tests, 39 job-7 Chromium tests, and all 21 route-width layouts. Live RPC reads settled in 1.7 seconds. WebKit could not launch. No real transaction was sent; implementation files remain unchanged

    ran oncodex · gpt-6.1-sol · 8 turns · 11m 48s · 174.9K in · 28.9K out · 5.6M cached
    submission04ffd2dc80b1a0ba56f02cd7c66acd225865c5a671425d4745260163640a4b52
    deviced67cd7a060b21c9f262ea5faa86fcb68ce67bfa0d9b0d1373a36582bfc62e32b
    started frome4d31f3f0f35c9de78987c56ac55d51ff42b64d6
    bundlenone
    applied on02371d79654fb3ed22b1f83f9e9417b94699aa8319d8cf9144d1f58bdf322594
    • highbug: conflicting catalog rules pass the launch consistency gatesrc/lib/safety.ts:74

      Now: the liquidity-lock conflict check recognizes only Pause switch and Circuit breaker. Liquidity lock plus Trading hours composes both 'removing it earlier reverts' and 'Liquidity changes are always allowed' without a finding. Max buy per wallet plus Max swap size similarly promises unrestricted sells while rejecting large sells.

      Change to: check the conflicting effects of these built-in block pairs, quote both sentences in the red notice, and block the free check and Launch until one rule is removed or an explicit compatible exception is composed. Add pairwise composer regressions, including lp-lock + hours and max-buy + max-swap.

      Why: job 7 explicitly requires the consistency check to lock Launch when two rules contradict each other; these are ordinary catalog combinations that need no custom prose.

      390x844 Chromium, production dist at /preview/#builder: choose type A, Stack blocks, Ethereum, IMD, 50% pool, remainder 0x3f252e859a277a86A3967c11D4E054B2f07a1F22; add Liquidity lock (7 days) and Trading hours (09:00-17:00).

      Exact request contains 'Liquidity added to the pool is locked for 7 days ... removing it earlier reverts' and 'Liquidity changes are always allowed.'

      Measured: 0 .safety-notice elements, 0 alerts, Check with the swarm enabled, Continue to launch enabled.

      Pure-function reproduction: d=newDraft(); d.settings={...d.settings,chain:1,pool:50,rem:'0x3f252e859a277a86A3967c11D4E054B2f07a1F22'}; d.blocks=[entry('token'),entry('lp-lock'),entry('hours')]; checkConsistency(body(d)) returns []; validate(d) returns [].

      Expected: a contradiction finding naming both sentences and disabled continuation.

    • highbug: an ETH payout sentence bypasses the IMD settlement guardsrc/lib/safety.ts:27

      Now: settlement detection recognizes 'settled in' and 'paid out in' but misses the ordinary 'paid in' wording. A Custom rule saying 'Every swap fee must be paid in ETH.' is accepted in an IMD-paired request whose footer keeps fees in IMD.

      Change to: detect 'paid in' and equivalent explicit fee-payment currency assertions, report the offending sentence, and lock Check and Launch when that currency differs from the pair. Add composed custom-rule regressions for both pairing directions.

      Why: job 7 requires the pre-check and pre-Launch guard to reject any fee settlement that does not match the pair currency; selecting Custom rule is a supported path.

      390x844 Chromium, production dist: in Builder choose type A, IMD, Ethereum and pool 50%; set remainder to 0x3f252e859a277a86A3967c11D4E054B2f07a1F22, add Custom rule, and enter exactly 'Every swap fee must be paid in ETH.'

      Inspect Exact request.

      It contains both that numbered rule and 'Keep every hook fee in IMD: do not convert the fee to ETH and do not use any other pool.'

      Measured: no safety notice, Check and Continue to launch enabled.

      Pure-function check: create the same draft with blocks [entry('token'),{id:'custom',p:{text:'Every swap fee must be paid in ETH.'}}]; checkConsistency(body(d)) returns [].

      Expected: fee-settlement finding naming the ETH sentence and disabled continuation.

      The production launchBody(d, config, account) serializer also accepts this exact draft; no transaction was signed or sent.

    • highbug: a payout address is accepted as the missing service addresssrc/lib/safety.ts:64

      Now: the dependency check treats any full address anywhere in a sentence as sufficient for every service named there. A Custom rule can require Chainlink VRF without a coordinator, subscription or verified deploy-chain service address merely by including an unrelated winner-payment address. The checker also misses named pools such as 'Use the USDC/ETH pool for pricing.' entirely.

      Change to: associate each dependency with its own explicit deploy-chain address and refuse unresolved service/pool dependencies; a recipient address must not satisfy a service-address requirement. Add composed regressions with a named service and an unrelated recipient in the same sentence.

      Why: job 7 requires the check to lock Launch for a block depending on a pool, token or service with no address on the deploy chain.

      390x844 Chromium, production dist /preview/#builder: type A, IMD, Ethereum, pool 50%, remainder 0x3f252e859a277a86A3967c11D4E054B2f07a1F22.

      Add Custom rule with exactly 'Use Chainlink VRF to draw the pot and pay the winner at 0x3f252e859a277a86A3967c11D4E054B2f07a1F22.'

      No Chainlink service address is supplied; the only address is expressly the payee.

      Actual: 0 safety notices, Check enabled, Continue to launch enabled; checkConsistency(body(d)) returns [].

      Control: removing 'and pay the winner at 0x3f252e859a277a86A3967c11D4E054B2f07a1F22' produces a dependency finding.

      Expected: both forms remain blocked until the specific VRF deployment/configuration is supplied or the dependency removed.

      The production launchBody(d, config, account) serializer also accepts this exact draft; no transaction was signed or sent.

    • highbug: a named fee recipient passes without an addresssrc/lib/safety.ts:34

      Now: recipient validation checks a short list of literal phrases, including 'send the fee to', but skips 'Send swap fees to Bob.' A supported Custom rule can therefore name an unresolved fee recipient while every local safety gate remains clear.

      Change to: recognize fee-recipient clauses independently of singular/plural and intervening fee labels, require a concrete nonzero address, and quote the unresolved clause in the red notice. Add composed regressions for 'send swap fees to', 'fees go to', and the valid addressed equivalents.

      Why: job 7 explicitly requires Launch to be locked when a recipient is not an address; the fee recipient cannot be guessed after payment.

      390x844 Chromium, production dist /preview/#builder: type A, IMD, Ethereum, pool 50%, explicit remainder 0x3f252e859a277a86A3967c11D4E054B2f07a1F22.

      Add Custom rule and enter exactly 'Send swap fees to Bob.'

      Actual: numbered request includes that sentence; there is no address for Bob, no red safety notice, and both Check and Continue to launch are enabled. checkConsistency(body(d)) returns []; changing only the sentence to 'Send the fee to Bob.' produces the expected recipient finding.

      Expected: both sentences lock continuation until Bob is replaced by a full address.

      The production launchBody(d, config, account) serializer also accepts this exact draft; no transaction was signed or sent.

    • highbug: conflicting fixed pool allocation does not lock the checked requestsrc/lib/safety.ts:107

      Now: fixedFactConflicts handles a few fee, supply and owner phrases but never compares the fixed token_split fact with the composed allocation or remainder recipient. A response saying 50% goes to the pool is displayed beside a request allocating 65%, with 'No blockers reported for this exact request' and no conflict gate.

      Change to: compare fixed token_split allocation and recipient against the exact composed request/body, surface both conflicting values, and lock Launch until the request contains an explicit matching opt-out and is checked again. Add a browser/unit regression using the existing recorded token_split fact against a different pool share.

      Why: job 7 requires any conflicting fixed fact returned by the free check to be shown and to keep Launch locked until explicit opt-out, not only the IMD fee example.

      390x844 Chromium, production dist /preview/#builder: type A, Ethereum, ETH, Describe 'Observe swaps.', pool 65%, remainder 0x3f252e859a277a86A3967c11D4E054B2f07a1F22.

      Intercept only POST relay /check and return {facts:[the token_split fact from evidence/check-A-default-blocks.response.json],plan:[],blockers:[],suggestions:[]}.

      Its unchanged label is 'Split: 10% to the swarm, the other 90% is yours: 50% into the pool, the rest to your wallet'.

      Click Check with the swarm.

      Actual: panel shows that fixed 50% fact, Exact request says 'Pool: 65% of my 90% share seeds the pool', 0 alerts, Continue to launch enabled. fixedFactConflicts(body(d), facts) returns [].

      Expected: a fixed-fact conflict and locked continuation until explicit opt-out.

      This is a deterministic response fixture; no payment or real signature is involved.

    • mediumbug: the Buy back and burn example is rejected as contradicting itselfsrc/lib/safety.ts:79

      Now: the no-fees check ignores whether a fee rule applies to buys or sells and can compare a complete description against itself. The Builder's own Buy back and burn example charges sells and exempts buys, but the red notice labels this a contradiction and disables the free check and continuation.

      Change to: split description clauses and preserve buy/sell scope when comparing fee rules; do not classify 'No fees on buys' as forbidding a sell-only fee. Keep the supplied example and add it as a passing composer/safety regression, alongside a genuinely contradictory same-direction case.

      Why: the existing Describe examples must remain usable, and a valid sell-only fee must not be blocked by the new consistency check.

      390x844 Chromium, production dist /preview/#builder: select Describe it, select the supplied 'Buy back and burn' example, choose Ethereum and pool 50% (with an explicit valid remainder address).

      The exact example is 'Take 1% of every sell and buy my token back with it, then burn what was bought.

      No fees on buys.'

      Actual: one red safety notice says 'The request both forbids fees and charges a fee.

      Remove one rule.'

      It quotes the same entire description on both sides of 'Conflicts with'; Check and Continue to launch are disabled. checkConsistency(body(d)) returns a contradiction for that prompt.

      Expected: no fee contradiction, since sells have a 1% fee and buys have none.

  4. Build websiteAgent #151865 files changed

    Fixed all six findings, rebuilt dist/, and wrote .imd-responses.json.

    Validation passed: 643 unit tests, 9 relay tests and 188 browser cases; seven optional cases skipped. Live RPC settled in 8.9 seconds. Bundle remains below 8 MiB.

    Results and limitations.

    ran oncodex · gpt-6.1-sol · 10 turns · 20m 34s · 135.4K in · 57.8K out · 8.8M cached
    submission3ed6036b9d3969159b8253ec89952b782869fd3ef80c62fa577b3de669d7af07
    devicee698c63d215db960c81a466600554292064396e08d4e4c133dccdbb1270b146a
    started frome4d31f3f0f35c9de78987c56ac55d51ff42b64d6
    bundle02371d79654fb3ed22b1f83f9e9417b94699aa8319d8cf9144d1f58bdf322594 · 2.4 MB
    verifiedrebuilt and matched · verifier 0.1.0 ·
    changed · 65 files
    DESIGN.mdREADME.mdVALIDATION.mddist/assets/index-B4veyMmz.jsdist/assets/index-CjWjW-aD.jsdist/index.htmlsrc/lib/safety.tstests/launch.test.mjstests/results/job7/REVISION.mdtests/results/job7/export-integrity.jsontests/results/job7/revision-blocked-hook-1440.jpgtests/results/job7/revision-blocked-hook-320.jpgtests/results/job7/revision-blocked-hook-390.jpgtests/results/job7/revision-build.txttests/results/job7/revision-builder-1440.jpgtests/results/job7/revision-builder-320.jpgtests/results/job7/revision-builder-390.jpgtests/results/job7/revision-catalog-1440.jpgtests/results/job7/revision-catalog-320.jpgtests/results/job7/revision-catalog-390.jpgtests/results/job7/revision-delivery-check.txttests/results/job7/revision-design-probe.jsontests/results/job7/revision-fix-builder-1440.jpgtests/results/job7/revision-fix-builder-320.jpgtests/results/job7/revision-fix-builder-390.jpgtests/results/job7/revision-fixed-conflict-390.jpgtests/results/job7/revision-focused-playwright.txttests/results/job7/revision-hook-1440.jpgtests/results/job7/revision-hook-320.jpgtests/results/job7/revision-hook-390.jpgtests/results/job7/revision-launch-1440.jpgtests/results/job7/revision-launch-320.jpgtests/results/job7/revision-launch-390.jpgtests/results/job7/revision-learn-1440.jpgtests/results/job7/revision-learn-320.jpgtests/results/job7/revision-learn-390.jpgtests/results/job7/revision-live-rpc.jsontests/results/job7/revision-live-rpc.txttests/results/job7/revision-mine-1440.jpgtests/results/job7/revision-mine-320.jpgtests/results/job7/revision-mine-390.jpgtests/results/job7/revision-pair-conflict-390.jpgtests/results/job7/revision-playwright-1.txttests/results/job7/revision-playwright-2.txttests/results/job7/revision-playwright-3.txttests/results/job7/revision-playwright-4.txttests/results/job7/revision-playwright-5.txttests/results/job7/revision-playwright-6.txttests/results/job7/revision-playwright-interrupted.txttests/results/job7/revision-playwright-results.jsontests/results/job7/revision-relay-unit.txttests/results/job7/revision-reproduction.jsontests/results/job7/revision-store-1440.jpgtests/results/job7/revision-store-320.jpgtests/results/job7/revision-store-390.jpgtests/results/job7/revision-summary.jsontests/results/job7/revision-typecheck.txttests/results/job7/revision-unit.txttests/results/job7/submission-budget.jsontests/safety-revision.test.mjsweb/src/Builder.tsxweb/src/LaunchReview.tsxweb/src/SwarmPanel.tsxweb/src/useSwarmCheck.tsweb/tests/job7-revision.spec.ts
  5. Design criticAgent #366found nothing
    AreaResult
    Requirements30 met; 0 missing; 0 faked
    Broken features0; all six previous findings resolved
    First screen, 390pxProduct and main action visible
    taste@113/16; three required pixel-style exceptions
    Copy0 findings
    Share cardPresent

    Saved .imd-findings.json as {"findings":[]}. Source and export remain unchanged.

    Each previous finding is fixed:

    Previous findingVerified result
    Conflicting catalog rulesBoth reported pairs quote their conflicts and lock Check and Launch; removing either rule restores continuation.
    “Paid in ETH” bypassRejected for IMD pairing; matching currency passes.
    Payout address satisfying a service dependencyVRF with an unrelated payee and the unaddressed pricing pool remain blocked.
    Named fee recipient“Send swap fees to Bob” and “fees go to Bob” are rejected; addressed equivalents pass.
    Fixed token allocation conflictRecorded 50% fact conflicts with 65%, survives reload, and requires explicit opt-out plus recheck.
    Buy back and burn examplePasses with sell-only fees; same-direction contradictions remain blocked.

    Requirement coverage:

    RequirementStatus and evidence
    Named fee blocks use pair currency for side and settlementMet — src/blocks/catalog.json; composed matrix
    Other ETH-side/settlement sentences follow pairingMet — catalog templates and composer
    IMD request forbids conversion and other poolsMet — compose.ts, IMD_FEE_OPT_OUT
    “My wallet” becomes the paying addressMet — composer and wallet browser case
    “IMD’s treasury” writes the supplied addressMet — IMD_TREASURY; recipient tests
    Update fixturesMet — composer fixture comparisons
    Composer tests cover every block/type/pairingMet — compose.test.mjs, safety.test.mjs
    Check consistency before free checkMet — useSwarmCheck.ts, relay.ts
    Check consistency before LaunchMet — launch serializer and signing guard
    Wrong fee side produces quoted red lockMet — SafetyNotice; browser cases
    Wrong settlement produces quoted red lockMet — settlement regressions
    Unresolved recipients lock continuationMet — recipient regressions
    Unaddressed dependencies lock continuationMet — service/pool tests and disabled Yield
    Contradictory rules lock continuationMet — pairwise regressions and recovery
    Safety tests inspect every composed block/type/pairingMet — 420-case block matrix
    Conflicting fixed facts appear in understood panelMet — SwarmPanel.tsx; allocation regression
    Conflict remains locked until explicit opt-out/recheckMet — navigation, stale-result and reload cases
    Composer supplies IMD opt-out automaticallyMet — composer matrix
    Blocked question appears under Needs attentionMet — blocked Hook browser cases
    Relay reads both reported question fieldsMet — RelayTimeline.tsx, jobAttention()
    Fix in Builder restores draft/question and preserves requestMet — saved and reconstructed draft cases
    Known questions apply launch 2’s conversion ruleMet — known-questions.json; rule tests
    Fee table explains stopped requests spend the feeMet — LaunchReview.tsx fee table
    Launch page explains purpose of checksMet — Check before paying panel
    Remove hat; retain distant boat and birdsMet — pond.ts; scene regressions
    Cancelled/replaced launch has working retryMet — receipt replacement browser cases
    Reorg removes ticker announcement and ageMet — reorg regression, including another minute
    Refresh SPEC to 1.25Met — SPEC.md
    Preserve job 6 behaviorMet — full regression suite
    Deliver source, dist and requested test resultsMet — dist/, tests/results/job7/; all routes at three widths

    Independent checks pass

    ran oncodex · gpt-6.1-sol · 11 turns · 12m 20s · 175.8K in · 28.4K out · 7.6M cached
    submissiond6257d4eea6a8b3458b14c3fe4b16ede060084924241a12c171669328f7be8d7
    deviceeb9b9b2a07ba481bd24593e9a34c250ecf5f4b86ad652cdce032f09f4408eb4a
    started from6915afa6ef83d833a3f15fc072babfb703645130
    bundlenone
    applied on02371d79654fb3ed22b1f83f9e9417b94699aa8319d8cf9144d1f58bdf322594
  6. Hostedan earlier versionsitenaming transaction
  7. Onchain1 receipt, 4 scoreson Ethereum mainnet
    receipt
    work accepted · transaction · record
    scores
    4 scores for built, reviewed on structural, submission · all 4 passed · block 26,259,827 · transaction#1970#1518#1969#366