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.
|