diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 42176999..f0fb2ced 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -158,6 +158,8 @@ jobs:
run: python scripts/outbound_scope_regression.py build/Src/App/Release/NullockApp.exe
- name: control API and Repeater responsiveness
run: python scripts/control_responsiveness_regression.py build/Src/App/Release/NullockApp.exe
+ - name: native Repeater Send and Stop controls
+ run: python scripts/native_repeater_controls_test.py
- name: workspace crash recovery
run: python scripts/workspace_recovery_regression.py build/Src/App/Release/NullockApp.exe
- name: authenticated scanner regression
diff --git a/CHANGELOG.md b/CHANGELOG.md
index bf019e48..496f98e3 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -10,6 +10,14 @@ developer-facing record.
## [Unreleased]
+### Native Repeater responsiveness
+- Run native-window sends on the existing background worker. Show Send/Stop
+ progress and disable Send/Clear while the request is active.
+- Copy the visible target fields before sending, reject blank hosts and ports
+ outside 1–65535, and expose the pending cancellation state to QML.
+- Stop prevents further redirects after the current response or transport
+ timeout. Immediate socket cancellation and simultaneous sends remain open work.
+
### Reflected HTML context handling
- Keep HTML template contents inert, including nested templates and apparent
closing tags inside raw text, comments or attributes.
diff --git a/Src/App/app.qml b/Src/App/app.qml
index 871f89bc..af63cd50 100644
--- a/Src/App/app.qml
+++ b/Src/App/app.qml
@@ -675,6 +675,7 @@ ApplicationWindow {
spacing: 8
HeaderCell { text: "Target" }
TextField {
+ id: repeaterHostField
Layout.preferredWidth: 280
placeholderText: "host"
text: repeater.host
@@ -686,8 +687,10 @@ ApplicationWindow {
}
HeaderCell { text: ":" }
TextField {
+ id: repeaterPortField
Layout.preferredWidth: 80
text: "" + repeater.port
+ validator: IntValidator { bottom: 1; top: 65535; locale: "C" }
color: root.text
font.family: "Consolas"
font.pixelSize: 12
@@ -701,11 +704,32 @@ ApplicationWindow {
Item { Layout.fillWidth: true }
Cell { text: repeater.statusLine; color: root.accent; Layout.preferredWidth: 200 }
AccentButton {
- label: repeater.busy ? "..." : "Send"
- onClicked: repeater.send()
+ label: repeater.cancelling ? "Stopping..." : "Stop"
+ visible: repeater.busy
+ enabled: !repeater.cancelling
+ opacity: enabled ? 1 : 0.5
+ onClicked: repeater.cancel()
+ ToolTip.visible: stopHover.hovered
+ ToolTip.text: "Stops after the current response or transport timeout; skips further redirects."
+ HoverHandler { id: stopHover }
+ }
+ AccentButton {
+ label: repeater.busy ? "Sending..." : "Send"
+ enabled: !repeater.busy && repeaterHostField.text.trim().length > 0
+ && repeaterPortField.acceptableInput && repeater.requestText.length > 0
+ opacity: enabled ? 1 : 0.5
+ onClicked: {
+ // Rectangle buttons do not necessarily take focus from a field.
+ // Commit the visible target before copying it into the worker.
+ repeater.host = repeaterHostField.text.trim()
+ repeater.port = Number(repeaterPortField.text)
+ repeater.sendAsync()
+ }
}
AccentButton {
label: "Clear"
+ enabled: !repeater.busy
+ opacity: enabled ? 1 : 0.5
onClicked: repeater.clear()
}
}
diff --git a/Src/Core/Networking/repeater.hpp b/Src/Core/Networking/repeater.hpp
index 636d873f..2eb33e24 100644
--- a/Src/Core/Networking/repeater.hpp
+++ b/Src/Core/Networking/repeater.hpp
@@ -90,6 +90,7 @@ class Repeater : public QObject {
Q_PROPERTY(qint64 elapsedMs READ elapsedMs NOTIFY responseChanged)
Q_PROPERTY(int responseBytes READ responseBytes NOTIFY responseChanged)
Q_PROPERTY(bool busy READ busy NOTIFY busyChanged)
+ Q_PROPERTY(bool cancelling READ cancelling NOTIFY busyChanged)
Q_PROPERTY(int activeTab READ activeTab NOTIFY tabsChanged)
Q_PROPERTY(int tabCount READ tabCount NOTIFY tabsChanged)
// Recompute Content-Length from the actual body before each send (Burp's
diff --git a/docs/changelog.html b/docs/changelog.html
index 93189ac0..0e952b08 100644
--- a/docs/changelog.html
+++ b/docs/changelog.html
@@ -52,12 +52,13 @@
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.
+ - fix Native Repeater stays responsive while sending. The native window now uses the same background worker as the browser and exposes Stop progress. Send uses the visible target fields and rejects blank hosts or invalid ports. Stop still takes effect after the current response or transport timeout; immediate socket cancellation remains on the roadmap.
- fix Reflected HTML respects templates and namespaces. Inert HTML templates no longer produce findings, while SVG and MathML elements follow their own parsing contexts. Nested templates, CDATA, escaped script text and malformed tag boundaries are covered by 1,255 Chromium comparisons and 13 new live API checks. The roadmap keeps the probe partial because framesets and full browser parsing still need work; a reflected marker does not prove script execution.
- fix Repeater preserves binary responses. Request Hex honors UTF-8 or Latin-1. Response Hex and Save bytes use either the body bytes or the original wire response, including compression and chunk framing. Downloads keep the full content beyond the 64 KiB preview. Current responses survive project reloads; past sends retain exact bytes for the current session. Empty compressed bodies and CRLF-separated Body views are also corrected.
- - fix Build 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.
+ - fix Build follow-up and roadmap corrections. The September 29 checklist now records completed byte-fidelity, HTML-context and native-window improvements alongside the remaining cancellation, fixture-isolation and certificate-lifecycle work. Scope enforcement evidence is refreshed.
- fix Request 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.
- fix Repeater 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.
- - fix Reflected-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.
+ - fix Reflected-XSS checks respect HTML tag boundaries. Iframe fallback text stays inert; custom tag names and abruptly closed comments no longer hide reflections. The roadmap records the additional context fixes above and the remaining browser-parsing limits.
- fix Content-Type values drive reflected-XSS decisions. A plain-text parameter mentioning
text/html no longer triggers an HTML finding. Repeated fields use the last usable media type, quoted commas stay inside parameters, and unknown types follow the browser's sniffing rules.
- fix Recover from stale or damaged certificate caches. After a restart, cached proxy certificates must match the current CA, private key and requested DNS/IP name. Invalid signatures and damaged or mismatched keys trigger replacement; valid cached certificates are retained.
- fix Proxy certificates work with strict TLS clients. Generated certificates explicitly include key identifiers on both OpenSSL and LibreSSL. Older cached leaves missing an authority key identifier are replaced when loaded after a restart.
diff --git a/docs/docs/index.html b/docs/docs/index.html
index 5dfcccaa..967fb8e0 100644
--- a/docs/docs/index.html
+++ b/docs/docs/index.html
@@ -131,7 +131,7 @@ Project notes (unreleased)
Repeater while a request runs (unreleased)
- Browser, API and CLI Repeater sends run in the background. Their busy state remains visible while you inspect other tools or edit the next request. The response and history belong to the request that was actually sent; later edits stay in the request pane. One Repeater request runs at a time, and project switching or closing tabs waits until it finishes. The native QML Send button still uses the synchronous path.
+ Browser, native-window, API and CLI Repeater sends run in the background. Their busy state remains visible while you inspect other tools or edit the next request. The response and history belong to the request that was actually sent; later edits stay in the request pane. One Repeater request runs at a time, and project switching or closing tabs waits until it finishes. The native window exposes Send/Stop progress, validates the visible host and port, and disables Send/Clear until the request completes.
Hex / download selects the response bytes to inspect or save. Body bytes excludes HTTP chunk framing and decodes supported gzip/deflate compression; Wire response bytes includes the original headers, compressed data and framing. Save bytes downloads the full selected content even when Hex stops at its 64 KiB preview limit. Text views are readable UTF-8 representations; use Hex or the binary download for non-text content. Request Hex uses the request's UTF-8 or Latin-1 encoding.
Stop takes effect after the current response or transport timeout. It prevents any further redirects; it cannot undo a request already sent to the server. A slow client uploading to the control API no longer stalls the UI. Some other synchronous scanner and extension handlers still share the UI thread.
diff --git a/docs/reviews/2026-09-29-build-follow-up.md b/docs/reviews/2026-09-29-build-follow-up.md
index fd48f5fa..6b40d15c 100644
--- a/docs/reviews/2026-09-29-build-follow-up.md
+++ b/docs/reviews/2026-09-29-build-follow-up.md
@@ -84,16 +84,21 @@ and proof of arbitrary script execution remain outside this marker check.
### 3. Finish Repeater cancellation and native-window responsiveness
-- [ ] Route the native QML Send button through the asynchronous send path and
+- [x] Route the native QML Send button through the asynchronous send path and
expose the same Stop state as the browser.
- [ ] Add cancellation to the socket-owning worker during connection, TLS,
header and body waits.
- [ ] Keep concurrent sends from separate tabs as a separate design task.
-**Evidence:** browser/API/CLI sends use `sendAsync`, but `Src/App/app.qml` still
-calls `repeater.send()` directly. Current Stop sets an atomic flag checked
-between responses and redirects; it does not interrupt a stalled socket.
-`HttpClient` uses per-wait timeouts and a five-minute total read budget.
+**Completed September 30:** [c94f5388](https://github.com/Bikebrainz/Nullock/commit/c94f5388)
+routes native Send through `sendAsync`, exposes Stop/pending state, disables
+Send/Clear during work and copies the visible host/port before sending. A QML
+harness executes the actual controls with a test backend; the real application
+passes 64 native-window runtime checks and 20 control responsiveness checks.
+
+**Remaining evidence:** Stop sets an atomic flag checked between responses and
+redirects; it does not interrupt a stalled socket. `HttpClient` uses per-wait
+timeouts and a five-minute total read budget.
**Done when:** a controlled stalled connection, TLS handshake, header, fixed body
and chunked body can each be stopped promptly without cross-thread socket use.
@@ -155,8 +160,8 @@ key permissions and test both OpenSSL and LibreSSL certificate generation.
This pass corrects the obsolete Repeater scope-bypass claim: the shared
`HttpClient` checks outbound scope before connecting, including redirects, and
the API snapshots the request synchronously before scheduling its worker.
-The 41-check outbound-scope regression passes. The native window's remaining
-blocking Send behavior is a separate issue described above.
+The 41-check outbound-scope regression passes. Native Send now uses the same
+background worker; interrupting a stalled socket remains open as described above.
## Verification to carry forward
diff --git a/docs/roadmap/index.html b/docs/roadmap/index.html
index 3956f769..10fa31f1 100644
--- a/docs/roadmap/index.html
+++ b/docs/roadmap/index.html
@@ -56,7 +56,7 @@ Where the work is
Recently updated
Capabilities reconciled since the audit, including closed gaps and corrections, newest first. Each entry records its date and source or verification commit. Showing the 24 most recent of 410 reconciled since the audit; the full set is in the capability table below.
- - 2bc4bcfa 2026-09-30 [A12] Active audit: reflected XSS present → partial
Correct the template and SVG/MathML gaps reproduced in the September build follow-up. Expand browser and live API checks. Keep partial because frameset handling and complete browser tree construction remain unfinished. - 432ff192 2026-09-30 Repeater: per-tab request history with back/forward (< >) navigation through previously se present → present
Refresh stale pre-history evidence and verify byte-preserving navigation. History is session-only; current-response persistence is separate. - 432ff192 2026-09-30 Repeater: response "Render" tab (renders the HTML response) absent → present
Refresh the obsolete claim that no renderer exists; state the static sandbox limit and corrected CRLF body extraction. - 432ff192 2026-09-30 Repeater: message editor views — Pretty / Raw / Hex for both request and response absent → present
partial -> present after native, live API, persistence and Chromium download verification. Current responses persist; past sends remain session-only. Hex previews 64 KiB and downloads retain all selected bytes. - 432ff192 2026-09-30 Repeater: "Unpack gzip / deflate" in the response view present → present
Keep compressed wire bytes separate from the inspection body and recognize valid empty compressed streams. Existing decompression limits and unsupported encodings remain unchanged. - 0665e41b 2026-09-29 [A4] Passive audit: missing security headers (CSP/HSTS/XFO/XCTO/RP/Permissions-Policy/COOP present → present
Hardened active and passive security-header parsing for repeated fields, fallback policies and malformed whitespace. Native regressions and pinned Chromium comparisons cover effective values. Existing capability remains present. - 784284db 2026-09-29 Proxy listener > Certificate > Generate CA-signed per-host certificate (per-host leaf mint present → present
Declare leaf key identifiers explicitly so strict TLS clients accept LibreSSL-generated certificates. Runtime regression exercises real proxy HTTPS with strict validation enabled on every Python version. - 4c44d3c0 2026-09-29 CA certificate: leaf caching across restarts
Verify the current CA, private key and requested DNS/IP subject alternative name before disk-cache reuse. Strict HTTPS regressions cover wrong and missing SANs; focused checks retain valid DNS, IPv4 and IPv6 leaves. - c2af0a33 2026-09-29 CA private key hardening on disk exceeds → present
Reconciled against current source and focused CLI, application and browser checks. Correct stale behavior/evidence and state the remaining limits. Grade changed from exceeds to present. - 697499b7 2026-09-29 Repeater: send a captured message to Repeater from other tools
CLI file and stdin input preserve raw body bytes. Empty input clears the draft, omitted input preserves it, and invalid base64 is rejected before mutation. Existing missing tool pivots keep the grade partial. - 927aed0e 2026-09-29 Repeater: out-of-scope send guard exceeds → present
Rechecked the existing shared scope implementation and reran 41 live scope checks. Removed obsolete API-only and queued-tab-switch claims; use present rather than an unverified comparison-based exceeds grade. - 99bfaf7f 2026-09-29 Repeater: headless / scriptable driving of the tool exceeds → present
Verified the CLI through owned API fixtures and a real app: history IDs, asynchronous sends, Stop, binary file/stdin input and tab response state. Replaced stale defect descriptions and removed an unverified exceeds comparison. Empty requests and blank targets now fail explicitly; real-app CLI regressions cover both. - c2af0a33 2026-09-29 Repeater: automatic "Update Content-Length" when the body is edited present → present
Reconciled against current source and focused CLI, application and browser checks. Correct stale behavior/evidence and state the remaining limits. - c2af0a33 2026-09-29 Repeater: cancel an in-flight request; non-blocking send
Reconciled browser/API/CLI asynchronous sends and Stop, while recording the native QML synchronous-send path separately. Immediate socket cancellation and concurrent sends remain incomplete; grade stays partial. - 76c583ff 2026-09-11 Save/Resume attack present → present
Existing manual SAVE/LOAD/RESUME is retained. Project switch and clean exit now save automatically; restoration remains idle and pending rows still need explicit Resume. CLI adds save/load/reset. - 2026-09-11 [A36] Authenticated scanning: session-handling rules (macros)
HTTP authenticated scan workflows verified, including form CSRF replacement, compressed token extraction, refresh cooldown, request fidelity and project isolation. Browser login execution remains a separate gap. - 2026-09-11 [A37] Out-of-scope handling during scans present → present
Full outbound scope boundary, live policy updates, full-URL redirect/crawler checks and visible validation errors. - 17d6c051 2026-09-11 Cookie jar and session rules persist in the project file / user settings across restarts absent → present
Cookie jars and session rules persist per project. Cookie changes autosave every two seconds and after shutdown workers drain; session-rule edits save when applied. Failed workspace writes remain visible and block project switching. Transient extracted session variables are intentionally cleared when changing projects. - 2026-09-11 Recorded login sequences (browser-recorded login replayed by the scanner) for authenticate
HTTP authenticated scan workflows verified, including form CSRF replacement, compressed token extraction, refresh cooldown, request fidelity and project isolation. Browser login execution remains a separate gap. - 63ecda0e 2026-09-11 Annotations: per-item Notes column and colour highlighting on Proxy history / any message partial → partial
Project-persisted comments and nine highlight colours synchronize across browser clients, survive restart/index rebuild, and round-trip through HAR. API/CLI field patches reject stale history generations. Selected-item XML and branch HTML reports include escaped notes. Legacy browser notes have an explicit migration action. - f24543d3 2026-09-11 Project files: Repeater tabs, Intruder attack config and Sequencer state saved in the proj absent → partial
Intruder configuration and result rows persist per project on switch/clean exit and restore idle. Browser drafts survive stale polls; rules/grep settings synchronize and stale project edits are refused. Runtime, browser and CLI checks pass. Sequencer persistence remains outstanding. - 63ecda0e 2026-09-11 HTTP history filter bar (in-scope only / hide items without responses / MIME / status / re
Annotation persistence caveat removed; unrelated filtering gaps remain documented. - 63ecda0e 2026-09-11 HTTP history annotations: per-item highlight colours and comments, plus filter-by-annotati partial → present
Project-persisted comments and nine highlight colours synchronize across browser clients, survive restart/index rebuild, and round-trip through HAR. API/CLI field patches reject stale history generations. Selected-item XML and branch HTML reports include escaped notes. Legacy browser notes have an explicit migration action. - c30a3eae 2026-09-11 Repeater: multiple concurrent request tabs
The GUI/control Repeater runs one request at a time on a worker, preserving UI responsiveness and edits made during a send. Busy/Stop states are exposed; Stop prevents subsequent redirects after the current response. Browser mutations are serialized and stale polls cannot overwrite pending edits. Tabs autosave per project. Independent concurrent sends across multiple tabs remain unavailable.
+ - 2bc4bcfa 2026-09-30 [A12] Active audit: reflected XSS present → partial
Correct the template and SVG/MathML gaps reproduced in the September build follow-up. Expand browser and live API checks. Keep partial because frameset handling and complete browser tree construction remain unfinished. - 432ff192 2026-09-30 Repeater: per-tab request history with back/forward (< >) navigation through previously se present → present
Refresh stale pre-history evidence and verify byte-preserving navigation. History is session-only; current-response persistence is separate. - 432ff192 2026-09-30 Repeater: response "Render" tab (renders the HTML response) absent → present
Refresh the obsolete claim that no renderer exists; state the static sandbox limit and corrected CRLF body extraction. - 432ff192 2026-09-30 Repeater: message editor views — Pretty / Raw / Hex for both request and response absent → present
partial -> present after native, live API, persistence and Chromium download verification. Current responses persist; past sends remain session-only. Hex previews 64 KiB and downloads retain all selected bytes. - 432ff192 2026-09-30 Repeater: "Unpack gzip / deflate" in the response view present → present
Keep compressed wire bytes separate from the inspection body and recognize valid empty compressed streams. Existing decompression limits and unsupported encodings remain unchanged. - c94f5388 2026-09-30 Repeater: cancel an in-flight request; non-blocking send
Native-window Send joins the asynchronous path and exposes Stop/pending state. Production QML controls and real application runtime checks pass. Immediate socket cancellation and concurrent sends remain incomplete; grade stays partial. - 0665e41b 2026-09-29 [A4] Passive audit: missing security headers (CSP/HSTS/XFO/XCTO/RP/Permissions-Policy/COOP present → present
Hardened active and passive security-header parsing for repeated fields, fallback policies and malformed whitespace. Native regressions and pinned Chromium comparisons cover effective values. Existing capability remains present. - 784284db 2026-09-29 Proxy listener > Certificate > Generate CA-signed per-host certificate (per-host leaf mint present → present
Declare leaf key identifiers explicitly so strict TLS clients accept LibreSSL-generated certificates. Runtime regression exercises real proxy HTTPS with strict validation enabled on every Python version. - 4c44d3c0 2026-09-29 CA certificate: leaf caching across restarts
Verify the current CA, private key and requested DNS/IP subject alternative name before disk-cache reuse. Strict HTTPS regressions cover wrong and missing SANs; focused checks retain valid DNS, IPv4 and IPv6 leaves. - c2af0a33 2026-09-29 CA private key hardening on disk exceeds → present
Reconciled against current source and focused CLI, application and browser checks. Correct stale behavior/evidence and state the remaining limits. Grade changed from exceeds to present. - 697499b7 2026-09-29 Repeater: send a captured message to Repeater from other tools
CLI file and stdin input preserve raw body bytes. Empty input clears the draft, omitted input preserves it, and invalid base64 is rejected before mutation. Existing missing tool pivots keep the grade partial. - 927aed0e 2026-09-29 Repeater: out-of-scope send guard exceeds → present
Rechecked the existing shared scope implementation and reran 41 live scope checks. Removed obsolete API-only and queued-tab-switch claims; use present rather than an unverified comparison-based exceeds grade. - 99bfaf7f 2026-09-29 Repeater: headless / scriptable driving of the tool exceeds → present
Verified the CLI through owned API fixtures and a real app: history IDs, asynchronous sends, Stop, binary file/stdin input and tab response state. Replaced stale defect descriptions and removed an unverified exceeds comparison. Empty requests and blank targets now fail explicitly; real-app CLI regressions cover both. - c2af0a33 2026-09-29 Repeater: automatic "Update Content-Length" when the body is edited present → present
Reconciled against current source and focused CLI, application and browser checks. Correct stale behavior/evidence and state the remaining limits. - 76c583ff 2026-09-11 Save/Resume attack present → present
Existing manual SAVE/LOAD/RESUME is retained. Project switch and clean exit now save automatically; restoration remains idle and pending rows still need explicit Resume. CLI adds save/load/reset. - 2026-09-11 [A36] Authenticated scanning: session-handling rules (macros)
HTTP authenticated scan workflows verified, including form CSRF replacement, compressed token extraction, refresh cooldown, request fidelity and project isolation. Browser login execution remains a separate gap. - 2026-09-11 [A37] Out-of-scope handling during scans present → present
Full outbound scope boundary, live policy updates, full-URL redirect/crawler checks and visible validation errors. - 17d6c051 2026-09-11 Cookie jar and session rules persist in the project file / user settings across restarts absent → present
Cookie jars and session rules persist per project. Cookie changes autosave every two seconds and after shutdown workers drain; session-rule edits save when applied. Failed workspace writes remain visible and block project switching. Transient extracted session variables are intentionally cleared when changing projects. - 2026-09-11 Recorded login sequences (browser-recorded login replayed by the scanner) for authenticate
HTTP authenticated scan workflows verified, including form CSRF replacement, compressed token extraction, refresh cooldown, request fidelity and project isolation. Browser login execution remains a separate gap. - 63ecda0e 2026-09-11 Annotations: per-item Notes column and colour highlighting on Proxy history / any message partial → partial
Project-persisted comments and nine highlight colours synchronize across browser clients, survive restart/index rebuild, and round-trip through HAR. API/CLI field patches reject stale history generations. Selected-item XML and branch HTML reports include escaped notes. Legacy browser notes have an explicit migration action. - f24543d3 2026-09-11 Project files: Repeater tabs, Intruder attack config and Sequencer state saved in the proj absent → partial
Intruder configuration and result rows persist per project on switch/clean exit and restore idle. Browser drafts survive stale polls; rules/grep settings synchronize and stale project edits are refused. Runtime, browser and CLI checks pass. Sequencer persistence remains outstanding. - 63ecda0e 2026-09-11 HTTP history filter bar (in-scope only / hide items without responses / MIME / status / re
Annotation persistence caveat removed; unrelated filtering gaps remain documented. - 63ecda0e 2026-09-11 HTTP history annotations: per-item highlight colours and comments, plus filter-by-annotati partial → present
Project-persisted comments and nine highlight colours synchronize across browser clients, survive restart/index rebuild, and round-trip through HAR. API/CLI field patches reject stale history generations. Selected-item XML and branch HTML reports include escaped notes. Legacy browser notes have an explicit migration action. - c30a3eae 2026-09-11 Repeater: multiple concurrent request tabs
The GUI/control Repeater runs one request at a time on a worker, preserving UI responsiveness and edits made during a send. Busy/Stop states are exposed; Stop prevents subsequent redirects after the current response. Browser mutations are serialized and stale polls cannot overwrite pending edits. Tabs autosave per project. Independent concurrent sends across multiple tabs remain unavailable.
@@ -84,7 +84,7 @@ How this stays true
nul·lock ▸ audited 2026-07-30 · reconciled through 2026-09-30 · generated from parity.json
-
+