{
  "notes": "EPISODE 1 (2026-10-27). Nothing had run before. Budget: 30 items, 6 episodes. This episode spends 19 items; 11 remain.\n\nSELECTION (orchestrator's sizing read of https://l2beat.com/api/scaling/summary on 2026-10-27, to be confirmed by batch 'scope', which is the citable source): projects L2BEAT categorises as a rollup with TVS > 500M USD are only FIVE today: Base (Optimistic Rollup, Stage 1, ~15.06B), Arbitrum One (Optimistic Rollup, Stage 1, ~9.83B), OP Mainnet (Optimistic Rollup, Stage 1, ~1.72B), Mantle (now 'ZK Rollup', Stage 0, ~1.30B, badge 'Built on the OP Succinct stack'), Lighter (ZK Rollup, Stage 0, ~1.06B, app-specific perp DEX, 'Onchain (SD)' DA). Above 500M but NOT rollups per L2BEAT: Hyperliquid (Other, L3 on Arbitrum, stage 'Not applicable', ~6.57B), Polygon PoS (Other, 'Not applicable', ~3.83B), Robinhood Chain (category 'Other' but Stage 0, Arbitrum Orbit, fraud proofs INT, onchain DA, sequencer failure 'No mechanism', ~2.29B). Below 500M (excluded, to be named in the deliverable with figures): World Chain ~401M, Starknet ~371M, Ink ~365M, Linea ~335M, ZKsync Era ~256M, Celo ~256M, Unichain ~89M, Scroll ~38M. Decision: the six workers' set is the five rollups PLUS Robinhood Chain, which has an L2BEAT stage and rollup-like risks but is filed under 'Other'; the deliverable ranks the five and reports Robinhood separately as borderline, saying why L2BEAT files it as Other. Hyperliquid and Polygon PoS are named as excluded (no stage, no proofs, external DA) and not profiled.\n\nBATCHES SPAWNED: 'scope' (1 item): the L2BEAT summary table with TVS, category, stage for everything above 300M on the snapshot date, plus the methodology page, so the selection and the exclusions are cited. 'l2beat' (6 items, one per chain): points 1-5 from the L2BEAT project page alone (stage with L2BEAT's stated reasons, state validation, exit window and upgrade permissions with security council threshold, DA, sequencer/forced inclusion) plus stage history since 2026-04-27 from the project page milestones and the l2beat GitHub config history. 'docs' (6 items): the same points 1-5 confirmed or contradicted from the project's own docs/code (second source). 'release' (6 items): point 6, newest release of the main node/prover software with date and URL. Every brief requires a URL after every fact and an explicit 'NOT FOUND' when a fact could not be found. Wake when all four settle or after 180 minutes.\n\nEPISODE 2 SHOULD: read all 19 results (they are small batches, handed as single items). Check each l2beat result has: stage + reasons, proof type + permissionless or not, exit window, upgrader + council threshold, DA, sequencer + forced inclusion, stage history. Check the release results have a version string, a date, and a URL to the release page. Where a result is missing a point, invents a value, or cites no URL, spawn a narrow repair batch (one chain, one point) from the remaining 11 items; do not re-run whole profiles. Also consider one item to double-check stage changes across the six (L2BEAT GitHub: packages/config/src/projects/<slug>/<slug>.ts, 'stage' field history) if the l2beat batch results are vague on history. If results are complete, set finish=true in episode 2 or 3 and write the deliverable: a table per chain, then the ranking. RANKING METHOD (decided now, apply in the write-up): order by L2BEAT stage first (Stage 1 above Stage 0), then within a stage by: live proof system and permissionless proving, forced-inclusion available, exit window length, upgrade control (security council threshold and delay), DA on Ethereum. Expected shape from today's risk summary: Arbitrum One / OP Mainnet / Base (Stage 1, fraud proofs live, self-sequence, onchain DA, no exit window) at the top in some order decided by permissionless proving and council details from the results; then Lighter (Stage 0, validity proofs live, force via L1, escape hatch) and Mantle (Stage 0, validity proofs via OP Succinct, self sequence, 'cannot withdraw' on proposer failure); Robinhood Chain outside the ranking (Other, no forced-inclusion mechanism). Do not fix the order until the results are read.\n\nCAVEATS: TVS moves daily; the deliverable must state the snapshot date and figures from the 'scope' result, not from these notes. 'Six months' = since 2026-04-27. Base's Stage 1 and most other stage moves predate the window; Mantle's category change to ZK Rollup and Lighter's listing may fall inside it, the results will tell. Lighter's node/prover may be closed-source: a 'NOT FOUND' there is an acceptable, reportable answer.",
  "spawn": [
    {
      "name": "scope",
      "brief": "Record which projects L2BEAT lists with more than 500 million US dollars of total value secured (TVS) today, so the selection can be cited. Sources, in this order: (a) https://l2beat.com/scaling/summary (the summary table; use the 'Rollups' and 'Others' filters), (b) the JSON at https://l2beat.com/api/scaling/summary (field projects.<slug>.tvs.breakdown.total in USD, plus category and stage), (c) https://l2beat.com/scaling/summary methodology link and https://l2beat.com/glossary for the definitions of 'Rollup', 'Validium', 'Optimium', 'Other' and of the Stage 0/1/2 framework. Deliver, in markdown: 1. The snapshot date and time (UTC) you read the data. 2. A table of EVERY project with TVS above 300 million USD: L2BEAT slug, display name, category exactly as L2BEAT writes it (Optimistic Rollup, ZK Rollup, Validium, Optimium, Other), stage exactly as shown (Stage 0, Stage 1, Stage 2, Not applicable, Under review), host chain, TVS in USD rounded to the nearest million, and the URL of its L2BEAT project page. 3. Which of those L2BEAT categorises as a rollup (Optimistic Rollup or ZK Rollup) AND has TVS above 500 million: this is the selected set. 4. For every project above 500 million that is NOT categorised as a rollup, quote L2BEAT's one-line reason (from its project page risk summary or the 'Other' explanation) for not calling it a rollup. 5. L2BEAT's definition of what makes a project 'Other' versus a rollup, quoted, with its URL. 6. L2BEAT's Stage 0 / 1 / 2 requirements, quoted briefly, with URL. Rules: every number and quote carries the URL it came from right after it. Do not guess or round beyond the nearest million; if the API and the page disagree, show both figures. If something cannot be read, write NOT FOUND and what you tried. Do not profile the projects themselves; only the list, figures, categories and definitions.",
      "items": [
        { "key": "l2beat-list", "vars": {} }
      ],
      "output": { "format": "markdown", "maxBytes": 24000 },
      "merge": { "groupSize": 20, "brief": "Keep the single result as it is." }
    },
    {
      "name": "l2beat",
      "brief": "Profile {{name}} from L2BEAT only. Read its project page https://l2beat.com/scaling/projects/{{slug}} in full (Risk summary, Stage section, State validation, Data availability, Operator / Sequencer, Withdrawals, Permissions, Upgrades & governance, Milestones) and, where the page links to L2BEAT's stage checklist, that too. Deliver markdown with EXACTLY these headings, each fact followed by the URL (with #anchor where available) it came from: '## Identity' (display name, category as L2BEAT writes it, host chain, TVS in USD with the date read, badges such as the stack it is built on). '## 1. Stage' (Stage 0/1/2 as shown; the full list of stage requirements L2BEAT marks as met and as unmet, quoted; any 'under review' or warning banner). '## 2. Proof system' (L2BEAT's State Validation value verbatim, e.g. 'Fraud proofs (INT)' or 'Validity proofs (SN)'; whether proofs are live; whether anyone can propose and challenge/prove or only a whitelist, with the Permissions entries that say so; challenge period or proof finality time). '## 3. Exit window and upgrades' (Exit Window value and L2BEAT's explanation verbatim; who can upgrade which contracts; every Security Council or multisig named, with its threshold like 9/12 and the delay it bypasses or must wait). '## 4. Data availability' (DA value verbatim; Ethereum blobs, calldata, or an external DA layer; any DAC and its threshold). '## 5. Sequencer and forced inclusion' (who runs the sequencer; L2BEAT's Sequencer Failure and Proposer Failure values verbatim; whether users can force a transaction from L1 and the delay). '## Stage history since 2026-04-27' (did the stage change between 2026-04-27 and today? Evidence: the Milestones section, L2BEAT's project page banners, and the change history of the project's config file in https://github.com/l2beat/l2beat under packages/config/src/projects/{{slug}}/ : look at the 'stage' field in its git history and give the commit URL and date of any change in that window; if no change, say so with the URL you checked). '## Not found' (every point you could not establish, and what you tried). Rules: copy L2BEAT's wording for values and reasons rather than paraphrasing; never guess; nothing from memory; no other site except L2BEAT and the l2beat GitHub repository. Write NOT FOUND for anything missing.",
      "items": [
        { "key": "base", "vars": { "name": "Base", "slug": "base" } },
        { "key": "arbitrum", "vars": { "name": "Arbitrum One", "slug": "arbitrum" } },
        { "key": "optimism", "vars": { "name": "OP Mainnet", "slug": "optimism" } },
        { "key": "mantle", "vars": { "name": "Mantle", "slug": "mantle" } },
        { "key": "lighter", "vars": { "name": "Lighter", "slug": "lighter" } },
        { "key": "robinhood", "vars": { "name": "Robinhood Chain", "slug": "robinhood" } }
      ],
      "output": { "format": "markdown", "maxBytes": 24000 },
      "merge": { "groupSize": 20, "brief": "Keep every result whole, one section per chain, in the order Base, Arbitrum One, OP Mainnet, Mantle, Lighter, Robinhood Chain." }
    },
    {
      "name": "docs",
      "brief": "Confirm five facts about {{name}} from the project's OWN documentation and code, as the second source behind L2BEAT. Start at {{docs}} and the project's GitHub organisation {{github}}; use only pages under the project's own domains or repositories (plus the stack's upstream docs, {{stack}}, where the chain inherits a mechanism from the stack and says so). Deliver markdown with EXACTLY these headings, each fact followed by the URL it came from: '## 2. Proof system' (what the docs say the chain uses: optimistic fault/fraud proofs, validity/ZK proofs, or none live yet; which proof system or prover (e.g. interactive fraud proofs, BoLD, OP Succinct, SP1, SNARK); whether anyone can propose a state root and challenge or prove it, or only whitelisted parties; the challenge period or proof finality time; the mainnet date the proofs went live if the docs give one). '## 3. Exit window and upgrades' (who can upgrade the L1 contracts: the governance body, security council or multisig, its threshold such as 9 of 12, any timelock delay in days; whether users get a window to exit before an upgrade takes effect). '## 4. Data availability' (where transaction data is posted: Ethereum blobs (EIP-4844), Ethereum calldata, or an external DA layer/committee, named). '## 5. Sequencer and forced inclusion' (who runs the sequencer, centralised or not; the documented way a user can force a transaction from L1 if the sequencer censors them, the function or contract name and the delay, e.g. 24 hours; or that no such path exists). '## 1. Stage' (anything the project itself writes about its L2BEAT stage or its decentralisation roadmap, with URL; else NOT FOUND). '## Not found' (every point the docs do not answer, and the pages you tried). Rules: quote or closely paraphrase the docs and give the URL after every fact; no L2BEAT, no news sites, no memory; if the docs contradict each other, show both. Never guess a threshold or a delay: NOT FOUND is the right answer when the docs are silent.",
      "items": [
        { "key": "base", "vars": { "name": "Base", "docs": "https://docs.base.org", "github": "https://github.com/base", "stack": "https://docs.optimism.io and https://specs.optimism.io (OP Stack)" } },
        { "key": "arbitrum", "vars": { "name": "Arbitrum One", "docs": "https://docs.arbitrum.io and https://docs.arbitrum.foundation", "github": "https://github.com/OffchainLabs", "stack": "https://docs.arbitrum.io (Arbitrum Nitro)" } },
        { "key": "optimism", "vars": { "name": "OP Mainnet", "docs": "https://docs.optimism.io and https://specs.optimism.io", "github": "https://github.com/ethereum-optimism", "stack": "https://specs.optimism.io (OP Stack)" } },
        { "key": "mantle", "vars": { "name": "Mantle", "docs": "https://docs.mantle.xyz", "github": "https://github.com/mantlenetworkio", "stack": "https://succinctlabs.github.io/op-succinct/ and https://specs.optimism.io (OP Succinct on the OP Stack)" } },
        { "key": "lighter", "vars": { "name": "Lighter", "docs": "https://docs.lighter.xyz (and https://lighter.xyz)", "github": "https://github.com/elliottech", "stack": "the project's own whitepaper or docs (Lighter is its own ZK rollup design)" } },
        { "key": "robinhood", "vars": { "name": "Robinhood Chain", "docs": "https://docs.robinhoodchain.com (and https://robinhood.com/chain or the chain's official docs site reached from L2BEAT's project links)", "github": "https://github.com/robinhood", "stack": "https://docs.arbitrum.io (Arbitrum Orbit / Nitro)" } }
      ],
      "output": { "format": "markdown", "maxBytes": 20000 },
      "merge": { "groupSize": 20, "brief": "Keep every result whole, one section per chain, in the order Base, Arbitrum One, OP Mainnet, Mantle, Lighter, Robinhood Chain." }
    },
    {
      "name": "release",
      "brief": "Find the newest release of the main node software and, if separate, the prover software that runs {{name}}, and the date of that release. Candidate repositories to check (verify; do not assume these are right): {{repos}}. Method: open each repository's Releases page (https://github.com/<org>/<repo>/releases) and Tags page; take the newest non-prerelease, non-draft release at the top (note separately if the newest entry is a pre-release or release candidate); read its tag name, title, and the published date shown on the release page; note in one line what the release notes say it changes. Also check the project's own docs 'node operators' / 'run a node' page for which software and version it tells operators to run today. Deliver markdown with EXACTLY these headings: '## Software' (the name of the main node software and who maintains it, with URL; whether the chain runs upstream stack software or its own fork). '## Newest node release' (repository URL, tag, release title, published date as shown, release URL, one line on the change, whether marked pre-release). '## Newest prover release' (same fields for the proof system software, e.g. fraud-proof or ZK prover; or 'same repository as node' or NOT FOUND with what you tried). '## Operator docs version' (what version the project's docs tell node operators to run, with URL; or NOT FOUND). '## Not found' (anything missing and the pages tried). Rules: every date and version copied from the page with its URL right after it; the date you read the pages, in UTC; never infer a release from a blog post or a package registry when the GitHub release page is reachable; if the software is closed-source or no public release exists, say so with the URLs you checked.",
      "items": [
        { "key": "base", "vars": { "name": "Base", "repos": "https://github.com/base/node (Base's node distribution), https://github.com/ethereum-optimism/optimism (op-node), https://github.com/ethereum-optimism/op-geth, https://github.com/base/reth" } },
        { "key": "arbitrum", "vars": { "name": "Arbitrum One", "repos": "https://github.com/OffchainLabs/nitro (Nitro node, includes the validator/fraud-proof software), https://github.com/OffchainLabs/bold" } },
        { "key": "optimism", "vars": { "name": "OP Mainnet", "repos": "https://github.com/ethereum-optimism/optimism (op-node, op-challenger), https://github.com/ethereum-optimism/op-geth" } },
        { "key": "mantle", "vars": { "name": "Mantle", "repos": "https://github.com/mantlenetworkio/mantle-v2, https://github.com/mantlenetworkio/op-geth, https://github.com/mantlenetworkio (any op-succinct fork), https://github.com/succinctlabs/op-succinct (upstream prover)" } },
        { "key": "lighter", "vars": { "name": "Lighter", "repos": "https://github.com/elliottech (look for node, prover or contracts repositories; Lighter's core may be closed-source, in which case say so and list what public repositories exist)" } },
        { "key": "robinhood", "vars": { "name": "Robinhood Chain", "repos": "https://github.com/OffchainLabs/nitro (Arbitrum Orbit chains run Nitro), https://github.com/robinhood (any chain or node repository), the chain's own docs site node-operator page" } }
      ],
      "output": { "format": "markdown", "maxBytes": 12000 },
      "merge": { "groupSize": 20, "brief": "Keep every result whole, one section per chain." }
    }
  ],
  "read": [],
  "cancel": [],
  "wake": { "batches": ["scope", "l2beat", "docs", "release"], "afterMinutes": 180 },
  "finish": false
}
