[GH-ISSUE #7394] [Bug] Hiding a custom qlog event payload adds a false incomplete transport record #4400

Closed
opened 2026-10-31 00:49:30 +00:00 by bsakaguchi · 0 comments
Owner

Originally created by @coygeek on GitHub (Oct 27, 2026).
Original GitHub issue: https://github.com/morluto/rea/issues/7394

Before submitting

  • I searched the open and closed issues for a related report.
  • I removed credentials, tokens, private paths, and sensitive target data.

Area

Evidence, artifacts, or reconstruction

Observed behavior

inspect-web-network-capture succeeds for a trace containing only extension:custom, but adding --sensitive-value data changes incomplete_fact_records from [] to [0]. The extension contributes neither STREAM facts nor loss declarations. Its name remains visible; only its uninterpreted payload is hidden.

Reproduction

Using Node 24.22.1 from the repository root, prepare a fresh checkout with npm ci && npm run build:cached, then run the following synthetic case. Verification used the existing locked dependency installation and a fresh successful build at the commit below; the lockfile was unchanged from the supplied checkout. The failing invocation and the no-declaration control each ran once.

WORK=$(mktemp -d)
mkdir -p "$WORK"/{home,config,data,cache,state,tmp}
export HOME="$WORK/home" XDG_CONFIG_HOME="$WORK/config" XDG_DATA_HOME="$WORK/data" XDG_CACHE_HOME="$WORK/cache" XDG_STATE_HOME="$WORK/state" TMPDIR="$WORK/tmp"
cat > "$WORK/capture.qlog" <<'JSON'
{"qlog_format":"JSON","qlog_version":"0.3","traces":[{"events":[{"name":"extension:custom","time":1,"data":{"body":"ordinary"}}]}]}
JSON
node scripts/rea.mjs inspect-web-network-capture "$WORK/capture.qlog" qlog --sensitive-value data --json > "$WORK/redacted.json"
node scripts/rea.mjs inspect-web-network-capture "$WORK/capture.qlog" qlog --json > "$WORK/control.json"
node -e 'for (const mode of ["redacted","control"]) {const r=require(process.argv[1]+"/"+mode+".json"); const t=r.normalized_result.qlog.traces[0]; console.log(mode,JSON.stringify({incomplete_fact_records:t.incomplete_fact_records,streams:t.streams,loss_declarations:t.loss_declarations})); console.log(mode,"reported",JSON.stringify(r.normalized_result.records[0].reported));}' "$WORK"

Expected behavior

Both runs should return incomplete_fact_records: [] while honoring the declaration. docs/web-network-captures.md:1021 defines this inventory as ordinals with omitted/redacted interpretable frame metadata; lines 987-993 permit event subsets and unknown extensions. Hiding a custom extension's uninterpreted data does not omit a transport fact. An empty inventory still does not establish complete network logging or capture.

Impact and scope

P2: a supported input produces a false incomplete-evidence coordinate. Stream and loss inventories remain empty in both runs, so the observed error is bounded to the completeness inventory. Those detailed inventories remain available for inspection, but do not repair the incorrect coordinate. Prevalence in real captures and the regression range are unknown; removing a sensitive declaration is not recommended as a workaround.

REA version

Exact node scripts/rea.mjs --version output: 6.8.0. Built and verified at current main commit 319fee4691e444d5ac9870f114f93f79ef89707b.

Runtime and platform

Node.js v24.22.1; macOS 27.0.1; uname -sm: Darwin arm64.

Target and artifact context

Synthetic JSON qlog 0.3 with one trace and one custom extension event, accepted under the aioquic-1.5.0-json-0.3 interpretation profile. No actual aioquic producer, live browser, device or external analysis provider was used.

Interface

CLI

Earliest failure stage

Capture or observation

Relevant output or evidence

Both CLI invocations exited 0. Selected output from the commands above:

redacted {"incomplete_fact_records":[0],"streams":[],"loss_declarations":[]}
redacted reported {"name":"extension:custom","time":1}
control {"incomplete_fact_records":[],"streams":[],"loss_declarations":[]}
control reported {"name":"extension:custom","time":1,"data":{"body":"ordinary"}}

Separate CLI controls used a single packet-sent STREAM frame with stream ID 0, offset 0 and length 10. Explicit fin: false returned incomplete_fact_records: []; fin: null returned [0]. Both preserved unique_bytes: "10". Each control ran once.

Analysis or suspected cause

Source-derived: src/browser/history/QlogCapture.ts:231-234 appends an incomplete ordinal whenever projected event data is absent, before filtering packet/loss event names at lines 239 and 261. packetEvent at lines 376-377 recognizes only packet sent/received. This ordering explains the observed extension false positive. No source modification was made.

Additional context

Closed #6598 concerns missing incomplete entries for unknown STREAM FIN, rather than this extra entry. Closed PR #2859 concerns hidden packet/loss event names; its existing extension control in src/browser/history/QlogCapture.test.ts:309-334 expects custom extensions to stay out of the inventory. Neither covers this hidden-data trigger. Open #3133 concerns performance measurement. No exact open duplicate was found. MCP and retained-view propagation were not executed. Proposed restoration check: repeat the failing case and controls, keeping extension ordinals absent while unknown STREAM FIN remains discoverable and the declared data remains hidden.

Originally created by @coygeek on GitHub (Oct 27, 2026). Original GitHub issue: https://github.com/morluto/rea/issues/7394 ## Before submitting - [x] I searched the open and closed issues for a related report. - [x] I removed credentials, tokens, private paths, and sensitive target data. ## Area Evidence, artifacts, or reconstruction ## Observed behavior `inspect-web-network-capture` succeeds for a trace containing only `extension:custom`, but adding `--sensitive-value data` changes `incomplete_fact_records` from `[]` to `[0]`. The extension contributes neither STREAM facts nor loss declarations. Its name remains visible; only its uninterpreted payload is hidden. ## Reproduction Using Node 24.22.1 from the repository root, prepare a fresh checkout with `npm ci && npm run build:cached`, then run the following synthetic case. Verification used the existing locked dependency installation and a fresh successful build at the commit below; the lockfile was unchanged from the supplied checkout. The failing invocation and the no-declaration control each ran once. ```sh WORK=$(mktemp -d) mkdir -p "$WORK"/{home,config,data,cache,state,tmp} export HOME="$WORK/home" XDG_CONFIG_HOME="$WORK/config" XDG_DATA_HOME="$WORK/data" XDG_CACHE_HOME="$WORK/cache" XDG_STATE_HOME="$WORK/state" TMPDIR="$WORK/tmp" cat > "$WORK/capture.qlog" <<'JSON' {"qlog_format":"JSON","qlog_version":"0.3","traces":[{"events":[{"name":"extension:custom","time":1,"data":{"body":"ordinary"}}]}]} JSON node scripts/rea.mjs inspect-web-network-capture "$WORK/capture.qlog" qlog --sensitive-value data --json > "$WORK/redacted.json" node scripts/rea.mjs inspect-web-network-capture "$WORK/capture.qlog" qlog --json > "$WORK/control.json" node -e 'for (const mode of ["redacted","control"]) {const r=require(process.argv[1]+"/"+mode+".json"); const t=r.normalized_result.qlog.traces[0]; console.log(mode,JSON.stringify({incomplete_fact_records:t.incomplete_fact_records,streams:t.streams,loss_declarations:t.loss_declarations})); console.log(mode,"reported",JSON.stringify(r.normalized_result.records[0].reported));}' "$WORK" ``` ## Expected behavior Both runs should return `incomplete_fact_records: []` while honoring the declaration. `docs/web-network-captures.md:1021` defines this inventory as ordinals with omitted/redacted interpretable frame metadata; lines 987-993 permit event subsets and unknown extensions. Hiding a custom extension's uninterpreted data does not omit a transport fact. An empty inventory still does not establish complete network logging or capture. ## Impact and scope P2: a supported input produces a false incomplete-evidence coordinate. Stream and loss inventories remain empty in both runs, so the observed error is bounded to the completeness inventory. Those detailed inventories remain available for inspection, but do not repair the incorrect coordinate. Prevalence in real captures and the regression range are unknown; removing a sensitive declaration is not recommended as a workaround. ## REA version Exact `node scripts/rea.mjs --version` output: `6.8.0`. Built and verified at current main commit `319fee4691e444d5ac9870f114f93f79ef89707b`. ## Runtime and platform Node.js `v24.22.1`; macOS `27.0.1`; `uname -sm`: `Darwin arm64`. ## Target and artifact context Synthetic JSON qlog 0.3 with one trace and one custom extension event, accepted under the `aioquic-1.5.0-json-0.3` interpretation profile. No actual aioquic producer, live browser, device or external analysis provider was used. ## Interface CLI ## Earliest failure stage Capture or observation ## Relevant output or evidence Both CLI invocations exited 0. Selected output from the commands above: ```text redacted {"incomplete_fact_records":[0],"streams":[],"loss_declarations":[]} redacted reported {"name":"extension:custom","time":1} control {"incomplete_fact_records":[],"streams":[],"loss_declarations":[]} control reported {"name":"extension:custom","time":1,"data":{"body":"ordinary"}} ``` Separate CLI controls used a single packet-sent STREAM frame with stream ID 0, offset 0 and length 10. Explicit `fin: false` returned `incomplete_fact_records: []`; `fin: null` returned `[0]`. Both preserved `unique_bytes: "10"`. Each control ran once. ## Analysis or suspected cause Source-derived: `src/browser/history/QlogCapture.ts:231-234` appends an incomplete ordinal whenever projected event data is absent, before filtering packet/loss event names at lines 239 and 261. `packetEvent` at lines 376-377 recognizes only packet sent/received. This ordering explains the observed extension false positive. No source modification was made. ## Additional context Closed [#6598](https://github.com/morluto/rea/issues/6598) concerns missing incomplete entries for unknown STREAM FIN, rather than this extra entry. Closed [PR #2859](https://github.com/morluto/rea/pull/2859) concerns hidden packet/loss event names; its existing extension control in `src/browser/history/QlogCapture.test.ts:309-334` expects custom extensions to stay out of the inventory. Neither covers this hidden-data trigger. Open [#3133](https://github.com/morluto/rea/issues/3133) concerns performance measurement. No exact open duplicate was found. MCP and retained-view propagation were not executed. Proposed restoration check: repeat the failing case and controls, keeping extension ordinals absent while unknown STREAM FIN remains discoverable and the declared data remains hidden.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
morluto/rea#4400
No description provided.