Skip to content

Solution: LP-0018 — logos-osm: OpenStreetMap registry, SDK, CLI and Basecamp app on LEZ - #187

Draft
YodHeVauHe wants to merge 15 commits into
logos-co:masterfrom
YodHeVauHe:solution/lp-0018-logos-osm
Draft

YodHeVauHe wants to merge 15 commits into
logos-co:masterfrom
YodHeVauHe:solution/lp-0018-logos-osm

Conversation

@YodHeVauHe

@YodHeVauHe YodHeVauHe commented Oct 31, 2026 •

Copy link
Copy Markdown

Solution: LP-0018 — logos-osm: OpenStreetMap registry, SDK, CLI and Basecamp app on LEZ

Submitted by: YodHeVauHe (Be'Zaleel Quant), FoundationStone Algorithms Limited

Status: early draft submission. This PR is opened early to start review while development and the adoption push continue, as the prize encourages ("release early"). Several success criteria and all required Adoption criteria are not yet met; they are marked unchecked below and listed under Pending work. Nothing below should be read as claiming a criterion that is not checked.

Summary

logos-osm distributes Geofabrik OpenStreetMap PBF snapshots through Logos. It consists of:

  • an on-chain OSM registry LEZ program (RISC Zero guest, ported to the LEZ v0.3.1 plan/apply API) that stores per-region entries (region, parent, level, cid, source_url, checksum, version, hosted, timestamp) in a public registry PDA, with single and batch registration;
  • a Rust SDK (osm_sdk) covering discovery of the frozen 72-region predefined set, Geofabrik MD5 verification, hosting, local import, registry queries by region / parent / CID, download (Storage by CID, Geofabrik fallback) and update checks;
  • an osm CLI, a C FFI, a Basecamp core module (osm-module), a QML distribution app (osm-app) and a separate consumer example module (examples/basecamp-consumer), built with logos-module-builder.

The program has been deployed to the public Logos testnet v0.3 as a practice deployment and smoke-tested (init + register + read-back). On that deployment, 28 real Geofabrik regions across 20 countries are now hosted in Logos Storage and registered on chain (25 from the coverage run, plus greece, chile and belarus from the bulk host and local import runs), with keyless verifies passing 25/25 and 3/3 on the hosting node (see Coverage on testnet v0.3). Retrieval of that data by an independent node over the network is not yet proven. The testnet 0.4 deployment required by the prize is pending because testnet 0.4 is not yet live.

Repository

Approach

Registry program. One public registry PDA (seed registry) owned by the program holds a Borsh-encoded Registry keyed by the Geofabrik region path, so region is unique and parent / level place it in the tree. Instructions: init_registry, register_region, register_batch (multiple regions in one transaction for bulk hosting). Validation (non-empty region, valid level, checksum format, timestamp) lives in a shared crate, osm_registry_core, used by both the guest and the SDK so client-side and on-chain checks cannot drift. Queries by region, parent and CID are done off-chain by reading the registry account and decoding it, which keeps the on-chain program small; results are ordered by timestamp (region path as tie-breaker). A size bound test keeps the registry under the LEZ 100 KiB account ceiling for the closed region set.

SPEL vs. LEZ v0.3.1. The program was first written against SPEL / the older ProgramInput API. Public testnet v0.3 runs LEZ v0.3.1, which replaced that API with the plan/apply model (run_program(plan, apply), shard effects, segmented program upload), while upstream SPEL still targets LEZ v0.2.5-rc2. To run on a real public network we ported the guest to v0.3.1 directly rather than wait for SPEL. As a consequence the IDL is currently produced by an in-repo generator (make idl, checked for freshness in CI) that describes the plan/apply instruction and account contract, not by SPEL tooling; see the IDL criterion below.

Region model. The predefined, non-overlapping set (48 country-level entries and 24 subregions of US, India, China and Russia) is frozen in regions.json and embedded in the SDK, so discovery works without network access; --refresh pulls fresh canonical URLs from the Geofabrik index. Because the set is a partition, bulk host never creates parent/child overlap.

Integrity. Geofabrik's published MD5 is checked at fetch/import time only; after that, integrity comes from the Storage CID recorded on-chain, so downloads of hosted regions do not need Geofabrik.

What did not work / known gap. The first Storage adapter (LogoscoreStorage) targeted the legacy Storage module API (uploadFile / downloadFile / nameObject). It has been replaced by LogosctlStorage, which calls the current storage_module 3.0.2 API (uploadUrl / downloadToUrl) through logosctl 0.3.2 and waits for the completion events. A real upload-download of the 3,507,206-byte Andorra PBF passed on one local Storage node with matching MD5 and SHA-256, and the 25-region coverage run (below) then did fetch → MD5 → store → fetch-back → register → registry read-back → download-by-on-chain-CID against real Storage and the public testnet v0.3 for every region, on that one node. Over relays alone, independent nodes and GitHub Actions runners found the hosting node but could not complete a transfer, because the hosting box is behind NAT and the testnet relays dropped the streams. A multi-node transfer was then done through a reverse tunnel: a fresh node on a GitHub runner downloaded china/henan by its registry CID from the hosting node with a matching MD5 (run 41469069413).

Fee bug found during coverage hosting. Registrations started failing with the sequencer's generic "Incorrect fee" error. The cause was the fee-reserve screen (PayerCannotFund): the wallet declares gas_limit = 2,000,000 by default, so the reserve exceeded the payer's balance although a Register actually costs about 1.1–1.2M. The client now sets --gas-limit (500,000 for the coverage run), preflights the payer balance against the reserve with an explicit error, and reconciles slow confirmations via getTransaction instead of resubmitting. The on-chain program is unchanged.

Why Logos. Map distribution today depends on central hosts. A registry on LEZ gives a censorship-resistant, publicly auditable index of which snapshot (by CID and checksum) is authentic for each region, with no operator able to silently swap data; Logos Storage lets many independent operators mirror the same CID, and content addressing means a downloader never has to trust the mirror. A centralised alternative would reintroduce a single party who can withhold or alter the index.

Success Criteria Checklist

Legend: [x] = met with evidence in the repo / CI; [ ] = not yet met (pending), with the current state explained.

Functionality

  • Region discovery: osm discover lists the frozen predefined set with level/parent; --refresh fetches the Geofabrik index for current URLs/versions (osm_sdk/src/regions.rs, regions.json).
  • Host workflow: fetch → MD5 verify → store → register is implemented in osm_sdk/src/host.rs and the osm host command. On testnet v0.3 it ran for real for 25 regions (Geofabrik fetch, MD5 check, upload to real Logos Storage, fetch-back check, on-chain register, read-back) through osm prepare, osm fetch-cid and osm register-entry (coverage evidence). It then ran as one osm host call for greece and chile (PR #14, below). In CI, the LEZ v0.3.1 chain job on main runs a real Logos Storage node (logosctl 0.3.2, storage_module 3.0.2; added in PR #13, merged). That job runs fixture fetch → MD5 → store → register → query → download-by-CID as a required step, with no continue-on-error. It is green on main at f91ddb2 (run 41458197956). Testnet 0.4 and retrieval by other nodes are tracked under their own criteria.
  • Download workflow: Storage-by-CID with Geofabrik fallback is implemented (osm download). Download by a registry-resolved CID from another node is verified: in run 41469069413 a fresh Storage node on a GitHub runner (peer 16Uiu2HAmAWEbJQshRYQCxmbav6FEVux4kVSYLyxKg9Xe4gvKtLvD, empty data dir) read the registry C5UwQUopzYvYREczjNJNf8fjmzrmf2QWK2f7Dd2YRgrS from testnet v0.3, resolved china/henan to CID zDvZRwzm5FYsh7BU1kK1TzjuZU92FyLFvqMjGUm5zm9pzWMLMUSP, and downloaded it through Logos Storage from the hosting node (peer 16Uiu2HAm2cmq5yqh7YLDqbYVQ2b9B7NrnMPMwHd6AVmBwGswdjJX): 50,468,082 bytes in 22.3 s, MD5 54c5fbf47dc51588de2ffb0a0a94a771 = on-chain checksum. The hosting box is behind NAT with HTTPS-only egress, so it reaches the runner through a Cloudflare quick tunnel the runner opens (storage-retrieval-tunnel workflow + tools/storage_tunnel_peer.sh, merged in logos-osm PR #17; evidence in coverage/verify-gha-tunnel-2026-11-02.md); the tunnel carries only the libp2p connection. Limit: one region, and the tunnel is opened per run; a permanently reachable node still needs a public host.
  • Bulk host: several regions in one osm host call go into one register_batch transaction, and --exclude opts a region out. On testnet v0.3, osm host greece chile belarus --exclude belarus registered greece and chile in one transaction (207214ce…bea0, block 74320). Belarus stayed unregistered, and the keyless verify passed (docs/bulk-import-testnet-v0.3.md, PR #14, merged; CI green on main at f91ddb2: run 41458197956). The chain CI job on main (from PR #13) asserts the same thing (2 registered in one batch tx, 0 skipped, belarus not registered) against a local sequencer with real Storage. The app has per-region checkboxes, Select all and Clear. Because the set is a partition, no overlap warning is needed. Not run from the app: Host selected, which spends deployer tokens.
  • Local import: osm import checks the file against Geofabrik's MD5, then stores and registers it by CID. On testnet v0.3, osm import belarus <file> registered belarus (9314ed80…1966, block 74323), and the keyless verify passed: fetched MD5 = on-chain checksum = Geofabrik sidecar (PR #14, merged). In the chain CI job on main (from PR #13), a tampered PBF is rejected (exit 2, nothing registered), and the genuine file imports with hosted=true and downloads back from Logos Storage with a matching MD5.
  • Update check: osm check-updates compares Geofabrik versions against registry entries per region path.
  • On-chain registry: required fields, unique Geofabrik-path keys with explicit parent / level, queries by region / parent / CID, and batch registration. Exercised against a real LEZ v0.3.1 sequencer in CI and on public testnet v0.3 (see below).
  • Testnet 0.4 (pending): testnet 0.4 is not live yet. Only a testnet v0.3 practice deployment exists (see Supporting Materials).
  • OSM registry SDK: SDK with a documented API (docs/sdk.md), the consumer example module examples/basecamp-consumer, and the osm core module published as a separate Basecamp module in the module catalog (osm 1.0.2, linux-amd64), so other modules can depend on it without osm-app.

Usability

  • Basecamp app GUI: the local build instructions are in the README and docs/basecamp-check.md. The app is a downloadable .lgx in the module catalog (osm-app 1.0.2, linux-amd64). It was checked in Basecamp on Linux against testnet v0.3 on 2026-11-02, with Basecamp 66505d5 portable, standalone mode and catalog 1.0.2 modules. Basecamp loads storage_module 3.0.2, osm 1.0.2 and osm-app_backend. After Refresh, the app marks all 28 registry entries as hosted (e.g. greece hosted · 261101; hungary, romania, bulgaria and south-korea hosted · 261031). Download of china/henan wrote 50,468,082 bytes and showed verified: yes and checksum verified. The file's MD5, 54c5fbf47dc51588de2ffb0a0a94a771, matches the registry. Storage was the hosting node on the same machine, not a remote peer. The 1.0.1 Download failure had two causes, both fixed in logos-osm PR #12 (merged as 4843e1e): the file:// destination URL, and module errors returned as unescaped JSON. 1.0.2 was released from PR Solution: LP-0013 — Token Program: Mint Authority (RFP-001) #12's branch commit 6debd97, which is now in main's history; between 6debd97 and main at f91ddb2 the module and app sources are unchanged, so the catalog pin was left at 6debd97. CI is green on main at f91ddb2 (run 41458197956). Host selected was not run, because it spends deployer tokens. macOS is not verified (the prize checks macOS through the Adoption criteria). Evidence: screenshots and docs/basecamp-check.md.
  • SDK/module with API docs and embedding example: docs/sdk.md documents the API, and "Embedding example" shows a third-party Basecamp UI app, examples/basecamp-consumer-app (osm-consumer-app), whose only module dependency is the consumer examples/basecamp-consumer (osm_consumer_example), which calls osm through the generated SDK client (logos-osm PR #15, merged as adeb95c). All three are published in the module catalog: osm_consumer_example-v1.0.2 (sha256 7bded8d0df4a55d5e2250416f5980c3e3b37514e993b611771d1e7cfe78dbacc), osm-consumer-app-v1.0.0 (sha256 c6c910ac0d0b9c436ac87c8fa411f37c9cf6acd889ec7c5313d679754904f9fa) and osm-v1.0.3 (sha256 bdf74fb43a35cc3d36fce237eb46b8b4bc6308cab4f3ecd7105daa457cce4bc0); the downloaded .lgx files match the index. Installed from those files, the app was run inside Basecamp on Linux (66505d5 portable, testnet v0.3) on 2026-11-02: Resolve china/henan showed the on-chain entry, and Download wrote 50,468,082 bytes from Logos Storage with verified: yes; the MD5 54c5fbf47dc51588de2ffb0a0a94a771 matches the registry. Storage was the hosting node on the same machine. Evidence: docs/basecamp-check.md → "Consumer app from the catalog" and the sdk-catalog-consumer-app-* screenshots (logos-osm PR #18, merged as 8a60170).
  • CLI: osm covers host (store + register; multiple regions → one batch transaction), import, lookup --region/--parent/--cid, check-updates, download and init-registry.
  • Clear UX: the CLI and the app both show hosted or not-hosted status, version numbers and verification results. In Basecamp on Linux (1.0.2), each region row shows hosted · <version> or not hosted. After a download, the status line shows the destination and verified: yes, followed by checksum verified (screenshot basecamp-osm-app-1.0.2-download-verified-china-henan.png). Hosting from the app was not exercised.

Reliability

  • Storage uploads and Geofabrik downloads retry with exponential back-off and report a clear error after retries are exhausted (osm_sdk).
  • Import-time checksum mismatches fail before registration with a clear error and remove partial files.
  • Registry query results are ordered by timestamp (region path tie-breaker).
  • No mandatory centralised services: only the configured sequencer / LEZ node, Logos Storage and Geofabrik (index, import-time checksum, fallback) are used; the repository contains no analytics or telemetry code.

Performance

  • Guest cycle counts documented for register_region (1 entry: 3,801 cycles) and register_batch (2 entries: 4,877 cycles), captured on a standalone LEZ v0.3.1 sequencer in RISC Zero dev mode (docs/cycles.md). These are localnet samples, not testnet 0.4 measurements.

Supportability

  • Deployed and tested against testnet 0.4 (pending): not live yet; v0.3 practice deployment only.
  • Platform support (recommended): Linux and macOS. Rust CI runs on Ubuntu, macOS and Windows (logos-osm PR #16, merged as 21d0ceb), and a nix macOS CI job builds the osm module, osm-app, the consumer example and the consumer app, plus their .lgx packages, for aarch64-darwin (run 41481684109; PR #18, merged as 8a60170, vendors the CI-built libosm_ffi.dylib). From 1.0.3, the catalog publishes linux-amd64 and darwin-arm64 variants of osm, osm-app, osm_consumer_example and osm-consumer-app, with the darwin builds run on macos-latest by the release action (docs/catalog.md). Limits: the darwin packages are built in CI but were not loaded in Basecamp on a Mac; Windows is covered by the Rust CI only; Android is not built. The prize requires Windows and Android from testnet 0.4.
  • Built with logos-module-builder: osm-module (mkLogosModule), osm-app (mkLogosQmlModule) and the consumer example (mkLogosModule) in flake.nix; module and app Nix builds pass in CI.
  • Published to a module catalog: logos-repo.json URL https://raw.githubusercontent.com/YodHeVauHe/logos-osm-modules/main/logos-repo.json. Catalog repository YodHeVauHe/logos-osm-modules, created from the logos-modules-release-base template (this account's GitHub fork of that repo already serves another catalog, and GitHub allows one fork per account). Current releases osm-v1.0.3 (osm-1.0.3.lgx, sha256 bdf74fb43a35cc3d36fce237eb46b8b4bc6308cab4f3ecd7105daa457cce4bc0), osm-app-v1.0.3 (osm-app-1.0.3.lgx, sha256 53e8a7b73ebc5a878563c1ba6aae6c13443b6accd64a72c61b62c16904931cb9), osm_consumer_example-v1.0.2 and osm-consumer-app-v1.0.0 were published on 2026-11-02 with linux-amd64 and darwin-arm64 variants, built from logos-osm commit 3bc74e9 (PR LP-0009: Clarification Request — Schnorr Signing and Keycard #18, merged as 8a60170; catalog commit ad2b431), and the downloaded files match the index sha256 values. Before them, osm-v1.0.2 (osm-1.0.2.lgx, sha256 9e410627533f931bf1daaf987f7df954a1c4cf3fad892f0f97df041cd8c9388c) and osm-app-v1.0.2 (osm-app-1.0.2.lgx, sha256 b530b767fca7116ab6123c49420e95fed9b2f7b280acefc449c2169b3252d145) were published on 2026-11-02. They were built from logos-osm PR Solution: LP-0013 — Token Program: Mint Authority (RFP-001) #12's branch commit 6debd97 (PR merged; the commit is in main's history, and module and app sources match main at f91ddb2) and carry the Download fix. They follow osm-v1.0.1 (osm-1.0.1.lgx, sha256 3ededd2d2469591b25cfa6b1a342758c44c46d48ebc3d44b36bf84a227fc8b6f) and osm-app-v1.0.1 (osm-app-1.0.1.lgx, sha256 df760d733f6c0cb2a7904a0a19b9e407ef847b9964637f505473340e6c70b430) were published by logos-modules-release-action on 2026-11-02, after the 1.0.0 releases. The index lists 1.0.3, 1.0.2, 1.0.1 and 1.0.0 of osm and osm-app, and the 1.0.3 and 1.0.2 files fetched with curl match its sha256 values. Releases up to 1.0.2 are linux-amd64 only; from 1.0.3 the osm module also vendors an aarch64-darwin libosm_ffi.dylib built in CI, so darwin-arm64 is published too. Details: docs/catalog.md and the standalone module flakes the releases are built from (logos-osm PR Update LP-0013 to add RFP-001 as part of delivery #8, merged). 1.0.1 carries the Basecamp fixes from PR Solution: Music Escrow Protocol — atomic music distribution on LEZ #10 (merged).
  • IDL generated via SPEL (pending, blocked upstream): an IDL is tracked at idl/osm-registry.idl.json and regenerated/freshness-checked in CI, but it is produced by an in-repo generator for the LEZ v0.3.1 plan/apply API, not by SPEL. SPEL main (c6f73ce) and release v0.7.0 pin LEZ v0.2.5-rc2, and no open SPEL PR moves to v0.3.x (checked 2026-11-02). docs/idl.md (logos-osm PR fix statuses #9, merged) records this evidence and maps each SPEL IDL field to the in-repo IDL, including the different instruction discriminator (Borsh enum index vs. SPEL's SHA256("global:<name>")[..8]).
  • E2E against a real sequencer in CI, green: on main, the chain CI job deploys the guest to a standalone LEZ v0.3.1 sequencer and runs it against a real Logos Storage node (logosctl 0.3.2, storage_module 3.0.2; PR #13, merged as f91ddb2). It covers host (fixture fetch → MD5 → store → register) → query → download-by-CID, CLI bulk host and local import, all as required steps. Green on main at f91ddb2 (run 41458197956). This is a local sequencer and a single Storage node in CI; testnet 0.4 and retrieval by other nodes are tracked under their own criteria.
  • README documents setup, deployed program ID, region list, CLI/app usage (pending): all present, but the program ID recorded is the v0.3 practice deployment; the testnet 0.4 program ID is pending.
  • SDK worked example: resolve a region to CID and metadata: docs/sdk.md → "Worked example".

Adoption (required) — all pending

  • Coverage (pending): the target is 15 countries / 25 verified entries hosted in Logos Storage on testnet 0.4. Current: 28 regions across 20 countries hosted and registered on testnet v0.3, counted from osm_registry_cli get on 2026-11-02 (all 28 hosted = true). The keyless verifies passed 25/25 (evidence) and 3/3 for greece, chile and belarus (PR #14, merged). Not yet counted, because it is on v0.3, not 0.4, and retrieval by an independent node over the network is not yet proven. The run is reproducible, so it can be repeated on 0.4.
  • Ecosystem reuse via the SDK (pending): 5 independent modules (≥3 Basecamp UI apps). Current: none.
  • macOS coverage (pending): no adoption evidence yet.

FURPS Self-Assessment

Full assessment: docs/furps.md.

Functionality

Registry program with init_registry, register_region, register_batch; SDK/CLI for discovery, host, bulk host, import, lookup (region / parent / CID), update check and download. 28 regions / 20 countries hosted and registered on testnet v0.3. That includes one bulk-host batch transaction and one local import, and the registry-backed verifies pass 25/25 and 3/3 on the hosting node. Retrieval by an independent node is verified for china/henan through a reverse tunnel (run 41469069413); the hosting node is not yet permanently reachable. Out of scope by design: live OSM sync, rendering, routing, custom regions.

Usability

osm discover works with no chain or Storage configuration. Registry commands need a program ID, wallet home and fee payer (OSM_RPC_URL, LEE_WALLET_HOME_DIR). SDK guide with a resolve-to-CID worked example and a consumer module example. The Basecamp app builds in CI and both modules are published in the module catalog (linux-amd64). On Linux the catalog 1.0.2 app loads in Basecamp, shows the testnet v0.3 registry's hosted regions, and downloads a hosted region with a verified checksum (logos-osm PR #12, merged). Hosting from the app and macOS are not yet verified.

Reliability

Shared validation between guest and SDK; MD5 mismatch fails before registration; exponential back-off retries on network/Storage operations; timestamp-ordered query results; registry size bound tested against the 100 KiB account limit. Registration is idempotent per region path (upsert).

Performance

Localnet guest cycles: 3,801 for a one-entry register and 4,877 for a two-entry batch (LEZ v0.3.1, RISC Zero dev mode). Queries are off-chain reads of a single account.

Supportability

Workspace split into shared types, guest, SDK, CLI, FFI, Basecamp module, app and consumer example. CI on main: fmt, clippy and tests (Ubuntu, Windows), C++ unit tests, in-memory e2e, Nix builds of module and app, and a job that builds LEZ v0.3.1, deploys the guest to a standalone sequencer, checks IDL freshness and runs the on-chain e2e (host, query, download-by-CID, bulk host, local import) against a real Logos Storage node. Deployment steps and program IDs are in the README.

Supporting Materials

Testnet v0.3 practice deployment — NOT the testnet 0.4 deployment the prize requires. Public Logos testnet v0.3 LEZ zone (https://testnet.lez.logos.co), LEZ v0.3.1 wallet program-loader, immutable program header, deployed 2026-10-30.

Item Value
Program ID (header account) C31bCPXKa5uy1hzmegqMABWLbavoSJbY4Rhrc5yNXPrY
Registry PDA C5UwQUopzYvYREczjNJNf8fjmzrmf2QWK2f7Dd2YRgrS
Guest image ID 2e27ae50d12ae9e823c6ac7659a3fa625b4a30fab5ad8d844ff25707adec36b6
Smoke test: InitRegistry 4df3a67cd07905a5155c97bbc9478d358bef737ef5a2310d51527358697b104a
Smoke test: RegisterRegion (kenya) 6f9ffdbdf48f6089fb90c2a51f8376f9fbae47397c7179c48aee6f656897425c

The kenya smoke-test entry was read back from the registry PDA with osm_registry_cli get; it was unhosted (hosted: false, placeholder CID). The coverage run later replaced it (registration is an upsert per region path) with a hosted entry, listed below. Segment-upload transaction hashes are in the README Program IDs section. Explorer: https://explorer.testnet.lez.logos.co/.

Coverage on testnet v0.3

Same program and registry PDA as above. Full table (region, country, size, Geofabrik MD5 = on-chain checksum, Storage CID, snapshot, block, tx) and method: docs/coverage-testnet-v0.3.md.

  • Result: 28 regions across 20 countries (Belarus, Bulgaria, Chile, China ×6 provinces, Colombia, Egypt, Ethiopia, Greece, Hungary, India ×4 zones, Iran, Kenya, Malaysia, Morocco, Pakistan, Peru, Romania, South Korea, Thailand, Vietnam), counted from osm_registry_cli get on 2026-11-02. Each is hosted = true with its Storage CID and Geofabrik MD5 on chain. The 25 from the coverage run use snapshots 261030/261031. Greece and chile (bulk host, one batch transaction) and belarus (local import) use 261101 (docs/bulk-import-testnet-v0.3.md, PR #14, merged).
  • Example registrations: kenya, china/henan, colombia.
  • Verify output: coverage/verify-node1-2026-11-01.md (and .json): 25/25 PASS, run 2026-11-01 20:08 EAT through the hosting node. coverage/verify-bulk-import-2026-11-02.md: 3/3 PASS (greece, chile, belarus).

Reproducibility. Versions (LEZ v0.3.1, logosctl 0.3.2 with SHA-256, storage_module 3.0.2, network logos.test), the RPC, program ID, registry PDA and the 25 regions are pinned in coverage/regions-testnet-v0.3.json. From a clean checkout:

tools/coverage.sh setup   # fetch + sha256-check logosctl 0.3.2, build osm and osm_registry_cli
tools/coverage.sh node    # start a Storage node on logos.test
tools/coverage.sh host    # needs a funded LEZ wallet; idempotent, skips regions already hosted on chain
tools/coverage.sh verify  # keyless: no wallet or key

verify reads the registry with the sequencer's getAccount JSON-RPC, decodes it, downloads each on-chain CID through a Storage node and compares the bytes with the on-chain checksum (--registry-only checks the chain side alone). The same steps are available as make coverage-* targets. A storage-retrieval GitHub workflow runs the keyless verify from a fresh runner as the public network check.

Network retrieval: proven through a reverse tunnel, not over relays. All 28 objects sit on one Storage node on a box behind NAT (private address, Cloudflare egress, port mapping failed, relay-only addresses). Two fresh verifier nodes and three GitHub Actions runs (41330147318, 41331443910, 41331566883) found the hosting node as a provider but did not complete a transfer. The latest storage-retrieval run, on the final PR #7 head (41335257985), fetched the public Logos docs control CID (2,276,462 bytes in 7.1 s) but 0/2 of our regions (china/henan, kenya: no download completed within 600 s; the kenya manifest was not found). That workflow's verify step is continue-on-error, so its green status does not mean a retrieval succeeded. The fix is a publicly reachable Storage node seeded with the same bytes; the steps are in the coverage doc. An independent fetch has since succeeded: run 41469069413 downloaded china/henan (50,468,082 bytes, MD5 54c5fbf47dc51588de2ffb0a0a94a771 = on-chain) on a fresh runner node from the hosting node, which dialed the runner through a Cloudflare quick tunnel. Without such a tunnel the hosting node is still unreachable, so the CIDs are not generally online yet.

Other materials:

Pending work

  1. Make the hosted data retrievable over the network: run a publicly reachable Storage node seeded with the 28 CIDs, then show an independent node (and the storage-retrieval CI workflow) fetching them with matching checksums. Multi-node transfer is demonstrated for one region through a reverse tunnel (run 41469069413).
  2. Deploy and test on Logos testnet 0.4 once it launches (expected around 2026-11-30); record the 0.4 program ID and registry PDA, and rerun tools/coverage.sh host / verify there.
  3. Generate the IDL via SPEL once a SPEL release supports the LEZ version of testnet 0.4 (SPEL main c6f73ce still pins LEZ v0.2.5-rc2). The mapping to SPEL's format is documented in docs/idl.md (logos-osm PR fix statuses #9).
  4. Exercise Host selected from the app with a funded wallet, run the consumer example as a module inside Basecamp, and verify on macOS. (Done: logos-osm PRs Update LP-0013 to add RFP-001 as part of delivery #8 to Solution: LP-0012 — Structured event system for LEZ programs #14 merged, with CI green on main at f91ddb2. Catalog 1.0.2 is published. Basecamp on Linux downloads a hosted region from the app with a verified checksum. The consumer's downloadRegion works under logosctl when pointed at a Storage node.)
  5. Adoption: repeat the 28-region / 20-country coverage (done on v0.3) on testnet 0.4 with network-retrievable data; 5 independent consumer modules (≥3 Basecamp UI apps); macOS usage evidence.
  6. Record the demo video.

Terms & Conditions

By submitting this solution, I confirm that I have read and agree to the Terms & Conditions.

Changes:
- Add solutions/LP-0018.md from the LP-0000 template for logos-osm (YodHeVauHe/logos-osm @ a0824db)
- Record the testnet v0.3 practice deployment (program ID, registry PDA, init and register smoke-test txs), labelled as not the testnet 0.4 deployment
- Mark testnet 0.4, real Storage roundtrip, module catalog, SPEL-generated IDL and all Adoption criteria as pending

Verification:
- Ran .github/scripts/validate-submission.sh locally against the file: no errors; one non-blocking warning (no module.json in logos-osm)
- Checked logos-osm main CI on a0824db with gh run view: rust, nix and chain jobs succeeded
@github-actions

github-actions Bot commented Oct 31, 2026 •

Copy link
Copy Markdown

✅ Validation passed

A reviewer will assess against the prize criteria.
ℹ️ Solution submission for LP-0018.
ℹ️ Checking repo: https://github.com/YodHeVauHe/logos-osm


Automated check. See solution template and TERMS.

…adapter

Changes:
- Point the submission at logos-osm main a8b587e and link the green CI run 41270856840
- Note the repo-level module.json that indexes the osm, osm-app and consumer-example manifests
- Replace the legacy Storage adapter gap with the LogosctlStorage adapter and its single-node real upload-download result, keeping multi-node and registry-backed roundtrips listed as pending

Verification:
- .github/scripts/validate-submission.sh run locally against this file (Validation passed, no warnings)
- git diff --check
…ucibility

Changes:
- Point the submission at logos-osm main 89e36fd (merge of PR logos-co#7) and note CI state
- Add a "Coverage on testnet v0.3" section: 25 regions across 17 countries hosted and registered, evidence doc, verify output and explorer links for kenya, china/henan and colombia
- Describe reproducibility: pinned regions/versions file, tools/coverage.sh setup/node/host/verify, idempotent host and keyless verify
- Record the "Incorrect fee" gas-reserve root cause and client-side fix
- Update Host, Download and Coverage criteria text without checking boxes; network retrieval by an independent node is stated as not proven
- Refresh pending work: public network retrieval / multi-node, testnet 0.4 deploy (~Nov 30), 5 independent consumers, SPEL IDL (SPEL main still pins LEZ v0.2.5-rc2), demo video

Verification:
- Ran .github/scripts/validate-submission.sh from a logos-co/lambda-prize master checkout against solutions/LP-0018.md: "Validation passed", no warnings
Changes:
- Point the CI line at main 89e36fd, fully green in run 41336085397 (rust Ubuntu/Windows, nix, LEZ v0.3.1 chain e2e; dispatch-only live Geofabrik job skipped)
- Add storage-retrieval run 41335257985 to the network retrieval note: control CID fetched, 0/2 regions fetched
- Note that the storage-retrieval verify step is continue-on-error, so a green run does not mean retrieval worked

Verification:
- gh run view 41336085397: conclusion success, every job passed except the skipped dispatch-only job
- Read logs of storage-retrieval run 41335257985: control OK, china/henan and kenya FAIL
- Checked via gh api that referenced docs/coverage files exist on main, coverage set has 25 regions across 17 countries, and PRs logos-co#4-logos-co#7 are merged
- Ran .github/scripts/validate-submission.sh locally against the updated file: passed, no warnings
Changes:
- Check the module catalog criterion with the logos-repo.json URL, releases, index and the linux-amd64-only limitation.
- Check the OSM registry SDK criterion now that osm is published as a separate Basecamp module.
- Note the downloadable osm-app release under Basecamp app GUI; interactive loading stays pending.
- Remove the catalog item from Pending work and renumber.

Verification:
- curl of logos-repo.json and index.json; downloaded .lgx SHA-256 values match the index.
- validate-submission.sh with the PR title and solutions/LP-0018.md: passed, no warnings.
Changes:
- Expand the SPEL IDL criterion with the pinned SPEL commit, release and LEZ version, and link logos-osm PR logos-co#9 (docs/idl.md); the box stays unchecked.
- Update the SPEL item in Pending work.

Verification:
- validate-submission.sh with the PR title and solutions/LP-0018.md: passed, no warnings.
Changes:
- Basecamp app GUI: verified on Linux against testnet v0.3 (Basecamp 66505d5 portable), with evidence and reproduction links on the logos-osm PR logos-co#10 branch; criterion stays unchecked (PR logos-co#10 not merged, catalog osm-app 1.0.0 predates the fixes, Host/Download not exercised, macOS pending)
- Catalog: note PR logos-co#8 is not yet merged and osm-app will be republished after PR logos-co#10
- Clear UX, SDK/module and FURPS usability lines updated to match; osm module now noted as published
- Pending work item 4 rewritten: merge PRs logos-co#8/logos-co#9/logos-co#10, republish osm-app, exercise Host/Download, consumer module in Basecamp, macOS
- Add the Basecamp check to Other materials

Verification:
- validate-submission.sh with the workflow layout (base/ checkout, pr/solutions/LP-0018.md, PR title): Validation passed, no warnings
- curl of the two new logos-osm evidence URLs: HTTP 200
Changes:
- Reference logos-osm main 25c4570 (PRs logos-co#8, logos-co#9, logos-co#10 merged) and its green CI run 41423033732
- Record the catalog republish as osm/osm-app 1.0.1 with release links and sha256
- Update the Basecamp app and SDK criteria with the 1.0.1 recheck: load and hosted list pass, app Download fails (file:// path, unescaped error JSON), Host selected not run, consumer resolve works and download times out; criteria stay unchecked
- Point Basecamp evidence at logos-osm PR logos-co#11 and update the pending list

Verification:
- gh run view 41423033732: success (rust ubuntu/windows, nix, chain; live Geofabrik skipped)
- curl + sha256sum of osm-1.0.1.lgx and osm-app-1.0.1.lgx match index.json
- validate-submission.sh with base/ = master and pr/solutions/LP-0018.md, PR_TITLE of logos-co#187: Validation passed, no warnings
…0.2 Download

Changes:
- Check Host workflow, Bulk host and Local import, citing logos-osm PRs logos-co#13 (real Storage leg in the chain e2e) and logos-co#14 (testnet v0.3 bulk host and local import txs) and their green CI runs
- Update the Basecamp app, SDK/module and Clear UX lines with the 1.0.2 Download and consumer results from logos-osm PR logos-co#12; leave them unchecked pending PR logos-co#12 CI
- Update E2E-in-CI with PR logos-co#13, still pending until merged and green on main
- Recount coverage from the live registry: 28 regions across 20 countries
- Add the 1.0.2 catalog releases and sha256 values, and rewrite Pending work item 4

Verification:
- Ran osm_registry_cli get against testnet v0.3: 28 entries, 20 countries, all hosted
- Read the logos-osm PR logos-co#13 and logos-co#14 check rollups (chain jobs success) and the PR logos-co#13 chain job log
- Ran .github/scripts/validate-submission.sh locally with the PR title: passed, no warnings
… CI is green

Changes:
- Check Basecamp app GUI and Clear UX: catalog 1.0.2 loads in Basecamp on Linux, downloads china/henan with a verified checksum, and shows hosted status, versions and verification results; logos-osm PR logos-co#12 CI is green
- State the green CI heads for logos-osm PRs logos-co#12, logos-co#13 and logos-co#14

Verification:
- Read the logos-osm PR logos-co#12 check rollup on b432f05: all jobs success (live Geofabrik skipped)
- Ran .github/scripts/validate-submission.sh locally with the PR title: passed, no warnings
…s-co#11-logos-co#14 merged

Changes:
- Check the "E2E against a real sequencer in CI, green" box, citing main CI run 41458197956 on f91ddb2 (the logos-co#13 merge), whose chain job runs a real Logos Storage node.
- Point the CI summary, Host, Bulk host and Basecamp GUI lines at main f91ddb2 and run 41458197956.
- Mark logos-osm PRs logos-co#11, logos-co#12, logos-co#13 and logos-co#14 as merged and drop the "not yet merged" wording.
- Point basecamp-check, evidence and bulk-import links at main instead of branch paths.
- Note that catalog 1.0.2 was built from 6debd97, now in main's history, with module and app sources unchanged on main; the catalog pin is left as is.
- Drop the merge step from pending work item 4.

Verification:
- .github/scripts/validate-submission.sh from origin/master, run on solutions/LP-0018.md with PR_TITLE, PR_REPO, BASE_REPO and CHANGED_FILES set: Validation passed.
- gh run view 41458197956: completed success, chain job success.
- git diff --name-only 6debd97 origin/main in logos-osm: only CI, tests, tools, coverage and docs files differ.
- grep for "not yet merged" and branch-path links in solutions/LP-0018.md: none.
…ent node

Changes:
- Download workflow box checked: run 41469069413 fetched china/henan by its registry CID on a fresh runner node from the hosting node, MD5 matching on chain.
- Update the known-gap, summary, network-retrieval and next-steps lines to match.

Verification:
- .github/scripts/validate-submission.sh with pr/ and base/ (origin/master) layout: Validation passed.
- Run 41469069413 verify.md artifact: china/henan PASS, MD5 54c5fbf47dc51588de2ffb0a0a94a771.
Changes:
- Link tools/storage_tunnel_peer.sh and coverage/verify-gha-tunnel-2026-11-02.md on main now that logos-osm PR logos-co#17 is merged.

Verification:
- Both main URLs return HTTP 200.
- .github/scripts/validate-submission.sh with pr/ and base/ (origin/master) layout: Validation passed.
… logos-osm logos-co#15, logos-co#16, logos-co#18

Changes:
- check SDK/module: osm-consumer-app on osm_consumer_example, published to the catalog, run inside Basecamp on Linux with Resolve and verified Download
- check Platform support: Rust CI on Ubuntu, macOS and Windows; aarch64-darwin Nix builds of all four modules; darwin-arm64 catalog variants; not loaded on a Mac
- catalog line: 1.0.3 releases and the two example packages with linux-amd64 and darwin-arm64

Verification:
- sha256sum of the four downloaded .lgx files matched index.json
- osm-consumer-app installed from the catalog .lgx files resolved and downloaded china/henan in Basecamp on Linux (verified: yes, MD5 matches)
- logos-osm run 41481684109 green on PR logos-co#18, including nix macOS; PR logos-co#18 merged as 8a60170
- bash .github/scripts/validate-submission.sh with the PR check's layout and env: Validation passed
Changes:
- CI line now cites logos-osm main run 41509457241 at 53ab0e2, fully green including the macOS rust and nix aarch64-darwin jobs, instead of run 41458197956 at f91ddb2
- Note that the macOS arm64 runner was not acquired on attempt 1 and the ci-runner-retry workflow reran it to green on attempt 2

Verification:
- gh api on run 41509457241 attempt 2: every job success except the dispatch-only live Geofabrik job (skipped)
- Read the ci-runner-retry run 41513549696 log: "Rerunning run 41509457241: 1 job(s) never acquired a hosted runner"
- Ran .github/scripts/validate-submission.sh from origin/master against solutions/LP-0018.md: Validation passed
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.

1 participant