Skip to content

Add shared runner implementation#2292

Merged
findolor merged 14 commits intomainfrom
shared-runner
Nov 25, 2025
Merged

Add shared runner implementation#2292
findolor merged 14 commits intomainfrom
shared-runner

Conversation

@findolor
Copy link
Copy Markdown
Collaborator

@findolor findolor commented Nov 4, 2025

Chained PR

Motivation

See issues:

Solution

  • Refactor remote manifest logic to fetch multiple files
  • Check database schema version while parsing manifest files
  • Add shared runner implementation that will be used by both client and producer
  • Add and update tests

Checks

By submitting this for review, I'm confirming I've done the following:

  • made this PR as small as possible
  • unit-tested any new functionality
  • linked any relevant issues or PRs
  • included screenshots (if this involves a front-end change)

Summary by CodeRabbit

  • New Features

    • Concurrent remote manifest fetching and aggregation
    • New runner orchestration: parsing YAML runner settings, building runner targets, grouping by network, and composing engine pipelines
    • Remote manifest download + decompression flow and lookup utilities
  • Bug Fixes / Error Handling

    • Expanded local DB error variants with clearer messages for manifest, YAML, scanning, task join, and missing sync/remote cases
  • Chores

    • Centralized DB schema version constant and updated schema-version handling across tests and flows

✏️ Tip: You can customize this high-level summary in your review settings.

@findolor findolor requested review from 0xgleb and hardyjosh November 4, 2025 07:49
@findolor findolor self-assigned this Nov 4, 2025
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Nov 4, 2025

Walkthrough

Adds a new local-db runner subsystem (runner/{environment,remotes,utils}), introduces async manifest fetch/download abstractions and EnginePipelines, extends LocalDbError with YAML/manifest/task variants, centralizes schema version as DB_SCHEMA_VERSION, renames/extends manifest fetch APIs for multi-URL concurrent fetching, and updates tests to use DB_SCHEMA_VERSION.

Changes

Cohort / File(s) Summary
Schema version migration
crates/cli/src/commands/local_db/pipeline/bootstrap.rs, crates/common/src/local_db/pipeline/adapters/bootstrap.rs, crates/common/src/raindex_client/local_db/pipeline/bootstrap.rs
Replaced uses of DATABASE_SCHEMA_VERSION with DB_SCHEMA_VERSION from rain_orderbook_app_settings::local_db_manifest in tests and metadata insertion; updated test arguments and assertions accordingly.
LocalDbError extensions
crates/common/src/local_db/mod.rs
Added new error variants (SettingsYaml, YamlScan, ManifestFetch, TaskJoin, MissingLocalDbSyncForNetwork, MissingLocalDbRemote) with From conversions and extended readable-message mapping.
Runner module wiring
crates/common/src/local_db/pipeline/mod.rs, crates/common/src/local_db/pipeline/runner/mod.rs
Added pub mod runner and exposed environment, remotes, and utils submodules.
Runner environment & pipelines
crates/common/src/local_db/pipeline/runner/environment.rs
New generic RunnerEnvironment and EnginePipelines types; Arc-wrapped manifest_fetcher/dump_downloader/engine_builder interfaces; async helpers and default factories; tests for behavior and cloning.
Remote manifest handling
crates/common/src/local_db/pipeline/runner/remotes.rs
New URL collection, concurrent manifest fetching, gzip download+decompression, manifest lookup logic; maps manifest errors to LocalDbError; comprehensive tests including error cases.
Runner utils / settings parsing
crates/common/src/local_db/pipeline/runner/utils.rs
New ParsedRunnerSettings and RunnerTarget types; functions to parse runner YAML, build targets, create SyncInputs, and group targets by network; tests for mapping and error handling.
Settings and manifest APIs
crates/settings/src/local_db_manifest.rs, crates/settings/src/remote/manifest.rs, crates/settings/Cargo.toml
Added pub const DB_SCHEMA_VERSION: u32; changed ManifestNetwork.chain_id and related APIs from u64u32; manifest header now validates db-schema-version; networks optional; renamed fetchfetch_manifest and added fetch_multiple_manifests + ManifestMap; added InconsistentManifestVersions error; added futures workspace dependency.

Sequence Diagram(s)

sequenceDiagram
    participant RunnerEnv as RunnerEnvironment
    participant Remotes as remotes
    participant Settings as settings crate
    participant EngineBuilder as EngineBuilder
    participant Pipelines as EnginePipelines

    Note over RunnerEnv,Settings: Initialization
    RunnerEnv->>Settings: read DB_SCHEMA_VERSION (constant)

    rect rgb(220,240,255)
    Note over RunnerEnv,Remotes: Manifest discovery & fetch
    RunnerEnv->>Remotes: collect_manifest_urls(orderbooks)
    Remotes-->>RunnerEnv: deduplicated URLs
    RunnerEnv->>Remotes: get_manifests(orderbooks)
    Remotes->>Remotes: fetch_multiple_manifests(urls) concurrently
    Remotes-->>RunnerEnv: ManifestMap
    end

    rect rgb(240,220,255)
    Note over RunnerEnv,EngineBuilder: Build engines
    RunnerEnv->>RunnerEnv: build_runner_targets(settings_yaml)
    RunnerEnv->>EngineBuilder: engine_builder(RunnerTarget)
    EngineBuilder-->>RunnerEnv: EnginePipelines
    end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~50 minutes

  • New async/concurrent logic across runner environment, remotes, and utils increases review surface.
  • Type/signature changes (chain-id u64→u32, LocalDbManifest.find) require cross-file consistency checks.
  • Error enum additions and propagation paths need verification.

Areas to pay attention to:

  • Correctness and bounds of generic types and Arc/Clone behavior in RunnerEnvironment.
  • Concurrency/error aggregation in fetch_multiple_manifests / remotes::get_manifests.
  • Schema-version validation in settings/local_db_manifest and impacts on manifest parsing.
  • All call sites updated for chain_id type narrowing from u64→u32.
  • Mapping of external fetch errors into LocalDbError variants.

Possibly related issues

Possibly related PRs

Suggested reviewers

  • hardyjosh
  • 0xgleb

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 75.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'Add shared runner implementation' accurately reflects the main objective of this PR, which introduces new runner modules and orchestration logic for local DB pipeline management.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch shared-runner

Comment @coderabbitai help to get the list of available commands and usage tips.

@findolor findolor added this to the LocalDB Implementation milestone Nov 4, 2025
@findolor
Copy link
Copy Markdown
Collaborator Author

findolor commented Nov 4, 2025

@coderabbitai review

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Nov 4, 2025

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

📜 Review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between c2939cf and 3036bb0.

⛔ Files ignored due to path filters (1)
  • Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (12)
  • crates/cli/src/commands/local_db/pipeline/bootstrap.rs (8 hunks)
  • crates/common/src/local_db/mod.rs (7 hunks)
  • crates/common/src/local_db/pipeline/adapters/bootstrap.rs (12 hunks)
  • crates/common/src/local_db/pipeline/mod.rs (1 hunks)
  • crates/common/src/local_db/pipeline/runner/environment.rs (1 hunks)
  • crates/common/src/local_db/pipeline/runner/mod.rs (1 hunks)
  • crates/common/src/local_db/pipeline/runner/remotes.rs (1 hunks)
  • crates/common/src/local_db/pipeline/runner/utils.rs (1 hunks)
  • crates/common/src/raindex_client/local_db/pipeline/bootstrap.rs (14 hunks)
  • crates/settings/Cargo.toml (1 hunks)
  • crates/settings/src/local_db_manifest.rs (8 hunks)
  • crates/settings/src/remote/manifest.rs (6 hunks)
🧰 Additional context used
📓 Path-based instructions (3)
crates/*/{src,tests,benches,examples}/**/*.rs

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

Rust code must pass clippy with all warnings denied (cargo clippy --workspace --all-targets --all-features -D warnings)

Files:

  • crates/common/src/local_db/pipeline/mod.rs
  • crates/common/src/local_db/pipeline/adapters/bootstrap.rs
  • crates/common/src/local_db/pipeline/runner/mod.rs
  • crates/settings/src/local_db_manifest.rs
  • crates/common/src/raindex_client/local_db/pipeline/bootstrap.rs
  • crates/settings/src/remote/manifest.rs
  • crates/common/src/local_db/pipeline/runner/remotes.rs
  • crates/common/src/local_db/mod.rs
  • crates/common/src/local_db/pipeline/runner/environment.rs
  • crates/cli/src/commands/local_db/pipeline/bootstrap.rs
  • crates/common/src/local_db/pipeline/runner/utils.rs
crates/**/*.rs

📄 CodeRabbit inference engine (AGENTS.md)

Rust code lives in the workspace under crates/* (e.g., cli, common, bindings, js_api, quote, subgraph, settings, math, integration_tests)

Files:

  • crates/common/src/local_db/pipeline/mod.rs
  • crates/common/src/local_db/pipeline/adapters/bootstrap.rs
  • crates/common/src/local_db/pipeline/runner/mod.rs
  • crates/settings/src/local_db_manifest.rs
  • crates/common/src/raindex_client/local_db/pipeline/bootstrap.rs
  • crates/settings/src/remote/manifest.rs
  • crates/common/src/local_db/pipeline/runner/remotes.rs
  • crates/common/src/local_db/mod.rs
  • crates/common/src/local_db/pipeline/runner/environment.rs
  • crates/cli/src/commands/local_db/pipeline/bootstrap.rs
  • crates/common/src/local_db/pipeline/runner/utils.rs
**/*.rs

📄 CodeRabbit inference engine (AGENTS.md)

**/*.rs: Format Rust with nix develop -c cargo fmt --all
Lint Rust with nix develop -c rainix-rs-static (preconfigured flags)
Use snake_case for Rust crates/modules and PascalCase for types

Files:

  • crates/common/src/local_db/pipeline/mod.rs
  • crates/common/src/local_db/pipeline/adapters/bootstrap.rs
  • crates/common/src/local_db/pipeline/runner/mod.rs
  • crates/settings/src/local_db_manifest.rs
  • crates/common/src/raindex_client/local_db/pipeline/bootstrap.rs
  • crates/settings/src/remote/manifest.rs
  • crates/common/src/local_db/pipeline/runner/remotes.rs
  • crates/common/src/local_db/mod.rs
  • crates/common/src/local_db/pipeline/runner/environment.rs
  • crates/cli/src/commands/local_db/pipeline/bootstrap.rs
  • crates/common/src/local_db/pipeline/runner/utils.rs
🧠 Learnings (33)
📓 Common learnings
Learnt from: rouzwelt
Repo: rainlanguage/rain.orderbook PR: 0
File: :0-0
Timestamp: 2025-05-21T21:24:53.708Z
Learning: For PR #1884 in rainlanguage/rain.orderbook, provide a separate comment after each review with PR size statistics in the format: `TOTAL=number ADDITIONS=number DELETIONS=number`, excluding lock files like package-lock.json and cargo.lock.
Learnt from: rouzwelt
Repo: rainlanguage/rain.orderbook PR: 0
File: :0-0
Timestamp: 2025-05-21T21:24:53.708Z
Learning: For PR #1884 in rainlanguage/rain.orderbook, provide a separate comment after each review with PR size statistics in the format: `TOTAL=number ADDITIONS=number DELETIONS=number`, excluding lock files like package-lock.json and cargo.lock.
Learnt from: rouzwelt
Repo: rainlanguage/rain.orderbook PR: 0
File: :0-0
Timestamp: 2025-05-21T21:24:53.708Z
Learning: For PR #1884 in rainlanguage/rain.orderbook, provide a separate comment after each review with PR size statistics in the format: `TOTAL=number ADDITIONS=number DELETIONS=number`, excluding lock files like package-lock.json and cargo.lock.
Learnt from: rouzwelt
Repo: rainlanguage/rain.orderbook PR: 0
File: :0-0
Timestamp: 2025-05-21T21:24:53.708Z
Learning: For PR #1884 in rainlanguage/rain.orderbook, provide a separate comment after each review with PR size statistics in the format: `TOTAL=number ADDITIONS=number DELETIONS=number`, excluding lock files like package-lock.json and cargo.lock.
Learnt from: rouzwelt
Repo: rainlanguage/rain.orderbook PR: 0
File: :0-0
Timestamp: 2025-05-21T21:25:47.873Z
Learning: After each new commit review for rainlanguage/rain.orderbook repository, generate a PR size report in a separate comment with the format: "TOTAL=number ADDITIONS=number DELETIONS=number". This report should exclude irrelevant files such as lock files (e.g., package-lock.json, cargo.lock).
📚 Learning: 2025-10-06T08:05:50.452Z
Learnt from: CR
Repo: rainlanguage/rain.orderbook PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-10-06T08:05:50.452Z
Learning: Applies to crates/**/*.rs : Rust code lives in the workspace under crates/* (e.g., cli, common, bindings, js_api, quote, subgraph, settings, math, integration_tests)

Applied to files:

  • crates/settings/Cargo.toml
  • crates/common/src/local_db/pipeline/runner/mod.rs
📚 Learning: 2025-05-16T17:24:34.724Z
Learnt from: 0xgleb
Repo: rainlanguage/rain.orderbook PR: 1844
File: tauri-app/src-tauri/src/commands/wallet.rs:27-28
Timestamp: 2025-05-16T17:24:34.724Z
Learning: In Rust projects, dependencies listed in the [dependencies] section of Cargo.toml are available for both application code and tests. The tokio crate with the "full" feature set includes the "test" feature needed for `#[tokio::test]` to work properly.

Applied to files:

  • crates/settings/Cargo.toml
  • crates/settings/src/remote/manifest.rs
📚 Learning: 2025-05-16T17:24:34.724Z
Learnt from: 0xgleb
Repo: rainlanguage/rain.orderbook PR: 1844
File: tauri-app/src-tauri/src/commands/wallet.rs:27-28
Timestamp: 2025-05-16T17:24:34.724Z
Learning: In Rust projects, dependencies listed in the [dependencies] section of Cargo.toml are available for both application code and tests. There's no need to duplicate them in [dev-dependencies] unless you want a different version or configuration specifically for tests.

Applied to files:

  • crates/settings/Cargo.toml
📚 Learning: 2025-05-14T05:13:59.713Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 1744
File: crates/subgraph/src/orderbook_client.rs:44-46
Timestamp: 2025-05-14T05:13:59.713Z
Learning: In the rain.orderbook project, WASM dependencies are intentionally made available in non-WASM targets to facilitate testing of WASM-related functionality, so conditional compilation guards like `#[cfg(target_family = "wasm")]` should not be added to imports or implementations that may be needed for tests.

Applied to files:

  • crates/settings/Cargo.toml
📚 Learning: 2025-05-14T04:49:14.621Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 1710
File: crates/quote/Cargo.toml:30-30
Timestamp: 2025-05-14T04:49:14.621Z
Learning: In the rain.orderbook repository, wasm-bindgen-utils is intentionally used as an unconditional dependency because non-wasm targets (like tests) sometimes need to use it.

Applied to files:

  • crates/settings/Cargo.toml
📚 Learning: 2025-04-30T09:28:36.960Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 1715
File: crates/js_api/src/common/mod.rs:111-118
Timestamp: 2025-04-30T09:28:36.960Z
Learning: In the rain.orderbook repository, the WASM tests are already properly configured with conditional compilation using `#[cfg(target_family = "wasm")]` and `#[cfg(not(target_family = "wasm"))]`, and don't require additional `wasm_bindgen_test_configure!(run_in_browser)` directives.

Applied to files:

  • crates/settings/Cargo.toml
  • crates/common/src/local_db/pipeline/runner/environment.rs
📚 Learning: 2025-05-19T13:40:56.080Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 1858
File: crates/subgraph/src/orderbook_client/mod.rs:54-58
Timestamp: 2025-05-19T13:40:56.080Z
Learning: The `wasm_bindgen_utils` crate in the Rain Orderbook project handles conditional compilation for `JsValue` and `JsError` internally, allowing `impl From<Error> for JsValue` to work on non-WASM targets without explicit cfg guards.

Applied to files:

  • crates/settings/Cargo.toml
📚 Learning: 2025-06-06T16:38:04.182Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 1913
File: Cargo.toml:55-55
Timestamp: 2025-06-06T16:38:04.182Z
Learning: In rain.orderbook repository, during PR chains involving dependency updates, wasm-bindgen-utils may temporarily point to git commits that don't contain the full required functionality, with the understanding that subsequent PRs in the chain will update it to the correct commit.

Applied to files:

  • crates/settings/Cargo.toml
📚 Learning: 2025-07-18T10:31:05.498Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 2008
File: crates/common/src/raindex_client/add_orders.rs:85-86
Timestamp: 2025-07-18T10:31:05.498Z
Learning: In the rainlanguage/rain.orderbook codebase, cfg-guarded imports like `#[cfg(not(target_family = "wasm"))] use super::*;` in test modules are sometimes needed to fix compiler warnings, even when similar imports exist in nested sub-modules. These should not be removed as they serve a specific purpose in the compilation process.

Applied to files:

  • crates/settings/Cargo.toml
📚 Learning: 2025-08-01T09:07:20.383Z
Learnt from: brusherru
Repo: rainlanguage/rain.orderbook PR: 2044
File: packages/orderbook/README.md:186-189
Timestamp: 2025-08-01T09:07:20.383Z
Learning: In the rainlanguage/rain.orderbook project, Rust methods on structs like RaindexVaultsList are exported as JavaScript getters in WASM bindings using #[wasm_bindgen(getter)]. This means while the Rust code uses method calls like items(), the JavaScript/WASM API exposes them as property access like .items. The README.md correctly documents the JavaScript API surface, not the Rust implementation details.

Applied to files:

  • crates/settings/Cargo.toml
📚 Learning: 2025-06-24T13:30:02.968Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 1950
File: crates/common/src/raindex_client/transactions.rs:34-38
Timestamp: 2025-06-24T13:30:02.968Z
Learning: When using #[wasm_bindgen] on an impl block, all methods within that block must have wasm_bindgen attributes, even if they are conditionally compiled for non-WASM targets using #[cfg(not(target_family = "wasm"))]. Removing these attributes causes compiler errors because the wasm_bindgen macro expansion processes the entire impl block and expects consistent attribute usage across all methods.

Applied to files:

  • crates/settings/Cargo.toml
📚 Learning: 2025-10-06T11:44:07.888Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 2145
File: crates/common/src/raindex_client/local_db/query/create_tables/query.sql:71-72
Timestamp: 2025-10-06T11:44:07.888Z
Learning: The local DB feature in the rain.orderbook codebase is not live yet (as of PR #2145), so schema migrations for existing databases are not required when modifying table structures in `crates/common/src/raindex_client/local_db/query/create_tables/query.sql`.

Applied to files:

  • crates/common/src/local_db/pipeline/adapters/bootstrap.rs
  • crates/common/src/raindex_client/local_db/pipeline/bootstrap.rs
  • crates/common/src/local_db/mod.rs
  • crates/cli/src/commands/local_db/pipeline/bootstrap.rs
📚 Learning: 2025-10-14T07:51:55.148Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 2202
File: crates/common/src/raindex_client/local_db/sync.rs:33-34
Timestamp: 2025-10-14T07:51:55.148Z
Learning: In `crates/common/src/raindex_client/local_db/sync.rs`, the hard-coded `DEFAULT_SYNC_CHAIN_ID` constant (set to `SUPPORTED_LOCAL_DB_CHAINS[0]`) will be replaced with proper chain ID handling in downstream PRs as part of the multi-network/orderbook implementation.

Applied to files:

  • crates/common/src/local_db/pipeline/adapters/bootstrap.rs
  • crates/settings/src/local_db_manifest.rs
  • crates/common/src/raindex_client/local_db/pipeline/bootstrap.rs
  • crates/common/src/local_db/mod.rs
  • crates/cli/src/commands/local_db/pipeline/bootstrap.rs
📚 Learning: 2025-10-06T11:13:29.956Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 2123
File: crates/common/src/raindex_client/local_db/mod.rs:23-29
Timestamp: 2025-10-06T11:13:29.956Z
Learning: In `crates/common/src/raindex_client/local_db/mod.rs`, the `Default` implementation for `LocalDb` that creates an RPC client pointing to `http://localhost:4444` is acceptable because the RPC client must be explicitly configured before actual usage in production scenarios.

Applied to files:

  • crates/common/src/local_db/pipeline/adapters/bootstrap.rs
  • crates/settings/src/local_db_manifest.rs
  • crates/common/src/raindex_client/local_db/pipeline/bootstrap.rs
  • crates/common/src/local_db/mod.rs
  • crates/cli/src/commands/local_db/pipeline/bootstrap.rs
📚 Learning: 2025-10-06T06:07:57.208Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 2111
File: crates/common/src/raindex_client/mod.rs:13-13
Timestamp: 2025-10-06T06:07:57.208Z
Learning: In Rust, when a module is declared in the same file with `pub mod module_name;`, importing from that module using `use module_name::Item;` is valid and does not require the `self::` prefix. The order of `use` statements and `mod` declarations does not affect module resolution.

Applied to files:

  • crates/common/src/local_db/pipeline/runner/mod.rs
📚 Learning: 2025-06-18T19:24:40.518Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 1938
File: crates/settings/src/yaml/orderbook.rs:185-199
Timestamp: 2025-06-18T19:24:40.518Z
Learning: In crates/settings/src/yaml/orderbook.rs, the user prefers not to refactor get_orderbook_by_network_key to handle multiple orderbooks per network key since their current architecture maintains a one-to-one mapping between orderbooks and networks. They would consider the refactoring if the system evolves to support multiple orderbooks per network in the future.

Applied to files:

  • crates/settings/src/local_db_manifest.rs
📚 Learning: 2025-06-20T07:26:50.488Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 1941
File: crates/settings/src/yaml/orderbook.rs:112-123
Timestamp: 2025-06-20T07:26:50.488Z
Learning: In crates/settings/src/yaml/orderbook.rs, the user prefers to keep the get_network_by_chain_id implementation simple with O(n) lookup rather than adding caching complexity for performance optimization, even if the method might be called frequently.

Applied to files:

  • crates/settings/src/local_db_manifest.rs
📚 Learning: 2025-10-18T10:38:41.273Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 2237
File: crates/common/src/raindex_client/local_db/sync.rs:79-89
Timestamp: 2025-10-18T10:38:41.273Z
Learning: In `crates/common/src/raindex_client/local_db/sync.rs`, the sync_database method currently only supports indexing a single orderbook per chain ID, which is why `.first()` is used to select the orderbook configuration. Multi-orderbook support per chain ID is planned for future PRs.

Applied to files:

  • crates/settings/src/local_db_manifest.rs
  • crates/common/src/raindex_client/local_db/pipeline/bootstrap.rs
  • crates/common/src/local_db/pipeline/runner/remotes.rs
  • crates/common/src/local_db/mod.rs
  • crates/cli/src/commands/local_db/pipeline/bootstrap.rs
📚 Learning: 2025-06-18T18:24:32.049Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 1938
File: crates/settings/src/yaml/orderbook.rs:180-199
Timestamp: 2025-06-18T18:24:32.049Z
Learning: In crates/settings/src/yaml/orderbook.rs, the user prefers to avoid refactoring duplicate search logic between get_orderbook_by_address and get_orderbook_by_network_key when there are only 2 functions, indicating they would consider it if more similar functions are added in the future.

Applied to files:

  • crates/settings/src/local_db_manifest.rs
📚 Learning: 2025-04-07T09:54:21.782Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 1483
File: crates/settings/src/yaml/orderbook.rs:45-45
Timestamp: 2025-04-07T09:54:21.782Z
Learning: The validation in OrderbookYaml's new method that includes RemoteNetworksCfg::parse_all_from_yaml is intentional and should remain as is, without conditional handling for users that only have local networks.

Applied to files:

  • crates/settings/src/local_db_manifest.rs
📚 Learning: 2025-06-18T19:23:33.747Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 1938
File: crates/settings/src/yaml/mod.rs:176-178
Timestamp: 2025-06-18T19:23:33.747Z
Learning: In crates/settings/src/yaml/mod.rs, the YamlError enum has two distinct error variants: `KeyNotFound(String)` for when a specific YAML key is not found in a hash/map, and `NotFound(String)` for when other types of entities (like networks, orderbooks, etc.) are not found in the configuration. These serve different purposes and should not be consolidated.

Applied to files:

  • crates/settings/src/local_db_manifest.rs
  • crates/common/src/local_db/mod.rs
📚 Learning: 2025-07-11T06:40:49.511Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 1983
File: crates/js_api/src/gui/mod.rs:964-1199
Timestamp: 2025-07-11T06:40:49.511Z
Learning: In crates/js_api/src/gui/mod.rs tests, findolor prefers to keep large hardcoded YAML strings (like the validation test YAML) inline in the test file rather than extracting them to separate external files for maintainability purposes.

Applied to files:

  • crates/settings/src/local_db_manifest.rs
📚 Learning: 2025-04-08T12:53:12.526Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 1588
File: packages/orderbook/test/js_api/gui.test.ts:2037-2057
Timestamp: 2025-04-08T12:53:12.526Z
Learning: In the remote network test for gui.test.ts, asserting that getCurrentDeployment() succeeds is sufficient validation that remote networks were properly fetched, as this operation would fail if the networks weren't correctly processed.

Applied to files:

  • crates/settings/src/local_db_manifest.rs
📚 Learning: 2025-10-06T14:41:41.909Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 2159
File: crates/cli/src/commands/local_db/sync/runner/mod.rs:52-113
Timestamp: 2025-10-06T14:41:41.909Z
Learning: The local DB sync CLI command (crates/cli/src/commands/local_db/sync/) is designed for CI-only usage, and simple println! statements are preferred over structured logging for status messages.

Applied to files:

  • crates/common/src/raindex_client/local_db/pipeline/bootstrap.rs
  • crates/cli/src/commands/local_db/pipeline/bootstrap.rs
📚 Learning: 2025-10-06T11:28:30.692Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 2145
File: crates/common/src/raindex_client/local_db/query/fetch_orders/query.sql:6-7
Timestamp: 2025-10-06T11:28:30.692Z
Learning: In `crates/common/src/raindex_client/local_db/query/fetch_orders/query.sql`, the orderbook_address is currently hardcoded to '0x2f209e5b67A33B8fE96E28f24628dF6Da301c8eB' because the system only supports a single orderbook at the moment. Multiorderbook logic is not yet implemented and will be added in the future.

Applied to files:

  • crates/common/src/raindex_client/local_db/pipeline/bootstrap.rs
📚 Learning: 2025-07-30T07:41:39.271Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 2012
File: crates/js_api/src/registry.rs:485-512
Timestamp: 2025-07-30T07:41:39.271Z
Learning: In crates/js_api/src/registry.rs, findolor considers the current concurrent fetching of order files using futures::future::join_all without concurrency limits to be acceptable, preferring the simple approach over adding concurrency limiting mechanisms for the DotrainRegistry implementation.

Applied to files:

  • crates/settings/src/remote/manifest.rs
📚 Learning: 2025-06-17T16:21:24.384Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 1903
File: crates/settings/src/yaml/orderbook.rs:371-377
Timestamp: 2025-06-17T16:21:24.384Z
Learning: In crates/settings/src/yaml/orderbook.rs tests, the user findolor considers RPC ordering in Vec<Url> assertions to be intentional and not a test brittleness issue. The ordering of RPCs in tests should be preserved as specified.

Applied to files:

  • crates/settings/src/remote/manifest.rs
  • crates/common/src/local_db/pipeline/runner/remotes.rs
📚 Learning: 2025-06-17T16:28:19.664Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 1903
File: tauri-app/src/routes/orders/[network]-[orderHash]/page.test.ts:68-69
Timestamp: 2025-06-17T16:28:19.664Z
Learning: In the tauri-app test files, the team is comfortable using single URLs in rpcs arrays for test mocks rather than multiple URLs, even when testing multi-RPC functionality. They don't consider this a coverage gap that needs to be addressed.

Applied to files:

  • crates/settings/src/remote/manifest.rs
📚 Learning: 2025-05-20T10:20:08.206Z
Learnt from: 0xgleb
Repo: rainlanguage/rain.orderbook PR: 1859
File: crates/quote/src/quote_debug.rs:472-492
Timestamp: 2025-05-20T10:20:08.206Z
Learning: In the Rain Orderbook codebase, the `#[tokio::test(flavor = "multi_thread")]` annotation is specifically needed for tests that use `LocalEvm`, not just for consistency across all async tests.

Applied to files:

  • crates/settings/src/remote/manifest.rs
📚 Learning: 2025-08-01T07:35:13.418Z
Learnt from: brusherru
Repo: rainlanguage/rain.orderbook PR: 2036
File: crates/js_api/src/filters/errors.rs:39-46
Timestamp: 2025-08-01T07:35:13.418Z
Learning: In the Rain Orderbook project's PersistentFilterStoreError (crates/js_api/src/filters/errors.rs), the Display implementation already provides user-friendly error messages, so using err.to_string() for both msg and readable_msg in the WasmEncodedError conversion is appropriate and doesn't require separate readable message handling.

Applied to files:

  • crates/common/src/local_db/mod.rs
📚 Learning: 2025-08-02T02:34:32.237Z
Learnt from: brusherru
Repo: rainlanguage/rain.orderbook PR: 2036
File: crates/js_api/src/filters/raindex_filter_store.rs:446-533
Timestamp: 2025-08-02T02:34:32.237Z
Learning: In the rainlanguage/rain.orderbook project's RaindexFilterStore WASM tests (crates/js_api/src/filters/raindex_filter_store.rs), brusherru decided to focus on testing only methods without side effects (that don't use web_sys) due to difficulties with mocking localStorage and window APIs in the WASM test environment. This pragmatic approach tests pure logic separately from browser integration.

Applied to files:

  • crates/common/src/local_db/pipeline/runner/environment.rs
📚 Learning: 2025-04-03T09:45:04.200Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 1477
File: crates/settings/src/remote_networks.rs:40-75
Timestamp: 2025-04-03T09:45:04.200Z
Learning: The RemoteNetworksCfg implementation in crates/settings/src/remote_networks.rs intentionally fetches remote networks sequentially rather than in parallel.

Applied to files:

  • crates/common/src/local_db/pipeline/runner/utils.rs
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: git-clean
🔇 Additional comments (7)
crates/common/src/raindex_client/local_db/pipeline/bootstrap.rs (1)

198-307: Centralized schema constant in tests.

Thanks for wiring the test scaffolding to the shared DB_SCHEMA_VERSION; this keeps the bootstrap harness aligned with the manifest contract with zero behavior drift.

crates/common/src/local_db/pipeline/adapters/bootstrap.rs (1)

42-105: Fallback schema version stays authoritative.

The db_schema_version.unwrap_or(DB_SCHEMA_VERSION) path keeps on-disk resets and schema validation speaking the same constant without altering existing behavior.

crates/cli/src/commands/local_db/pipeline/bootstrap.rs (1)

170-298: Producer adapter tests share the manifest constant.

Great to see the CLI harness lean on DB_SCHEMA_VERSION; this keeps both sides of the runner in sync with the manifest contract.

crates/settings/src/local_db_manifest.rs (2)

101-114: Early schema-version gate keeps manifest compatibility tight.

Failing fast when db-schema-version disagrees with DB_SCHEMA_VERSION is a solid safeguard—much better than letting downstream bootstrap discover the mismatch later.


123-148: Confirm type validation behavior change in networks parsing.

Your concern is valid. The code now silently accepts malformed networks fields (e.g., networks: [] or networks: "string") instead of raising a type error.

When optional_hash(doc, "networks") calls as_hash() on a non-hash value, it returns None, the if let block is skipped, and an empty networks map is returned. Previously, require_hash would explicitly error on type mismatches via ok_or_else().

Please confirm whether this behavioral change is intentional. If not, add an explicit type check when the networks field is present but not a hash, or restore the strict validation.

crates/common/src/local_db/pipeline/runner/remotes.rs (2)

24-67: Manifest fetch plumbing looks solid.

The combination of URL deduping and a single fetch_multiple_manifests call gives us one place to fan out requests and propagate structured errors—nice and clean.


38-51: Gzip download path handles errors decisively.

Appreciate the explicit status check and io/reqwest error propagation in download_and_gunzip; this should make diagnosing bad dumps much easier.

Comment on lines +16 to +25
pub type ManifestFuture =
Pin<Box<dyn Future<Output = Result<ManifestMap, LocalDbError>> + 'static>>;
pub type DumpFuture = Pin<Box<dyn Future<Output = Result<String, LocalDbError>> + 'static>>;

pub type ManifestFetcher =
Arc<dyn Fn(&HashMap<String, OrderbookCfg>) -> ManifestFuture + Send + Sync>;
pub type DumpDownloader = Arc<dyn Fn(&Url) -> DumpFuture + Send + Sync>;
pub type EngineBuilder<B, W, E, T, A, S> = Arc<
dyn Fn(&RunnerTarget) -> Result<EnginePipelines<B, W, E, T, A, S>, LocalDbError> + Send + Sync,
>;
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot Nov 4, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Require Send futures so the environment can run on multi-threaded executors

ManifestFuture and DumpFuture drop the Send bound. As a result, RunnerEnvironment::fetch_manifests / download_dump futures are not Send, preventing callers from spawning them on Tokio’s multi-threaded runtime (e.g., in the shared runner). We need these hooks to preserve Send; the default implementations already satisfy it, but the type aliases must enforce it.

-pub type ManifestFuture =
-    Pin<Box<dyn Future<Output = Result<ManifestMap, LocalDbError>> + 'static>>;
-pub type DumpFuture = Pin<Box<dyn Future<Output = Result<String, LocalDbError>> + 'static>>;
+pub type ManifestFuture =
+    Pin<Box<dyn Future<Output = Result<ManifestMap, LocalDbError>> + Send + 'static>>;
+pub type DumpFuture =
+    Pin<Box<dyn Future<Output = Result<String, LocalDbError>> + Send + 'static>>;
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
pub type ManifestFuture =
Pin<Box<dyn Future<Output = Result<ManifestMap, LocalDbError>> + 'static>>;
pub type DumpFuture = Pin<Box<dyn Future<Output = Result<String, LocalDbError>> + 'static>>;
pub type ManifestFetcher =
Arc<dyn Fn(&HashMap<String, OrderbookCfg>) -> ManifestFuture + Send + Sync>;
pub type DumpDownloader = Arc<dyn Fn(&Url) -> DumpFuture + Send + Sync>;
pub type EngineBuilder<B, W, E, T, A, S> = Arc<
dyn Fn(&RunnerTarget) -> Result<EnginePipelines<B, W, E, T, A, S>, LocalDbError> + Send + Sync,
>;
pub type ManifestFuture =
Pin<Box<dyn Future<Output = Result<ManifestMap, LocalDbError>> + Send + 'static>>;
pub type DumpFuture =
Pin<Box<dyn Future<Output = Result<String, LocalDbError>> + Send + 'static>>;
pub type ManifestFetcher =
Arc<dyn Fn(&HashMap<String, OrderbookCfg>) -> ManifestFuture + Send + Sync>;
pub type DumpDownloader = Arc<dyn Fn(&Url) -> DumpFuture + Send + Sync>;
pub type EngineBuilder<B, W, E, T, A, S> = Arc<
dyn Fn(&RunnerTarget) -> Result<EnginePipelines<B, W, E, T, A, S>, LocalDbError> + Send + Sync,
>;
🤖 Prompt for AI Agents
In crates/common/src/local_db/pipeline/runner/environment.rs around lines 16 to
25, the ManifestFuture and DumpFuture type aliases currently drop the Send bound
which prevents callers from spawning those futures on multi-threaded executors;
update the aliases so the boxed dyn Future includes + Send (i.e., Pin<Box<dyn
Future<Output = Result<ManifestMap, LocalDbError>> + Send + 'static>> and
similarly for DumpFuture) so the futures are Send, leaving the ManifestFetcher,
DumpDownloader, and EngineBuilder aliases unchanged.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is not needed

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@findolor, understood! I've noted that the Send bounds are not required for these future types in your use case.


🧠 Learnings used
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 2123
File: crates/common/src/raindex_client/local_db/mod.rs:23-29
Timestamp: 2025-10-06T11:13:29.956Z
Learning: In `crates/common/src/raindex_client/local_db/mod.rs`, the `Default` implementation for `LocalDb` that creates an RPC client pointing to `http://localhost:4444` is acceptable because the RPC client must be explicitly configured before actual usage in production scenarios.

Learnt from: 0xgleb
Repo: rainlanguage/rain.orderbook PR: 1859
File: crates/quote/src/quote_debug.rs:472-492
Timestamp: 2025-05-20T10:20:08.206Z
Learning: In the Rain Orderbook codebase, the `#[tokio::test(flavor = "multi_thread")]` annotation is specifically needed for tests that use `LocalEvm`, not just for consistency across all async tests.

Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 2008
File: crates/common/src/raindex_client/add_orders.rs:85-86
Timestamp: 2025-07-18T10:31:05.498Z
Learning: In the rainlanguage/rain.orderbook codebase, cfg-guarded imports like `#[cfg(not(target_family = "wasm"))] use super::*;` in test modules are sometimes needed to fix compiler warnings, even when similar imports exist in nested sub-modules. These should not be removed as they serve a specific purpose in the compilation process.

Learnt from: rouzwelt
Repo: rainlanguage/rain.orderbook PR: 0
File: :0-0
Timestamp: 2025-05-21T21:24:53.708Z
Learning: For PR #1884 in rainlanguage/rain.orderbook, provide a separate comment after each review with PR size statistics in the format: `TOTAL=number ADDITIONS=number DELETIONS=number`, excluding lock files like package-lock.json and cargo.lock.

Learnt from: rouzwelt
Repo: rainlanguage/rain.orderbook PR: 0
File: :0-0
Timestamp: 2025-05-21T21:24:53.708Z
Learning: For PR #1884 in rainlanguage/rain.orderbook, provide a separate comment after each review with PR size statistics in the format: `TOTAL=number ADDITIONS=number DELETIONS=number`, excluding lock files like package-lock.json and cargo.lock.

Learnt from: rouzwelt
Repo: rainlanguage/rain.orderbook PR: 0
File: :0-0
Timestamp: 2025-05-21T21:24:53.708Z
Learning: For PR #1884 in rainlanguage/rain.orderbook, provide a separate comment after each review with PR size statistics in the format: `TOTAL=number ADDITIONS=number DELETIONS=number`, excluding lock files like package-lock.json and cargo.lock.

Learnt from: rouzwelt
Repo: rainlanguage/rain.orderbook PR: 0
File: :0-0
Timestamp: 2025-05-21T21:24:53.708Z
Learning: For PR #1884 in rainlanguage/rain.orderbook, provide a separate comment after each review with PR size statistics in the format: `TOTAL=number ADDITIONS=number DELETIONS=number`, excluding lock files like package-lock.json and cargo.lock.

Learnt from: rouzwelt
Repo: rainlanguage/rain.orderbook PR: 0
File: :0-0
Timestamp: 2025-05-21T21:25:47.873Z
Learning: After each new commit review for rainlanguage/rain.orderbook repository, generate a PR size report in a separate comment with the format: "TOTAL=number ADDITIONS=number DELETIONS=number". This report should exclude irrelevant files such as lock files (e.g., package-lock.json, cargo.lock).

Comment on lines +35 to +44
let manifests_by_url =
results
.into_iter()
.fold(HashMap::new(), |mut acc: ManifestMap, (url, manifest)| {
acc.insert(url, manifest);
acc
});

Ok(manifests_by_url)
}
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot Nov 4, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Enforce manifest/schema version consistency across URLs.

fetch_multiple_manifests only folds the joined results into a map, so if one URL serves a manifest with a different manifest_version or db_schema_version we silently accept it and the new InconsistentManifestVersions error can never trip. That leaves the runner operating on mutually incompatible manifests. Please compare each fetched manifest against the baseline and return the conflicting URL via the new error.

-    let manifests_by_url =
-        results
-            .into_iter()
-            .fold(HashMap::new(), |mut acc: ManifestMap, (url, manifest)| {
-                acc.insert(url, manifest);
-                acc
-            });
-
-    Ok(manifests_by_url)
+    let mut iter = results.into_iter();
+    let Some((first_url, first_manifest)) = iter.next() else {
+        return Ok(HashMap::new());
+    };
+
+    let expected_manifest_version = first_manifest.manifest_version;
+    let expected_schema_version = first_manifest.db_schema_version;
+
+    let mut manifests_by_url = HashMap::new();
+    manifests_by_url.insert(first_url, first_manifest);
+
+    for (url, manifest) in iter {
+        if manifest.manifest_version != expected_manifest_version
+            || manifest.db_schema_version != expected_schema_version
+        {
+            return Err(FetchManifestError::InconsistentManifestVersions { url });
+        }
+        manifests_by_url.insert(url, manifest);
+    }
+
+    Ok(manifests_by_url)
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
let manifests_by_url =
results
.into_iter()
.fold(HashMap::new(), |mut acc: ManifestMap, (url, manifest)| {
acc.insert(url, manifest);
acc
});
Ok(manifests_by_url)
}
let mut iter = results.into_iter();
let Some((first_url, first_manifest)) = iter.next() else {
return Ok(HashMap::new());
};
let expected_manifest_version = first_manifest.manifest_version;
let expected_schema_version = first_manifest.db_schema_version;
let mut manifests_by_url = HashMap::new();
manifests_by_url.insert(first_url, first_manifest);
for (url, manifest) in iter {
if manifest.manifest_version != expected_manifest_version
|| manifest.db_schema_version != expected_schema_version
{
return Err(FetchManifestError::InconsistentManifestVersions { url });
}
manifests_by_url.insert(url, manifest);
}
Ok(manifests_by_url)
}

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

during parsing we check for the manifest and db schema version so there is no way that we have different values

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Check the parse_manifest_header and parse_manifest_doc functions to verify version validation
ast-grep --pattern 'fn parse_manifest_header($$$) {
  $$$
}'

# Also search for DB_SCHEMA_VERSION usage in validation
rg -n "DB_SCHEMA_VERSION" crates/settings/src/local_db_manifest.rs -A 3 -B 3

# Check for manifest_version validation
rg -n "manifest.version|manifest_version" crates/settings/src/local_db_manifest.rs -A 2 -B 2

Length of output: 6126


@findolor You're absolutely right! I've verified the parsing implementation and can confirm that parse_manifest_header enforces both version checks:

  1. manifest_version is validated against MANIFEST_VERSION constant (lines 77-86)
  2. db_schema_version is validated against DB_SCHEMA_VERSION constant (lines 101-108)

Since fetch_manifest calls parse_manifest_doc, which in turn calls parse_manifest_header, any manifest with incompatible versions will fail to parse and return a YamlError before being added to the results. The try_join_all will then propagate that error immediately, preventing any inconsistent manifests from coexisting in the map.

This means the InconsistentManifestVersions error variant is unreachable in the current implementation. You might consider removing it if it's not intended for future use, or adding a comment explaining its purpose if you're keeping it for a different validation scenario.

My apologies for the noise on this one! 🐰


✏️ Learnings added
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 2292
File: crates/settings/src/remote/manifest.rs:35-44
Timestamp: 2025-11-04T09:20:06.343Z
Learning: In the rain.orderbook codebase, manifest version validation happens during parsing in crates/settings/src/local_db_manifest.rs. The parse_manifest_header function validates both manifest_version against MANIFEST_VERSION and db_schema_version against DB_SCHEMA_VERSION constants, failing with YamlError if either doesn't match. This means fetch_manifest calls will fail before returning if versions are incompatible, making cross-URL version consistency checks unnecessary in fetch_multiple_manifests.

Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.


🧠 Learnings used
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 2012
File: crates/js_api/src/registry.rs:485-512
Timestamp: 2025-07-30T07:41:39.271Z
Learning: In crates/js_api/src/registry.rs, findolor considers the current concurrent fetching of order files using futures::future::join_all without concurrency limits to be acceptable, preferring the simple approach over adding concurrency limiting mechanisms for the DotrainRegistry implementation.

Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 1477
File: crates/settings/src/remote_networks.rs:40-75
Timestamp: 2025-04-03T09:45:04.200Z
Learning: The RemoteNetworksCfg implementation in crates/settings/src/remote_networks.rs intentionally fetches remote networks sequentially rather than in parallel.

Learnt from: rouzwelt
Repo: rainlanguage/rain.orderbook PR: 0
File: :0-0
Timestamp: 2025-05-21T21:24:53.708Z
Learning: For PR #1884 in rainlanguage/rain.orderbook, provide a separate comment after each review with PR size statistics in the format: `TOTAL=number ADDITIONS=number DELETIONS=number`, excluding lock files like package-lock.json and cargo.lock.

Learnt from: rouzwelt
Repo: rainlanguage/rain.orderbook PR: 0
File: :0-0
Timestamp: 2025-05-21T21:24:53.708Z
Learning: For PR #1884 in rainlanguage/rain.orderbook, provide a separate comment after each review with PR size statistics in the format: `TOTAL=number ADDITIONS=number DELETIONS=number`, excluding lock files like package-lock.json and cargo.lock.

Learnt from: rouzwelt
Repo: rainlanguage/rain.orderbook PR: 0
File: :0-0
Timestamp: 2025-05-21T21:24:53.708Z
Learning: For PR #1884 in rainlanguage/rain.orderbook, provide a separate comment after each review with PR size statistics in the format: `TOTAL=number ADDITIONS=number DELETIONS=number`, excluding lock files like package-lock.json and cargo.lock.

Learnt from: rouzwelt
Repo: rainlanguage/rain.orderbook PR: 0
File: :0-0
Timestamp: 2025-05-21T21:24:53.708Z
Learning: For PR #1884 in rainlanguage/rain.orderbook, provide a separate comment after each review with PR size statistics in the format: `TOTAL=number ADDITIONS=number DELETIONS=number`, excluding lock files like package-lock.json and cargo.lock.

Learnt from: rouzwelt
Repo: rainlanguage/rain.orderbook PR: 0
File: :0-0
Timestamp: 2025-05-21T21:25:47.873Z
Learning: After each new commit review for rainlanguage/rain.orderbook repository, generate a PR size report in a separate comment with the format: "TOTAL=number ADDITIONS=number DELETIONS=number". This report should exclude irrelevant files such as lock files (e.g., package-lock.json, cargo.lock).

@findolor findolor linked an issue Nov 6, 2025 that may be closed by this pull request
Comment on lines +16 to +18
pub type ManifestFuture =
Pin<Box<dyn Future<Output = Result<ManifestMap, LocalDbError>> + 'static>>;
pub type DumpFuture = Pin<Box<dyn Future<Output = Result<String, LocalDbError>> + 'static>>;
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why not something like the following?

pub type PinnedDbFuture<RES> =
  Pin<Box<dyn Future<Output = Result<RES, LocalDbError>> + 'static>>;

Comment on lines +11 to +21
pub(crate) fn collect_manifest_urls(orderbooks: &HashMap<String, OrderbookCfg>) -> Vec<Url> {
let mut urls = Vec::new();
let mut seen = HashSet::new();
for orderbook in orderbooks.values() {
let url = orderbook.local_db_remote.url.clone();
if seen.insert(url.clone()) {
urls.push(url);
}
}
urls
}
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
pub(crate) fn collect_manifest_urls(orderbooks: &HashMap<String, OrderbookCfg>) -> Vec<Url> {
let mut urls = Vec::new();
let mut seen = HashSet::new();
for orderbook in orderbooks.values() {
let url = orderbook.local_db_remote.url.clone();
if seen.insert(url.clone()) {
urls.push(url);
}
}
urls
}
pub(crate) fn collect_manifest_urls(orderbooks: &HashMap<String, OrderbookCfg>) -> Vec<Url> {
orderbooks
.values()
.map(|orderbook| orderbook.local_db_remote.url.clone())
.unique()
.collect()
}

/// Parsed settings required by the runner orchestration layer.
#[derive(Debug, Clone)]
pub struct ParsedRunnerSettings {
pub orderbooks: HashMap<String, OrderbookCfg>,
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

what are the keys here? addresses? some id? can we use a more expressive type to avoid the confusion?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the key is referencing the orderbook key which is found in the settings.yaml and is the most appropriate type for this map. it's not a special type

#[derive(Debug, Clone)]
pub struct ParsedRunnerSettings {
pub orderbooks: HashMap<String, OrderbookCfg>,
pub syncs: HashMap<String, LocalDbSyncCfg>,
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ditto

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same comment as above, it's referencing the keys for the sync configuration

Comment on lines +104 to +113
pub fn group_targets_by_network(targets: &[RunnerTarget]) -> HashMap<String, Vec<RunnerTarget>> {
let mut grouped: HashMap<String, Vec<RunnerTarget>> = HashMap::new();
for target in targets.iter().cloned() {
grouped
.entry(target.network_key.clone())
.or_default()
.push(target);
}
grouped
}
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
pub fn group_targets_by_network(targets: &[RunnerTarget]) -> HashMap<String, Vec<RunnerTarget>> {
let mut grouped: HashMap<String, Vec<RunnerTarget>> = HashMap::new();
for target in targets.iter().cloned() {
grouped
.entry(target.network_key.clone())
.or_default()
.push(target);
}
grouped
}
pub fn group_targets_by_network(targets: &[RunnerTarget]) -> HashMap<String, Vec<RunnerTarget>> {
targets
.iter()
.cloned()
.into_group_map_by(|target| target.network_key.clone())
}

Base automatically changed from local-db-engine to main November 25, 2025 18:23
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

📜 Review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3036bb0 and bb0871c.

📒 Files selected for processing (8)
  • crates/cli/src/commands/local_db/pipeline/bootstrap.rs (8 hunks)
  • crates/common/src/local_db/mod.rs (6 hunks)
  • crates/common/src/local_db/pipeline/adapters/bootstrap.rs (12 hunks)
  • crates/common/src/local_db/pipeline/mod.rs (1 hunks)
  • crates/common/src/local_db/pipeline/runner/environment.rs (1 hunks)
  • crates/common/src/local_db/pipeline/runner/remotes.rs (1 hunks)
  • crates/common/src/local_db/pipeline/runner/utils.rs (1 hunks)
  • crates/common/src/raindex_client/local_db/pipeline/bootstrap.rs (10 hunks)
🧰 Additional context used
📓 Path-based instructions (3)
crates/**/*.rs

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

crates/**/*.rs: For Rust crates in crates/*, run lints using nix develop -c cargo clippy --workspace --all-targets --all-features -D warnings
For Rust crates in crates/*, run tests using nix develop -c cargo test --workspace or --package <crate>

Files:

  • crates/common/src/local_db/pipeline/mod.rs
  • crates/common/src/raindex_client/local_db/pipeline/bootstrap.rs
  • crates/cli/src/commands/local_db/pipeline/bootstrap.rs
  • crates/common/src/local_db/pipeline/runner/utils.rs
  • crates/common/src/local_db/pipeline/adapters/bootstrap.rs
  • crates/common/src/local_db/mod.rs
  • crates/common/src/local_db/pipeline/runner/remotes.rs
  • crates/common/src/local_db/pipeline/runner/environment.rs
**/crates/**

📄 CodeRabbit inference engine (AGENTS.md)

Rust workspace organized as crates/* with subdirectories: cli, common, bindings, js_api, quote, subgraph, settings, math, integration_tests

Files:

  • crates/common/src/local_db/pipeline/mod.rs
  • crates/common/src/raindex_client/local_db/pipeline/bootstrap.rs
  • crates/cli/src/commands/local_db/pipeline/bootstrap.rs
  • crates/common/src/local_db/pipeline/runner/utils.rs
  • crates/common/src/local_db/pipeline/adapters/bootstrap.rs
  • crates/common/src/local_db/mod.rs
  • crates/common/src/local_db/pipeline/runner/remotes.rs
  • crates/common/src/local_db/pipeline/runner/environment.rs
**/*.rs

📄 CodeRabbit inference engine (AGENTS.md)

**/*.rs: Rust: format code with nix develop -c cargo fmt --all
Rust: lint with nix develop -c rainix-rs-static (preconfigured flags included)
Rust: crates and modules use snake_case; types use PascalCase

Files:

  • crates/common/src/local_db/pipeline/mod.rs
  • crates/common/src/raindex_client/local_db/pipeline/bootstrap.rs
  • crates/cli/src/commands/local_db/pipeline/bootstrap.rs
  • crates/common/src/local_db/pipeline/runner/utils.rs
  • crates/common/src/local_db/pipeline/adapters/bootstrap.rs
  • crates/common/src/local_db/mod.rs
  • crates/common/src/local_db/pipeline/runner/remotes.rs
  • crates/common/src/local_db/pipeline/runner/environment.rs
🧠 Learnings (37)
📓 Common learnings
Learnt from: rouzwelt
Repo: rainlanguage/rain.orderbook PR: 0
File: :0-0
Timestamp: 2025-05-21T21:24:53.708Z
Learning: For PR #1884 in rainlanguage/rain.orderbook, provide a separate comment after each review with PR size statistics in the format: `TOTAL=number ADDITIONS=number DELETIONS=number`, excluding lock files like package-lock.json and cargo.lock.
Learnt from: rouzwelt
Repo: rainlanguage/rain.orderbook PR: 0
File: :0-0
Timestamp: 2025-05-21T21:24:53.708Z
Learning: For PR #1884 in rainlanguage/rain.orderbook, provide a separate comment after each review with PR size statistics in the format: `TOTAL=number ADDITIONS=number DELETIONS=number`, excluding lock files like package-lock.json and cargo.lock.
Learnt from: rouzwelt
Repo: rainlanguage/rain.orderbook PR: 0
File: :0-0
Timestamp: 2025-05-21T21:24:53.708Z
Learning: For PR #1884 in rainlanguage/rain.orderbook, provide a separate comment after each review with PR size statistics in the format: `TOTAL=number ADDITIONS=number DELETIONS=number`, excluding lock files like package-lock.json and cargo.lock.
Learnt from: rouzwelt
Repo: rainlanguage/rain.orderbook PR: 0
File: :0-0
Timestamp: 2025-05-21T21:24:53.708Z
Learning: For PR #1884 in rainlanguage/rain.orderbook, provide a separate comment after each review with PR size statistics in the format: `TOTAL=number ADDITIONS=number DELETIONS=number`, excluding lock files like package-lock.json and cargo.lock.
Learnt from: rouzwelt
Repo: rainlanguage/rain.orderbook PR: 0
File: :0-0
Timestamp: 2025-05-21T21:25:47.873Z
Learning: After each new commit review for rainlanguage/rain.orderbook repository, generate a PR size report in a separate comment with the format: "TOTAL=number ADDITIONS=number DELETIONS=number". This report should exclude irrelevant files such as lock files (e.g., package-lock.json, cargo.lock).
Learnt from: rouzwelt
Repo: rainlanguage/rain.orderbook PR: 0
File: :0-0
Timestamp: 2025-05-21T21:26:31.566Z
Learning: For PR #1884 and future PRs in rainlanguage/rain.orderbook repository, provide PR size reports in a separate comment with ONLY the exact format "TOTAL=number\nADDITIONS=number\nDELETIONS=number", without any additional text or explanation. Reports should exclude irrelevant files such as lock files (package-lock.json, yarn.lock, pnpm-lock.yaml, cargo.lock).
Learnt from: rouzwelt
Repo: rainlanguage/rain.orderbook PR: 0
File: :0-0
Timestamp: 2025-05-21T22:14:22.646Z
Learning: For PR #1884 in rainlanguage/rain.orderbook, I must consistently report the PR size after EVERY new commit in the exact format "TOTAL=number\nADDITIONS=number\nDELETIONS=number" without any formatting blocks. The report must exclude lock files (package-lock.json, yarn.lock, pnpm-lock.yaml, cargo.lock) and can be included either as part of the review or as a separate comment.
Learnt from: rouzwelt
Repo: rainlanguage/rain.orderbook PR: 0
File: :0-0
Timestamp: 2025-05-21T22:14:22.646Z
Learning: For PR #1884 in rainlanguage/rain.orderbook, I must consistently report the PR size after EVERY new commit in the exact format "TOTAL=number\nADDITIONS=number\nDELETIONS=number" without any additional text or formatting blocks. The report must exclude lock files (package-lock.json, yarn.lock, pnpm-lock.yaml, cargo.lock) and can be included either as part of the review or as a separate comment.
Learnt from: rouzwelt
Repo: rainlanguage/rain.orderbook PR: 0
File: :0-0
Timestamp: 2025-05-21T21:25:47.873Z
Learning: After each new commit review for rainlanguage/rain.orderbook repository, generate a PR size report in a separate comment with the exact format: "TOTAL=number\nADDITIONS=number\nDELETIONS=number". This report should exclude irrelevant files such as lock files (package-lock.json, yarn.lock, pnpm-lock.yaml, cargo.lock).
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 2292
File: crates/settings/src/remote/manifest.rs:35-44
Timestamp: 2025-11-04T09:20:06.368Z
Learning: In the rain.orderbook codebase, manifest version validation happens during parsing in crates/settings/src/local_db_manifest.rs. The parse_manifest_header function validates both manifest_version against MANIFEST_VERSION and db_schema_version against DB_SCHEMA_VERSION constants, failing with YamlError if either doesn't match. This means fetch_manifest calls will fail before returning if versions are incompatible, making cross-URL version consistency checks unnecessary in fetch_multiple_manifests.
📚 Learning: 2025-11-04T09:20:06.368Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 2292
File: crates/settings/src/remote/manifest.rs:35-44
Timestamp: 2025-11-04T09:20:06.368Z
Learning: In the rain.orderbook codebase, manifest version validation happens during parsing in crates/settings/src/local_db_manifest.rs. The parse_manifest_header function validates both manifest_version against MANIFEST_VERSION and db_schema_version against DB_SCHEMA_VERSION constants, failing with YamlError if either doesn't match. This means fetch_manifest calls will fail before returning if versions are incompatible, making cross-URL version consistency checks unnecessary in fetch_multiple_manifests.

Applied to files:

  • crates/common/src/raindex_client/local_db/pipeline/bootstrap.rs
  • crates/cli/src/commands/local_db/pipeline/bootstrap.rs
  • crates/common/src/local_db/pipeline/adapters/bootstrap.rs
  • crates/common/src/local_db/mod.rs
  • crates/common/src/local_db/pipeline/runner/remotes.rs
  • crates/common/src/local_db/pipeline/runner/environment.rs
📚 Learning: 2025-10-06T11:44:07.888Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 2145
File: crates/common/src/raindex_client/local_db/query/create_tables/query.sql:71-72
Timestamp: 2025-10-06T11:44:07.888Z
Learning: The local DB feature in the rain.orderbook codebase is not live yet (as of PR #2145), so schema migrations for existing databases are not required when modifying table structures in `crates/common/src/raindex_client/local_db/query/create_tables/query.sql`.

Applied to files:

  • crates/common/src/raindex_client/local_db/pipeline/bootstrap.rs
  • crates/cli/src/commands/local_db/pipeline/bootstrap.rs
  • crates/common/src/local_db/pipeline/adapters/bootstrap.rs
  • crates/common/src/local_db/mod.rs
📚 Learning: 2025-10-14T07:51:55.148Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 2202
File: crates/common/src/raindex_client/local_db/sync.rs:33-34
Timestamp: 2025-10-14T07:51:55.148Z
Learning: In `crates/common/src/raindex_client/local_db/sync.rs`, the hard-coded `DEFAULT_SYNC_CHAIN_ID` constant (set to `SUPPORTED_LOCAL_DB_CHAINS[0]`) will be replaced with proper chain ID handling in downstream PRs as part of the multi-network/orderbook implementation.

Applied to files:

  • crates/common/src/raindex_client/local_db/pipeline/bootstrap.rs
  • crates/cli/src/commands/local_db/pipeline/bootstrap.rs
  • crates/common/src/local_db/pipeline/adapters/bootstrap.rs
  • crates/common/src/local_db/mod.rs
📚 Learning: 2025-10-18T10:38:41.273Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 2237
File: crates/common/src/raindex_client/local_db/sync.rs:79-89
Timestamp: 2025-10-18T10:38:41.273Z
Learning: In `crates/common/src/raindex_client/local_db/sync.rs`, the sync_database method currently only supports indexing a single orderbook per chain ID, which is why `.first()` is used to select the orderbook configuration. Multi-orderbook support per chain ID is planned for future PRs.

Applied to files:

  • crates/common/src/raindex_client/local_db/pipeline/bootstrap.rs
  • crates/cli/src/commands/local_db/pipeline/bootstrap.rs
  • crates/common/src/local_db/pipeline/adapters/bootstrap.rs
  • crates/common/src/local_db/mod.rs
  • crates/common/src/local_db/pipeline/runner/remotes.rs
📚 Learning: 2025-10-06T11:13:29.956Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 2123
File: crates/common/src/raindex_client/local_db/mod.rs:23-29
Timestamp: 2025-10-06T11:13:29.956Z
Learning: In `crates/common/src/raindex_client/local_db/mod.rs`, the `Default` implementation for `LocalDb` that creates an RPC client pointing to `http://localhost:4444` is acceptable because the RPC client must be explicitly configured before actual usage in production scenarios.

Applied to files:

  • crates/common/src/raindex_client/local_db/pipeline/bootstrap.rs
  • crates/cli/src/commands/local_db/pipeline/bootstrap.rs
  • crates/common/src/local_db/pipeline/adapters/bootstrap.rs
  • crates/common/src/local_db/mod.rs
  • crates/common/src/local_db/pipeline/runner/environment.rs
📚 Learning: 2025-10-06T11:28:30.692Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 2145
File: crates/common/src/raindex_client/local_db/query/fetch_orders/query.sql:6-7
Timestamp: 2025-10-06T11:28:30.692Z
Learning: In `crates/common/src/raindex_client/local_db/query/fetch_orders/query.sql`, the orderbook_address is currently hardcoded to '0x2f209e5b67A33B8fE96E28f24628dF6Da301c8eB' because the system only supports a single orderbook at the moment. Multiorderbook logic is not yet implemented and will be added in the future.

Applied to files:

  • crates/common/src/raindex_client/local_db/pipeline/bootstrap.rs
  • crates/common/src/local_db/pipeline/runner/utils.rs
  • crates/common/src/local_db/pipeline/adapters/bootstrap.rs
📚 Learning: 2025-10-06T14:41:41.909Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 2159
File: crates/cli/src/commands/local_db/sync/runner/mod.rs:52-113
Timestamp: 2025-10-06T14:41:41.909Z
Learning: The local DB sync CLI command (crates/cli/src/commands/local_db/sync/) is designed for CI-only usage, and simple println! statements are preferred over structured logging for status messages.

Applied to files:

  • crates/common/src/raindex_client/local_db/pipeline/bootstrap.rs
  • crates/cli/src/commands/local_db/pipeline/bootstrap.rs
  • crates/common/src/local_db/pipeline/adapters/bootstrap.rs
  • crates/common/src/local_db/mod.rs
📚 Learning: 2025-10-06T14:39:36.425Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 2159
File: crates/cli/src/commands/local_db/sync/cli.rs:37-78
Timestamp: 2025-10-06T14:39:36.425Z
Learning: In the SyncLocalDb CLI command (crates/cli/src/commands/local_db/sync/cli.rs), block range validation (e.g., start_block <= end_block) is handled internally by the sync runner, not at the CLI entry point.

Applied to files:

  • crates/common/src/raindex_client/local_db/pipeline/bootstrap.rs
📚 Learning: 2025-05-20T10:20:08.206Z
Learnt from: 0xgleb
Repo: rainlanguage/rain.orderbook PR: 1859
File: crates/quote/src/quote_debug.rs:472-492
Timestamp: 2025-05-20T10:20:08.206Z
Learning: In the Rain Orderbook codebase, the `#[tokio::test(flavor = "multi_thread")]` annotation is specifically needed for tests that use `LocalEvm`, not just for consistency across all async tests.

Applied to files:

  • crates/cli/src/commands/local_db/pipeline/bootstrap.rs
  • crates/common/src/local_db/pipeline/runner/environment.rs
📚 Learning: 2025-07-18T10:31:05.498Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 2008
File: crates/common/src/raindex_client/add_orders.rs:85-86
Timestamp: 2025-07-18T10:31:05.498Z
Learning: In the rainlanguage/rain.orderbook codebase, cfg-guarded imports like `#[cfg(not(target_family = "wasm"))] use super::*;` in test modules are sometimes needed to fix compiler warnings, even when similar imports exist in nested sub-modules. These should not be removed as they serve a specific purpose in the compilation process.

Applied to files:

  • crates/cli/src/commands/local_db/pipeline/bootstrap.rs
  • crates/common/src/local_db/pipeline/runner/environment.rs
📚 Learning: 2025-07-21T16:34:04.947Z
Learnt from: 0xgleb
Repo: rainlanguage/rain.orderbook PR: 1911
File: crates/common/src/raindex_client/orders.rs:720-720
Timestamp: 2025-07-21T16:34:04.947Z
Learning: In the rainlanguage/rain.orderbook codebase, user 0xgleb prefers using `.unwrap()` in test code rather than `.expect()` with descriptive messages, considering the direct unwrap approach acceptable for test contexts where failures should be fast and clear.

Applied to files:

  • crates/cli/src/commands/local_db/pipeline/bootstrap.rs
📚 Learning: 2025-10-13T12:57:05.900Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 2198
File: crates/common/src/raindex_client/local_db/query/fetch_store_addresses/mod.rs:7-8
Timestamp: 2025-10-13T12:57:05.900Z
Learning: In the rain.orderbook repository, using unqualified serde helper names (e.g., `#[serde(with = "serde_address")]`) that rely on glob imports is acceptable and does not need to be changed to fully qualified paths.

Applied to files:

  • crates/cli/src/commands/local_db/pipeline/bootstrap.rs
📚 Learning: 2025-10-27T09:17:38.145Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 2270
File: crates/settings/src/local_db_remotes.rs:107-212
Timestamp: 2025-10-27T09:17:38.145Z
Learning: In the rain.orderbook codebase using strict_yaml_rust, all YAML keys are treated as strings, including numeric literals. Numeric keys like `123` are automatically coerced to strings and are valid, so they don't need error-case testing for non-string keys.

Applied to files:

  • crates/common/src/local_db/pipeline/runner/utils.rs
📚 Learning: 2025-06-18T19:24:40.518Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 1938
File: crates/settings/src/yaml/orderbook.rs:185-199
Timestamp: 2025-06-18T19:24:40.518Z
Learning: In crates/settings/src/yaml/orderbook.rs, the user prefers not to refactor get_orderbook_by_network_key to handle multiple orderbooks per network key since their current architecture maintains a one-to-one mapping between orderbooks and networks. They would consider the refactoring if the system evolves to support multiple orderbooks per network in the future.

Applied to files:

  • crates/common/src/local_db/pipeline/runner/utils.rs
📚 Learning: 2025-05-20T15:15:01.333Z
Learnt from: hardingjam
Repo: rainlanguage/rain.orderbook PR: 1876
File: packages/webapp/src/lib/services/resetActiveOrderbookRef.ts:19-20
Timestamp: 2025-05-20T15:15:01.333Z
Learning: In the Rain orderbook project, there is no preferred orderbook when resetting the active orderbook reference, so selecting the first available one (even with non-deterministic object key ordering) is acceptable.

Applied to files:

  • crates/common/src/local_db/pipeline/runner/utils.rs
📚 Learning: 2025-06-18T18:24:32.049Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 1938
File: crates/settings/src/yaml/orderbook.rs:180-199
Timestamp: 2025-06-18T18:24:32.049Z
Learning: In crates/settings/src/yaml/orderbook.rs, the user prefers to avoid refactoring duplicate search logic between get_orderbook_by_address and get_orderbook_by_network_key when there are only 2 functions, indicating they would consider it if more similar functions are added in the future.

Applied to files:

  • crates/common/src/local_db/pipeline/runner/utils.rs
📚 Learning: 2025-06-20T07:26:50.488Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 1941
File: crates/settings/src/yaml/orderbook.rs:112-123
Timestamp: 2025-06-20T07:26:50.488Z
Learning: In crates/settings/src/yaml/orderbook.rs, the user prefers to keep the get_network_by_chain_id implementation simple with O(n) lookup rather than adding caching complexity for performance optimization, even if the method might be called frequently.

Applied to files:

  • crates/common/src/local_db/pipeline/runner/utils.rs
📚 Learning: 2025-08-20T06:59:32.191Z
Learnt from: hardyjosh
Repo: rainlanguage/rain.orderbook PR: 2087
File: .github/workflows/rainix.yaml:94-106
Timestamp: 2025-08-20T06:59:32.191Z
Learning: In the rain.orderbook repository, the ephemeral deployment key generated in .github/workflows/rainix.yaml is intentionally designed to be non-sensitive and doesn't require security hardening measures like key masking or leak prevention, as explicitly confirmed by hardyjosh.

Applied to files:

  • crates/common/src/local_db/pipeline/runner/utils.rs
📚 Learning: 2025-04-03T09:45:04.200Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 1477
File: crates/settings/src/remote_networks.rs:40-75
Timestamp: 2025-04-03T09:45:04.200Z
Learning: The RemoteNetworksCfg implementation in crates/settings/src/remote_networks.rs intentionally fetches remote networks sequentially rather than in parallel.

Applied to files:

  • crates/common/src/local_db/pipeline/runner/utils.rs
📚 Learning: 2025-10-06T14:12:05.824Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 2155
File: crates/common/src/raindex_client/local_db/query/fetch_order_trades/query.sql:86-108
Timestamp: 2025-10-06T14:12:05.824Z
Learning: CTEs (Common Table Expressions) are not supported in the local DB SQL implementation used in the rain.orderbook codebase.

Applied to files:

  • crates/common/src/local_db/pipeline/adapters/bootstrap.rs
📚 Learning: 2025-06-18T19:23:33.747Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 1938
File: crates/settings/src/yaml/mod.rs:176-178
Timestamp: 2025-06-18T19:23:33.747Z
Learning: In crates/settings/src/yaml/mod.rs, the YamlError enum has two distinct error variants: `KeyNotFound(String)` for when a specific YAML key is not found in a hash/map, and `NotFound(String)` for when other types of entities (like networks, orderbooks, etc.) are not found in the configuration. These serve different purposes and should not be consolidated.

Applied to files:

  • crates/common/src/local_db/mod.rs
📚 Learning: 2025-08-01T07:35:13.418Z
Learnt from: brusherru
Repo: rainlanguage/rain.orderbook PR: 2036
File: crates/js_api/src/filters/errors.rs:39-46
Timestamp: 2025-08-01T07:35:13.418Z
Learning: In the Rain Orderbook project's PersistentFilterStoreError (crates/js_api/src/filters/errors.rs), the Display implementation already provides user-friendly error messages, so using err.to_string() for both msg and readable_msg in the WasmEncodedError conversion is appropriate and doesn't require separate readable message handling.

Applied to files:

  • crates/common/src/local_db/mod.rs
📚 Learning: 2025-06-17T16:32:04.554Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 1903
File: crates/js_api/src/gui/order_operations.rs:124-134
Timestamp: 2025-06-17T16:32:04.554Z
Learning: In the rain.orderbook codebase, RPC lists are typically small (2 items maximum), so performance optimizations around cloning and converting small Vec<Url> collections are generally unnecessary.

Applied to files:

  • crates/common/src/local_db/pipeline/runner/remotes.rs
📚 Learning: 2025-06-17T16:21:24.384Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 1903
File: crates/settings/src/yaml/orderbook.rs:371-377
Timestamp: 2025-06-17T16:21:24.384Z
Learning: In crates/settings/src/yaml/orderbook.rs tests, the user findolor considers RPC ordering in Vec<Url> assertions to be intentional and not a test brittleness issue. The ordering of RPCs in tests should be preserved as specified.

Applied to files:

  • crates/common/src/local_db/pipeline/runner/remotes.rs
  • crates/common/src/local_db/pipeline/runner/environment.rs
📚 Learning: 2025-06-18T12:56:44.290Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 1938
File: crates/js_api/src/raindex/mod.rs:102-118
Timestamp: 2025-06-18T12:56:44.290Z
Learning: In the rainlanguage/rain.orderbook codebase, it's acceptable to scaffold unused enum variants in initial implementation PRs when they will be implemented in future PRs, as confirmed by findolor.

Applied to files:

  • crates/common/src/local_db/pipeline/runner/environment.rs
📚 Learning: 2025-07-16T10:40:05.717Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 2000
File: crates/common/src/raindex_client/vaults.rs:183-183
Timestamp: 2025-07-16T10:40:05.717Z
Learning: In the rainlanguage/rain.orderbook codebase, user findolor considers breaking changes from Option<U256> to U256 for required fields like decimals in RaindexVaultToken to be acceptable and safe, even when they affect multiple usage sites across the codebase.

Applied to files:

  • crates/common/src/local_db/pipeline/runner/environment.rs
📚 Learning: 2025-07-15T08:01:38.534Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 1994
File: crates/common/src/raindex_client/vaults.rs:282-292
Timestamp: 2025-07-15T08:01:38.534Z
Learning: In the rainlanguage/rain.orderbook codebase, findolor prefers to avoid concurrency optimizations like using `futures::future::try_join_all` for parallel processing of balance changes, considering such optimizations "not that critical at the moment" when the performance impact is minimal.

Applied to files:

  • crates/common/src/local_db/pipeline/runner/environment.rs
📚 Learning: 2025-07-04T09:02:57.301Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 1956
File: crates/common/src/fuzz/mod.rs:64-64
Timestamp: 2025-07-04T09:02:57.301Z
Learning: In rainlanguage/rain.orderbook, user findolor prefers to limit type consistency changes to only the parts directly related to the current work scope. For example, when updating chain_id fields from u64 to u32 in fuzz-related code, unrelated files like tauri-app wallet commands can remain as u64 if they serve different purposes and aren't part of the current changes.

Applied to files:

  • crates/common/src/local_db/pipeline/runner/environment.rs
📚 Learning: 2025-09-02T08:04:34.729Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 2117
File: crates/js_api/src/gui/select_tokens.rs:421-424
Timestamp: 2025-09-02T08:04:34.729Z
Learning: User findolor in the rainlanguage/rain.orderbook codebase prefers not to change test code when tests are already passing, even if there appear to be type mismatches or potential issues. Working tests should be left alone unless there are actual errors.

Applied to files:

  • crates/common/src/local_db/pipeline/runner/environment.rs
📚 Learning: 2025-07-23T10:51:12.278Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 2012
File: crates/js_api/src/registry.rs:233-252
Timestamp: 2025-07-23T10:51:12.278Z
Learning: In the rainlanguage/rain.orderbook codebase, findolor considers the pattern of creating a partially initialized struct instance within a constructor and then populating it through async operations to be acceptable, as long as the partial state is never exposed to users and the constructor returns Result<T, E> with proper error propagation using the ? operator.

Applied to files:

  • crates/common/src/local_db/pipeline/runner/environment.rs
📚 Learning: 2025-05-19T07:14:24.219Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 1838
File: crates/cli/src/output.rs:29-41
Timestamp: 2025-05-19T07:14:24.219Z
Learning: For the rainlanguage/rain.orderbook repository, findolor prefers minimal documentation for straightforward functions like `output` in crates/cli/src/output.rs where the implementation is self-explanatory.

Applied to files:

  • crates/common/src/local_db/pipeline/runner/environment.rs
📚 Learning: 2025-07-16T05:52:05.576Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 1994
File: crates/common/src/raindex_client/vaults.rs:59-59
Timestamp: 2025-07-16T05:52:05.576Z
Learning: User findolor prefers to handle documentation updates for getter methods in batch via dedicated PRs rather than addressing them individually during feature development, as mentioned for the formatted amount string fields in crates/common/src/raindex_client/vaults.rs.

Applied to files:

  • crates/common/src/local_db/pipeline/runner/environment.rs
📚 Learning: 2025-06-18T12:54:47.807Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 1938
File: crates/js_api/src/raindex/orders.rs:1-11
Timestamp: 2025-06-18T12:54:47.807Z
Learning: In the rain.orderbook repository, findolor prefers to keep unused imports in place when they will be used in upcoming follow-up PRs, rather than removing and re-adding them during incremental development.

Applied to files:

  • crates/common/src/local_db/pipeline/runner/environment.rs
📚 Learning: 2025-08-02T02:34:32.237Z
Learnt from: brusherru
Repo: rainlanguage/rain.orderbook PR: 2036
File: crates/js_api/src/filters/raindex_filter_store.rs:446-533
Timestamp: 2025-08-02T02:34:32.237Z
Learning: In the rainlanguage/rain.orderbook project's RaindexFilterStore WASM tests (crates/js_api/src/filters/raindex_filter_store.rs), brusherru decided to focus on testing only methods without side effects (that don't use web_sys) due to difficulties with mocking localStorage and window APIs in the WASM test environment. This pragmatic approach tests pure logic separately from browser integration.

Applied to files:

  • crates/common/src/local_db/pipeline/runner/environment.rs
📚 Learning: 2025-04-30T09:28:36.960Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 1715
File: crates/js_api/src/common/mod.rs:111-118
Timestamp: 2025-04-30T09:28:36.960Z
Learning: In the rain.orderbook repository, the WASM tests are already properly configured with conditional compilation using `#[cfg(target_family = "wasm")]` and `#[cfg(not(target_family = "wasm"))]`, and don't require additional `wasm_bindgen_test_configure!(run_in_browser)` directives.

Applied to files:

  • crates/common/src/local_db/pipeline/runner/environment.rs
📚 Learning: 2025-11-25T16:50:31.742Z
Learnt from: CR
Repo: rainlanguage/rain.orderbook PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-11-25T16:50:31.742Z
Learning: Applies to crates/integration_tests/**/*.rs : Rust: write tests using `cargo test`; integration tests live in `crates/integration_tests`. Prefer `insta` snapshots and `proptest` where helpful

Applied to files:

  • crates/common/src/local_db/pipeline/runner/environment.rs
🧬 Code graph analysis (3)
crates/common/src/raindex_client/local_db/pipeline/bootstrap.rs (3)
crates/common/src/local_db/query/insert_db_metadata/mod.rs (1)
  • insert_db_metadata_stmt (5-7)
crates/common/src/local_db/query/clear_tables/mod.rs (1)
  • clear_tables_stmt (7-9)
crates/common/src/local_db/query/create_tables/mod.rs (1)
  • create_tables_stmt (28-30)
crates/common/src/local_db/pipeline/adapters/bootstrap.rs (2)
crates/common/src/local_db/query/insert_db_metadata/mod.rs (1)
  • insert_db_metadata_stmt (5-7)
crates/common/src/local_db/query/sql_statement.rs (1)
  • sql (60-62)
crates/common/src/local_db/pipeline/runner/environment.rs (4)
crates/common/src/local_db/pipeline/runner/remotes.rs (5)
  • download_and_gunzip (46-59)
  • get_manifests (32-43)
  • orderbooks (15-26)
  • sample_settings_yaml (101-156)
  • update_remote_url (170-185)
crates/common/src/local_db/pipeline/runner/utils.rs (2)
  • parse_runner_settings (30-39)
  • sample_settings_yaml (126-181)
crates/settings/src/yaml/mod.rs (1)
  • default_document (484-486)
crates/settings/src/scenario.rs (1)
  • key (221-221)
🔇 Additional comments (17)
crates/common/src/raindex_client/local_db/pipeline/bootstrap.rs (1)

136-136: LGTM!

The import and all test usages correctly switch to the centralized DB_SCHEMA_VERSION constant from rain_orderbook_app_settings::local_db_manifest. This aligns with the PR objective to consolidate schema version handling.

crates/common/src/local_db/pipeline/mod.rs (1)

12-12: LGTM!

The new runner module is correctly declared alongside existing adapters and engine modules, following the established pattern for the pipeline namespace.

crates/common/src/local_db/pipeline/adapters/bootstrap.rs (1)

14-14: LGTM!

The production code correctly uses DB_SCHEMA_VERSION as the fallback default in both ensure_schema and reset_db methods. The centralized constant source improves maintainability.

Also applies to: 56-56, 111-111

crates/cli/src/commands/local_db/pipeline/bootstrap.rs (1)

48-48: LGTM!

The test imports are correctly updated to use DB_SCHEMA_VERSION from the centralized location, and OrderbookIdentifier is now imported separately. This aligns with the PR's consolidation of schema version handling.

Also applies to: 55-55

crates/common/src/local_db/mod.rs (1)

19-23: LGTM!

The new error variants are well-structured and appropriately support the runner module's requirements:

  • SettingsYaml and YamlScan for YAML parsing errors
  • MissingLocalDbSyncForNetwork and MissingLocalDbRemote for configuration lookup failures
  • ManifestFetch and TaskJoin for async operations

All variants have corresponding to_readable_msg implementations and use #[from] for ergonomic error propagation.

Also applies to: 32-36, 50-54, 104-108

crates/common/src/local_db/pipeline/runner/utils.rs (4)

13-27: LGTM!

The ParsedRunnerSettings and RunnerTarget structs are well-designed, providing clear separation between parsed configuration and scheduling metadata. The fields appropriately capture all necessary information for runner orchestration.


29-54: LGTM!

The parse_runner_settings function correctly creates the YAML parser and extracts orderbooks and sync configurations. The map_sync_to_engine helper cleanly maps sync configuration to engine-compatible types with proper error propagation through FetchConfig::new.


56-99: LGTM!

The build_runner_targets function has clear logic:

  1. Iterates over orderbooks with proper capacity pre-allocation
  2. Validates sync config presence with descriptive error
  3. Validates remote config presence with descriptive error
  4. Builds complete RunnerTarget with all required fields

Error handling properly uses the new MissingLocalDbSyncForNetwork and MissingLocalDbRemote variants.


108-114: LGTM!

The group_targets_by_network function uses itertools' into_group_map_by for clean, idiomatic grouping of targets by network key.

crates/common/src/local_db/pipeline/runner/remotes.rs (4)

12-29: LGTM!

The collect_manifest_urls function correctly:

  1. Maps over orderbooks to extract remote URLs
  2. Returns MissingLocalDbRemote error for orderbooks without remote config
  3. Deduplicates URLs using unique() from itertools

31-43: LGTM!

The get_manifests function has clean logic:

  1. Collects unique manifest URLs
  2. Short-circuits with empty map if no URLs
  3. Delegates to fetch_multiple_manifests with proper error mapping

Based on learnings, manifest version validation happens during parsing, so cross-URL version consistency checks are unnecessary here.


61-75: LGTM!

The lookup_manifest_entry function correctly navigates the manifest map using the target's manifest URL, then finds the matching entry by chain_id and orderbook address. Returning Option appropriately handles the case where no matching entry exists.


45-59: Consider adding a timeout for the HTTP request.

The download_and_gunzip function fetches remote SQL dumps but doesn't specify a request timeout. For production resilience, consider adding a timeout to prevent indefinite hangs on slow or unresponsive endpoints.

 pub async fn download_and_gunzip(url: &Url) -> Result<String, LocalDbError> {
-    let response = reqwest::get(url.clone()).await?;
+    let client = reqwest::Client::builder()
+        .timeout(std::time::Duration::from_secs(300)) // 5 min for large dumps
+        .build()?;
+    let response = client.get(url.clone()).send().await?;
     if !response.status().is_success() {
         return Err(LocalDbError::HttpStatus {
             status: response.status().as_u16(),
         });
     }
⛔ Skipped due to learnings
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 1483
File: crates/settings/src/remote_tokens.rs:32-57
Timestamp: 2025-04-07T09:51:52.614Z
Learning: The implementation for remote token fetching in `crates/settings/src/remote_tokens.rs` does not include explicit timeouts/retries, as the team considers the current implementation sufficient for now.
crates/common/src/local_db/pipeline/runner/environment.rs (4)

17-26: RunnerEnvironment abstractions and pinned future aliases look solid

The generic PinnedDbFuture plus Arc-wrapped ManifestFetcher / DumpDownloader / EngineBuilder give a clean, extensible surface for plugging different backends, and the Clone impl correctly shares dependencies via Arc::clone with no hidden ownership issues.

Also applies to: 28-83


85-124: EnginePipelines wrapper cleanly composes into SyncEngine

Grouping the six pipeline components in EnginePipelines and exposing into_engine as a thin pass-through into SyncEngine::new keeps construction explicit and type-safe while avoiding duplication.


201-415: Test scaffolding effectively exercises environment wiring

The stub pipeline implementations (using #[async_trait(?Send)]) combined with the unit tests around manifest fetching, dump downloading, engine construction, error propagation, and RunnerEnvironment cloning cover the important behavior without overcomplicating the setup.

Also applies to: 417-659


1-139: Run fmt, static checks, and tests for the new runner module

Verify the new module is fully integrated with the workspace by running standard Rust tooling:

  • nix develop -c cargo fmt --all
  • nix develop -c rainix-rs-static
  • nix develop -c cargo clippy --workspace --all-targets --all-features -D warnings
  • nix develop -c cargo test --workspace

Comment on lines +661 to +747
#[cfg(not(target_family = "wasm"))]
fn sample_settings_yaml() -> String {
r#"
networks:
network-a:
rpcs:
- https://rpc.network/a
chain-id: 1
subgraphs:
network-a: https://subgraph.network/a
local-db-remotes:
remote-a: https://remotes.example.com/a.yaml
local-db-sync:
network-a:
batch-size: 10
max-concurrent-batches: 5
retry-attempts: 3
retry-delay-ms: 100
rate-limit-delay-ms: 50
finality-depth: 12
bootstrap-block-threshold: 10000
orderbooks:
ob-a:
address: 0x00000000000000000000000000000000000000a1
network: network-a
subgraph: network-a
local-db-remote: remote-a
deployment-block: 111
"#
.to_string()
}

#[cfg(not(target_family = "wasm"))]
fn update_remote_url(orderbooks: &mut HashMap<String, OrderbookCfg>, key: &str, url: &Url) {
if let Some(orderbook) = orderbooks.get_mut(key) {
let remote = LocalDbRemoteCfg {
document: default_document(),
key: orderbook
.local_db_remote
.as_ref()
.expect("orderbook remote present")
.key
.clone(),
url: url.clone(),
};
orderbook.local_db_remote = Some(Arc::new(remote));
}
}

#[cfg(not(target_family = "wasm"))]
#[test]
fn default_manifest_fetcher_uses_remotes() {
let server = MockServer::start();
let manifest_yaml = format!(
r#"
manifest-version: {version}
db-schema-version: 1
networks:
mainnet:
chain-id: 1
orderbooks:
- address: "0x00000000000000000000000000000000000000a1"
dump-url: "{base}/dump.sql.gz"
end-block: 123
end-block-hash: "0x01"
end-block-time-ms: 1000
"#,
version = MANIFEST_VERSION,
base = server.base_url()
);

server.mock(|when, then| {
when.method(GET).path("/");
then.status(200)
.header("content-type", "application/x-yaml")
.body(manifest_yaml.clone());
});

let mut parsed = parse_runner_settings(&sample_settings_yaml()).expect("sample settings");
let manifest_url = Url::parse(&server.base_url()).unwrap();
update_remote_url(&mut parsed.orderbooks, "ob-a", &manifest_url);

let fetcher = default_manifest_fetcher();
let manifests = block_on(fetcher(&parsed.orderbooks)).expect("manifest map");
assert_eq!(manifests.len(), 1);
assert!(manifests.contains_key(&manifest_url));
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick | 🔵 Trivial

Use DB_SCHEMA_VERSION in manifest test instead of a hard-coded 1

default_manifest_fetcher_uses_remotes inlines db-schema-version: 1 even though manifest parsing validates this value against the DB_SCHEMA_VERSION constant. This makes the test brittle to future schema bumps. Prefer formatting in the constant so the sample manifest stays in sync with the parser.

You can adjust the imports and format string like this:

-    use rain_orderbook_app_settings::local_db_manifest::MANIFEST_VERSION;
+    use rain_orderbook_app_settings::local_db_manifest::{
+        DB_SCHEMA_VERSION,
+        MANIFEST_VERSION,
+    };
@@
-        let manifest_yaml = format!(
+        let manifest_yaml = format!(
             r#"
 manifest-version: {version}
-db-schema-version: 1
+db-schema-version: {schema_version}
@@
 "#,
-            version = MANIFEST_VERSION,
-            base = server.base_url()
+            version = MANIFEST_VERSION,
+            schema_version = DB_SCHEMA_VERSION,
+            base = server.base_url()
         );

Based on learnings, manifest parsing already enforces both manifest-version and db-schema-version against their respective constants, so wiring DB_SCHEMA_VERSION directly into the test keeps it aligned with that behavior.

Committable suggestion skipped: line range outside the PR's diff.

🤖 Prompt for AI Agents
crates/common/src/local_db/pipeline/runner/environment.rs lines 661-747: the
test hard-codes "db-schema-version: 1" which will break when the
DB_SCHEMA_VERSION constant changes; replace the literal with the
DB_SCHEMA_VERSION constant (add an import if needed) and inject it into the
manifest_yaml format! call so the test formats db-schema-version =
DB_SCHEMA_VERSION, keeping the test in sync with the parser's validation.

@findolor findolor merged commit 830d416 into main Nov 25, 2025
28 of 29 checks passed
@findolor findolor deleted the shared-runner branch November 25, 2025 20:07
@github-actions
Copy link
Copy Markdown
Contributor

@coderabbitai assess this PR size classification for the totality of the PR with the following criterias and report it in your comment:

S/M/L PR Classification Guidelines:

This guide helps classify merged pull requests by effort and complexity rather than just line count. The goal is to assess the difficulty and scope of changes after they have been completed.

Small (S)

Characteristics:

  • Simple bug fixes, typos, or minor refactoring
  • Single-purpose changes affecting 1-2 files
  • Documentation updates
  • Configuration tweaks
  • Changes that require minimal context to review

Review Effort: Would have taken 5-10 minutes

Examples:

  • Fix typo in variable name
  • Update README with new instructions
  • Adjust configuration values
  • Simple one-line bug fixes
  • Import statement cleanup

Medium (M)

Characteristics:

  • Feature additions or enhancements
  • Refactoring that touches multiple files but maintains existing behavior
  • Breaking changes with backward compatibility
  • Changes requiring some domain knowledge to review

Review Effort: Would have taken 15-30 minutes

Examples:

  • Add new feature or component
  • Refactor common utility functions
  • Update dependencies with minor breaking changes
  • Add new component with tests
  • Performance optimizations
  • More complex bug fixes

Large (L)

Characteristics:

  • Major feature implementations
  • Breaking changes or API redesigns
  • Complex refactoring across multiple modules
  • New architectural patterns or significant design changes
  • Changes requiring deep context and multiple review rounds

Review Effort: Would have taken 45+ minutes

Examples:

  • Complete new feature with frontend/backend changes
  • Protocol upgrades or breaking changes
  • Major architectural refactoring
  • Framework or technology upgrades

Additional Factors to Consider

When deciding between sizes, also consider:

  • Test coverage impact: More comprehensive test changes lean toward larger classification
  • Risk level: Changes to critical systems bump up a size category
  • Team familiarity: Novel patterns or technologies increase complexity

Notes:

  • the assessment must be for the totality of the PR, that means comparing the base branch to the last commit of the PR
  • the assessment output must be exactly one of: S, M or L (single-line comment) in format of: SIZE={S/M/L}
  • do not include any additional text, only the size classification
  • your assessment comment must not include tips or additional sections
  • do NOT tag me or anyone else on your comment

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Nov 25, 2025

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Get PR details and stats using GitHub CLI
gh pr view 2292 --repo rainlanguage/rain.orderbook --json additions,deletions,changedFiles,files

Length of output: 1169


SIZE=L


🧠 Learnings used
Learnt from: rouzwelt
Repo: rainlanguage/rain.orderbook PR: 0
File: :0-0
Timestamp: 2025-05-21T21:24:42.275Z
Learning: For PR #1884, after each commit review, I should provide a new comment with a PR size report in the format: `TOTAL=number ADDITIONS=number DELETIONS=number`, excluding irrelevant files such as lock files (package-lock.json, cargo.lock, etc.).

Learnt from: rouzwelt
Repo: rainlanguage/rain.orderbook PR: 0
File: :0-0
Timestamp: 2025-05-21T21:24:42.275Z
Learning: After each commit in PR #1884, I should provide a new comment with the PR size report in the format: `TOTAL=number ADDITIONS=number DELETIONS=number`. The report should exclude irrelevant files such as lock files (e.g., package-lock.json, cargo.lock).

Learnt from: rouzwelt
Repo: rainlanguage/rain.orderbook PR: 0
File: :0-0
Timestamp: 2025-05-21T21:25:47.873Z
Learning: After each new commit review for rainlanguage/rain.orderbook repository, generate a PR size report in a separate comment with the format: "TOTAL=number ADDITIONS=number DELETIONS=number". This report should exclude irrelevant files such as lock files (e.g., package-lock.json, cargo.lock).

Learnt from: rouzwelt
Repo: rainlanguage/rain.orderbook PR: 0
File: :0-0
Timestamp: 2025-05-21T21:25:47.873Z
Learning: After each new commit review for rainlanguage/rain.orderbook repository, generate a PR size report in a separate comment with the exact format: "TOTAL=number\nADDITIONS=number\nDELETIONS=number". This report should exclude irrelevant files such as lock files (package-lock.json, yarn.lock, pnpm-lock.yaml, cargo.lock).

Learnt from: rouzwelt
Repo: rainlanguage/rain.orderbook PR: 0
File: :0-0
Timestamp: 2025-05-21T22:14:22.646Z
Learning: For PR #1884 in rainlanguage/rain.orderbook, I must consistently report the PR size after EVERY new commit in the exact format "TOTAL=number\nADDITIONS=number\nDELETIONS=number" without any formatting blocks. The report must exclude lock files (package-lock.json, yarn.lock, pnpm-lock.yaml, cargo.lock) and can be included either as part of the review or as a separate comment.

Learnt from: rouzwelt
Repo: rainlanguage/rain.orderbook PR: 0
File: :0-0
Timestamp: 2025-05-21T22:14:22.646Z
Learning: For PR #1884 in rainlanguage/rain.orderbook, I must consistently report the PR size after EVERY new commit in the exact format "TOTAL=number\nADDITIONS=number\nDELETIONS=number" without any additional text or formatting blocks. The report must exclude lock files (package-lock.json, yarn.lock, pnpm-lock.yaml, cargo.lock) and can be included either as part of the review or as a separate comment.

Learnt from: rouzwelt
Repo: rainlanguage/rain.orderbook PR: 0
File: :0-0
Timestamp: 2025-05-21T22:46:08.530Z
Learning: For PR #1884 in rainlanguage/rain.orderbook, the PR size report should be the only content in the comment - no text before it, no text after it, no formatting blocks, just the raw report in the exact format: "TOTAL=number\nADDITIONS=number\nDELETIONS=number". The report must exclude lock files (package-lock.json, yarn.lock, pnpm-lock.yaml, cargo.lock).

Learnt from: rouzwelt
Repo: rainlanguage/rain.orderbook PR: 0
File: :0-0
Timestamp: 2025-05-21T21:24:53.708Z
Learning: For PR #1884 in rainlanguage/rain.orderbook, provide a separate comment after each review with PR size statistics in the format: `TOTAL=number ADDITIONS=number DELETIONS=number`, excluding lock files like package-lock.json and cargo.lock.

Learnt from: rouzwelt
Repo: rainlanguage/rain.orderbook PR: 0
File: :0-0
Timestamp: 2025-05-21T21:24:53.708Z
Learning: For PR #1884 in rainlanguage/rain.orderbook, provide a separate comment after each review with PR size statistics in the format: `TOTAL=number ADDITIONS=number DELETIONS=number`, excluding lock files like package-lock.json and cargo.lock.

Learnt from: rouzwelt
Repo: rainlanguage/rain.orderbook PR: 0
File: :0-0
Timestamp: 2025-05-21T21:24:53.708Z
Learning: For PR #1884 in rainlanguage/rain.orderbook, provide a separate comment after each review with PR size statistics in the format: `TOTAL=number ADDITIONS=number DELETIONS=number`, excluding lock files like package-lock.json and cargo.lock.

Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 1971
File: .github/workflows/vercel-docs-prod.yaml:32-34
Timestamp: 2025-07-11T12:30:09.245Z
Learning: findolor prefers not to pin Node versions explicitly in GitHub Actions workflows when using Nix with webapp-shell, considering the current setup sufficient for deterministic builds in the rainlanguage/rain.orderbook project.

Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 1971
File: .github/workflows/vercel-docs-prod.yaml:10-14
Timestamp: 2025-07-11T12:29:49.284Z
Learning: In GitHub Actions workflows for the rainlanguage/rain.orderbook project, findolor is comfortable with job names that may seem misleading (like "Deploy-Docs-Preview" in a production workflow) when there's only one job in the workflow, as the context makes it clear enough.

Learnt from: rouzwelt
Repo: rainlanguage/rain.orderbook PR: 0
File: :0-0
Timestamp: 2025-05-21T21:24:53.708Z
Learning: For PR #1884 in rainlanguage/rain.orderbook, provide a separate comment after each review with PR size statistics in the format: `TOTAL=number ADDITIONS=number DELETIONS=number`, excluding lock files like package-lock.json and cargo.lock.

Learnt from: rouzwelt
Repo: rainlanguage/rain.orderbook PR: 0
File: :0-0
Timestamp: 2025-05-21T21:26:31.566Z
Learning: For PR #1884 and future PRs in rainlanguage/rain.orderbook repository, provide PR size reports in a separate comment with ONLY the exact format "TOTAL=number\nADDITIONS=number\nDELETIONS=number", without any additional text or explanation. Reports should exclude irrelevant files such as lock files (package-lock.json, yarn.lock, pnpm-lock.yaml, cargo.lock).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Share Sync Orchestration Between WASM and CLI

3 participants