Logoscore Weekly Update — 2026-10-05

Highlights

Initiatives

The 0.3.0 release wave

  • The rollback, and putting it back. Releases tagged before the bad bump were unaffected and needed no re-release. LEZ and accounts were repinned first, then storage. One of the repins was accounts-ui, moved to its v0.3.0 tag because 9daa899 was never pushed logos-modules-release#78, #79, #80, #85
  • LEZ Core moved to the shard-based account model of LEZ 0.3.0. FfiAccount now returns {nonce, shards: [{program, data}]}: program_owner, balance and data are gone, private identifiers are 32 bytes, and generic transactions take a per-account FfiAccountMention. The hand-written test stub had already drifted from the FFI, so it was replaced with the real wallet_ffi.h. Explorer shows each program’s data shard and prints “Invalid encoding” for a native balance it cannot decode. Wallet UI dropped its “Unclaimed / Initialized” tracking, which depended on program_owner. A later bump picks up an r0 linking fix, and Explorer’s channel id moved from 0101… to 0303… logos-execution-zone-module#61, #62, #63, #64, lez-explorer-ui#25, #26, #28, #29, #30, logos-execution-zone-wallet-ui#51, #52, #53, #54, logos-modules-release#77, #93, #94
  • Storage 3.0.0 makes privacy a per-download choice. The node-wide “private DHT queries” switch is gone. Each download and each manifest fetch now has its own Private toggle, which routes it over Mix and does not advertise the file. The toggle is greyed out when the config has Mix turned off. .lgx files get their own row with no delete button, since installed modules may still need them. libstorage went 0.5.0 → 0.5.2 → 0.5.3; 0.5.3 fixes a critical upstream bug and shipped as storage 3.0.2. Doctests now pin logosctl 0.3.1 / lgpm 0.3.0 instead of tracking master logos-storage-ui#96, #97, #99, logos-storage-module#99, #100, #102, #103, #104, logos-modules-release#70, #71, #87, #89, #97, #99
  • Basecamp downloads over Storage, end to end. Basecamp starts the node when storage_module is ready and stops it on quit. A new doctest exercises the full path: it uploads a storage_ui package to a provider node the way a release does, and installs it over Storage. It then stops the node from the Storage UI and installs over HTTPS. It also checks that a download never restarts a node the user stopped, and never uses a node on a different network from the catalog’s. Release workflows moved to v1.7–1.8 and now pass STORAGE_NODES logos-basecamp#416, #454, logos-modules-release#64, #68
  • libp2p 1.1.0. start now returns once the switch is listening, and a new kadWaitBootstrap(timeoutMs) waits for the DHT, so a slow DHT bootstrap no longer has to fit inside start’s 10 s budget. nim-libp2p is pinned to a commit, and every external ref is now a full hash. That includes the code-review workflow, which receives API keys and had been running whatever was pushed to @main logos-libp2p-module#114, #115, #116, #119, logos-modules-release#75
  • The catalog grew. All 19 EVM-wallet and 7 Monero-wallet stack repos joined the official catalog. Accounts now ships as accounts_ui 0.3.0: its module name had still been accountlog_ui, which Basecamp listed as “Account Log”. openmetrics 0.1.2 gained a Windows variant, and Monero and verified-proxy were bumped logos-accounts-ui#14, logos-modules-release#67, #69, #96, #83, #73, #76, #90

Blockchain UI — mining state from the node, and the claims it missed

  • Mining state is now read from the node. Mining had been a fire-and-forget toggle with no readback, so the view showed what it last requested. It went wrong whenever the node started or stopped mining on its own. pow_status is now read on every status poll. It is not tied to the claimable-tickets timer, because that timer runs only while the app believes mining is on, which is exactly the belief the readback exists to correct. Views bind to miningActive, the node’s answer whenever there is one. The old request flag survives only as a fallback for a module without pow_status, and to keep the button responsive until the next poll. Auto-claim is resolved the same way. That includes the node’s own reason for standing auto-claim down: every claim target has reached its threshold logos-blockchain-ui#85
  • No pow_* call is made before the chain has first been online. Until then the node’s PoW service doesn’t read its inbox, and the module waits on it with no timeout on its own thread. An early call therefore stalled every other call and every event, blocks included. The gate is latched once per run, and all PoW state is cleared when the node leaves Running logos-blockchain-ui#85
  • Claims made while the app was closed are now counted. A catch-up reads get_blocks from the last scanned slot up to LIB, 2,000 slots per status poll. That is about 50 blocks: few enough not to stall the poll, and enough that a full backfill takes minutes, not hours. When a block holding our claims has no successor in the window, the window doubles, up to 64,000 slots. Raw blocks carry neither a header id nor transaction hashes. Ids are therefore recovered from the next block’s parent_block, and claims are keyed by the beneficiary pk the reward note is minted to. A reply that isn’t a JSON array counts as a failure, not an empty window, so a range is never skipped for good. Results go into a ClaimLedger that is saved to disk with a write throttle. Until the scan has reached back to genesis, the Earned tiles say which period they cover logos-blockchain-ui#86
  • Quick start mines with desktop defaults. Quick start never shows the PoW form, so the node used to mine with its own defaults: every CPU, 4 searches per block, and a 300 s claim period. Quick start now writes 1 thread, 1 search per block and a 10 s claim period, and Advanced’s form starts from the same values. The setting is relabelled “Parallel ticket searches per block”, because it does not cap how many tickets a block can earn logos-blockchain-ui#91
  • Claims in flight, and who counts as funded. The dashboard now tells claims sent apart from claims settling (“3 sent · 2 settling”, or “sent, not seen yet”). The funded-wallet check now accepts any tracked account holding tokens, not only the one with the leader_funding role logos-blockchain-ui#84
  • Shipped as 0.3.0, again as 0.3.0 with the CPU% fix, and as 0.3.1 with the new defaults logos-modules-release#81, #82, #95

Optional dependencies, chosen at install time

  • The resolver offers optional dependencies and returns the full graph it chose. Each optional dependency is returned as an offer. An offer lists the catalog versions it permits after filtering by version range, artifact and signer pins, download source, and whether its required packages can be installed. The returned graph includes packages that are already installed, so a frontend can re-resolve to find nested optionals and drop branches the user deselected logos-package-downloader#44
  • Offers now agree with the required plan. Several mismatches were reproduced before being fixed. A dependency already scheduled at a newer version by another package overwrote the plan’s manifest. An optional needing D ^2 was offered while the plan installed D 1.x. An offer was marked unavailable when only its newest release failed. Offers are no longer built for packages the plan already requires, which took a large synthetic resolve from ~1.5 s to ~0.14 s with identical output logos-package-downloader#45
  • Installed optionals can now be upgraded or downgraded. When the caller supplied the installed set, the resolver had dropped installed optionals from the offers entirely. The default request now pins the installed release, so leaving an offer untouched changes nothing. An installed optional that was never published, such as the embedded modules_state, shows as installed-only instead of unavailable logos-package-downloader#46, #47, logos-basecamp#455
  • Basecamp’s install and upgrade dialogs. Optional dependencies get the same row as required ones, with a version selector that changes the version and its artifact hash together. A follow-up fixed four problems: an unrelated dialog could cancel PMUI’s install gate, leaving every later install refused as busy; the upgrade cascade showed checkboxes that froze Continue; a version pick could loop into an unresolvable selection; and a failed re-resolve emptied the list, so the change that caused it could not be undone logos-basecamp#452, #453
  • PMUI now installs the optional dependencies the shell approved. It had been discarding the shell’s response and installing only the original set. With the new InstallSequence, a failed optional row is marked Failed and the batch continues; a failed required row still stops it logos-package-manager-ui#89, #90
  • logosctl apply() had three bugs. package upgrade uninstalled every named package but downloaded only the ones that had changed, so a package that was already current was removed and never reinstalled. A failing optional aborted the run before the restarts; it is now reported as skipped_optional. And --no-deps installed the whole transitive closure. Four of the seven new tests fail if the fixes are reverted logos-logoscore-cli#160, #161, #162
  • Docs and repins. The developer guide documents the default selections, the RLN → LEZ RLN chain, and branch pruning logos-package-downloader-module#46, #47, #48, logos-tutorial#104, #105, #106

Where packages come from — the Storage fetcher, the download source, and a downloader that starts on request

Upgrades and reinstalls that replace only what changed

  • Embedded packages can be upgraded. The upgrade keeps the bundled copy, which is read-only, and installs the replacement into the user directory. Uninstalling the user copy brings the embedded one back. App Manager now checks a package’s installType again before removing anything, because its cached map can be incomplete during a refresh logos-package-manager-module#75, logos-package-manager#45, logos-package-manager-ui#88, logos-basecamp#447, logos-logoscore-cli#158, logos-liblogos#236
  • Reinstalling one component no longer refetches the whole app. The skip check for packages already on disk ran on the download’s results instead of before the request; it now compares version and rootHash first. A doctest counts .lgx requests in a local server’s access log: three on the first install, one on the reinstall. The same PR unloads an app’s running modules before any of their dependencies is replaced. Previously an upgrade succeeded while the old module kept running logos-basecamp#444
  • Installing an app whose dependency only Basecamp ships. With the built-in catalog disabled, a dependency that only Basecamp bundles is in no enabled catalog, and the resolve failed with no candidate matches even though the installed copy satisfied the range. The preview now retries with that installed package logos-basecamp#472
  • logosctl now names the running dependents an install stops. Reinstalling calc_slow silently left calc_fanout unloaded. The install plan now lists stopped_dependents with a module load hint for each one. They are deliberately not restarted logos-logoscore-cli#166
  • Packages this host cannot install are hidden by default. On Windows most catalog rows could only say Not available. PMUI and App Manager now hide them, and a filter shows them again. That filter combines with the install-state tabs. Grid tiles also give names the cell’s full width logos-package-manager-ui#87, logos-basecamp#445, #446
  • Distribution fixes. A detached logosctl daemon started from an AppImage relaunched the copy inside /tmp/.mount_*, so storage_module and package_downloader crashed with signal 7 once the outer runtime exited. It now relaunches the outer AppImage. lgpm releases now include a Windows zip logos-logoscore-cli#159, logos-package-manager#46

Protocol and SDK correctness

Process lifetime and runtime races

  • A module that calls out from its own init no longer has those calls refused. liblogos told capability_module about the new token only after the child reported its plugin loaded, so the module’s first calls failed with “auth token not recognized”. That is how package_downloader could read is_ready("storage_module") as false. The token is now registered before the child receives it, and a failed load revokes it. Integration passes 49/49 logos-liblogos#237
  • A memory-corruption bug present since intents first landed was crashing Basecamp. IntentBroker::dispatchTo held a QHash iterator across deliverRequest, which can answer the intent synchronously and erase the record. One byte was then written through the dead iterator, showing up as double free or corruption and as a SIGSEGV during QML garbage collection. The broker now looks the record up again after any call that can re-enter it. Replaying deep-link launches went from 5 core dumps in ~12 launches to 0 in 180 logos-basecamp#463
  • logosctl fixes. watch now exits with NO_DAEMON about 1 s after the daemon stops; before, it was still running 31 s later and never exited. daemon stop no longer aborts when the process is reaped between opening and reading /proc/<pid>/stat, a race that had failed a tutorial CI run. modules_state and capability_module are now reported as installed, so a dry-run install of eth_wallet_ui no longer fails with no candidate matches logos-logoscore-cli#164, #171, #165
  • The module inspector’s CPU usage is accurate again, after a process-stats pin fix logos-liblogos#239, logos-basecamp#460

Windows

  • ui-host.exe now dies with Basecamp. It had no job object, so a killed or crashed Basecamp left it orphaned along with its conhost. It now starts suspended inside a kill-on-close job and exits 41–62 ms after Basecamp is killed. Before, it was still alive 5 s later in every run logos-view-module-runtime#43
  • Windows-specific fixes in the UI doctests. On Windows, file:///tmp/... URLs resolve against the drive root while Git Bash’s /tmp is %TEMP%. The persistence spec now confirms that every DLL import resolves inside the bundle: 202 binaries checked, none resolving outside it. The deep-links spec reads its registry handler back and restores any handler that was already registered logos-basecamp#470, #471
  • Search chips show the platform’s real shortcut. The embedded font on Windows has no ⌘ glyph, so the chip drew an empty box, and on Linux it named a key that does nothing. Each chip now shows its own Shortcut’s nativeText. Fixing this showed that a test had been passing on another view’s shortcut, so it is now scoped to the welcome page logos-basecamp#465, #466, #468, logos-package-manager-ui#92
  • Tutorials on Windows and linux-arm64. On Windows 11, the LGX tutorial passes 25/25 and caller identity 11/11. linux-arm64 joined the matrix, taking it from 18 to 27 jobs logos-tutorial#108, #113

Doctests and tutorials — reports you can trust

  • The generated scripts could report a pass for steps that failed or never ran. A multi-line step ran twice, and one step’s set -e ended the whole script, so the LGX spec stopped after 5 of 25 steps. A step with several records repeated its JSON key, so exit 3 came out as 1/1 passed. Under the harness’s bash -e, the first failing step ended the script before its record was written. A ui_test step was dropped without a word. A step that does not finish is now recorded as fail with “not run” logos-doctest#20, #23, #24, #25, #26, #27
  • Screenshots no longer show the screen from before the action. Offscreen, grab() returns the last rendered frame, and the new frame arrives about 5 ms later. A screenshot identical to the previous one is now retaken for up to 1 s, and the action fails if it still hasn’t changed. A survey of about 5,800 screenshot pairs across 476 published reports found real stale captures, for example evm-wallet-ui’s “Advanced” tab showing Settings in 28 of 35 runs logos-doctest#21, logos-test-modules#78, logos-basecamp#464, logos-standalone-app#65, logos-tutorial#112
  • Reports show what actually ran. Each action now has its own result and duration. expect_property honours timeout:, which took basecamp-intents from 11/24 to 24/24. A busy inspector port now fails the step instead of driving whichever app holds that port logos-doctest#19, #22, #30, #31
  • The intents doctest now runs in Basecamp CI. Its click step had been sending click(""), so 19 of its actions never ran. It now passes 24/24, and deep-links passes 10/10 now that it no longer leaves a Basecamp holding port 3768 logos-basecamp#458, #459, #473
  • The tutorials use logosctl, the tool that actually ships. Porting them found three runtime bugs, all fixed upstream this week, and their workarounds have been removed. The repos the tutorials build against are now pinned in tutorial-set.json; doing so revealed five flake.nix files that ignored --release. Stale prose and broken links were fixed logos-tutorial#107, #109, #110, #111, #114, logos-logoscore-py#32, logos-test-modules#76
  • nix run on the design-system storybook launches again. The Windows cross-build had turned off Qt wrapping on every platform, so the storybook exited with qtquickcontrols2plugin not found. A new CI check runs it offscreen for 10 s logos-design-system#63

Appendix: all merged PRs, by repo

lez-explorer-ui, logos-accounts-ui, logos-basecamp, logos-blockchain-ui, logos-cpp-sdk, logos-design-system, logos-doctest, logos-execution-zone-module, logos-execution-zone-wallet-ui, logos-liblogos, logos-libp2p-module, logos-logoscore-cli, logos-logoscore-py, logos-module-builder, logos-module-loader-qt, logos-module-viewer, logos-modules-release, logos-modules-state-module, logos-package, logos-package-downloader, logos-package-downloader-module, logos-package-manager, logos-package-manager-module, logos-package-manager-ui, logos-plugin-qt, logos-protocol, logos-qt-sdk, logos-rust-sdk, logos-standalone-app, logos-storage-module, logos-storage-ui, logos-test-framework, logos-test-modules, logos-tutorial, logos-view-module-runtime, nix-bundle-lgx, nix-bundle-logos-module-install

lez-explorer-ui

logos-accounts-ui

logos-basecamp

logos-blockchain-ui

logos-cpp-sdk

logos-design-system

logos-doctest

logos-execution-zone-module

logos-execution-zone-wallet-ui

logos-liblogos

logos-libp2p-module

logos-logoscore-cli

logos-logoscore-py

logos-module-builder

logos-module-loader-qt

logos-module-viewer

logos-modules-release

logos-modules-state-module

logos-package

logos-package-downloader

logos-package-downloader-module

logos-package-manager

logos-package-manager-module

logos-package-manager-ui

logos-plugin-qt

logos-protocol

logos-qt-sdk

logos-rust-sdk

logos-standalone-app

logos-storage-module

logos-storage-ui

logos-test-framework

logos-test-modules

logos-tutorial

logos-view-module-runtime

nix-bundle-lgx

nix-bundle-logos-module-install