# Changelog All notable changes to Triangles (TRI) are documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [6.2.5] - 2026-08-03 ### Fixed - **Stake-age soft cap reverted** in `src/kernel.cpp::GetWeight`. The V5-fork 7-day soft cap (activated 2026-04-12) was the regression that capped long-dormant coins at 7 days of weight, killing the diamond-hands incentive. Restored to original Peercoin `min(nAge, nStakeMaxAge)`. Chain was frozen at block 2,224,763 since 2026-07-18 with no blocks ever produced under the soft cap, so reverting changes zero historical block validation results. - **`ReadUtxo` lazy fallback** in `src/txdb-base.cpp`. The fallback to `txindex.vSpent[]` exists in `HaveUtxo` but was missing in `ReadUtxo`, so nodes with incomplete UTXO snapshots could not find pre-snapshot unspent outputs (chain stalled at 2,224,763 since 2026-07-18). Added: when UTXO DB misses an entry but `txindex.vSpent[n].IsNull()`, read the transaction from disk and reconstruct the full CUtxoEntry including exact block height via `mapBlockIndex` lookup. - **`DisconnectBlock` height reconstruction** in `src/main.cpp`. Reorg path now recovers exact block height via `mapBlockIndex` instead of leaving `nHeight = 0` on restored UTXOs. ## [6.2.4] - 2026-08-02 ### Changed - **RocksDB bumped 8.9.1 → 10.10.1** in CI (`scripts/ci/build-rocksdb.sh`). Required to read the Hetzner Dropbox bootstrap snapshot's chain DB, whose SST files are at format_version=7. RocksDB 10.10.1 still uses `format_version=6` as its own default; the daemon does NOT pin a different value, so newly written SSTs continue to land at v6. This is deliberate: mixed v6/v7 SST files in the same DB are supported by RocksDB, and v7 writes from this build would close the door on downgrade to 6.2.3 (or any RocksDB < 10.4.0) without fixing anything. ### Fixed - **`scripts/ci/build-rocksdb.sh`** now strips `-std=c++XX` (regex covers `-std=c++17` / `-std=c++20` / `-std=c++2b` / future values) from `rocksdb.pc` Cflags instead of only the `-std=c++17` value. RocksDB 10.x writes `-std=c++20`, which `pkg-config` injects into every Triangles translation unit. C++ translation units ignore the redundant flag, but C units (e.g. `src/lz4/lz4.c`) hit a fatal `error: invalid argument '-std=c++XX' not allowed with 'C'` from clang. Previously, the daemon build tolerated this as a warning; the fuzz build (`clang-15` + sanitizers) treated it as a hard error and the `test-fuzz-smoke` / `test-fuzz-smoke-tx` jobs failed in the 6.2.4 CI run #30744702062 at the `Build fuzz_script` / `Build transaction_deserialize_fuzz` step. ### Notes for operators upgrading from 6.2.3 - The daemon's runtime dependency is `librocksdb.so.10.10.1` (replacing the previous `librocksdb.so.8.9.1`). Install or build rocksdb from source before rolling 6.2.4 onto a node; the .deb from CI bundles the right SONAME and should just work on Ubuntu 22.04 / 24.04. - If you imported the Hetzner Dropbox bootstrap snapshot's chain DB into this node, that DB still contains v7 SSTs. Any daemon down to RocksDB 10.4.0 will read it; RocksDB ≤ 10.3.x will reject the v7 SSTs with `Corrupt or unsupported format_version: 7`. After the daemon compacts the imported chain DB, the v7 SSTs may be re-written at v6 and the DB becomes readable by older rocksdb again — that happens naturally as part of normal compaction, no extra action required. - Package checksums in `packaging/flatpak`, `packaging/scoop`, and `packaging/winget` are regenerated during the CI release workflow after artifacts are produced; do not ship those package manifests until their SHA-256 sums match the v6.2.4 release artifacts. ## [6.2.3] - 2026-08-01 ### Changed - **Local snapshot loading no longer requires a compiled-in SHA match.** Previously, loading `utxo-snapshot.bin` from the data dir rejected the file unless its SHA256 was present in `Checkpoints::mapSnapshotHashes` (which only knows about one or two canonical tips at compile time). Local file loads are operator-trusted — the operator already has filesystem access — so the SHA gate was friction without a security benefit. The gate still exists for P2P-delivered snapshots via `SnapshotNet` (requireCheckpoint=true there). ### Added - `-acceptanylocalsnapshot` CLI flag: forces acceptance of a local `utxo-snapshot.bin` whose SHA is not in the compiled map, with an explicit warning log line. Use only with operator-signed snapshots. ## [6.2.2] - 2026-08-01 ### Fixed - **Snapshot regeneration: full chain index, not just the last 2000.** `UTXO_SNAPSHOT_DEFAULT_HEADERS` was 2000, which silently trimmed the snapshot to the last 2000 blocks even though the v2+ format is designed to carry the full chain index. The too-small snapshot caused `GetKernelStakeModifier() : block not indexed` errors after a fresh node loaded it — the kernel-stake-modifier walk in `CreateCoinStake` needs blocks older than the last 2000 because `nStakeModifierSelectionInterval` is multi-day. The block index was effectively unusable for the StakeMiner on the recovered node. Default is now 0 (all headers); the trim is bypassed when `nHeaders=0`. Callers may still pass an explicit positive value for a small diagnostic snapshot. ### Fixed - **Build portability: v6.1.9 binary crashed with SIGILL on every production node.** v6.1.9 was built on GitHub Actions' EPYC 7763 runner (AVX-512 capable). GCC 11.4 + libstdc++ inlining emitted 741 `vpbroadcastq` EVEX instructions into the daemon binary even though the cmake `AddCompilerFlags.cmake` was setting `-march=x86-64-v2 -mtune=generic`. The resulting binary crashed on every production CPU that lacks AVX-512: KVM-virtualized EPYC (DNS2), Ryzen 5 3600 (SAMI-PC), and any non-x86_64 node. v6.2.0 adds an explicit `-mno-avx512f -mno-avx512*` block to the global compile options so the build cannot leak AVX-512 regardless of what the build host supports. Carries forward the v6.1.9 staking-selfheal fix unchanged. See `references/avx-512-sigill-build-fix.md` for the full diagnosis. ### Changed - Bump version 6.1.9 → 6.2.0 to reflect the build-system change. ## [6.1.9] - 2026-07-31 ### Fixed - **Staking deadlock on idle networks.** `IsStakingSafe()` refused to stake whenever `IsInitialBlockDownload()` was true, and `IBD` flipped true whenever the chain tip was older than 24h. After 24h of no blocks, every node simultaneously refused to stake and the chain deadlocked. The `staking: true` flag in `getstakinginfo` was misleading — it only reflected a single search in the brief window after a restart. Narrowed the gate to "refuse only when IBD is true AND local height is behind the peer/checkpoint estimate" (`f69f087`). A node at the peer median now clears the gate and keeps staking through idle periods, so the chain self-heals. Genuinely-behind nodes still hold off. Block validation, reorg rules, and checkpoint rules are unchanged. The `-forcestaking` bootstrap escape hatch still works on nodes caught up to the checkpoint. ### Changed - CLI: `-conf=` (empty value) now falls back to the default config path instead of erroring out (`41e3898`). - CLI: `-conf` / `-datadir` / `-rpcuser` / `-rpcpassword` are honored in the documented order, with clearer error messages on bad input (`64556dc`). - Build: reproducible build + signed release pipeline (PR #26 chain). ## [6.1.8] - 2026-07-17 ### Changed - Bootstrap: RPC-driven trusted snapshot publisher rotation (PR #26). Operators can rotate the snapshot publisher via RPC instead of hard-coding it in the binary. - Consensus: removed local-finality, fixed `getheaders` fork recovery (`935d1d5`). - Consensus: fail-closed reorg guard when the startup checkpoint pointer is null (`6116cff`). - IBD: allow `getblocks`/`getheaders` on OneShot peers during IBD (`c68a8cb`). - Build: bump revision 7 → 8. ### ⚠️ Known issue - v6.1.8 introduced a staking deadlock on idle networks via the `IsStakingSafe()` gate. Operators on v6.1.8 should set `staking=1` and `forcestaking=1` in `triangles.conf` and restart to unstick the chain. v6.1.9 fixes the root cause. ## [6.1.7] - 2026-07-08 ### Changed - Overview page UI: the Total balance label is now rendered with `font-weight: 900` (full bold) instead of Qt's default bold (75, medium-bold). On builds where the font has a true heavy variant, the Total now visually pops as the headline number against the Spendable / Stake / Unconfirmed rows. - Transactions amount column **Confirming tier color** is now `#4A8C5E` (mid green) instead of `#C5EBC9` (pale mint). The pale mint was too close to the bright `#7CDB8A` Confirmed green on the dark background and read as the same color. Mid green sits clearly between grey (Unconfirmed) and bright green (Confirmed) so the three tiers are visually distinct. - Transactions amount column **now reads confirmation depth directly** (new `DepthRole` on `TransactionTableModel`) instead of going through the `TransactionStatus` enum. The rule fires on every block increment, not just on enum state transitions. Affects both `transactiontablemodel.cpp` (Transactions tab) and `overviewpage.cpp` (Overview recent-5 list). ## [6.1.6] - 2026-07-08 ### Changed - Overview page UI: conditional color on the **Total** balance label. Renders money-green (`#7CDB8A`) when the total is greater than zero and brand-red (`#e32105`) when the wallet is empty. Previously a static green stylesheet rule failed to cascade on some Qt builds, leaving Total always red. - Transactions list (and Overview recent-5 list) **amount column** now uses a 3-tier color rule keyed off the existing `TransactionStatus` state machine, so the amount color agrees with the status icon: - 0 confirms (`Unconfirmed`) → grey (`#61280E`) - 1–3 confirms (`Confirming`) → pale mint (`#C5EBC9`) - 4+ confirms (`Confirmed`) → money-green (`#7CDB8A`) - Conflicted → grey - Negative amounts (spent) stay red across all tiers. - Internal: added `COLOR_CONFIRMING` constant in `guiconstants.h`; rewired both amount paint sites (`overviewpage.cpp::TxViewDelegate::paint` and `transactiontablemodel.cpp::ForegroundRole`) to share the rule. ### Fixed - `overviewpage.cpp` now includes `transactionrecord.h` so the `TransactionStatus::Confirming` enum value is in scope (was previously only forward-declared via `transactiontablemodel.h`). ## [6.1.5] - 2026-07-08 ### Added - New `tweet@sami-ahmed.net` uid on the maintainer signing key, with `hello@sami-ahmed.net` verified on the GitHub account — release tags now show as "Verified" on github.com. - `CHANGELOG.md` at the repo root (this file). ### Changed - Overview page UI: pending (`labelUnconfirmed`) and immature (`labelImmature`) balance labels now render in **olive green** (`#A8B847`) instead of the same light green as confirmed balances. The distinction reads as "incoming but not yet confirmed" instead of "incoming and final". - `doc/release-process.md`: corrected signing-key identity to match the actual key in use (RSA-4096 `Krystie Triangles Release `, not the Ed25519 `sami@cryptographic-triangles.org` the doc previously claimed). ### Fixed - Wallet close-hang on Windows: detached `std::thread` instances backing the embedded Tor and I2P controllers now join cleanly on shutdown, removing the ~30s exit delay. (`#20`) - Consensus: live proof-of-stake checks run during stale-tip IBD instead of being suppressed, fixing a divergence path where a node could accept a stale chain tip while local PoS validity checks were off. (`#18`) - CI: `simd.c:265` UBSan build-id drift resolved; reproducible-build warnings now ignore untracked files. (`#17`) ### Security - Audit follow-ups merged: kernel coverage, keystore coverage, sigcache fixes, wallet-DB test fixes. (`#14`, `#15`) ## [6.1.4] - 2026-07-04 ### Fixed - CI: Tor bundle download resilience. - `NeedsBootstrap` flag now correctly persists across `rocksdb/` restarts. ## [6.1.3] - 2026-07-01 ### Changed - Chain-DB migration hardening. - BIP39 passphrase support. - HD-wallet indicator in the UI. - Test isolation improvements. ## [6.1.2] - 2026-06-30 [YANKED] Hotfix for v3 snapshot seek-offset corruption. Superseded by 6.1.3. Do not use. ## [6.1.1] - 2026-06-22 ### Fixed - Minor wallet bugs. ## [6.1.0] - 2026-06-15 ### Added - Initial 6.x release line. C++20 modernization, embedded Tor/I2P support. [6.1.7]: https://github.com/SamiAhmed7777/triangles_v5/compare/v6.1.6...v6.1.7 [6.1.6]: https://github.com/SamiAhmed7777/triangles_v5/compare/v6.1.5...v6.1.6 [6.1.5]: https://github.com/SamiAhmed7777/triangles_v5/compare/v6.1.4...v6.1.5 [6.1.4]: https://github.com/SamiAhmed7777/triangles_v5/compare/v6.1.3...v6.1.4 [6.1.3]: https://github.com/SamiAhmed7777/triangles_v5/compare/v6.1.2...v6.1.3 [6.1.2]: https://github.com/SamiAhmed7777/triangles_v5/compare/v6.1.1...v6.1.2 [6.1.1]: https://github.com/SamiAhmed7777/triangles_v5/compare/v6.1.0...v6.1.1 [6.1.0]: https://github.com/SamiAhmed7777/triangles_v5/releases/tag/v6.1.0