Repository navigation
release: prep v26.10.2 — a unified title bar, docs.aethersdr.com and remote operation over CGNAT - #6389
Conversation
…remote operation over CGNAT. Principle VIII. Six release files: version spots in CMakeLists.txt, README.md, AGENTS.md and ROADMAP.md; the metainfo release entry; and the [v26.10.2] CHANGELOG section written from the 106 PR bodies in v26.10.1..46943eb. README and ROADMAP content refreshed for what landed this cycle. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
tools/docs/snapshot_stable.py 26.10.2: docs/user/docs/ becomes the Stable snapshot (97 pages), its sidebar and version label follow, and Log Analyzer rule links to pages in the snapshot point at Stable instead of /next/. Checked with `npm ci && npm run build` in docs/user and `node tools/docs/test_log_rules.mjs` (707 checks, 45 rules). Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
ten9876
left a comment
There was a problem hiding this comment.
Reviewed exact head d267d2dd90e61bb440f4dd1041c03219f804a498. Recommendation: Approve with nits, subject to the usual CODEOWNERS review. No closing issue is linked; this is the stated v26.10.2 release prep, and its version/date, roadmap choices and accepted #6350 TSan exception are explicitly disclosed as maintainer decisions. The metadata, release accounting and generated snapshot satisfy that intent. No new runtime implementation is introduced.
| File/group | Change claimed in body? | Verdict |
|---|---|---|
| CMakeLists.txt, AGENTS.md, metainfo XML | Yes: version/date | In scope; 26.10.2 and 2026-10-11 agree |
| CHANGELOG.md | Yes: new release notes | In scope; complete range/citations and preserved history |
| README.md | Yes: highlights/hardware/roadmap refresh | In scope; experimental/hardware-validation qualifiers retained |
| ROADMAP.md | Yes: cycle, shipped work, RFC tracking | In scope; direction choices disclosed |
| Stable docs, sidebar and label | Yes: generated snapshot | In scope; exact current-docs copy, no manual snapshot edits detected |
| Log Analyzer rules.json | Yes: Stable link migration | In scope; exactly four /next -> Stable URL rewrites |
The metadata-only checklist holds: no source/test/CI/dependency/default/protocol changes, no authored-date outlier, and CHANGELOG is appropriate for this release-prep PR.
Blockers
None found. The known TSan red is a disclosed, accepted release decision, not an undisclosed test regression introduced here.
Non-blocking nits
-
Describe the sanitizer success historically —
CHANGELOG.md:13,:15. The headline says “green sanitizer lanes” and the intro says “both weekly sanitizer lanes run clean,” but the PR correctly states thatctr2_hid_thread_port_teststill fails TSan (#6350). The latest weekly run 38061328568 has ASan success and TSan failure; its log includes six race SUMMARY reports and99% tests passed, 1 tests failed out of 694. The historical “ran green for the first time” atCHANGELOG.md:116is supported. Preserve the accepted release decision, but make the public headline/intro equally precise. Replace the sentence beginning “Underneath” with:Underneath, both weekly sanitizer lanes achieved their first clean runs this cycle, but `ctr2_hid_thread_port_test` remains failing under TSan (#6350). Windows builds are Authenticode-signed, and every release keeps its debug symbols.
Change the headline's “green sanitizer lanes” to “first green sanitizer runs.”
-
Expand the stale-screenshot disclosure —
docs/user/versioned_docs/version-stable/panadapter-controls.md:9,:35. The embeddedpanadapter.pngstill shows the old opaque gradient strip while the text describes the transparent header. #6386 already disclosed stale main-window/panadapter shots, but this prep's list names only four shots from the dialog PRs. Add those two to the release-prep body's stale-shot list, or recapture in the current docs workflow and regenerate the snapshot. This is inherited screenshot drift, not a faulty snapshot generator.
What was verified
- Independently mapped
v26.10.1(8df6db2f7) through cutoff46943eb3cusing the commit-to-PR API: 106 commits -> 106 merged PRs, no direct/unresolved/excluded commits, 15 human contributors, two AetherClaude changes, zero Dependabot updates. Every PR is cited; all 16 contributor entries/counts match; pre-tag merged-PR history identifies only@dacacioaas first-time. The eight extra citations are seven RFCs and open issue #6238. - All six version spots and dates agree; AppStream validates; [Unreleased] stays empty; the prior CHANGELOG content is byte-identical. The mapped release validator reproduces 30 checks, one FAIL and one WARN: the FAIL is solely the generated Stable current-version label, and the WARN is solely the disclosed snapshot scope. The validator's historical-string rule predates that legitimate label; neither establishes a release defect. Running the same mapped validator on the six-file commit produced 29 checks, zero FAIL and zero WARN; the exact head was restored afterwards.
- All 97 Stable files exactly match source docs, evaluated sidebar/versions match generator output, and the rule migration reproduces byte-for-byte. Log Analyzer: 707 checks / 45 rules pass on head and base; moved-line notices are identical and preexisting. Retaining the old snapshot while moving links to Stable fails four anchor checks, so the check detects the broken combination.
npm cisucceeded and the production docs build passed, validating Stable/Next links and anchors. The first build hit temporary-files quota; retry passed after freeing completed review artifacts. Generated references and diff whitespace checks passed. The 119-shot/63-illustrated-pages statement matches the manifest and page embeddings. Sampled feature claims were checked against cited PRs/source, including canon shortcuts, MTU limits and backend maturity/validation qualifications.- No application/bridge session, hardware or socket test was run: only release metadata and generated documentation changed. This review verifies release accounting and docs transformations, not fresh runtime or hardware certification of all 106 shipped changes. A model-invocable code-review skill was unavailable; manual and three independent audits were used.
Current main remains cutoff 46943eb3c (2026-10-11T20:56:06Z), so no post-cutoff fold-in is currently missing. PR head CI was created after it (21:18:45Z, pull_request workflows at 21:18:46Z); no stale-merge qualification currently applies, although protection has strict:false. All four required checks (Linux build, Windows, macOS and Static checks), plus Docs, are now green. Head signing is GitHub-verified. Formal approval, merge, and the subsequent main-commit tag remain the operator's decision; nothing was merged or tagged by this review.
…itizer runs, and the ALC figure at 21.4 dB. Principle VIII. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
|
Both nits from the review at
Proof: |
There was a problem hiding this comment.
Issue fit
No linked issue, and none is wanted: this is release prep, which AGENTS.md names as the one legitimate reason to touch CHANGELOG.md. Reviewed against AGENTS.md → "Version and release files", and all five required touchpoints plus the ROADMAP.md heading agree on 26.10.2:
| row | file | state |
|---|---|---|
| 1 | CMakeLists.txt:10 — project(AetherSDR VERSION 26.10.2 …) |
✅ |
| 2 | README.md:13 — Current version: 26.10.2 |
✅ |
| 3 | AGENTS.md:252 — Current version: 26.10.2 |
✅ |
| 4 | CHANGELOG.md:11 — new section under ## [Unreleased] |
✅ |
| 5 | packaging/linux/…metainfo.xml:71 — <release version="26.10.2" date="2026-10-11"/> |
✅ |
| + | ROADMAP.md:10 — Current cycle: post-v26.10.2 |
✅ |
Dates are consistent (CHANGELOG 2026-10-11 = metainfo date="2026-10-11" = today), and the historical-mention rule is respected: all 14 surviving 26.10.1 references in ROADMAP.md are statements about what landed in that release ("v26.10.1 landed M1", "(v26.10.1)"), not stale current-version claims.
Scope
Everything in the diff is explained by the release-prep contract. For the record, the file list in my brief was truncated — the PR is 83 files, not 29, and packaging/linux/io.github.aethersdr.aethersdr.metainfo.xml was missing from the shown diff (it is row 5 of the table above, so it belongs here).
| file / group | change | claimed? | verdict |
|---|---|---|---|
CMakeLists.txt, README.md, AGENTS.md, CHANGELOG.md, metainfo.xml |
the five version touchpoints | yes | ✅ in scope |
ROADMAP.md |
cycle heading, per-family v26.10.2 paragraphs, shipped-RFC pruning, 4 new backlog entries | yes | ✅ in scope |
README.md (feature prose) |
highlights, device list, maturity rows updated to shipped state | yes | ✅ in scope |
docs/user/stable-version.json |
"label": "26.10.2" → feeds docusaurus.config.js:70 |
yes | ✅ in scope |
docs/user/versioned_docs/version-stable/** (76 files) |
Stable snapshot refresh | yes (commit 2) | ✅ byte-identical to docs/user/docs/ (diff -rq → 0 differences) |
docs/user/src/components/LogAnalyzer/rules.json |
4 × "/next/…" → "/…" |
yes | ✅ in scope, and correct — see below |
No files added or deleted (git diff --name-status HEAD~2 HEAD is all M), so versioned_sidebars/version-stable-sidebars.json correctly needs no change. No new public surface, no code changes, nothing removed that guards behaviour.
The rules.json edit is right, and machine-verified
docusaurus.config.js:63 sets lastVersion: 'stable', so Stable is served at / and Next at /next/. Those four rules pointed at pages that only existed on Next last release; the pages are now in the snapshot (e.g. bnr-gpu-noise-removal.md:88 The download fails with "checksum mismatch", gpu-rendering.md:120 AetherSDR runs on XWayland in a Wayland session), so flipping them to / is the correct move.
I resolved all 41 distinct docs: targets in rules.json against the Stable snapshot's slugs and heading anchors: every one exists, and zero /next/ references remain anywhere in docs/user/src or docs/user/versioned_docs. This is independently gated — tools/docs/test_log_rules.mjs check 5 validates /<page> against the Stable snapshot specifically, and it is green in the passing Build docs site job.
Security audit
Required by the harness; run via the security-audit subagent over both flagged files. All six CodeGuard findings are lexical false positives, and none sits on a line this PR changes — CodeGuard scanned hunk context, so pre-existing strings surfaced next to the four docs: edits.
rules.json:88-89(CS-PII-DL-1 drivers_license, CS-VLN-SSRF-HEX) —"The radio refused the connection (for example F3000001)"/"Code 0xf3000001 usually means…". That is the FlexRadio GUI-client registration refusal code in prose. No URL, no fetch, no network sink anywhere in the file.rules.json:744and:1003(CS-VLN-PATH-UNC ×2) —"regex": "… denoiser model \\(sm_\\w+/denoiser_48k\\.trtpkg\\) not found"and"regex": "version [\']GLIBC_2\.\d+' not found". The\pairs are JSON escaping of regex metacharacters, not a\server\share` UNC prefix, and these strings are match patterns — never opened as paths.metainfo.xml:82and:91(CS-PII-IP ×2) —<release version="26.7.4.1" date="2026-07-27"/>andversion="26.6.1.1". Four-component CalVer hotfix versions matched as dotted quads. The only line this PR adds to that file is:71.
Nothing to act on. Credit: security-audit (CodeGuard).
Blockers
None.
Nits
-
ROADMAP.md:318— #5468 is left in the unapproved RFC list while the same release claims it shipped. The section header above it reads "waiting on a maintainer decision — not scheduled, and not approved for implementation", yetROADMAP.md:120andCHANGELOG.mdboth credit RFC #5468 for v26.10.2's RTL multi-receiver delivery, and the issue body carries Jeremy's conditional architecture approval. This PR pruned #4764 and #4861 from that list and promoted #6226/#6332/#4214 up into the cycle, so the omission looks accidental rather than deliberate. If the intent is "approved, partially delivered, remaining scope is capacity qualification", it belongs in the cycle above alongside the RTL entry; if it is genuinely still awaiting a decision, the shipped-work citations should say so. Either way worth one line, not worth blocking. -
Release sequencing for the Authenticode claim (
docs/user/versioned_docs/version-stable/installation.md:75and:141). The docs now assert signing unconditionally:The Windows builds are Authenticode-signed: the setup,
AetherSDR.exeand the other AetherSDR files by Jeremy Fielder…That matches the implementation (
windows-installer.yml:692-693signs$oursToSignwith a description and$othersToSignwithout), but the gate atwindows-installer.yml:55isgithub.ref_type == 'tag' && (startsWith(ref_name, 'v') || startsWith(ref_name, 'signtest-')). So this PR's green CI does not exercise signing at all, and v26.10.2 is the firstv*tag to run it. The path was clearly rehearsed —signtest-6288,signtest-6307…signtest-6307etags exist — so this is low risk, just ordering: since the docs site deploys from this same commit, confirming the signing job on thev26.10.2tag before the docs go live avoids a window where published docs promise a signature the published installer lacks. -
tools/docs/gen_reference.py:57— the drift check does not cover the snapshot.OUT_DIR = REPO / "docs" / "user" / "docs" / "generated", sogen_reference.py --checkvalidates only the Next copies. Harmless this time (the trees are byte-identical, and I confirmedgenerated/log-categories.mdmatchessrc/core/LogManager.cpp:117and:138string-for-string for the two newaether.network/aether.nvafxrows), but a future release prep could snapshot a stale generated page and CI would not notice. A--checkpass overversioned_docs/version-stable/generated/would close it.
What I tried to break
Findings below are reasoned from the checkout at /tmp/aetherclaude/pr-6389; I have no build and ran nothing, so the dynamic claims are cross-checked against source constants and the green CI jobs rather than reproduced.
-
Fabricated or stale release notes — the classic defect here. Extracted every
#NNNNfrom the new CHANGELOG section and compared both directions againstgit log v26.10.1..HEAD~2. Nothing is fabricated: the range is exactly 106 commits, matching "106 merged changes" verbatim. 19 citations initially looked unmerged, but all resolve — 17 of the 106 commit subjects carry no(#PR)suffix at all (e.g.fix(hl2): remember TUNE power, FFT AVG, the receiver set…), so the CHANGELOG cites those by issue number. In the other direction, every "uncited" number is the fix-target issue inside a subject whose PR number is cited (…ALC bar ends at its value's tick (#6228)… (#6236)). No shipped change is missing an entry. -
Contributor credits.
git log --format='%an'over the range gives 16 distinct authors — 15 humans plusaethersdr-agent[bot]— matching "15 human contributors, AetherClaude". Every per-person count is right (44/13/10/6/5/5/5/4/3/3/2/1/1/1/1 = 104, +2 bot = 106), and "no dependency updates within that total" holds: zerobump/dependabotcommits in range. I tried to catch an omitted first-timer —Nick - WØNYhas no commits in this range's name set before the tag, but the same GitHub address landed #4678 in August 2026, so welcoming only @dacacioa (genuinely 0 prior commits) is correct. -
Features described but not actually in the tree. Spot-checked the distinctive claims:
CanonWindow(34 files),CanonSurface(5),CanonPan(4),flex-tailnet-shim(13), FFT De-comb (21), KPA1500 (14),-symbols.tar.xz(3), Authenticode (6). The shim version claim is exact —tools/flex-tailnet-shim/main.go:28isconst shimVersion = "0.4.1". -
The quantitative claims, which are the easiest to overstate. "AGC-T covers −20 to 120 dB … starts at 79.4 dB" →
AnanBackend.h:154kAgcKnobMinDb = -20.0and:160"71 = 79.4 dB". "A measured scale, −194.8 + 1.49 × level dBm" →IcomModels.cpp:641SquelchScaleProfile{-195.1 + 0.584 * 0.5, 0.584 * 2.55, …}, i.e. −194.808 and 1.4892. Both round exactly as written. -
Snapshot fidelity and doc-link integrity.
diff -rq docs/user/docs docs/user/versioned_docs/version-stable→ 0 differences, so the Stable snapshot cannot have silently dropped or half-copied a page. All 119/img/screens/*.pngreferenced by the snapshot exist underdocs/user/static/(matching the "119 screenshots … 63 pages" claim), and 0 of the relative./*.mdlinks in the snapshot dangle. Consistent with the passing Build docs site job, which runsnpm run build("fails on any broken link or anchor") plusgen_reference.py --check. -
Documented build options that do not exist.
building-from-source.mdadds aREQUIRE_RTLrow; it is real (CMakeLists.txt:168,cmake/AetherRequireRtl.cmake:3) and the "official release packages set this" claim holds —appimage.yml,macos-dmg.ymlandwindows-installer.ymlall set it. -
Harness artifact ruled out. The
${PR_DIFF}strings scattered through the diff I was handed ("Support ${PR_DIFF} Diagnostics", "KK7GWY ${PR_DIFF} Claude") are a quoting artifact in my own brief, not in the PR —grep -rn 'PR_DIFF'across the four root files returns 0 hits. The real text is&. -
Could not check: whether the
v26.10.2tag's signing, release-asset and docs-deploy jobs actually succeed — those are tag-triggered and have never run for this version. That is the basis of the sequencing nit, not a finding against the diff. - Socket tests: none added, modified or removed. No test sources are touched at all.
Recommendation
Approve with nits. This is the most thoroughly self-consistent release prep I have reviewed — the commit count, contributor roster, screenshot count, shim version and two independent dB constants all reconcile to the tree, the Stable snapshot is byte-identical to Next, and the rules.json /next/ → / flip is both correct and covered by a green CI gate that checks exactly that. Nothing here blocks a merge.
Next step: optionally reconcile the #5468 ROADMAP placement (one line), then merge and tag — and watch the v26.10.2 signing job, since installation.md now promises a signature on a path that has only ever run under signtest-*.
Thanks for the care on this one — the citation discipline in particular made the whole release verifiable from the repo alone.
🤖 aethersdr-agent · cost: $12.3576 · model: claude-opus-5
|
Cisco CodeGuard — static analysis of this PR (6 finding(s))
Automated static scan by Cisco DefenseClaw CodeGuard on the changed files. Advisory — some may be false positives; the review above verifies them. 🤖 aethersdr-agent · cost: $13.1843 · model: claude-opus-5 |
|
Antares Detector — candidate vulnerable file(s)
The suggestedHostname function in src/core/TailnetShimClient.cpp resolves arbitrary strings to IPs (QString suggestedHostname(const QString& nickname)) and only truncates length, not validates tailnet-hostname rules. This can enable unsafe name resolution/path traversal when the function is used to resolve remote CGNAT hostnames. Localized by Cisco Foundation AI Antares-1B running locally in the AetherClaude sandbox, seeded by the Cartographer security map. Advisory only — please verify before acting. 🤖 aethersdr-agent · cost: $13.1843 · model: claude-opus-5 |
Summary
Release prep for v26.10.2: the six release files plus the Stable docs snapshot. Metadata and docs only; no source, test or CI changes.
Cutoff:
origin/mainat46943eb3c(#6083, merged 2026-10-11). Anything that merges after it is folded in before the tag.106 merged changes from 15 human contributors, AetherClaude (2) and Dependabot (0). First-time contributor: @dacacioa. This was confirmed by checking each login for a merged PR before the previous tag, not from
author_association.Changelog
The range
v26.10.1..46943eb3cwas mapped through the commit-to-PR API (repos/…/commits/<sha>/pulls), not from commit subjects. It holds 106 PRs and no direct commits, and every one is cited in the section.v26.10.1is an ancestor ofmain, so nothing is excluded. #6083 merged before the branch was cut, so it is inside the range and needs no unmerged-PR banner.The notes lead with:
Then come DVK import, FFT Smooth/De-comb, TCI tune and receiver events, RTL-SDR multi-receiver delivery, HL2 and ANAN-G2 state memory, the IC-7300MK2 fixes, the first clean sanitizer runs (stated beside #6350's TSan red) and Authenticode signing.
Numbers come from the PR bodies. "On upgrading" callouts cover the behavior changes the bodies flagged:
DeepFist (#5953, #6103) is described as applying only to
ENABLE_DEEPFIST_EXPERIMENTbuilds.Docs refresh, not just version strings
label:rfc: [RFC] Unified client-side voice keyer: local per-client recordings, quick-access CQ/Call, external/controller control, radio/local routing #4214 leaves (approved); [RFC] Frameless window retrofit: one 52 px unified title bar with radio tabs, on all three platforms #4764 and RFC: raw (pre-noise-reduction) audio for Copy Assist ASR #4861 leave (shipped by feat(gui): unified 52 px title bar on Qt 6.12 window chrome — native captions on macOS/Windows, frameless on Linux (RFC #4764) #6198 and feat(asr): Copy Assist can transcribe before client NR. Principle V. #6216); [RFC] AetherN³R (Aetherial Neural Net Noise Reduction): weak-SSB neural NR trained on HF receiver noise #6346, [RFC] Official Windows ARM64 build and release support #6232, [RFC] Status bar: caption the supply voltage when it is the only PA reading #6212 and [RFC] ANAN-G2 front-end options: a Radio Setup page and the anan/frontend.set extension verb #6209 join. [RFC] CTR2 USB link: per-device negotiated extensions; first extension sends the RX audio spectrum #6332 is approved and folds into the CTR2 entry.(v26.10.2)entries, still within the v26.10.x cycle, so no month-rollover trim.Judgment calls flagged for the maintainer
All of these were decided through AskUserQuestion:
Known failing on
mainctr2_hid_thread_port_testfails in the weekly TSan lane (runs of 2026-10-08 and 2026-10-10; [sanitizer] TSan weekly run failure (fp 55883e54f84e) #6350).main's CI and Full Suite were green at414082197. The CHANGELOG headline and intro say so: the lanes achieved their first clean runs this cycle, and the test remains failing under TSan. This prep does not fix the test, and the release ships with it red in that lane.Scope
CMakeLists.txtproject(AetherSDR VERSION 26.10.2)README.mdAGENTS.mdCHANGELOG.md[v26.10.2] — 2026-10-11section;[Unreleased]stays and stays empty; history below byte-identicalpackaging/linux/io.github.aethersdr.aethersdr.metainfo.xml<release version="26.10.2" date="2026-10-11"/>first in<releases>ROADMAP.mddocs/user/versioned_docs/version-stable/**,docs/user/versioned_sidebars/version-stable-sidebars.json,docs/user/stable-version.json,docs/user/src/components/LogAnalyzer/rules.jsontools/docs/snapshot_stable.py 26.10.2), in its own commit. This is the first snapshot since #6286.Validation
Output of
check_release_prep.py --mapping mapping.jsonat the branch head: 30 checks, 1 FAIL (explained below), 1 WARN (the snapshot files, listed in the scope table).docs/user/stable-version.json's"label"is the docs site's current Stable version, andsnapshot_stable.pyrewrites it by design. The validator predates docs(user): docs.aethersdr.com — the user guide as docs-as-code, with Stable/Next versions, a signed PDF manual, generated reference and a Log Analyzer. Principle VIII. #6286 and knows only the four current-version lines. Run on the six-file commit alone, the same check passes (29 checks, 0 FAIL, 0 WARN).npm ci && npm run buildindocs/user.node tools/docs/test_log_rules.mjsreports 707 checks passed for 45 rules. The line moves it reports were already onmain.psk-reporter-sidebar.png,menu-tools.png,connect-dialog.png,rx-agc-calibration.png), and feat(gui): CanonApplet, CanonPan and CanonCanvas, and the panadapter as the first CanonPan with a transparent header over the spectrum. Principle VIII. #6386 named the panadapter shots (panadapter.pngand the main-window captures, which still show the old title strip). They were not recaptured, so the Stable snapshot carries the older images.mainCI at the cutoff46943eb3c: Docs and CodeQL - Code Quality are green; CI, Full Suite, CodeQL and the System Libraries Canary were still running when this was opened. At414082197, every one of them was green.After merge: tag the resulting main commit, not this branch.
🤖 Generated with Claude Code