diff --git a/CHANGELOG.md b/CHANGELOG.md
index de8d7f91..257d409c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -10,6 +10,14 @@ developer-facing record.
## [Unreleased]
+### Build follow-up
+- Add the September 29 to-do list with reproduced gaps and acceptance checks.
+- Correct website release labels: v3.7.0 is the latest public release; v3.8.0
+ remains an unpublished draft.
+- Correct stale scope-enforcement evidence and distinguish native QML Send
+ behavior from asynchronous browser/API/CLI sends.
+- Label roadmap grade changes as changes, including downward corrections.
+
### Repeater CLI and roadmap
- Reject empty drafts and blank target hosts before accepting an API send, so
the CLI cannot report a previous response as a successful new request.
@@ -1651,7 +1659,9 @@ developer-facing record.
the mechanism the doc comment always described actually produces a report
now instead of only ever being reachable from a crash signal.
-## [3.8.0] — 2026-08-20
+## 3.8.0 — unpublished draft
+
+Notes prepared August 20, 2026. This version has not been published as a GitHub release.
This release folds in a large security-and-correctness pass: a whole-codebase
security review (16 findings, from a CRITICAL CI-action fix down to
diff --git a/docs/changelog.html b/docs/changelog.html
index 9bdea10e..3e6561ab 100644
--- a/docs/changelog.html
+++ b/docs/changelog.html
@@ -50,8 +50,9 @@
What shipped
development
-
Security checks now distinguish effective response headers from malformed lookalikes. These changes are in the development build; v3.8.0 remains the latest release listed below.
+
The development build includes corrected security checks, certificate-cache validation and Repeater CLI fixes; v3.7.0 remains the latest public release, and the v3.8.0 notes below are a draft.
+
fixBuild follow-up and roadmap corrections. The September 29 checklist records remaining byte-fidelity, HTML-context, cancellation, fixture-isolation and certificate-lifecycle work. Scope enforcement evidence is refreshed, and the native window's blocking Send path is called out separately.
fixRequest files keep their binary bodies. Repeater CLI file and stdin loading preserves NUL bytes, non-UTF-8 data and trailing newlines. Invalid input leaves the draft unchanged; an empty file explicitly clears it. Tab summaries distinguish fresh tabs from completed responses, and duplicated tabs clear their old response metadata. Empty drafts and blank targets are rejected instead of reporting an old response as a successful send.
fixRepeater CLI loads the right request and waits for sends. History IDs select the complete captured request, including binary bodies. Send polling handles pending responses and reports refusals or unfinished waits. The new repeater stop command stops after the current response. The roadmap now distinguishes working views and responsive sends from the remaining byte-fidelity and immediate-cancellation gaps.
fixReflected-XSS checks respect HTML tag boundaries. Iframe fallback text stays inert; custom tag names and abruptly closed comments no longer hide reflections. The roadmap now marks this probe as partial because template and SVG/MathML context handling still needs work.
@@ -70,8 +71,8 @@
What shipped
v3.8.0
- Aug 20, 2026
- released
+ Draft notes · Aug 20, 2026
+ unpublished draft
The pre-launch blocker push — five of the first-hour blockers fixed: scan findings and Repeater tabs now survive app close and project reopen, Repeater auto-updates Content-Length, the proxy can bind off-loopback for device testing, and interception is now rule-driven — alongside a detector-hardening pass over the passive scanner (mutation-proven regression coverage around every finding kind), the false-negative bugs those tests surfaced, and new Burp-parity features on the roadmap.
@@ -148,7 +149,7 @@
What shipped
v3.7.0
- Jul 5, 2026
+ Published Jul 21, 2026latest
Self-host first. Everything here runs on your machine, offline, with no account.
@@ -86,7 +86,7 @@
Install
cmake --build build --target NullockApp
On first run the app generates a local CA and prints its path. Download its public certificate from Settings → CA & TLS and trust it in a dedicated test browser when you need HTTPS interception. Nullock does not automatically modify the OS trust store.
-
Sections marked unreleased describe the current development build and supplied beta packages. They may not be included in the latest public release. See the repository build instructions for platform prerequisites.
+
Sections marked unreleased describe the current development build and supplied beta packages. The latest public release is v3.7.0; v3.8.0 remains an unpublished draft. See the repository build instructions for platform prerequisites.
diff --git a/docs/reviews/2026-09-29-build-follow-up.md b/docs/reviews/2026-09-29-build-follow-up.md
new file mode 100644
index 00000000..172c285b
--- /dev/null
+++ b/docs/reviews/2026-09-29-build-follow-up.md
@@ -0,0 +1,164 @@
+# September 29 build follow-up
+
+Owner: Bikebrainz. This is the next-work checklist from the September 29 build
+and verification pass. The [capability register](../roadmap/parity.json) remains
+the full roadmap; this list prioritizes gaps reproduced or inspected during the
+session. An unchecked item is not implemented.
+
+## Changes from this build
+
+| Change | Pull request | Status |
+| --- | --- | --- |
+| Effective security headers and strict TLS certificate compatibility | [#21](https://github.com/Bikebrainz/Nullock/pull/21) | Merged |
+| Reflected-XSS media types and HTML boundaries; certificate-cache validation | [#22](https://github.com/Bikebrainz/Nullock/pull/22) | Merged |
+| Stable history IDs, asynchronous CLI send polling and Stop | [#25](https://github.com/Bikebrainz/Nullock/pull/25) | Merged |
+| Binary file/stdin requests, tab indicators and empty-send rejection | [#26](https://github.com/Bikebrainz/Nullock/pull/26) | Merged |
+
+Each implementation PR passed all eight CI jobs on its reviewed head before
+merge. Every implementation PR also updates the public changelog and roadmap. These
+are development changes; they do not create a release or change the latest
+published version. GitHub release metadata checked on September 29 identifies
+v3.7.0 as the latest public release and v3.8.0 as an unpublished draft.
+Certificate details from #23 and HTML-context details from
+#24 were incorporated into #22.
+
+## Next work, in priority order
+
+### 1. Preserve response bytes through Repeater and Hex views
+
+- [ ] Carry the original response bytes through the tab model, snapshot and
+ per-tab history, with a separate decoded display representation.
+- [ ] Make request Hex honor the request's actual UTF-8 or Latin-1 encoding.
+- [ ] Make response Hex and binary export use the selected byte representation.
+
+**Evidence:** a loopback response body `00 ff 80 41` becomes
+`00 U+FFFD U+FFFD 41` in Repeater. `Repeater::send` converts the raw or decoded
+body with `QString::fromUtf8`; `toHexDump` then UTF-8-encodes the display text.
+The original bytes cannot be recovered from that string. A Latin-1 request can
+send correctly while its Hex view shows different bytes.
+
+**Done when:** all 256 byte values survive send, snapshot, history navigation,
+project save/reload and export; Hex matches the fixture bytes. Compressed
+responses distinguish original wire bytes from decoded body bytes. Include
+empty bodies, invalid UTF-8, NULs and bodies larger than the preview limit.
+
+### 2. Correct the remaining reflected-XSS HTML contexts
+
+- [ ] Handle inert template contents and SVG/MathML parsing contexts.
+- [ ] Expand the pinned-browser corpus before changing the parser or its grade.
+
+**Evidence:** after the tag-boundary fixes, a 97-context browser comparison left
+two mismatches for the marker ``:
+
+| HTML | Native marker classification | Chromium element present |
+| --- | --- | --- |
+| `` | true | false |
+| `