Skip to content

docs: fixes from an end-to-end dogfooding run of every runnable doc - #461

Open
weboko wants to merge 27 commits into
mainfrom
docs/dogfooding-fixes-2026-08
Open

docs: fixes from an end-to-end dogfooding run of every runnable doc#461
weboko wants to merge 27 commits into
mainfrom
docs/dogfooding-fixes-2026-08

Conversation

@weboko

@weboko weboko commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Fixes found by running the runnable docs end to end on a Linux host, as a new user would. Every change is backed by an actual run.

What was executed this pass

Basecamp 0.2.3 driven on a virtual display (package install → Settings → Module Inspector → load); the ETH↔LEZ swap app upgraded to 0.4.6 and taken through catalogue → setup → LEZ activation → live market; the LEZ wallet CLI against the public testnet (init, Piñata claim, transfer, balances); a Logos Blockchain node from the CLI (install → module → config → start → peers → faucet); a storage node (uploaded a file, downloaded Farewell to Westphaliachecksum matched the doc exactly); a six-node Mix network (upload via node 5, download via node 6, SURB path confirmed in the log); a delivery node (live ENR); and a core module built from the template, packaged and called via logoscore.

Repo-wide checks: docusaurus build passes with onBrokenLinks: throw, Vale is clean on all changed files, all 80 referenced GitHub repos resolve, every logos-module-builder pin and template name exists, and all image references resolve.

Fixes in this PR

Doc Problem
blockchain/zone-sdk/inscribe-data-on-chain-using-zone-sdk Step 1 was unfollowable. cd logos-blockchain/deployment/tui-zone straight after cloning fails — that directory exists only on the tui-zone-tutorial branch. Reproduced on a real clone. The demo link (tree/master/…) 404s and the claim that master holds a fuller implementation is false: master has no tui-zone at all.
basecamp/swap-eth-and-lez-tokens-… Toolbar button is Manage Repositories, not "Repositories". Installing opens Install Package?, not an "Add Application" window listing "Required Packages". The offer pane has no Hashlock row (the hashlock derives from the preimage the buyer's app invents on accept, so it cannot exist before the offer is taken), which also made the Step 5 comparison impossible. The disabled Accept button explains itself above the button, and the usual reason — an unfunded ETH address — was not among the listed messages.
messaging/get-started/send-1-1-messages-logos-chat Option B pinned v0.1.0, the oldest tag in logos-chatsdk-ui and older than every published release, while Option A installs 0.2.2 from the catalogue — the two options ran different apps, and v0.1.0 predates the address-based flow Step 2 describes.
blockchain/get-started/run-a-logos-blockchain-node-from-cli Added the restart case: against an existing state directory, start returns METHOD_FAILED/RPC_FAILED while the node actually comes up and syncs (reproduced twice). The existing troubleshooting entry blames an unreachable daemon or unloaded module, neither of which applies. Also noted /cryptarchia/info returning 408 under sync load while /network/info answers.
lez/transfer-tokens/transfer-native-tokens-… wallet account new public prints the account ID and its public key, not the ID alone.
lez/programs/write-and-deploy-lez-program-with-scaffold The localnet is fixed to port 3040 and the doc never says so. Worse, [localnet].port in scaffold.toml looks like a workaround but isn't: scaffold writes it into sequencer_config.json and polls it, while the sequencer binary still binds its --port default of 3040 and wallet_config.json keeps pointing at 3040 — so deploy and wallet topup silently talk to whatever else is on 3040 and report success. Added a warning telling readers to free the port instead.
storage/…/run-logos-storage-node, …/run-mix-network-of-storage-nodes The lgpm list sample output printed (v) in the VERSION column of a block shown as literal terminal output; the real output prints 2.1.2, the very version the step above pins.
peer-discovery/…/build-logos-core-module-that-uses-service-discovery-api Seven defects; five of them block a reader outright. The vendor step promises to copy the C-binding header and shared library into ./lib, but find /nix/store -name libp2p.so -path '*cbind*' matches nothing — the derivation ships liblibp2p.so, so the library was silently skipped (find exits 0 either way). The build line targets example_service_discovery, which does not exist: cmake fails with No rule to make target; the real target is tutorial_9_service_discovery, and it lands in build/tutorial/, not build/examples/. And the expected-output block described an older program entirely — demo-service, 16Uiu2HAk… peer IDs, "matched the advertiser", "Signed XPR is 288 bytes", "Done". The tutorial's own C++ then fails to compile — it calls discoStartAdvertising(serviceId, serviceData) while the generated API takes three arguments (upstream passes ""), and the inline comment "requires BOTH" reinforced the wrong arity. Step 3 builds with .#install, which emits a linux-amd64-dev variant that the released logoscore from this doc's own prerequisites refuses (MODULE_LOAD_FAILED); .#install-portable is the loadable one. Finally the Step 5 result shows "data":"version=1" where the field is actually base64 (dmVyc2lvbj0x). All corrected against a real build, and the full three-node DHT discovery now runs: the discoverer finds the advertiser on port 9001 knowing only the bootstrap node.
lez/transfer-tokens/create-and-transfer-custom-tokens-… Step 2 never says how a recipient becomes a token holder. wallet token send to a fresh public account is silently discarded — hash printed, Transaction is None, sender unchanged, recipient still Uninitialized. Verified the alternatives: auth-transfer init hands the account to the wrong program and the send still fails, and token mint to a fresh account is discarded too, while minting to the --supply-account-id holder works (1337 → 1837). Added a warning explaining that a public holding account only ever comes from token creation.
blockchain/node-app/build-and-run-logos-blockchain-node-app-ui The curl /cryptarchia/info sample showed the flat mode object — that is the logoscore call shape; the HTTP endpoint nests under cryptarchia_info with state plus a top-level phase. Also, the release notes contain no "testnet bootstrap peers" string to search for; the peers sit under Initialize Your Node.
core/…/wrap-a-c-library-as-a-logos-core-module The lm metadata expected-output block was missing the Display name and Protocol lines the tool actually prints.
lez/get-started/run-lez-wallet-via-cli Added the libpcsclite-dev / pcsc-lite-devel prerequisite (the wallet pulls pcsc-sys, whose build script fails without it) and generalised the poller note: init, pinata claim and send all print Error: All pollers failed and exit non-zero on transactions that settle fine.

Plus three small corrections: wallet account new private-accounts-key prints the key node's path (e.g. /1), not a chain_index as the private-transfer page claimed; the Basecamp node page labelled its peer example "release 0.2.2" while Step 1 installs 0.2.3 (the addresses are identical in both releases' notes), and a missing space before a code span rendered as overrideflake.nix in the peer-discovery tutorial.

Earlier commits on this branch (module versions and root hashes, logoscore config key paths, absolute data-dir, Basecamp Module Inspector wording, module-info, LGX variant guidance) were re-verified against live systems this pass rather than taken on trust.

Software issues for the owning teams — not doc bugs

  1. LEZ wallet exits non-zero on transactions that succeed. auth-transfer send prints the hash then Error: All pollers failed (exit 1), while the transfer settles — verified 113→106 / 37→44 with the tx on chain. Any script checking exit status sees a good transfer as failed.
  2. blockchain_module start reports failure on a node that starts fine (see the doc row above). The documented happy path reads as a hard failure on any restart.
  3. /cryptarchia/info returns HTTP 408 under sync load while /network/info returns 200 — this is the endpoint the tutorial tells operators to poll.
  4. lgpm 0.2.1 rejects packages from the tutorial-v1 builder.#lgx emits a manifest with no hashes block: Package validation failed: Missing content hashes in manifest. Reproduced; the doc's preferred packaging path is unusable with the tools its own prerequisites install, and the nix bundle workaround is documented in the meantime.
  5. rzup install r0vm fails behind a TLS-inspecting proxy with InvalidCertificate(UnknownIssuer) against api.github.com, where curl/git to the same host succeed.
  6. logos-scaffold 0.3.0 only partly honours [localnet].port, causing silent cross-talk. With port = 3055 set, localnet start still failed against the process on 3040; starting the sequencer by hand on 3055 left its log completely empty while deploy (5/5 "submitted") and wallet topup both reported success — they had gone to an unrelated sequencer on 3040. On any shared machine a developer's deploys and faucet claims are submitted to someone else's sequencer and reported as successful.

Correction to an earlier claim on this PR: the blockchain faucet backend is not auth-gated. POST /web/faucet-backend/<key> returns 202 {"status":"queued"} today, exactly as documented.

Not covered

Run on a shared host with ~1-3 GB of free RAM, which bounds a few things. The risc0 proving path (private/shielded LEZ transfers, the AMM trade) OOMs — the public paths are all verified. The full swap trade needs real Sepolia ETH from a browser PoW faucet. Docker-based flows (the LEZ indexer's local stack) cannot run: no CAP_SYS_ADMIN. Anything needing a fully-synced Online blockchain node (the faucet balance check, joining Blend as a core node) needs ~1h of sync that restarts lose.

Where a GUI step could not be driven I have said so rather than implied coverage: the C++ UI module builds and launches, but clicking Add in its view was not exercised (nix run OOM-killed); the delivery API module builds, but its two-instance messaging run was not; and the chat and mixnet docs' two-instance message exchanges were not.

Thirty of the seventy pages are prose-only — verified by scan to contain no shell blocks and no command lines — so the repo-wide checks above are the meaningful verification for them.

weboko and others added 6 commits August 20, 2026 17:36
Verified against Basecamp 0.2.3 and the ETH<->LEZ swap app 0.4.4 on Linux.

- install: the released AppImage is named LogosBasecamp-Desktop-<version>-<commit>-<arch>,
  so the literal launch command in the doc matched no file; use the downloaded name.
  Mounting the .dmg is a separate step from dragging the app.
- install-and-load-a-module: there is no Modules view. The sidebar is Applications,
  Package Manager and Settings; module status/CPU/memory and Load/Unload live in
  Settings > Module Inspector. The local-package button is Install Local Package, and
  installs go through an Install Package? confirmation listing dependency changes.
- swap: the app is 0.4.4 and has six tabs (Market, Swap, History, Sell, Refund, Setup).
  There is no Config tab, so Step 3 is rewritten as a check against the Market detail
  pane. Setup has four cards with different button labels, the LEZ HTLC program ID was
  stale, the Market column is SELLER, and the toolbar button is Manage Repositories.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…tools

Ran all four build-modules tutorials end to end on Linux.

- start-a-logos-module-from-the-cli: 'cp -RL ./logos/modules/.' fails because nothing
  creates ./logos in the prebuilt-binary flow (that step belongs to the Nix flow in the
  delivery-node doc). Dropped it. 'nix build .#lgx' also produces a -dev variant the
  released lgpm rejects, so the doc now builds .#lgx-portable. Prose said module_info;
  the command is module-info.
- wrap-a-c-library: the 0.2.0 #with-external-lib template scaffolds external_lib_impl.*,
  not external_lib_interface.h/_plugin.*, so the rm removed nothing. The info box saying
  the template scaffolds a hand-written Qt plugin no longer holds.
- build-a-logos-cpp-ui-module: same problem, the 0.2.0 #ui-qml-backend template scaffolds
  ui_example_backend.{h,cpp}.
- build-and-run-a-logos-core-module: the lm methods sample showed doSomething, but the
  template exposes greet and getStatus. lgpd registry names are the internal names
  (chat_module), and downloads are written as <name>-<version>.lgx. On Linux the Basecamp
  data directory is ~/.local/share/Logos/LogosBasecamp, not ~/.config. Added a warning
  that .#lgx/.#lgx-portable at the tutorial-v1 pin emit a manifest without content hashes
  that lgpm 0.2.1 refuses, with the nix bundle workaround.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
… command

Run against the live LEZ testnet with the wallet CLI.

- run-lez-wallet-via-cli: the pinned v0.2.1 builds a wallet whose program IDs no longer
  match the testnet, so "wallet check-health" panics with "Local ID for authenticated
  transfer program is different from remote". v0.2.4 returns the documented
  "All looks good!". The transfer step also silently did nothing: sending to a recipient
  that was never initialised is dropped by the sequencer (chain-info reports
  "Transaction is None"), so the recipient now gets its own auth-transfer init step.
  After that the doc's exact numbers appear (113 / 37). Also documented the first-run
  password prompt and recovery phrase, and the spurious "All pollers failed".
- transfer-native-tokens / create-and-transfer-custom-tokens: nine code blocks were
  wrapped in stray quadruple backticks, so the published pages rendered a literal fence
  marker inside the block and lost highlighting and the copy button. Also corrected the
  claim that a transfer initialises an uninitialised recipient - reproduced twice that it
  does not, and that it fails silently.
- trade-tokens-on-lez-amm-program: "wallet config set sequencer_addr" returns
  "Error: Unknown field" because the address lives inside a sequencers array;
  "wallet change-network testnet" is the working equivalent.
- write-and-deploy-lez-program-with-scaffold: the whole documented flow completed with no
  container runtime, so Docker/Podman is not an unconditional prerequisite.
- set-up-shared-private-lez-account: a wallet holds one sealing key and cannot reprint
  its public key, so tell the reader to save it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…dshake

- run-logos-node-blockchain-storage-delivery: the storage download pinned 2.1.2 against
  2.1.0's root hash, so "lgpd download" fails outright; corrected to 2.1.2's hash, which
  downloads cleanly. The install and verification lines still said 2.1.0. The storage
  config also used a relative data-dir, which run-logos-storage-node.md explicitly warns
  against - reproduced with this doc's own layout: the module writes to
  <base>/storage-data while the directory the doc creates stays empty.
- run-a-logos-blockchain-node-from-cli: the headless faucet call returns 403 and an OAuth2
  sign-in page, so it cannot be scripted as written. Also aligned the release label with
  the 0.2.2 peers the doc lists, noted the extra arrays in /network/info, and softened the
  one-hour bootstrap claim (a real run sat in ProlongedBootstrapPeriod far longer).
- send-1-1-messages-logos-chat: the shipped chat_ui 0.2.2 has no intro-bundle handshake.
  Rewrote Step 2 for the address-based flow (copy your hex address, New chat > Direct
  message, paste, Create), verified by exchanging messages between two instances. Package
  names in the catalogue are Chat Module and Chat.
- run-logos-storage-node / set-up-and-use-logos-storage-ui: logoscore prints JSON when
  piped, so the sample outputs were replaced; the Storage category lists one package whose
  core module comes in as a dependency.
- run-logos-delivery-node: added the --config-dir workaround for running a second daemon
  alongside another guide's.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Contradictions and regressions the previous commits left behind:

- swap: Step 2 still promised a Config tab that Step 3 says 0.4.4 removed;
  retitle Step 3 (it no longer confirms configuration) and document the red
  "Fix validation errors before fetching balances" banner a reader hits there.
- core module: registry install example still said chat_module.lgx one line
  after establishing the name is <name>-<version>.lgx.
- storage node: logoscore prints the table when attached to a terminal and
  JSON only when piped, so the JSON-only samples showed a reader following
  along something they will not see. Restored the table with the real
  versions, kept a line about the piped behaviour.
- chat: the intro and What to expect still described the intro-bundle
  handshake the Step 2 rewrite removed, and both screenshots showed the old
  UI ("Generate Intro Bundle", "+ new", logos-chat-ui checkboxes). Replaced
  with the shipped 0.2.3 UI, and reordered Steps 2-3 so no step depends on
  the next one.
- custom tokens: `wallet token new --supply-account-id` was offered as a
  workaround for the silent-drop bug, but it only claims the supply account
  at creation time and cannot fund a second holder. Say what actually works.
- Drop the now-unreferenced modules-icon.png; fix Step 2's heading level.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@kashepavadan

Copy link
Copy Markdown
Contributor

@weboko Thanks for this! Any way we can get a check like this to run once in a while, like once a month or something?

claude and others added 21 commits September 1, 2026 01:29
…-2026-08

# Conflicts:
#	docs/basecamp/swap-eth-and-lez-tokens-in-logos-basecamp.md
#	docs/blockchain/get-started/run-a-logos-blockchain-node-from-cli.md
#	docs/lez/transfer-tokens/create-and-transfer-custom-tokens-on-the-logos-execution-zone.md
#	docs/run-a-node/get-started/run-logos-node-blockchain-storage-delivery.md
…logue, offer pane and disabled-accept reason

Checked against Basecamp 0.2.3 with swap/swap_ui 0.4.6:

- the Package Manager toolbar button is Manage Repositories, not Repositories
- installing a package opens Install Package?, not an Add Application window
  listing Required Packages; that wording predates the current dialogue
- the offer detail pane has no Hashlock row. The hashlock derives from the
  preimage the buyer's own app invents on accept, so it cannot exist before
  the offer is taken, and the receipt is where it first appears
- the disabled Accept button explains itself above the button, and the usual
  reason is an unfunded Ethereum address, which was not among the examples
…public account creation output

- deployment/tui-zone exists only on the tui-zone-tutorial branch, so the
  documented `cd logos-blockchain/deployment/tui-zone` immediately after a
  clone fails with No such file or directory. Check out the branch first.
  The demo link pointed at tree/master/deployment/tui-zone, which 404s, and
  the claim that master carries a fuller implementation was not true — master
  has no tui-zone directory at all.
- `wallet account new public` prints the account ID and its public key (pk),
  not the account ID alone.
…ure while running

Reproduced twice: after a daemon restart against an existing state directory,
`logoscore call blockchain_module start` returns METHOD_FAILED/RPC_FAILED while
the node actually comes up, peers with 18-35 nodes and syncs. The existing
troubleshooting entry blames an unreachable daemon or an unloaded module, neither
of which applies, so the tutorial's happy path reads as a hard failure. Also note
that /cryptarchia/info can return 408 under sync load while /network/info answers.
Option A installs Chat 0.2.2 from the Basecamp catalogue while Option B pinned
v0.1.0, the oldest tag in logos-chatsdk-ui and older than every published release.
The two options therefore ran different apps, and v0.1.0 predates the
address-based contact flow that Step 2 now describes.
Both storage guides print `(v)` in the VERSION column of a block presented as
literal terminal output, while `lgpm list` actually prints the version number.
Since the same step pins `--version 2.1.2` immediately above, a reader comparing
their terminal against the doc sees a mismatch. Verified against real output.
logos-scaffold 0.3.0 only partly honours [localnet].port: it writes the value
into sequencer_config.json and polls it for readiness, but sequencer_service
still binds its --port default of 3040, and .scaffold/wallet/wallet_config.json
keeps sequencer_addr at http://127.0.0.1:3040. Verified by setting port = 3055:
localnet start still failed with 'Address already in use' against the process on
3040, and after starting the sequencer by hand on 3055 its log stayed empty
while deploy and wallet topup both reported success against 3040.

That silent cross-talk is the dangerous part, so the warning tells readers to
free 3040 rather than to change the port.
…e token

`wallet token send` to a brand-new public account is discarded by the sequencer
with no error: the hash is printed, chain-info reports `Transaction is None`,
the sender balance is unchanged and the recipient stays Uninitialized.

Verified the alternatives too. `auth-transfer init` gives the account to the
authenticated-transfer program, not the token program, and the send is still
discarded. `token mint` against a fresh account is discarded the same way, while
minting to the supply account created by `token new` succeeds (1337 -> 1837,
included in a block). So a public holding account only ever comes from
--supply-account-id, which Step 2 never said.
…fine the swap hashlock note

build-and-run-logos-blockchain-node-app-ui showed `curl /cryptarchia/info`
returning the flat `mode` object, which is what `logoscore call` returns; the
HTTP endpoint nests under cryptarchia_info and names the field `state`, with a
top-level `phase`. Verified against a running node. Also corrected the release
notes pointer: the notes have no 'testnet bootstrap peers' string to search for,
the peers live under the Initialize Your Node section.

Refined the swap offer-pane note after checking swap-ui/src/qml/OfferBoard.qml at
swap_ui-v0.4.6, as AGENTS.md requires: the Hashlock row does exist but is bound
to `visible: hashlock !== ""`, so it appears only for an offer that already
carries one rather than being absent outright.
`lm metadata` on a module built from the 0.2.0 template also prints a
'Display name' line and a 'Protocol' line, neither of which appeared in the
doc's expected-output block.
… installs

Step 1 has you install Blockchain Module v0.2.3, but the Initial peers example
was still labelled 'for release 0.2.2'. The addresses themselves are correct —
the 0.2.2 and 0.2.3 release notes list an identical peer set — so this only
aligns the label with the version the same procedure installs.
'override`flake.nix` at build time' renders as 'overrideflake.nix'.
`wallet account new private-accounts-key` prints the key node's path (for
example `/1`) followed by npk and vpk; there is no `chain_index` label in the
output for a reader to look for. Also mention the --cci flag, which is the
place a chain index is actually supplied.
The vendor step promises to copy the C-binding header and shared library into
./lib, but `find /nix/store -name libp2p.so -path '*cbind*'` matches nothing:
the cbind derivation ships `liblibp2p.so`. The header lands and the library
does not, silently, so the later `logos_module()` build is missing the library
the step said it vendored. Verified against a real build of the module: the
only .so under the cbind store path is
nim-libp2p-cbind-dev/lib/liblibp2p.so, and the corrected find copies it.
…ed output

Step 3's build line targets `example_service_discovery`, which does not exist:
cmake fails with 'No rule to make target'. The project's targets are
tutorial_0..tutorial_11, so the real one is tutorial_9_service_discovery and the
binary lands in build/tutorial/, not build/examples/.

The expected-output block described an older program entirely — a 'demo-service'
advertisement, 16Uiu2HAk-style peer IDs, 'matched the advertiser', 'Signed XPR is
288 bytes' and a closing 'Done'. The tutorial actually advertises
'demo-chat-service', prints 12D3KooW peer IDs and 'found 1 provider(s)', decodes
the XPR rather than reporting its byte size, and ends with
'=== Tutorial 9 Complete ==='. Replaced it with a real run's output and noted the
libp2p DBG lines that surround it.
The tutorial's own module source does not compile against the current
logos-libp2p-module:

  error: no matching function for call to
    'Libp2pModule::discoStartAdvertising(const std::string&, const std::string&)'

The generated API takes serviceId, serviceData and an advertisement string, and
the upstream example (tutorial_9_service_discovery.cpp) passes "" for the third.
The inline comment claiming it 'requires BOTH serviceId and serviceData'
reinforced the wrong arity, so it is reworded too.
…core can load

The prerequisites install released logoscore 0.2.2, but Step 3 builds both
modules with `nix build .#install`, which emits a -dev variant that release
refuses:

  Warning: module 'libp2p_module' ... installed for variant 'linux-amd64-dev'
  which is not supported on this platform and will not be loadable:
  supported variants [linux-x86_64, linux-amd64].

Step 4's load-module then fails with MODULE_LOAD_FAILED, so the doc could not
work as written. The flake also exposes .#install-portable, which produces
variant linux-amd64; verified that both modules then load and the whole Step 4
lifecycle runs (startDiscovery, getPeerInfo, advertise, discover, stopDiscovery).
This mirrors the .#lgx vs .#lgx-portable trap already documented for the CLI
module tutorial. Also corrected the getPeerInfo sample peer ID, which used a
16Uiu2 prefix while the module emits 12D3KooW.
…ctually is

A real three-node run returns `"data":"dmVyc2lvbj0x"`, not `"data":"version=1"`
— the service data is base64-encoded in the discover result. The prose said the
entry 'carries the serviceData (version=1)', which sends a reader looking for a
plaintext value that is not there. Verified: dmVyc2lvbj0x decodes to version=1.
@weboko
weboko requested review from kashepavadan and removed request for kashepavadan September 1, 2026 21:20
@weboko

weboko commented Sep 1, 2026

Copy link
Copy Markdown
Contributor Author

@kashepavadan I put it to be run once a month

@weboko
weboko marked this pull request as ready for review September 1, 2026 21:21
@weboko

weboko commented Sep 1, 2026

Copy link
Copy Markdown
Contributor Author

@kashepavadan @cheny0 can you review? I clarified some items but still would like someone else to take a look as I am not sure in some parts

alternatively, maybe, should I split this PR in couple? pre doc package?

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.

3 participants