Skip to content
Bitcoin Roots

v31.1-roots.1 · Commit 8: [PATCH 08/17] chore(roots): integrate v31 identity and maintenance tooling

doc/roots-v31-port-review.md

Before: doc/roots-v31-port-review.md · After: doc/roots-v31-port-review.md

File metadata
index 778324d7aa8c24174b1626fce8da5d44ee8f97b6..2732a300ad5d2aeabe2a811531685bb69ba0bcbb 100644

Download original patch · Release notes

Diff rows 1–190 of 190. Line numbers refer to the original before/after files.

+ Added− RemovedUnmarked lines are context.

Scroll the code area horizontally to read long lines. Before is on the left; after is on the right. Unified view fits narrow screens more easily.

doc/roots-v31-port-review.md CHANGED
@@ -820,3 +820,190 @@ macOS, BSD and 32-bit execution are not proved by these runs; their conditional
820
  branches are retained from the source/native APIs, with the Windows file-size
821
  comparison expressed through `LARGE_INTEGER::QuadPart`. Whole-L12 acceptance
822
  and broader platform/runtime matrices remain separate gates.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
820
  branches are retained from the source/native APIs, with the Windows file-size
821
  comparison expressed through `LARGE_INTEGER::QuadPart`. Whole-L12 acceptance
822
  and broader platform/runtime matrices remain separate gates.
823
+
824
+ ## L13.1 identity and desktop integration
825
+
826
+ The candidate retains Roots client identity, source/issue URLs and original
827
+ Roots PNG/ICO/ICNS/SVG/splash assets from `c592888088`. The Windows resource path
828
+ correction (`25f889f97e`) uses a configured resource file with absolute build-time
829
+ asset paths. Upstream protocol/legacy file names remain unchanged; this is not
830
+ mass rebranding. Core and Knots lineage remains explicit in the candidate README,
831
+ and binary copyright output retains Bitcoin Core credit alongside Roots.
832
+ Jaromil and devjoinedthechat source credit is retained in the thematic mapping.
833
+
834
+ The release version block from `7791eede50` now checks the selected `31.1` base:
835
+ untagged/default builds identify `v31.1-roots.1`; valid `CLIENT_VERSION_TAG`
836
+ values provide `v31.1-roots.<positive revision>` identity without Git metadata.
837
+ Numeric protocol versions and BIP14 `Satoshi` remain upstream-compatible.
838
+ `roots_build_identity` exercises the actual production CMake block: default,
839
+ two valid tag revisions, and five wrong-base/invalid-tag cases. The six headless
840
+ tools and actual Qt6 GUI identify Bitcoin Roots in captured `--version` output.
841
+ These are local candidate build names, not published release claims.
842
+
843
+ QR export retains the quiet zone, adds font-aware caption layout and updates
844
+ receive QR images on the money-font setting signal. The QString-size correction
845
+ from `3e13c1f213` uses the native Qt5/Qt6 size type. Qt apptests check Roots
846
+ icon/splash resources, PNG round-trip, clipboard export and quiet-zone geometry.
847
+ The wallet fixture drives the actual receive dialog's Save Image action into a
848
+ temporary PNG, compares it to the displayed export image, and checks refresh
849
+ through the production money-font setting. Keys, settings and regtest data are
850
+ disposable; no real wallet or network broadcast is involved.
851
+
852
+ Windows taskbar progress is carried behind `WITH_TASKBAR_PROGRESS`, enabled
853
+ only for Windows GUI builds. It registers/removes the native event filter with
854
+ the window lifetime and clears progress at synchronization completion. Qt5/Qt6
855
+ use their respective native-filter signatures. Linux configurations generate an
856
+ undefined taskbar macro; local tests do not establish Windows COM/event behavior.
857
+ Windows/macOS/32-bit runtime and cross-build evidence remains unavailable.
858
+
859
+ Example configuration is generated by the inherited generator from this exact
860
+ candidate's isolated `bitcoind --help` output and passes byte-identical repeat
861
+ regeneration. The selected profile has wallet enabled and IPC/USDT/ZeroMQ
862
+ disabled; its generated output omits the inherited optional ZeroMQ section.
863
+ This omission describes the tested help profile and does not retire ZeroMQ
864
+ support. No older source help/config content was copied into the generated file.
865
+ After the missing generator was installed externally, all seven manuals were
866
+ regenerated using the existing `contrib/devtools/gen-manpages.py` and GNU
867
+ help2man 1.49.3. Isolated wrappers invoke the unchanged tested headless binaries
868
+ and Qt6 GUI; daemon/wallet/GUI help has an explicit disposable regtest datadir.
869
+ The generator uses `LC_ALL=C` and `SOURCE_DATE_EPOCH=1791755546` (the starting
870
+ candidate commit timestamp). A second generation into a temporary directory
871
+ matches all seven manuals byte for byte. The manuals retain Bitcoin Core
872
+ copyright alongside Roots and contain no local wrapper/datadir paths. No manual
873
+ was hand-edited. Like the example config, they reflect the tested no-ZeroMQ
874
+ profile rather than proving optional-library availability.
875
+
876
+ Exact focused commands, build/binary/source hashes, result counts and the
877
+ receive/export evidence matrix are recorded below as local verification evidence;
878
+ L13.2 maintenance and the full L13 acceptance suite remain separate gates.
879
+
880
+ Focused L13.1 evidence on the uncommitted tree starting at `44c15f2cde`:
881
+
882
+ - `cmake --build <profile> --target bitcoin-qt test_bitcoin-qt -j 2`
883
+ passed for the existing actual Qt5 and Qt6 profiles. The headless profile
884
+ built `bitcoin bitcoind bitcoin-cli bitcoin-tx bitcoin-wallet bitcoin-util`.
885
+ - `python3 test/cmake/test_identity.py -v` passed 3 tests;
886
+ `ctest --test-dir <headless-profile> -R roots_build_identity --output-on-failure`
887
+ passed its one registered test.
888
+ - The actual `test_bitcoin-qt` binary passed 21 result rows, including
889
+ initialization/cleanup, in each of eight Xvfb profiles: Qt5/Qt6 × 1280×800/
890
+ 1920×1080 × 100%/150% application font scale. `QT_SCALE_FACTOR=1` is retained;
891
+ this is font scaling evidence, not physical DPI scaling. Each run has a
892
+ 60-second timeout and isolated XDG settings/runtime data.
893
+ - Each profile records receive controls, the receive QR dialog and the PNG
894
+ save chooser at the full screen dimensions, plus the actual exported QR PNG:
895
+ 24 screenshots and 8 exported images. The save chooser uses Qt's non-native
896
+ dialog for deterministic automated interaction. Screens retain preceding
897
+ test widgets in the background; their synthetic balances are fixture facts.
898
+ Representative Qt5/Qt6 receive views at 1280×800/150%, the Qt6 save chooser,
899
+ and the exported QR at 1920×1080/150% were visually inspected: the affected
900
+ payment text, QR caption and Save/Copy/OK actions were readable.
901
+ - `BITCOIND=<isolated-candidate-help-wrapper> bash contrib/devtools/gen-bitcoin-conf.sh`
902
+ regenerated the example config; a second generation into a temporary file
903
+ compared byte for byte. The wrapper passes an explicit disposable regtest
904
+ datadir. An initial unwrapped help invocation hit the read-only default
905
+ wallet directory and did not produce valid help; only the corrected isolated
906
+ invocation supplies this generated file and current help evidence.
907
+ - `BUILDDIR=<isolated-candidate-help-wrappers> HELP2MAN=/usr/bin/help2man
908
+ QT_QPA_PLATFORM=offscreen XDG_CONFIG_HOME=<isolated-settings>
909
+ SOURCE_DATE_EPOCH=1791755546 LC_ALL=C python3 contrib/devtools/gen-manpages.py`
910
+ generated all seven manuals. Repeat generation with `MANDIR=<temporary-directory>`
911
+ and byte comparison passed 7/7; current version, retained credit and absence
912
+ of local-path leakage were checked in each file. Generated differences are
913
+ candidate version/date/URLs/credit, current Roots help/defaults and omission
914
+ of the unsupported-in-this-profile optional ZeroMQ section.
915
+ - `python3 test/lint/check-doc.py` and `git diff --check` passed.
916
+
917
+ Local `.gestalt/l13-integration` evidence includes exact commands/results,
918
+ `l13.1-snapshot.json` with source/binary SHA256s, and
919
+ `l13.1-gui-snapshot.json` with image SHA256s/dimensions and all eight result
920
+ counts. This focused evidence does not substitute for the later full L13 suite,
921
+ Windows/macOS/32-bit tests or optional ZeroMQ/IPC/USDT profiles. On resumption,
922
+ 31 previous source paths, 22 binaries and all 32 identity images matched their
923
+ recorded hashes; unchanged GUI and focused test evidence was reused.
924
+
925
+ ## L13.2 maintenance, portable export and CI cadence
926
+
927
+ This adaptation retains the source classifier, exact canonical-promotion CI
928
+ proof, conservative nightly change gate, strict APT refresh, release-source/tag
929
+ validation, archive/COPYING checks, portable export/replay, optional notice
930
+ helpers, required manifest signing and new-draft-only tools. The checked-in
931
+ public key and expected fingerprint remain unchanged. Only a permanent tag
932
+ push can enter the signing environment; manual rehearsal has read-only
933
+ permissions, requires an absent future tag and cannot create a release. Signing
934
+ capability, signature/source mismatch and any existing draft/public release
935
+ still fail. No dispatch, publishing, remote ref mutation or signing with a real
936
+ secret was performed locally.
937
+
938
+ The remaining maintenance-only history is folded by responsibility:
939
+
940
+ | Source commits | Candidate disposition |
941
+ | --- | --- |
942
+ | `5c210e17fb`, `9f1780f330`, `4570a6a547` | Adapted CI/platform/assurance entry points and maintained fixtures; retain v31 native cache actions, compiler profiles, build script and test runners. Feature-owned code/tests stay in their earlier themes. |
943
+ | `9da5851410`, `26b691e4f3`, `201927c151`, `e819a07a4a`, `56e2894760` | Adapted additive classification, conservative scheduled-change gate, strict APT retry, optional-feature selection and branded archive checks. Broad platform jobs move to nightly/manual; no optional capability is retired. |
944
+ | `83fa42a963`, `f5182f0e3a`, `7791eede50`, `11c84c39ef`, `0efa437e29`, `f2595557d9`, `38bc7ec2ce`, `df8aa8e2b7`, `ddae467a78`, `778ff50d19`, `c474825f96`, `17e1d484ab` | Kept/adapted final release-source/rehearsal, five-platform archives, COPYING, portable replay, trusted signing/new-draft-only and promotion-proof safeguards. Corrective source history is folded; expanded notices remain optional/deferred. The configured-version sub-aspect is also preserved in L13.1. |
945
+ | `b0b235d6a1`, `f4066e5282`, `30f673a4bc`, `a13f28e2f4`, `1517d925b2`, `628bdf4e38`, `02464df449`, `089888acdd` | Adapted relevant candidate identity, maintained workflow guidance, provenance and credit; existing upstream release notes remain historical. Final aggregate/range evidence stays L14. |
946
+ | `1b73fe3d21`, `ec9db369f5`, `c592888088`, `9b778b9a23` | Remaining CI/build/GUI assertions are carried or adapted to v31 paths and the accepted owning-feature implementations; semantic source content is not reintroduced as a second chronological series. |
947
+
948
+ PR/development execution now uses the existing `ci/test_run_all.sh` and native
949
+ runners with a small affected-regression selector. Complete known paths select
950
+ wallet, network, policy/mining and runtime acceptance groups; mixed changes take
951
+ the union and incomplete/unknown paths choose broad fast coverage. Fast
952
+ functional execution is bounded at 900 seconds; selected libFuzzer smoke uses
953
+ 5 seconds/target and a 15-second outer timeout. The nine possible smoke targets
954
+ have fixed seed 1 and per-input limits; input counts are results, not quotas.
955
+ The standalone selector also exposes a 60-second/target, 75-second outer
956
+ nightly campaign and a 7200-second selected-functional budget.
957
+
958
+ Scheduled/manual assurance retains full ASan/USDT/Qt, TSan/MSan, full Linux,
959
+ macOS and Windows fuzz corpora, extended/previous-release tests, tidy, i686
960
+ no-IPC, ARM32, kernel and native Windows/macOS smokes. Linux full-corpus replay
961
+ also runs the longer selected campaigns. Ordinary PRs have actual Qt tests,
962
+ fast native sanitizers/affected regressions and bounded fuzz smoke; explicit
963
+ labels can still request fresh heavy coverage. Every selected required PR job
964
+ must succeed. Nightly jobs with empty selected matrices are skipped before
965
+ strategy expansion; failed/incomplete schedule history retries. Explicit job
966
+ budgets and failure artifacts are documented in [CI guidance](/ci/README.md).
967
+
968
+ The v31 action/preset adaptations include current cache-action paths, LLVM 22
969
+ profiles, the upstream i686 no-IPC profile and VS2026 static builds. Windows
970
+ GUI jobs explicitly select the optional `miniupnpc` vcpkg feature when requiring
971
+ that library. Wallet-only Windows fuzz manifests explicitly disable ZMQ. The
972
+ vcpkg baseline is unchanged. Actual Windows/macOS/32-bit and hosted CI jobs were
973
+ not executed locally; static command/dependency checks do not establish their
974
+ success. No dependency was installed by this executor.
975
+
976
+ Focused local verification:
977
+
978
+ - Maintained source-tool tests cover classifiers, promotion proof, schedule
979
+ gates, release source/tag/absence checks, archives/COPYING, optional notices,
980
+ signing and new-draft refusal. The maintained suite passed 124 cases;
981
+ after narrowing the mempool-argument selection, its six affected behavioral
982
+ cases passed (125 current cases in aggregate with unchanged remaining tests).
983
+ - New tests execute actual nightly selector and required-result Bash blocks,
984
+ plus affected selection/union/fallback, fast/nightly command budgets, real
985
+ process timeout and retained failure logs. All pass. Parsed workflow YAML,
986
+ dependency references/local actions and embedded Bash syntax validate locally.
987
+ `actionlint` is unavailable; no hosted workflow was dispatched.
988
+ - The actual budget runner executed three wallet scripts successfully, then
989
+ the conservative fallback for the mempool-argument path executed all 16 Roots
990
+ scripts successfully. Its final narrower policy/mining/runtime selection is
991
+ covered by the six behavioral cases and those matching native test passes.
992
+ Tested product binaries and functional fixtures were unchanged.
993
+ - The new fast native ASan/UBSan profile configured on local Clang and built
994
+ `bitcoin_clientversion`; this bounded probe is not a full sanitizer-profile
995
+ pass. Sixteen changed shell scripts passed `bash -n` and ShellCheck.
996
+ - Temporary export verification snapshots the exact uncommitted candidate in
997
+ a disposable local clone, validates against authenticated v31.1 commit
998
+ `9be056a8a72b624dae9623b2f7bded92c2a21c91`, and invokes the actual
999
+ `create-patch-series.sh`. Its internal `git am -3 --keep-cr` replay matches
1000
+ the snapshot outside `.github/**`; Core's `.github/**` tree is unchanged.
1001
+ Exported content retains Jaromil/devjoinedthechat credit. Synthetic snapshot
1002
+ commits/refs/tags exist only in the disposable fixture; candidate/source refs,
1003
+ index and history remain unchanged.
1004
+
1005
+ Exact commands, pass counts, intended cumulative/delta paths and current source,
1006
+ binary/tool-test/export hashes are local evidence under
1007
+ `.gestalt/l13-integration`. L13.1 GUI/capture/manual evidence remains unchanged
1008
+ and is reused. Full L13 acceptance and the final candidate/hosted matrix remain
1009
+ later gates, rather than being inferred from these focused checks.