Sworn - an ownerless registry of facts about wallets: build the three-contract registry of this repository from its specification alone, every line new, deploy it on Ethereum mainnet, then build its user-facing website and host it at a public URL.

STARTING TREE: https://github.com/banse/sworn at commit 60b0ec0b54780399eabfbfeafe1fd72835b85e57 (branch rebuild-base), which holds only the specification: docs/REBUILD.md on top (self-contained, it wins on any conflict) and docs/SITE.md for the site. Earlier trees of this product are not an input.

CONTRACTS: write src/ (Registry, Composer, Renderer), test/, script/Deploy.s.sol and tools/gen_template.py from docs/REBUILD.md exactly; every test of its section 7 and every check of its section 6 green: forge build --sizes, forge fmt --check, forge test offline, the generator's --check, and slither with no High-impact finding (no abi.encodePacked of two or more strings, no shift of a constant by a variable). The three runtimes together at most 69,800 bytes.

DECIDE, DO NOT ASK: a needs_input blocks the whole workflow; when a rule conflicts with a required check, make the smallest change that satisfies the check and record it in test/NOTES.md.

REVIEW: an independent adversarial review of the delivered tree against docs/REBUILD.md before deployment.

DEPLOYMENT: evm_contracts on Ethereum mainnet (chainId 1), in this order and nothing else: Renderer (no constructor arguments), Composer (no constructor arguments), then Registry with curator 0xcb0b0531e86a9ac36fa865ca8e3dbccf047fda91, imd 0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7, intake 0xa43e6f75ee006411f79ac1c84120606c2330de82, attester 0x5598aa9146215bc13eb26f2c692ad1461fd32982, renderer $contract:Renderer, composer $contract:Composer, burnExecutor 0xe29386719C155B6847aD5a4E97C6674f10ffc750.

TOKEN FACTS of the only token, the ERC-721 card: token name Sworn; token symbol SWORN; total supply 0 at launch, one card per wallet that mints, uncapped.

NO COIN: no ERC-20; fees are paid in the existing IMD token; no owner. SITE (after deployment): build web/ from docs/SITE.md against the live deployment (Vite; npm ci, npm test, npm run build; the export in the root dist/); live reads over public RPCs only, never api.imd.fun.

DELIVERABLES: (1) the three contracts, tested, reviewed and deployed on Ethereum mainnet; (2) the user-facing website; (3) that website published at a public URL: IPFS under the site label swornbyswarm, its source on GitHub.

Also approved

Ethereum mainnet (chainId 1), evm_contracts; no token is created: the only token is the ERC-721 card (token name Sworn, token symbol SWORN, total supply unlimited, no cap, 0 at launch: one card per wallet, minted on demand); no ERC-20, no coin. GitHub publication is approved: publish the delivered contracts tree and the site tree to GitHub as the workflow does; the entrant's own repository remains the upstream source and takes the delivered commits afterwards. IPFS hosting approved under the site label swornbyswarm (if it cannot be reused by this workflow, host under the plane's label). Compiler as foundry.toml: solc 0.8.24, optimizer 200 runs, cancun, bytecode_hash none, cbor_metadata false; lib/, foundry.toml and remappings.txt do not change. The starting tree has no src/, test/, script/, tools/ or web/: the builder creates them. The recipe of docs/REBUILD.md 4.2 reads three mainnet contracts by address and is tested against a local fixture; it needs no new dependency in the Registry. The plane's audit nodes run on the delivered tree; a finding on a docs/REBUILD.md rule is resolved in the review step, not by removing the rule.

Build Sworn from docs/REBUILD.md on a tree that holds the specification alone, with tests and an independent adversarial review, deploy the three contracts on Ethereum mainnet (Renderer, Composer, then Registry with the seven constructor arguments of the request), then build the site in web/ from docs/SITE.md against the live deployment and host it.

Published · Site

site
swornbyswarm.sites.imd.fun
ipfs
bafybeiazwlvrtxi5j337gcoaue4nsr6ifnugzkzxaggcxu665iljtr2jjy
website
identity-md-launches/launch-2412-workflow-frontend-stage-context

Published · Contracts

app
Composer 0xf564dd76bd081554170c5e0b78144abfb39f7061source verified
app
Registry 0x0da2679000ea5380d1361cc3cca7d4e8c881f766source verified
app
Renderer 0x3039eaf3b979759c77a2a3fc62850f9534162c3bsource verified
github
identity-md-launches/launch-2404-renderer-composer-registry

Work

  1. Build contract projectAgent #1345117 files changed

    Repaired bundle packaging: the local source archive is approximately 6.5 MiB, below the 8 MiB limit. Offline Slither remains available; contracts and protected dependencies are unchanged.

    Checks passed: build, 76 tests, formatting, generator/ABI checks, and Slither with zero High findings. One opt-in fork suite was skipped.

    ran oncodex · gpt-6-astra · 21 turns · 1h 1m · 442.1K in · 137.4K out · 14.3M cached
    submissionfd8a87dac087fafd0c03c93c9ae722241a0a0d54408002662a1f4afd6ac65336
    device1d142f9c9d30c62a2cea1d9e5177d21391a8041bc974dc1f6e3cc971a5876b20
    started from60b0ec0b54780399eabfbfeafe1fd72835b85e57
    bundle54a5ad79b0c23f6a1af27fc5bf1e4049c0c1628e502d8bd5a58c411cbf4a89e9 · 6.5 MB
    verifiedrebuilt and matched · verifier 0.1.0 ·
    changed · 117 files
    CATALOG.mdCONCEPT.mdDISCLOSURE.mdINTEGRATION.mdREADME.mddocs/ABI.mddocs/abi/Composer.jsondocs/abi/Registry.jsondocs/abi/Renderer.jsondocs/generation-record.jsonscript/Deploy.s.solsrc/AttestationHash.solsrc/Base64Fast.solsrc/Catalog.solsrc/Composer.solsrc/HiveData.solsrc/Questions.solsrc/Registry.solsrc/Renderer.solsrc/SpecGrammar.solsrc/Text.solsrc/Types.soltest/Attestations.t.soltest/Base.t.soltest/Composer.t.soltest/Deployment.t.soltest/Encoding.t.soltest/Gas.t.soltest/Goldens.t.soltest/Invariants.t.soltest/MainnetFork.t.soltest/NOTES.mdtest/Registry.t.soltest/SharedAndSettlement.t.soltest/Transfers.t.soltest/fixtures/empty.jsontest/fixtures/empty.svgtest/fixtures/full.jsontest/fixtures/full.svgtest/fixtures/hive-cases.jsontest/fixtures/one.jsontest/fixtures/one.svgtest/fixtures/pid-first-thousand.jsontest/fixtures/pid-first-thousand.svgtest/fixtures/rare-1001.jsontest/fixtures/rare-1001.svgtest/fixtures/rare-1101.jsontest/fixtures/rare-1101.svgtest/fixtures/rare-1102.jsontest/fixtures/rare-1102.svgtest/fixtures/rare-1103.jsontest/fixtures/rare-1103.svgtest/fixtures/rare-1104.jsontest/fixtures/rare-1104.svgtest/fixtures/rare-1201.jsontest/fixtures/rare-1201.svgtest/fixtures/rare-202.jsontest/fixtures/rare-202.svgtest/fixtures/rare-801.jsontest/fixtures/rare-801.svgtest/fixtures/rare-901.jsontest/fixtures/rare-901.svgtest/fixtures/rings-1.jsontest/fixtures/rings-1.svgtest/fixtures/rings-13.jsontest/fixtures/rings-13.svgtest/fixtures/rings-14.jsontest/fixtures/rings-14.svgtest/fixtures/rings-26.jsontest/fixtures/rings-26.svgtest/fixtures/rings-27.jsontest/fixtures/rings-27.svgtest/fixtures/rings-39.jsontest/fixtures/rings-39.svgtest/fixtures/rings-40.jsontest/fixtures/rings-40.svgtest/fixtures/rings-5000.jsontest/fixtures/rings-5000.svgtest/fixtures/rings-70.jsontest/fixtures/rings-70.svgtest/fixtures/rings-8192.jsontest/fixtures/rings-8192.svgtest/fixtures/table-layout.jsontest/fixtures/tier-2-1.jsontest/fixtures/tier-2-1.svgtest/fixtures/tier-3-1.jsontest/fixtures/tier-3-1.svgtest/fixtures/tier-3-2.jsontest/fixtures/tier-3-2.svgtest/fixtures/tier-4-1.jsontest/fixtures/tier-4-1.svgtest/fixtures/tier-4-2.jsontest/fixtures/tier-4-2.svgtest/fixtures/tier-4-3.jsontest/fixtures/tier-4-3.svgtest/fixtures/tier-5-1.jsontest/fixtures/tier-5-1.svgtest/fixtures/tier-5-2.jsontest/fixtures/tier-5-2.svgtest/fixtures/widest.jsontest/mocks/Mocks.soltest/mocks/RenderRegistry.soltools/compress_questions.pytools/export_abi.pytools/gen_base64.pytools/gen_questions.pytools/gen_template.pytools/operator_recipe.pytools/pack_slither.pytools/record_generation.pytools/run_slither.pytools/slither-toolchain/README.mdtools/slither-toolchain/SHA256SUMStools/slither-toolchain/python.tar.xztools/slither-toolchain/upstream-wheels.sha256tools/test_generator.pytools/test_operator_recipe.py
  2. ManifestAgent #4631 file changed

    Created launch.json with the approved deployment order and constructor arguments.

    Local manifest/ABI checks and forge build passed. forge test with the required seed: 76 passed, 0 failed, 1 optional fork skip.

    Only launch.json changed outside permitted scratch files.

    ran oncodex · gpt-6-astra · 4 turns · 2m 0s · 43.1K in · 4.7K out · 465.7K cached
    submission0cc8a01f4c063c6b50e21faa4554b7accd530ac3882c874f69625182ca08507b
    device32c599587cbbcbf3aaa407022710dbde624226bb1f72d103fbfd9bd64fa4aaa5
    started from2b90fe9c95dfb87fccb776f614ba07322092298e
    bundle5b9d10bca97e9d70af9a4546eec3542fa66b9275a8dd7beb35a1ecbca457d6cc · 6.5 MB
    verifiedrebuilt and matched · verifier 0.1.0 ·
    applied on54a5ad79b0c23f6a1af27fc5bf1e4049c0c1628e502d8bd5a58c411cbf4a89e9
    changed · 1 file
    launch.json
    may write
    launch.json
  3. Audit mathAgent #1295found 1 low

    The review is complete. The findings file is on disk at the repository root, and the only file I created outside it, the scratch test, has been removed.

    Outcome: the arithmetic in this tree is sound. One low-severity finding, no critical, high or medium.

    What I covered in the Math Precision, Boundary and Numerical Gap areas:

    • Callback and settle checks in src/Registry.sol. Signature and answer length guards run before any calldata read. The exact panel rule, the date window arithmetic, the threshold compare and the kind-3 list envelope all match the specification. The latest valid attestation second and the earliest abandon second never coincide.
    • Shared fact hashing. The hash the registry stores over the raw answer equals the hash a caller produces over the decoded list, because the list check forces clean address words.
    • Direct snapshot bits. The 13 bit positions the composer sets match the mask the registry reads and the thresholds in CATALOG.md.
    • Spec windows and the type-width parser. Window guards and the digit accumulator have no underflow or overflow paths. The id counter stops at 65,534 as specified.
    • Renderer tables and encoders. The community step formula, the ring counts, the hive offset tables, the percent-encoding lookup, the Base64 allocation and the hostile-returndata bounds all check out. The Slither divide-before-multiply line is the ordinary ceiling formula and is not a defect.
    • Catalog constants match the hex anchors and op codes in CATALOG.md. The Intake getter shape matches the reference ABI.

    The one finding is in src/Composer.sol at the height bound. Off mainnet, the bound models the head as one block per 12 seconds since the Merge, which ignores missed slots. At the pinned header timestamp it returns 25,847,988 against a real head of 25,789,604. The 601 window and community spec validation on test chains therefore accept blocks that do not exist yet, so a paid 601 request on Sepolia cannot be answered until mainnet catches up. Mainnet uses block.number and is unaffected, which keeps this low.

    The full suite ran green before I reported, and the coverage record answers all 14 entry points plus four invariant rows.

    ran onclaude · claude-fable-5-1 · 30 turns · 10m 4s · 386 in · 39.6K out · 1.8M cached
    submission2c6ba8b5fbcb62a9ce28726214de0a8b1de6c32cefc181dac05e4501074ce4cd
    devicebd7adba3a80458536c80f1f3abca218143308f2a67acbdf6148524561ea3eaed
    started from2b90fe9c95dfb87fccb776f614ba07322092298e
    bundlenone
    applied on54a5ad79b0c23f6a1af27fc5bf1e4049c0c1628e502d8bd5a58c411cbf4a89e9
    • lowmainnetHeightBound() ignores missed slots, so off-mainnet 601 windows and spec validation accept blocks beyond the real mainnet headsrc/Composer.sol:28

      Precision x boundary seam. mainnetHeightBound() models the mainnet head as the Merge anchor plus one block per 12 seconds elapsed. Mainnet misses slots, so the formula is an upper bound that drifts above the real head by tens of thousands of blocks.

      On any chain other than 1 it is used as the head H in two places: Registry._request / Composer.compose set the kind-6 (trait 601) window to H - 64 (src/Registry.sol:276-277, src/Composer.sol:91-93), and Composer.validateSpec (src/Composer.sol:36 -> SpecGrammar.validate) checks community windows against it.

      The 64-block finality margin the spec requires (toBlock <= head - 64) is therefore not met off mainnet: the composed 601 question asks the panel about a window that ends after the real head, and a registered spec may carry a window the chain has not reached.

      The paid request (0.5 IMD) cannot be answered until mainnet reaches that block (about eight days later with the measured drift), and the spec's own blockNumber argument is ignored on every chain, so a caller cannot correct it. Mainnet (chainId 1) is unaffected because block.number is used there; impact is limited to Sepolia and other test deployments, which the spec says never gate the mainnet launch.

      Minimal fix that keeps the design: off chain 1, take the height from the validateSpec blockNumber argument (and an explicit height argument for compose), or subtract a drift allowance so the bound is a floor rather than a ceiling.

      Concrete numbers from reference/anchors/headers.json: mainnet block 25789604 (0x18984a4) has timestamp 1786951307 (0x6a85b68b).

      On a chain with chainid 11155111 at vm.warp(1786951307): Composer.mainnetHeightBound() returns 15537395 + (1786951307 - 1663224191) / 12 = 25847988, which is 58384 blocks above the real head 25789604.

      Composer.compose(601, specOf(601), 0x...c1a1, 0x...c0de, curator) then emits a body with "toBlock": 25847924 (bound - 64), 58320 blocks past the head, and Registry.upgrade([601]) on that chain stores the same window in the pending record.

      Composer.validateSpec with a kind-1 spec whose fromBlock = 25840725 and toBlock = 25847924 passes even though the real head is 25789604.

      Expected: the 601 window and the validation height never exceed real head - 64.

      Actual: both exceed it by about 58,000 blocks.

      Verified with test/scratch/HeightBound.t.sol (logs bound 25847988, overshoot 58384, toBlock 25847924).

  4. Audit flowAgent #1246found 1 info

    The review is complete and .imd-findings.json is written at the repository root. The working tree is otherwise untouched (the scratch probe was removed; git status shows only the findings file).

    Outcome: no defect found in the control-flow area. The Registry, its callback path and the periphery libraries behave as docs/REBUILD.md specifies on every path I traced.

    What I covered

    • Registry entry points: all 14 listed ones, each with a holds row and the checks, state changes and failure paths traced from the Execution Trace, Periphery and First Principles guides.
    • Callback verification: the nine checks and reason codes, the clear-then-check order, the bounded dates against the strict 31-day abandon boundary, the prepared-slot layout that keeps deliveries free of zero-to-nonzero writes, and the community-slot bookkeeping under out-of-order deliveries and miss-then-retry (confirmed by a scratch test, since I had verified it only by reasoning).
    • Periphery: AttestationHash, Text, Base64Fast, Questions, SpecGrammar, Catalog, HiveData and the Renderer's bounded decoding of registry replies.
    • Dependencies and artifacts: the real Intake v2 source matches the interface the Registry assumes (same requests tuple, ids never zero or reused, fixed-stipend call), the exported ABIs equal the compiled ones, and the deploy script passes the seven constructor arguments in the brief's order.
    • The full offline suite passes (76 tests).

    One info-level note, with reproduction. Once the Intake marks the registry's own request completed, settle accepts an attestation from any payer's panel for the same question, including when the completion was a refusal delivered with empty failure args, which invokes no callback and leaves the pair pending. REBUILD 3.4 states this limit explicitly, so it is recorded for the judge as accepted design rather than as a defect.

    Static-analysis leads were all checked: the strict-equality lines compare state and kind codes, the unused returns are the ECDSA error word and the Intake's unrelated tuple fields, the Base64 divide-before-multiply is the standard length formula, and the mint reentrancy lead is guarded by nonReentrant with a hookless token.

    Not re-measured: the maximum-state tokenURI gas and the Glamsterdam gas model, which I accepted from test/NOTES.md and the passing GasTest rather than reproducing on Sepolia.

    ran onclaude · claude-fable-5-1 · 37 turns · 10m 54s · 418 in · 41.7K out · 2M cached
    submission4a9a8b78a6b600bac839151a9dfb776f5b7a691ee27e11ef8b2c995cb661122d
    device5d667e4b0751bcb55515022399c1ba51448da54deb4eebc7503f9961c70cfde3
    started from2b90fe9c95dfb87fccb776f614ba07322092298e
    bundlenone
    applied on54a5ad79b0c23f6a1af27fc5bf1e4049c0c1628e502d8bd5a58c411cbf4a89e9
    • infosettle accepts a foreign panel's attestation once the Intake marks the registry's request completed, including a refusal delivered with empty failure args (documented design limit, REBUILD 3.4)src/Registry.sol:407

      The completion gate checks only that the Intake has completed the registry's own request; it does not bind the attestation to that oracle request (a.requestId is the plane's UUID, never compared with anything stored). When the writer completes the request with status 1 or 2 and empty args, Intake v2 calls no failure function (reference/IntakeV2.sol complete: selector cleared when args is empty), so the pair stays pending here while requests(id).completed is true.

      Any attestation for the same questionHash and window, signed for this registry by the attester within the 1-day issue window, then settles it. For a shared fact the question is identical for every payer, so whoever buys a second panel for the same question chooses the permanent list if the registry's own panel ended without a delivered verdict.

      REBUILD 3.4 states this limit explicitly ('which oracle request produced that attestation is not checked'); it is recorded here with a reproduction so the judge can confirm it is accepted, not fixed.

      State: Registry deployed with the mock Intake of test/mocks/Mocks.sol.

      1. alice calls upgrade([701], max) -> request r pending.

      2. intake.complete(r, 1, "") returns false (no callback), requests(r).completed == true, registry.pendingRequest(r) still returns traitId 701.

      3. anyone calls registry.settle(r, a, sig) with a true attestation for the same questionHash/window signed by the attester (in the test the local signer) -> hasTrait(alice, 701) == true.

      Expected by the specification's own words: accepted.

      Expected if the limit is not accepted: NotSettleable.

      Probe: test/scratch/Probe.t.sol test_settleAfterUndeliveredFailureAcceptsForeignPanel passed on this tree.

  5. Audit permissionsAgent #2found 2 info

    Review complete. The findings file is written and the tree is otherwise untouched (the scratch probe was removed after it ran).

    Outcome: no reproducible defect in the assigned area. Access control, trust gaps and asymmetries in the Registry hold as the specification describes them. The file .imd-findings.json carries two info-level trust assumptions and a coverage row for every one of the 14 listed entry points plus three invariants, all holds.

    What I checked

    • Every state-changing entry point of the Registry was traced for caller assumption, guard, state change and failure path against the Pashov Access Control, Trust Gap and Asymmetry checklists and the Trail of Bits entry-point inventory.
    • A scratch Foundry probe with six adversarial sequences ran green on the current code: a stranger's own Intake request naming the registry as callback cannot touch any pair, card transfers and operator approvals move only the card, abandon authorization and the strict 31-day boundary, another claimant's attestation is refused on settle, shared-fact application needs list membership, and the registry holds no IMD or allowance after any call.
    • The existing 76-test suite passed offline. The real Intake v2 reference confirms the requests() getter shape and the completion flow the registry relies on.
    • Mainnet state of the seven constructor dependencies was read through a public RPC stand-in: price 0.5 IMD, curator settled, 18 decimals, callback gas 200000, executor has code. The constructor's outside-the-floor checks pass today. No launch.json exists yet, so there was no manifest to inspect.

    The two info findings record documented trust assumptions with concrete scenarios so the judge has actor and preconditions: settle accepts a true attestation bought by any payer for the same question once the registry's own delivery failed (spec 3.4 accepts this), and the Intake owner's price, callback gas and writer powers plus the single attester key have no remedy inside the registry (spec 3.10 accepts this).

    Not reached: the Renderer's rendering paths and the Composer's question text beyond their trust boundaries with the Registry, which belong to the other specialists.

    ran onclaude · claude-fable-5-1 · 30 turns · 11m 40s · 546 in · 40.9K out · 2.3M cached
    submission2f3fd84fd40b16996a0a940db0c13b8883e2a34a66e223e0186f815bdd59c76f
    device468e82a89b9bfe188ef46b055e2ea554bde626cc162630c20effb0fcc7e13fed
    started from2b90fe9c95dfb87fccb776f614ba07322092298e
    bundlenone
    applied on54a5ad79b0c23f6a1af27fc5bf1e4049c0c1628e502d8bd5a58c411cbf4a89e9
    • infoTrust assumption (documented): settle applies an attestation bought by any payer for the same question once the registry's own delivery failedsrc/Registry.sol:407

      Not a permission bypass: docs/REBUILD.md 3.4 and DISCLOSURE.md line 7 accept it, and the completion gate keeps the registry's own verdict first. Recorded so the judge has the actor and preconditions.

      The canonical document leaves out consumer, panelSize and quorum, so any payer can call Intake.requestWithFailure with the registry's exact body (composeBody(traitId, claimant)) naming the registry as callback target and obtain an attestation signed under the registry's domain with the same questionHash and window. The registry never binds a.requestId to the Intake id it stores.

      Therefore, whenever the Intake completes the claimant's own request but the callback is not delivered (callbackGas lowered below the ~65k the callback needs, a reverting decode, a status-0 completion with mangled args), a true attestation from a different panel on the same question can be stored for that request by anyone.

      For panel-evidence kinds (5, 6) this lets a claimant whose own undelivered verdict was false pay 0.5 IMD per extra panel and settle the first true one; chain kinds (1, 2, 4) and the shared list (3) are deterministic so a second panel should answer the same.

      Reproduced in test/scratch/AccessProbe.t.sol test_foreignIntakeRequestCannotTouchState: eve's foreign request cannot touch alice's pair (Missed reason 1, settle NotPending), but after intake.setStipend(1000) makes alice's own delivery fail, eve settles alice's request with the attestation of her own panel and alice's 701 becomes verified.

      The protection that holds is the completion gate at this line; the residual risk is the one the specification names and is operational (a lowered callbackGas is the Intake owner's power, 3.10).

      State: alice called upgrade([701]) -> pending id r.

      Eve calls intake.requestWithFailure(ACTION, registry.composeBody(701, alice).body, Callback(registry, onResult.selector), onFailure.selector, imd, 0.5e18) and receives an attestation a signed by the attester for the registry's domain with a.questionHash == pendingRequest(r).questionHash.

      (1) Intake delivers onResult(foreignId, a, sig): registry emits Missed(foreignId, 0, 1), pendingOf(alice, 701) still r, hasTrait false.

      (2) settle(foreignId, a, sig) reverts NotPending(foreignId).

      (3) Intake completes r but the callback runs out of gas (callbackGas 1000 in the mock): requests(r).completed == true, pair still pending.

      (4) Eve calls settle(r, a, sig): succeeds, hasTrait(alice, 701) == true although the verdict stored came from eve's panel, not from the request alice paid for.

      Expected per spec: exactly this (accepted); listed as a trust assumption, not a defect.

    • infoTrust assumption (documented): the Intake owner's price, callbackGas and writer powers and the single attester key are unremediable dependenciessrc/Registry.sol:376

      The registry has no owner, setter, pause or upgrade path (checked: none exists; all seven dependency addresses are plain storage written once in the constructor; the protected owner test has no owned contract to find).

      Its trust therefore sits entirely in two addresses fixed at construction: the Intake 0xa43e6f75ee006411f79ac1c84120606c2330de82, whose owner can setPrice(ACTION, imd, 0) (every upgrade and requestSharedFact then reverts ZeroPrice), setCallbackGas below what onResult needs (every verdict becomes undeliverable; each pair then depends on someone calling settle with the plane-served args before expiry, and a shared fact stays pending and unrequestable until settled or abandoned after 31 days), or setWriter to a party that completes requests with status 1/2 and arbitrary unsigned NoVerdict arguments; and the attester EOA 0x5598aa9146215bc13eb26f2c692ad1461fd32982, whose compromise lets anyone verify any oracle trait for any claimant that has a pending request (signature over the registry's domain is the only check besides panel size, window and dates), and whose rotation permanently stops every verification. docs/REBUILD.md 3.10 and DISCLOSURE.md line 9 accept all of this and name a successor contract as the remedy.

      Mainnet state read on 2026-10-21 through a public Ethereum mainnet RPC (https://rpc.mevblocker.io): priceOf(ACTION, IMD) = 0.5 IMD, callbackGas = 200000, curator.isSettled() = true, IMD.decimals() = 18, BurnExecutor has code, attester has no code, so the constructor's outside-the-floor checks pass today.

      Precondition only the Intake owner can create: Intake.setCallbackGas(60000).

      Then for any pending request r, complete(r, 0, args) records completed == true with delivered == false (onResult needs about 63k gas on the cheapest path per test/NOTES.md), the pair stays pending, and verification requires a third party to call settle(r, a, sig) before a.expiresAt.

      With Intake.setPrice(ACTION, imd, 0): upgrade([701], max) reverts ZeroPrice() and no new fact can be asked.

      Expected per spec 3.10: accepted dependency; no code change asked.

  6. Audit economicsAgent #535found 1 low

    The review is complete and .imd-findings.json is in the repository root.

    Result: the economic, invariant and flow-gap area of the Registry holds against the specification. Every value flow, the request state machine, the community slot accounting, the abandon and date boundaries, and the Intake v2 periphery behave as docs/REBUILD.md requires. The offline suite of 76 tests passes on this tree. I found one low-severity trust-boundary defect and no critical or high issues, so no proof file is attached.

    The finding (low), at src/Registry.sol:406: the settle completion gate reads only the Intake's completed flag. Intake v2 sets that flag on a status 1 or 2 completion even when it makes no failure call. A shared fact in that state stays pending for 31 days, since nobody may abandon it earlier. During that window any payer who buys a second panel on the registry's own 1201 body and receives a true list can settle it as the permanent top-32 list. The specification's stated guarantee that the registry's own verdict always arrives first does not hold there. The precondition is the plane's behaviour, not the attacker's, which is why it is low. I reproduced the full path in a scratch test and offered two options for the author: an immediate shared-fact abandon once the Intake reports completion, or a disclosure line.

    Coverage: all 14 listed entry points have rows. Thirteen are holds with reasons, settle is finding. Five extra rows record the invariants I checked: zero IMD residue and allowance, one pending request per pair and per fact, exact community listing, the attestation-versus-abandon timing, and the Intake v2 interface match.

    Leads closed rather than reported: the Slither strict-equality and timestamp lines are state codes and the spec's own date rules. The Aderyn reentrancy line is a trusted view call under a reentrancy guard. Text buffers are bounds-checked, and the list-entry floor rejected my own low test address, confirming that guard works. Not reached in depth: Renderer internals and the Composer's template bytes beyond the golden-hash tests, which are outside my area.

    ran onclaude · claude-fable-5-1 · 41 turns · 11m 47s · 546 in · 44.1K out · 2.7M cached
    submission8b20774071255f39b8f7ec224296039297aa466ec77c769cfd8fad347980432b
    device3516474d8a268bd881d353f80dfd9aac9f71259a623f003d76ecd829ffca4e10
    started from2b90fe9c95dfb87fccb776f614ba07322092298e
    bundlenone
    applied on54a5ad79b0c23f6a1af27fc5bf1e4049c0c1628e502d8bd5a58c411cbf4a89e9
    • lowsettle: the completion gate also opens after an undelivered failure completion, so for a shared fact any payer can buy a second panel and fix the permanent list; the 3.4 claim that the registry's own src/Registry.sol:406

      Economic Security / Flow Gap (periphery x first principles). docs/REBUILD.md 3.4 justifies the completion rule of settle with: 'With it the registry's own verdict always arrives first, and settle stores a true verdict only for a request whose own delivery failed', to stop 'the first settle of a shared fact [choosing] its permanent list'. The gate only reads Intake v2's requests(id).completed.

      Intake v2 (reference/IntakeV2.sol lines 241-255) sets completed = true on every complete, and on status 1/2 with empty args (or a failure selector call that runs out of gas) it calls nothing. In that state the registry's own request has no verdict at all, it stays pending (state 1), a shared fact cannot be abandoned by anyone for 31 days (abandon line 361: claimant zero => TooEarly), and settle accepts any attester-signed attestation for the same questionHash.

      The 1201 question contains no claimant, so every body for it has one hash; settle does not check a.requestId against the Intake id (documented), panelSize/quorum are outside the canonical document, and dates only require issuedAt >= requestedAt.

      So whoever first pays the Intake 0.5 IMD for a panel on the registry's own 1201 body (consumer = registry) and gets a true list can store it as the permanent top-32 list before any other panel runs; each further attempt costs 0.5 IMD and the registry's own request is never re-run. The same path applies to personal pairs but there the question binds the claimant, so the only effect is a claimant buying extra panels for its own fact.

      Who profits: the first settler decides which panel's list becomes permanent (and whether it contains them).

      Precondition: the plane completes the registry's shared request with status 1/2 without a delivered failure call. This precondition is the plane's, not the attacker's, so the issue is a trust boundary the spec partly documents ('which oracle request produced that attestation is not checked'); it is reported because the spec's stated guarantee for the completion rule is false in this reachable state and because the 31-day shared lock makes the window long.

      No in-contract fix preserves the design without new Intake data (the Intake does not expose the completion status).

      Options for the author to decide: (a) for shared facts only, let abandon succeed at once when requests(id).completed is true (mirroring the personal early abandon of 3.7), so a stranger cannot settle an unrelated panel's list while the honest path is a fresh request; or (b) document in DISCLOSURE.md that an undelivered failure completion of a shared fact opens a 31-day window in which the first true panel bought by anyone fixes the list.

      Coverage of my area: traced every Registry entry point's value flow (fee pull/forward, price pull/approve/consume, zero-residue), the pending/verified/cleared state machine, the pair/shared/applied indices, the community slot accounting under concurrent and failed requests, the date/abandon boundary, the settle gate, the list floor, the Intake v2 periphery (requests getter, requestWithFailure amount semantics, complete's stipend and 63/64 reserve) and Text buffer bounds; the full offline suite (76 tests) passes.

      Not reached in depth: Renderer internals and the Composer's template bytes beyond the golden-hash tests.

      State: fresh Registry on chainId 1 with mocks.

      1. anyone: requestSharedFact(1201, maxPrice) -> pending request r (claimant 0).

      2. the Intake writer completes r with status 2 and empty args: Intake v2 sets requests[r].completed = true and calls nothing (IntakeV2.sol 242, 252-253); registry.pendingRequest(r) still returns state-1 data.

      3. abandon(r) by anyone reverts TooEarly (line 361) until requestedAt + 31 days.

      4. stranger S (address >= 2**80) obtains an attester-signed attestation for the identical body (same questionHash, chainId 1, answerType 4, panelSize 11, quorum 7, agreed 7, window 25769870-25789604, issuedAt = requestedAt + 1, expiresAt = issuedAt + 30 days) whose 32-entry list places S first, and calls settle(r, a, sig).

      Expected per 3.4: 'the registry's own verdict always arrives first' / settle only stores a verdict for 'a request whose own delivery failed'.

      Actual: settle passes the gate (completed == true), _check returns 0, sharedFact(1201) returns (r, keccak256(a.answer), 32) permanently, applySharedFact(1201, list) by S succeeds and hasTrait(S, 1201) is true; no later panel can change it (requestSharedFact reverts FactAlreadyStored).

      Reproduced locally in test/scratch/SettleAfterUndeliveredFailure.t.sol (passes on this code, i.e. the path executes).

  7. Write foundry testsAgent #7214 files changed

    Added failure-path tests, seven fuzz properties, and stateful invariants covering payments, cards, oracle requests, and callbacks.

    Validation passed: build, formatting, and seeded offline tests—101 passed, zero failed, one optional fork skip. Invariants completed 24,576 randomized actions.

    Changes are confined to test/. No reproducible contract defects found.

    ran oncodex · gpt-6-astra · 10 turns · 13m 58s · 153.6K in · 30.8K out · 4.7M cached
    submissioncba19f5de7a4818b6771e0c43b69b8e106f1ea3e2b41ddf8b0a819f2adbdf514
    device107def308610130ec9478ef93a724963248f47a92e0147b8e379a16dc8862cf8
    started from2b90fe9c95dfb87fccb776f614ba07322092298e
    bundle615239dae1ea265c90ead5b9dc79e5ec2778c11548c187df61a70153dabae8f2 · 6.5 MB
    verifiedrebuilt and matched · verifier 0.1.0 ·
    applied on54a5ad79b0c23f6a1af27fc5bf1e4049c0c1628e502d8bd5a58c411cbf4a89e9
    changed · 4 files
    test/Adversarial.t.soltest/BoundaryProperties.t.soltest/LifecycleInvariants.t.soltest/NOTES.md
    may write
    testtest/**
  8. Audit judgeAgent #1581found 2 low, 1 info

    The review is complete. The findings file .imd-findings.json holds 3 findings and an 18-row coverage record covering all 14 entry points.

    What I kept from the specialists

    • Finding 1 (low, merged from three specialists): the settle gate at src/Registry.sol:407 opens on any Intake completion, including a status-1/2 completion with empty args that calls nothing on the registry. I reproduced both the shared-fact path and the personal-pair path in test/scratch/Judge.t.sol. For a shared fact, a stranger's attester-signed list for the same question becomes the permanent list, and nobody can abandon for 31 days. The spec documents the limit, but its stated guarantee that the registry's own verdict always arrives first does not hold in that state. The flow, economics and permissions reports describe the same root cause, so they are one finding.
    • Finding 2 (low, from audit_math): the height bound in src/Composer.sol:28 overshoots the real mainnet head by about 58,000 blocks at the anchored timestamp, so off-mainnet 601 windows and spec validation accept unmined blocks. Reproduced with exact numbers. Mainnet is unaffected and the spec itself prescribes this formula, so it stays low.
    • Finding 3 (info): the documented Intake-owner and single-attester trust assumptions, with the mock reproduction of the price-zero and lowered-stipend paths.

    What I checked myself and found clean

    • Every state-changing entry point was traced and marked holds, except settle, which carries finding 1.
    • Maximal community specs of kinds 1 through 4 register and then compose within the 1,000/512/16,384 limits, so no fee-then-unusable-spec defect exists.
    • The manifest matches the spec's seven constructor arguments and deploy order. Mainnet reads today pass the constructor's outside-the-floor checks. Sizes, formatting and the full offline suite are green.
    • The aderyn reentrancy and slither unused-return lines did not reproduce as defects. The tryRecover error is checked and mintCard is guarded.

    No critical or high findings, so no proof files are attached. The scratch tests remain under test/scratch/ for the author to rerun.

    ran onclaude · claude-fable-5-1 · 33 turns · 13m 27s · 418 in · 26.6K out · 1.4M cached
    submission30cd847973697f654acee66b683cb4d793a7436499b7626ade7aed34e08fec88
    devicedc7103e773ea194aeb43ebfa0f295e081a9aeced51b271af6c73aa99451a394f
    started from80ba3f7c6e6c54816867f45394ea12755a2126b3
    bundlenone
    applied on54a5ad79b0c23f6a1af27fc5bf1e4049c0c1628e502d8bd5a58c411cbf4a89e9, 615239dae1ea265c90ead5b9dc79e5ec2778c11548c187df61a70153dabae8f2, 5b9d10bca97e9d70af9a4546eec3542fa66b9275a8dd7beb35a1ecbca457d6cc
    • lowsettle's completion gate also opens after an undelivered failure completion, so for a shared fact any payer's panel can fix the permanent list for 31 days (merged: audit_flow, audit_economics, audit_psrc/Registry.sol:407

      settle requires only that Intake v2 reports requests(id).completed == true. Intake v2 (reference/IntakeV2.sol lines 241-253) sets completed on every complete, and on status 1 or 2 with empty args, or when the callback runs out of its stipend, it calls nothing on the registry.

      The request then stays pending here (state 1) while the gate is open, and settle accepts any attester-signed attestation with the same questionHash and window: a.requestId is never compared with anything stored, and panelSize/quorum are outside the canonical document, so any payer can buy a panel for the registry's exact body (consumer = registry).

      For a shared fact (1201 or any kind-3 spec) the question carries no claimant, so every payer's body has one hash, and abandon(r) by anyone reverts TooEarly until requestedAt + 31 days (line 361), so the first true list bought by anyone becomes the permanent list and requestSharedFact then reverts FactAlreadyStored.

      For a personal pair the question binds the claimant, so the effect is limited to the claimant (or anyone) settling a different panel's true verdict for that claimant. docs/REBUILD.md 3.4 documents that 'which oracle request produced that attestation is not checked' and DISCLOSURE.md accepts it, but 3.4's stated guarantee that 'the registry's own verdict always arrives first' and that settle stores a verdict 'only for a request whose own delivery failed' does not hold in the status-1/2-with-empty-args state, which the plane (not the attacker) creates.

      Three specialists reported the same root cause (ids 2b881a07..., 2ef488d5..., d969f345...); merged here as one finding. Impact is bounded by the attester's signature and 7-of-11 agreement on an identical question, so low. Options the author may weigh: let abandon of a shared fact succeed at once when requests(id).completed is true (mirroring 3.7's personal early abandon), or record the 31-day window in DISCLOSURE.md.

      Reproduced in test/scratch/Judge.t.sol test_sharedFactSettledByStrangerAfterUndeliveredFailure and test_personalPairSettledByStrangerAfterUndeliveredResult (both pass on this tree, i.e. the path executes).

      Shared: fresh Registry (chainId 1, mocks of test/mocks/Mocks.sol).

      1. anyone: requestSharedFact(1201, max) -> r = sharedPending(1201).

      2. intake.complete(r, 2, "") -> requests(r).completed == true, registry.pendingRequest(r) still returns traitId 1201.

      3. abandon(r) reverts TooEarly.

      4. stranger S builds a 32-entry list with S first, an attestation with the pending questionHash, chainId 1, answerType 4, panelSize 11, quorum 7, agreed 7, window 25769870-25789604, issuedAt = requestedAt+1, expiresAt = issuedAt+30 days, signed by the attester, and calls settle(r, a, sig).

      Expected per 3.4: the registry's own verdict first / NotSettleable.

      Actual: sharedFact(1201) == (r, keccak256(abi.encode(list)), 32), applySharedFact(1201, list) by S succeeds, hasTrait(S, 1201) == true, requestSharedFact(1201) reverts FactAlreadyStored.

      Personal: alice upgrade([701]); intake.setStipend(1000); complete(r, 0, args) with a false verdict returns false (undelivered); pair still pending; settle(r, trueA, sig) by a stranger with a true attestation from a different panel succeeds and hasTrait(alice, 701) == true.

    • lowmainnetHeightBound() ignores missed slots, so off-mainnet 601 windows and spec validation accept blocks past the real mainnet head (audit_math)src/Composer.sol:28

      The bound models the mainnet head as the Merge anchor plus one block per 12 seconds. Mainnet misses slots, so the formula overshoots the real head by tens of thousands of blocks.

      On every chain other than 1 it is the H used by Registry._request/Composer.compose for the kind-6 (601) window (toBlock = H - 64, src/Registry.sol:276-277, src/Composer.sol:91-93) and by Composer.validateSpec (line 36) for community windows, so the 64-block finality margin the spec requires is not met there: a 601 body asks about a window ending after the real head and a registered spec may carry a window the chain has not reached. docs/REBUILD.md 3.6 itself prescribes mainnetHeightBound() off chain 1, and DISCLOSURE.md already says 'It can admit a not-yet-mined window', so this is a documented spec-level choice; mainnet (chainId 1) uses block.number and is unaffected.

      Reported as low because the mainnet launch is unaffected and the spec says Sepolia never gates it. A fix within the design: off chain 1 take the height from the blockNumber argument of validateSpec (and an explicit height for compose), or subtract a drift allowance.

      test/scratch/Judge.t.sol test_heightBoundOvershoot. vm.chainId(11155111); vm.warp(1786951307), the timestamp of mainnet block 25789604 (reference/anchors/headers.json numberDec 25789604).

      Composer.mainnetHeightBound() returns 15537395 + (1786951307 - 1663224191) / 12 = 25847988, 58384 blocks above the real head 25789604. compose(601, specOf(601), alice, registry, curator) emits a body with "toBlock": 25847924, 58320 blocks past the real head. validateSpec of a kind-1 spec with fromBlock 25840725, toBlock 25847924 passes although the real head is 25789604.

      Expected: the window and the validation height never exceed real head - 64.

      Actual: both exceed it by about 58,000 blocks.

    • infoTrust assumption (documented): the Intake owner's price, callbackGas and writer powers and the single attester key are unremediable dependencies (audit_permissions #2)src/Registry.sol:376

      The registry has no owner, setter, pause or upgrade path; all seven dependency addresses are written once in the constructor.

      Its trust sits entirely in the Intake 0xa43e6f75ee006411f79ac1c84120606c2330de82 (owner can setPrice(ACTION, imd, 0) so every upgrade and requestSharedFact reverts ZeroPrice; setCallbackGas below what onResult needs so every verdict depends on a third party's settle before expiry; setWriter to a party completing requests with status 1/2 and arbitrary unsigned NoVerdict arguments) and the attester EOA 0x5598aa9146215bc13eb26f2c692ad1461fd32982 (its compromise verifies any oracle trait for any pending claimant; its rotation stops every verification for ever). docs/REBUILD.md 3.10 and DISCLOSURE.md accept all of this and name a successor contract as the remedy.

      Recorded as a trust assumption, not a defect; no code change asked.

      Precondition only the Intake owner can create.

      With the mock Intake: intake.setPrice(0); alice upgrade([701], max) reverts ZeroPrice() (src/Registry.sol:273). intake.setStipend(60000) then complete(r, 0, args): requests(r).completed == true with delivered == false, the pair stays pending and verification needs settle(r, a, sig) by someone before a.expiresAt (shown in test/scratch/Judge.t.sol test_personalPairSettledByStrangerAfterUndeliveredResult with stipend 1000).

      Expected per spec 3.10: accepted dependency.

  9. Deployed3 contracts on Ethereum mainnettransaction
    rebuilt
    AttestationHash, Base64Fast, Catalog, Composer, HiveData, Questions, Registry, Renderer, SpecGrammar, Text · verifier 0.1.0 · solc 0.8.24
    gates
    • provenance
    • findings
    • independent review
    • bytecode
    • manifest
    • protected invariants
    • economics
    proof
    commit, attestation, manifest, tree, per-contract hashes
    repository
    identity-md-launches/launch-2404-renderer-composer-registry
    commit
    c4ff3238390fc51962fb67e86affc20cf418126e
    attestation
    7afa89428facc92ccd863a1b1d36ef9384b58fe2108465765b35e60eb78377c7
    manifest
    4a44b6ff59eef9811076bb94bb0839f71eb9a236e3635aec97a19ddb4797ac3f
    constructor
    Registry: 0xcb0b0531e86a9ac36fa865ca8e3dbccf047fda91, 0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7, 0xa43e6f75ee006411f79ac1c84120606c2330de82, 0x5598aa9146215bc13eb26f2c692ad1461fd32982, $contract:Renderer, $contract:Composer, 0xe29386719C155B6847aD5a4E97C6674f10ffc750
    tree
    abba790d5074b9a2e7c398ae8fcd03d69f9369e8
    compiler
    solc 0.8.24, optimizer 200 runs, reproducible
    contract
    AttestationHash
    src/AttestationHash.sol · 81 bytes
    creation 1c1538710fd2c69e5ac07c04cdc677f2ab0a86dbfd7eaf576dc6132a0c968921
    abi 518674ab2b227e5f11e9084f615d57663cde47bce1ba168b4c19c7ee22a73d70
    metadata 6e2e075abce0f980823648cee967a78282291fb40df0774be715da7a23497e16
    contract
    Base64Fast
    src/Base64Fast.sol · 81 bytes
    creation 1c1538710fd2c69e5ac07c04cdc677f2ab0a86dbfd7eaf576dc6132a0c968921
    abi 518674ab2b227e5f11e9084f615d57663cde47bce1ba168b4c19c7ee22a73d70
    metadata c0904f64719d926430808ce0ad131b1395bf02b224a98b02b2badd9a3a2fd5bd
    contract
    Catalog
    src/Catalog.sol · 81 bytes
    creation 1c1538710fd2c69e5ac07c04cdc677f2ab0a86dbfd7eaf576dc6132a0c968921
    abi 82e865b99d491a4fb5b9207af1f3cb70150d4991b1fba3e47515fa237f4a35a2
    metadata 95da2fe1dd1cce9efa92cb8d86179abbd69712152067ad91a41a09fa054be45d
    contract
    Composer
    src/Composer.sol · 24431 bytes
    creation bd7570d4c50d13ec64a8cca37a91e5d5006e065adcfffad10e410e8e0245c1ea
    abi 37b9a6c54c65f302558b81c741465e5559c33284612d2046b4ffbfff6584eb6d
    metadata 56152f8c024e87ae5a6fb03a2ade7fbb0ba4191b1e1abc0a3a2be130eaeb23fe
    onchain at 0xf564…7061, block 26,242,885 · creation code matches
    contract
    HiveData
    src/HiveData.sol · 81 bytes
    creation 1c1538710fd2c69e5ac07c04cdc677f2ab0a86dbfd7eaf576dc6132a0c968921
    abi 518674ab2b227e5f11e9084f615d57663cde47bce1ba168b4c19c7ee22a73d70
    metadata 0e1572306df73dcde395acf4a0d0905cb37c65228947b79efb1d03c6763c2500
    contract
    Questions
    src/Questions.sol · 81 bytes
    creation 1c1538710fd2c69e5ac07c04cdc677f2ab0a86dbfd7eaf576dc6132a0c968921
    abi 518674ab2b227e5f11e9084f615d57663cde47bce1ba168b4c19c7ee22a73d70
    metadata 60ff24d400676fef807c1f9d80e441e6ad4585a207412e3dfc4705aaaf1701b6
    contract
    Registry
    src/Registry.sol · 22740 bytes
    creation b1533b0db052829fa71eb3335654ad6d0b95df2e07283398c5fcdc4c7bfb80ff
    abi 681346b3fa66ff9c620fb255a9617b0f102e975f5ad492bab6d4afd2f608e031
    metadata d3badcb1fce5f3048f815c16859a53e53a1b8e68cb2a4898e9b65b6bdfeea592
    onchain at 0x0da2…f766, block 26,242,885 · creation code matches
    contract
    Renderer
    src/Renderer.sol · 20556 bytes
    creation 892879059b4f88665811d57ff5daff5c404f8d7924bb90083d305d99df38f3ae
    abi 61a60df208f0a8712452ebc563183e54d1e5ba8b43dfa1a26fbe54f265b73817
    metadata 74c63630977d708d1efab31a4333787f26a464aba01aa3a670d8a920ecbe5a2d
    onchain at 0x3039…2c3b, block 26,242,885 · creation code matches
    contract
    SpecGrammar
    src/SpecGrammar.sol · 81 bytes
    creation 1c1538710fd2c69e5ac07c04cdc677f2ab0a86dbfd7eaf576dc6132a0c968921
    abi 662877616e67683c124889b82686cae9e7254033923b19fb48bbba396f225611
    metadata 63afe857a07781bce6ad8075e1c51e3339b5b09de7b4eb5f33d8e12bc36bfbca
    contract
    Text
    src/Text.sol · 81 bytes
    creation 1c1538710fd2c69e5ac07c04cdc677f2ab0a86dbfd7eaf576dc6132a0c968921
    abi ee75bf2183979163fe54fe652a65bc4e0d3fb65f67f022bb18342e3ff60d36fa
    metadata 0f0a767b9adf86938e9b781fea102972abb3c4f9c4e07724041e8d81da77598a
  10. Build websiteAgent #1823148 files changedsent back

    Implemented Sworn’s eight-route frontend and static export with verified ABIs and deployment manifest.

    Build/typecheck, 26 unit tests, 40 layout checks, Chromium/WebKit interactions, and 17 fork checks pass. Changed files total 2.68 MB, below the 8 MiB budget.

    Build instructions, validation evidence, screenshots, and limitations are in web/README.md and web/TEST-NOTES.md. Design documentation is in docs/DESIGN.md to respect the path budget.

    Real wallet/passkey onboarding and live settlement/Sepolia replay remain unverified.

    ran oncodex · gpt-6.1-sol · 16 turns · 1h 14m · 506K in · 176.3K out · 27.6M cached
    submissionb829a860a0909193d7823ce33bf4c1f9dda3e687352f236ac4c2b14f9f92845b
    device122a561f18b5bb1e0cfd156a7889c2f54bcd131d2bbd8ff9f07e9767aff19763
    started fromc4ff3238390fc51962fb67e86affc20cf418126e
    bundle8c6815d7bc461dc8336d33c181233bce744af25a742e381515816fca8ed52afb · 1.3 MB
    verifiedrebuilt and matched · verifier 0.1.0 ·
    changed · 148 files
    dist/abi/Composer.jsondist/abi/IntakeV2.jsondist/abi/Registry.jsondist/abi/Renderer.jsondist/abi/WhitelistCurator.jsondist/agents/sworn.mddist/art/sample.svgdist/art/trait-1001.svgdist/art/trait-101.svgdist/art/trait-1101.svgdist/art/trait-1102.svgdist/art/trait-1103.svgdist/art/trait-1104.svgdist/art/trait-1105.svgdist/art/trait-1201.svgdist/art/trait-1301.svgdist/art/trait-201.svgdist/art/trait-202.svgdist/art/trait-301.svgdist/art/trait-302.svgdist/art/trait-303.svgdist/art/trait-401.svgdist/art/trait-402.svgdist/art/trait-403.svgdist/art/trait-404.svgdist/art/trait-501.svgdist/art/trait-502.svgdist/art/trait-503.svgdist/art/trait-601.svgdist/art/trait-701.svgdist/art/trait-801.svgdist/art/trait-901.svgdist/assets/ccip-AJUFevyU.jsdist/assets/dist-CqbChHYP.jsdist/assets/index-B7zxnXCr.cssdist/assets/index-DVw1ahbR.jsdist/data/art-provenance.jsondist/data/curator-source.jsondist/data/eth-market.jsondist/data/hours.jsondist/data/launch.jsondist/data/renderer-preview.jsondist/favicon.svgdist/imd-deployment.jsondist/index.htmldist/share.pngdocs/DESIGN.mddocs/frontend/README.mddocs/frontend/browser-results.jsondocs/frontend/delivery.jsondocs/frontend/fork-results.jsondocs/frontend/independent-reads.jsondocs/frontend/live-deployment.jsondocs/frontend/screenshots/explorer-390.pngdocs/frontend/screenshots/home-1440.pngdocs/frontend/screenshots/home-390.pngdocs/frontend/screenshots/integrate-320.pngdocs/frontend/screenshots/minted-fork-390.pngdocs/frontend/screenshots/wallet-390.pngdocs/frontend/taste-results.jsonweb/.gitignoreweb/LICENSES/Better-Interface.txtweb/LICENSES/RainbowKit.txtweb/README.mdweb/TEST-NOTES.mdweb/assets/share.svgweb/deployment-handoff.jsonweb/index.htmlweb/network.jsonweb/package-lock.jsonweb/package.jsonweb/public/abi/Composer.jsonweb/public/abi/IntakeV2.jsonweb/public/abi/Registry.jsonweb/public/abi/Renderer.jsonweb/public/abi/WhitelistCurator.jsonweb/public/agents/sworn.mdweb/public/art/sample.svgweb/public/art/trait-1001.svgweb/public/art/trait-101.svgweb/public/art/trait-1101.svgweb/public/art/trait-1102.svgweb/public/art/trait-1103.svgweb/public/art/trait-1104.svgweb/public/art/trait-1105.svgweb/public/art/trait-1201.svgweb/public/art/trait-1301.svgweb/public/art/trait-201.svgweb/public/art/trait-202.svgweb/public/art/trait-301.svgweb/public/art/trait-302.svgweb/public/art/trait-303.svgweb/public/art/trait-401.svgweb/public/art/trait-402.svgweb/public/art/trait-403.svgweb/public/art/trait-404.svgweb/public/art/trait-501.svgweb/public/art/trait-502.svgweb/public/art/trait-503.svgweb/public/art/trait-601.svgweb/public/art/trait-701.svgweb/public/art/trait-801.svgweb/public/art/trait-901.svgweb/public/data/art-provenance.jsonweb/public/data/curator-source.jsonweb/public/data/eth-market.jsonweb/public/data/hours.jsonweb/public/data/launch.jsonweb/public/data/renderer-preview.jsonweb/public/favicon.svgweb/public/share.pngweb/scripts/agents.mjsweb/scripts/check-reads.mjsweb/scripts/derive-storage.mjsweb/scripts/generate-art.mjsweb/scripts/manifest.mjsweb/scripts/read-live.mjsweb/scripts/render-share.mjsweb/scripts/rpc.mjsweb/scripts/select-market.mjsweb/scripts/verify-abis.mjsweb/src/App.tsxweb/src/chain.tsweb/src/claim.tsxweb/src/components.tsxweb/src/context.tsxweb/src/data.tsweb/src/env.d.tsweb/src/hive-layout.tsweb/src/main.tsxweb/src/oracle.mjsweb/src/pages.tsxweb/src/pure.mjsweb/src/settlement.tsweb/src/styles.cssweb/src/swap.tsweb/src/transactions.tsxweb/src/wallet-icons.tsweb/src/wallet.tsxweb/tests/browser.mjsweb/tests/core.test.mjsweb/tests/fixtures/completion-mainnet.jsonweb/tests/fork.mjsweb/tests/harness.mjsweb/tests/optional-fork.mjsweb/tests/wallet-browser.mjsweb/tsconfig.jsonweb/vite.config.ts
    may write
    web/**dist/**docs/**web/.gitignore
  11. Design criticAgent #1510found 2 high, 1 medium
    AreaResult
    Requirements66 groups: 59 met, 3 missing, 0 faked, 2 after review, 2 need requester
    Broken features2
    First screen at 390Product and Explore action visible
    taste@114/16; two required design overrides
    Copy findings0
    Share cardPresent; 1200×630 PNG

    Recorded three findings in .imd-findings.json. Website files remain unchanged.

    • High — bug: Following “Transaction steps” from #/claim?trait=601 destroys the prepared request, changes unsent steps to “unknown,” and removes confirmation. Preserve the query in local anchor links.
    • High — fidelity: Explorer offers paid fact requests without their required live IMD price. Display the fetched price beside each request link.
    • Medium — bug: Explorer’s automatic refresh removes its results and loses reading position. At 390px, document height fell from 5,443px to 1,245px and scroll position jumped from 3,754px to 401px. Retain results while refreshing the same wallet.

    Each finding includes the exact source snippet, change, reason and reproduction.

    Clean installation, typecheck, production build, all 26 unit/export tests and 40 route/width checks passed in a temporary copy. The rebuilt export matched the submission byte for byte. Chromium and WebKit interactions passed; both reproduced the claim-link reset. All 45 asset hashes and the pinned implementation ABIs matched.

    The visual idea is clear: a terminal interface makes wallet evidence readable through a green, thirteen-family hive.

    “Met” below means supported by inspected implementation, independent checks or the supplied fork evidence; no live transaction was signed.

    RequirementStatus and evidence
    S-1 “eight routes, live reads over the chosen public RPC”Met: App, formatting helpers; 40 route checks, no page errors or overflow.
    S-2 “one-click wallet connect”Met: WalletProvider, EIP-6963/browser providers, mobile sheet, focus containment, dismissal and switch/add-chain evidence.
    S-3 kind-3 “under its own id”Met: receipt-derived registration id, traitMethod, supplied fork request/application evidence.
    S-4 recovery, replacement handling and no resend on reloadMet: useTransactions, receipt recovery and supplied replacement checks.
    S-5 exact-output ETH payment, 1% maximum, 120-second deadlineMet: swap.ts, exact approval and recorded fork refund.
    S-6 unminted live Renderer preview; minted own tokenURIMet: lookup; independent stranger/contributor reads and supplied before/after-mint evidence.
    S-7 no token-id text in shipped SVGsMet: Renderer generation script, 26 illustrations and passing export test.
    S-8 earlier registries only in the About noteMet: About; no earlier runtime configuration.
    S-9 registration uses the current price and says it can changeMet: CommunityForm and fresh preparation reads.
    S-10 impossible Curator facts are unavailable to nonmembersMet: impossible, disabled picker rows and live stranger Explorer results.
    S-11 adjacent busy/error/success statusesMet: action Status elements and numbered journal steps.
    S-12 one acknowledgement state with focus linksMet: Claim, AckLink; focus verified in both browsers. Selection loss is recorded under S-16.
    S-13 connected preview or minted card with disabled repeat mintMet: mint panel and supplied minted-wallet browser evidence.
    S-14 no sideways ordinary data tables at 390pxMet: responsive rows; documented census exception.
    S-15 direct-load titles, anchors and trait selectionMet: route handler and browser deep-link checks.
    S-16 usable “Prepared, see Transaction steps” linkMissing: following it from a trait deep link destroys the prepared plan. Finding 1.
    S-17 check
    ran oncodex · gpt-6.1-sol · 10 turns · 13m 33s · 231.9K in · 29.8K out · 5.1M cached
    submissionaf77345e1325d4e0142f7d322ff7149a586df7a0fe657b2253b7f2d05d829ff4
    deviceb3280f20e86b4e0d55e0cac944300abc26d744fcd6a2a06035e53b6d0f43ddfa
    started from186dc95108c0ad8c2917ea0a21f9390379508786
    bundlenone
    applied on2cd9ea7bd77937018f4abbb8ec778a92d27d69099b6d0c55563b6cdcbb447f26
    may write
    web/**dist/**docs/**web/.gitignore
    • highbug: the transaction link destroys requests prepared from trait deep linksweb/src/App.tsx:183

      Now: main is keyed by the query, but Claim anchor links discard ?trait=N. Following “Transaction steps” remounts Claim, drops the prepared plan, restores its unsent steps as unknown and removes the confirmation button. The acknowledgement link also clears the selected fact.

      Change to: retain the active query in all in-route Claim anchor links so scrolling to the acknowledgement, originating step or journal preserves the existing form and prepared plan.

      Why: SITE S-16 explicitly requires “Prepared, see Transaction steps” to link to the usable prepared journal; S-12 and S-15 require acknowledgement links and trait deep links to work together. The required pre-signing flow is unavailable through its own navigation.

      At 390×844 open #/claim?trait=601.

      Use a read-only injected test provider returning account 0x000000000000000000000000000000000000c1a1 and chain 0x1; forward all public RPC reads normally except return 1 IMD for balanceOf so preparation is reachable; refuse every signing method.

      Connect Browser wallet, check oracle-ack directly, then click Prepare selected facts.

      The journal shows “Request 1 oracle fact: 601 / Swarmed”, two ready steps and one Confirm transaction steps button.

      Click the Transaction steps link under Prepare selected facts.

      Actual: URL becomes #/claim#transaction-steps, the heading becomes generic Transaction steps, both unsent steps become unknown and Confirm transaction steps count changes 1 → 0.

      No signature or broadcast occurred, so neither step has a recoverable hash.

      Expected: navigate to the same prepared journal with its confirmation button intact.

      Independently reproducible without any provider: open #/claim?trait=701 and follow the acknowledgement link; the preselected 701 checkbox changes true → false.

    • highfidelity: Explorer omits the live price beside paid fact requestsweb/src/components.tsx:348

      Now: unproven, requestable Explorer facts show only “Request ” links; the entire Explorer main region contains no IMD amount, price or cost, even after dependency and price reads succeed.

      Change to: show the existing health.price with the common IMD formatter and the “priceOf · live” mark beside each requestable fact link; when unavailable, say the price is unavailable rather than inventing an amount.

      Why: SITE section 4 explicitly requires Explorer oracle facts to remain requestable “with the live price and a link to #/claim?trait=N”. Visitors choosing a paid oracle request need its price at that decision.

      At 390×844, open #/explorer?address=0x000000000000000000000000000000000000c1a1 with working Ethereum RPC reads.

      Wait for All 25 facts and scroll to #trait-601.

      Actual row ends “Request Swarmed ↗” with no price; #trait-1301 likewise ends “Request Pretrained ↗”.

      Measured both request-link texts and searched main.innerText for /IMD|price|cost/i: zero matching lines.

      The footer separately reports priceOf read live.

      Expected: the fetched oracle price in IMD next to these request links.

    • mediumbug: automatic Explorer refresh removes the results and loses reading positionweb/src/pages.tsx:349

      Now: every new health object, including the 45-second background refresh, clears facts before re-reading. The whole Explorer result disappears and the browser clamps the scroll position to the shortened page.

      Change to: retain the previous wallet result during a background refresh of the same address, show a refreshing status, then replace it after success; reserve clearing for an address change or a failed read.

      Why: the review requires loading states not to move unrelated content. A reader must be able to inspect all 25 facts without being returned to the top every 45 seconds.

      At 390×844, open #/explorer?address=0x000000000000000000000000000000000000c1a1 with working Ethereum RPC reads.

      Wait for All 25 facts, scroll to trait 1105, and wait for the normal 45-second refresh without interacting.

      Measured scrollY=3754 and document height=5443 before refresh; at 43.5 seconds after starting the observation the result subtree disappeared, height fell to 1245 and scrollY to 401.

      At 44.1 seconds results returned and height recovered to 5443, but scrollY stayed 401.

      Expected: keep the facts visible and preserve the reading position during refresh.

  12. Build websiteAgent #189633 files changedsent back

    Fixed all three findings: Claim links preserve prepared requests, Explorer shows live prices, and refresh retains results and reading position.

    Rebuilt dist/ and its manifest. Build, typecheck, Chromium/WebKit regressions, 27 unit/export tests, 40 layout checks and 17 fork checks passed.

    Responses are in .imd-responses.json; evidence is in web/TEST-NOTES.md.

    ran oncodex · gpt-6.1-sol · 9 turns · 22m 49s · 145.4K in · 60.8K out · 7.3M cached
    submission2231af5857c960000d31665a68715cf3ff7a2c6d1d8c4aa47bcc984831b9bd34
    device83e7e92833e57c52ced3c5884258d590694b50076849a4a25ef9b9bdcc96a870
    started from186dc95108c0ad8c2917ea0a21f9390379508786
    bundle46183bff308f314d3e413881b37e4b2f88c4b7325a6788ac54a36794f08fa1e9 · 1.5 MB
    verifiedrebuilt and matched · verifier 0.1.0 ·
    changed · 33 files
    dist/assets/ccip-AJUFevyU.jsdist/assets/ccip-CboUdbEl.jsdist/assets/dist-CqbChHYP.jsdist/assets/dist-YM0QQFiI.jsdist/assets/index-B7zxnXCr.cssdist/assets/index-BNS4TvO-.cssdist/assets/index-DVw1ahbR.jsdist/assets/index-S8JmSZwW.jsdist/imd-deployment.jsondist/index.htmldocs/DESIGN.mddocs/frontend/README.mddocs/frontend/browser-results.jsondocs/frontend/delivery.jsondocs/frontend/fork-results.jsondocs/frontend/revision-results.jsondocs/frontend/screenshots/revision-ack-390.pngdocs/frontend/screenshots/revision-journal-390.pngdocs/frontend/screenshots/revision-price-390.pngdocs/frontend/screenshots/revision-refresh-390.pngdocs/frontend/taste-results.jsonweb/README.mdweb/TEST-NOTES.mdweb/package.jsonweb/src/claim.tsxweb/src/components.tsxweb/src/navigation.tsweb/src/pages.tsxweb/src/styles.cssweb/src/transactions.tsxweb/tests/browser.mjsweb/tests/explorer.test.mjsweb/tests/revision.mjs
    may write
    web/**dist/**docs/**web/.gitignore
  13. Design criticAgent #1673found 1 high
    AreaPrevious supplied reviewThis round
    Requirements2 misses reportedSITE S-1–S-39: 37 met, 1 missing, 0 faked, 1 needs requester
    Broken features21 new
    First screen at 390pxNot suppliedProduct and main action visible
    taste@1Not supplied14/16; both flags required by brief
    Copy findingsNone supplied0
    Share cardNot suppliedPresent; 5/5 metadata checks

    All three original findings are fixed. One new high bug is recorded in [.imd-findings.json][findings]. Website files remain unchanged.

    Original findingResult and measured evidence
    Claim links destroy prepared requestsFixed. Chromium and WebKit preserve the query, selection, acknowledgement, two ready steps and one confirmation button through journal/origin links and Back. See [navigation.ts][nav].
    Explorer omits request pricesFixed. Swarmed and Pretrained show 0.50 IMD · priceOf · live beside their correct Claim links. Unavailable-price rendering also passes. See [components.tsx][components].
    Refresh loses reading positionFixed. All 25 result nodes remain during and after refresh. Chromium stayed at scrollY 3717; WebKit stayed at 3723. Trait deep links do not scroll again. See [pages.tsx][pages].

    High — bug: switching RPC or losing health blanks the entire Explorer

    At [pages.tsx:445][bug], Explorer reads site.health!.block while existing facts remain available. Switching RPC or failing a health refresh sets health to null, causing an uncaught exception and removing the entire application.

    Change the result-render guard to require both facts and health, preserving loading/error/retry controls when health is unavailable. This satisfies the required RPC switching and recovery behavior.

    Reproduction: at 390×844, open #/explorer?address=0x000000000000000000000000000000000000c1a1, wait for all 25 facts, then choose ethereum-rpc.publicnode.com in Public RPC. Chromium reports Cannot read properties of null (reading 'block'); rows fall 25→0, main elements 1→0, and body text length 3633→0. WebKit reproduces the same blank page. Returning HTTP 503 during the scheduled health refresh also reproduces it; restoring RPC responses does not recover the application. No signing or broadcasting was attempted.

    The isolated production rebuild matches the committed export byte for byte. Typechecking, 27 unit/export tests, 40 route/width checks, and seven revision groups in each browser passed. Manifest verification covers all 45 assets, 1,012,986 bytes, the pinned ABIs and exact handoff/network values.

    The checklist retains submitted implementation evidence for unchanged requirements; signed flows rely on the existing, explicitly qualified [fork evidence][fork].

    RequirementStatusEvidence
    S-1 “eight routes” and “no console error”Missing error-free RPC switching/recoveryReproduction above; ordinary route checks pass
    S-2 “one-click wallet connect”Met[Wallet][wallet]; connection evidence
    S-3 kind-3 requests “under its own id”Met[Claim][claim], [journal][journal], fork evidence
    S-4 “a reload never resends a transaction”MetJournal persistence and recovery evidence
    S-5 “an exact-output swap”Metweb/src/swap.ts; recorded fork quote, approval and refund checks
    S-6 preview versus “its own tokenURI”Met[Chain lookup][chain]; before/after mint evidence
    S-7 “no token-id text in any shipped SVG”MetExport tests; generated artwork
    S-8 earlier Registries only in AboutMetAbout copy; documented source checks
    S-9 registration cost from live priceOfMetCommunityForm in Claim
    S-10 impossible facts unavailable for requestMetStranger-wallet browser checks; eligibility tests
    S-11 status directly under each actionMetClaim and journal status elements
    S-12 “one shared state” for acknowledgementMet
    ran oncodex · gpt-6-astra · 7 turns · 7m 0s · 103.4K in · 16.4K out · 1.7M cached
    submission185781bba09a0e2da019f05e1c5bb8355572a5c7f7ed36beafa77ef88a84ab70
    deviced0a17ab6722865f68dc1c1a92d2c92859e30cc21a83fd1b15d82812e48938791
    started from8228e96e67506c5c16f58408da7b05cd54cbc28c
    bundlenone
    applied on2cd9ea7bd77937018f4abbb8ec778a92d27d69099b6d0c55563b6cdcbb447f26
    may write
    web/**dist/**docs/**web/.gitignore
    • highbug: switching RPC or losing health blanks the entire Explorerweb/src/pages.tsx:445

      Now: once Explorer has facts, it renders site.health!.block unconditionally. Changing the Public RPC sets health to null immediately; a failed background health read also sets it to null. Explorer throws before its effect can clear facts, unmounting the whole app, including navigation and Retry reads.

      Change to: guard the wallet-result render on both facts and non-null health (and only read health.block in that guarded branch), retaining the existing loading/error/retry UI when health is absent. Preserve same-address results while a successful background refresh is in progress.

      Why: SITE section 2.2 requires unavailable RPCs to show unavailability and recovery without reloading; S-1 requires no console errors and section 1 requires a user-switchable public RPC. A normal supplied control must not erase the site.

      At 390×844 in Chromium 156, open #/explorer?address=0x000000000000000000000000000000000000c1a1 and wait for Wallet facts loaded / all 25 .fact-row elements.

      With JSON-RPC requests forwarded unmodified to https://ethereum-rpc.publicnode.com and no wallet or signing fixture, select https://ethereum-rpc.publicnode.com in the footer #rpc-choice (initial selection is https://rpc.mevblocker.io).

      Actual: pageerror is Cannot read properties of null (reading 'block'); .fact-row count 25→0, main count 1→0, and document.body.innerText length 3633→0.

      The viewport is entirely blank and remains blank with RPC available.

      Expected: a loading state followed by the same wallet on the chosen endpoint.

      Independently on a fresh loaded page, return HTTP 503 for the next public-RPC requests and invoke the actual captured 45000ms refresh callback: the identical null-block error and empty page occur; restoring RPC responses does not recover the unmounted app.

      No transaction is attempted.

      Repeated in WebKit 27.2 at 390×844 for both endpoint switching and failed health refresh: all 25 rows and main disappear, body text length 3543→0, with pageerror null is not an object (evaluating 'e.health.block').

      Both browser screenshots show only the empty dark canvas.

  14. Build websiteAgent #99221 files changed

    Fixed the Explorer crash on RPC changes and health failures. Retry and scheduled recovery work; healthy refreshes preserve results and scroll.

    Rebuilt dist/ and its manifest. Build, typecheck, 27 unit tests, 40 route/width checks, and Chromium/WebKit regressions passed.

    Recorded the finding response in .imd-responses.json and evidence under docs/frontend/.

    ran oncodex · gpt-6.1-sol · 9 turns · 14m 4s · 186.1K in · 35.4K out · 5.6M cached
    submission28c8641b73078bb8e3b0b6ecb83e72f6eddb10561311717ab3920f1cfdfd4287
    deviceb5656f252a09fc5d0abd5164eeb2f4a714b33a770aee58778fbbb27abae55ed2
    started from8228e96e67506c5c16f58408da7b05cd54cbc28c
    bundle2cd9ea7bd77937018f4abbb8ec778a92d27d69099b6d0c55563b6cdcbb447f26 · 1.6 MB
    verifiedrebuilt and matched · verifier 0.1.0 ·
    changed · 21 files
    dist/assets/ccip-CboUdbEl.jsdist/assets/ccip-d7FZk9D4.jsdist/assets/dist-YM0QQFiI.jsdist/assets/dist-mbml2NTA.jsdist/assets/index-DrNDTVhN.jsdist/assets/index-S8JmSZwW.jsdist/imd-deployment.jsondist/index.htmldocs/DESIGN.mddocs/frontend/README.mddocs/frontend/browser-results.jsondocs/frontend/delivery.jsondocs/frontend/explorer-health-results.jsondocs/frontend/screenshots/explorer-outage-390.pngdocs/frontend/screenshots/explorer-recovered-webkit-390.pngdocs/frontend/taste-results.jsonweb/README.mdweb/TEST-NOTES.mdweb/package.jsonweb/src/pages.tsxweb/tests/explorer-health.mjs
    may write
    web/**dist/**docs/**web/.gitignore
  15. Design criticAgent #1143found nothing
    AreaThis review
    Requirement revisited1 met; 0 missing or faked
    Broken features0 remaining
    First screen at 390pxProduct and Explore action visible
    taste@114/16; 2 specification overrides
    Copy findings0
    Share cardPresent

    The previous high finding is fixed. pages.tsx:438 now guards results on both facts and health.

    Rechecked at 390×844 in Chromium 156 and WebKit 27.2, without a wallet fixture:

    • Met — user-switchable RPC: changing endpoints preserves navigation and reloads all 25 facts.
    • Met — outage and recovery: injected HTTP 503 responses show unavailability and Retry reads. Keyboard retry and the scheduled callback restore results without reloading.
    • Met — healthy refresh: all 25 row nodes, page height and scroll position remain unchanged.
    • Met — application stability: all six scenarios pass on recheck with no application page errors.

    Met — deployment export: all 45 assets’ hashes, pinned ABI bytes and canonical hashes, handoff fields, and unchanged network configuration verify. Publication and naming remain after review. Other accepted requirements retain their documented coverage in web/TEST-NOTES.md; this round focused on settling the supplied finding.

    Sworn presents verifiable wallet facts through a restrained terminal interface and a hive-shaped card.

    .imd-findings.json contains {"findings":[]}. Site files are unchanged.

    ran oncodex · gpt-6.1-sol · 6 turns · 6m 42s · 102.9K in · 12.4K out · 2.4M cached
    submissionc6c22570f3b5e3994bf529e9bcfbc90fccdc41a35945aba10e9c6e9c085455f8
    deviced47149da4d751a90d06bb72a20a3396289cca6354da2e10db94c4e1f687de694
    started fromb8c9d5453fe84f49db430f434ddb6866165f5e57
    bundlenone
    applied on2cd9ea7bd77937018f4abbb8ec778a92d27d69099b6d0c55563b6cdcbb447f26
    may write
    web/**dist/**docs/**web/.gitignore
  16. Checkedall checks passed
    • deployment-config
    • static-assets
    • html-assets
    • named-entrypoint
    • named-assets
    • contract-abis
    • chain-state