~0x64616E69656C
project 03 / research result 01 / detection A / 2026-10-22

No new mechanism.
That is the result.

An isolated 138-request experiment found that unmodified nginx can identify predefined response-contract contradictions with existing maps and access-log metadata. The result is retrospective detection — not evidence of application safety or pre-delivery containment.

R0 PASS / NO NEW MECHANISM
nginx 1.31.7 · TLS 1.3 · HTTP/1.1
Stock observation only; no response filter, Lua, WAF or source patch.
138
primary HTTP requests
23
cases × 3 repetitions × 2 arms
9 / 9
injected status/size signals detected
69 / 69
A/B client response comparisons matched
Experimental finding / R0 completeHTTP/2 + HTTP/3 + containment / NOT RUN
01 / RESULT

A useful answer
without a new filter.

The previous read-only source audit concluded that stock nginx should be sufficient for R0. The synthetic A/B validation supported that conclusion for its predefined status and declared-size contracts.

DETECTION / VERIFIED IN R0

Every injected metadata contradiction was flagged.

Six of six status contradictions and three of three declared-size contradictions were detected in the B arm. The remaining 60 of 60 B records were silent, including all required legitimate controls and deliberately incomplete streaming outcomes.

Content-type classification was present, but a type-only positive contradiction was not injected. This experiment does not establish body-only detection.

RESPONSE EQUIVALENCE / VERIFIED IN R0

The observer did not alter the compared responses.

All 69 paired A/B client comparisons matched selected response headers, exact in-memory payload and completion outcome. The Date header was excluded and redirect target paths normalized for the two lab listeners.

Every B log record reconciled with its expected request. These are bounded synthetic correctness results, not a general proof of zero runtime overhead.

Scope of “NO NEW MECHANISM”: stock map classification and log-phase metadata were sufficient for these R0 fixtures. The result does not establish inline detection, response replacement, exploitation detection, protection against origin side effects, or behavior under HTTP/2 and HTTP/3.
02 / METHOD

Same executable.
One controlled difference.

The experiment ran on loopback using an owned synthetic origin, a verified, unmodified nginx binary and a controlled HTTP/1.1 client over TLS 1.3. No nxTLS experiment or production configuration was changed.

A / STOCK BASELINE

No additional observation.

Ordinary stock proxy response handling. Access logging disabled for the experiment. No filters, body scanning, compression or interception; response buffering disabled on the main fixtures.

B / STOCK OBSERVATION

Maps and one bounded log.

The same executable and response configuration with built-in nginx map variables and one allowlisted JSON metadata access log. No custom module, Lua code or response modification.

FIXTURE CONTRACT

A reviewed static oracle keyed by method, route and listener-bound synthetic authorization context; neither request headers nor origin responses could rewrite expectations.

EXECUTION

23 cases, three repetitions, alternating A/B then B/A then A/B. One outstanding request; fresh nginx, origin and cache per arm and repetition.

CLIENT VALIDATION

TLS certificate and hostname checked. HTTP framing and decoded payload validated in memory, independently of TLS reads, chunks and nginx output counters.

Main fixtures used disabled proxy response buffering, compression, retries and error interception in both arms. The cache control enabled identical stock proxy buffering/cache. Normal nginx/TLS working buffers still existed.

03 / TEST MATRIX

The positives mattered.
So did the negatives.

Every case below passed in A and B in all three repetitions. “Silent” describes the expected metadata-classifier result, not proof that the origin was safe or the client received a complete response.

23 cases × 3 repetitions × 2 arms = 138 primary requests. All A/B comparisons passed.
CaseSynthetic response / controlB classificationClient outcome
normalExpected normal 200silentcomplete
invalid-matchInvalid route with expected 404silentcomplete
invalid-injectedInvalid route returns unexpected 200status flaggedcomplete
restricted-deniedDenied context with expected 403silentcomplete
restricted-injectedDenied context returns unexpected 200status flaggedcomplete
restricted-allowedAllowed context legitimately returns 200silentcomplete
error-matchExpected bounded 500 responsesilentcomplete
error-injected500 with accurate declared length of 32,768 bytessize flaggedcomplete
stream-completeAll three controlled portions arrivesilentcomplete
stream-delayControlled 50-ms delays between gated portionssilentcomplete
stream-truncateOrigin stops after validated 512-byte prefixsilenttruncated
stream-cancelControlled client closes after 256-byte prefixsilentcancelled
unusualLegitimate unusual-route 200silentcomplete
redirectExpected 302, not followedsilentcomplete
headHEAD with declared length, no payloadsilentcomplete
no-contentLegitimate 204 without payloadsilentcomplete
not-modifiedLegitimate 304 without payloadsilentcomplete
partialValid 206 with Content-Rangesilentcomplete
proxyOrdinary proxied responsesilentcomplete
cache-missMISS populates bounded synthetic cachesilentcomplete
cache-hitHIT avoids a new origin requestsilentcomplete
internal-redirectUpstream 404 → final 200 via X-Accel-Redirectsilentcomplete
side-effectOrigin increments in-memory counter, normal 200silentcomplete

B logged 69/69 expected records. Six status flags and three declared-size flags were raised; 60 records remained unflagged. Cache was MISS then HIT in all six arm runs. The internal redirect consistently preserved the distinction between upstream 404 and final 200. No required control was left uncovered.

04 / BOUNDARIES

An OK in the log
is not a receipt.

The most useful R0 findings may be its deliberate blind spots. They establish what response metadata cannot responsibly be made to say.

OBSERVED / INCOMPLETE RESPONSE

Server says OK.
Client says truncated.

In all three B runs of stream-truncate, nginx logged 200 and request_completion=OK. The controlled client independently validated a 512-byte prefix but detected incomplete chunked framing.

This is not evidence of an nginx defect: its request-completion state does not promise a complete, client-validated HTTP response.

OBSERVED / INVISIBLE SIDE EFFECT

An ordinary response
can hide other work.

The synthetic origin incremented a private in-memory counter before sending the same normal 200 response. The harness verified the counter separately. The B observer correctly raised no response-contract flag.

Matching status, type and size do not exclude application side effects, compromise or state carried between requests.

The response is evidence.
Not necessarily the truth.Know what was observable. Log-phase status, counters and request_completion do not prove origin safety, a server-side commit point or client receipt.
Additional distinction: an intentional client cancellation was recorded as incomplete; its cause was known from the harness, not inferred from status 200. The B log sees request finalization retrospectively and cannot interrupt a still-running response.
05 / COST + PRIVACY

No changed responses.
No free-cost claim.

The functional comparison was bounded. Coarse process and time buckets are sufficient for initial diagnostics, not for microbenchmark conclusions or production sizing.

Exploratory observations; three repetitions per case, not a statistically powered cost campaign.
MeasurementArm A / StockArm B / Maps + logInterpretation
Request-to-TTFB69 samples: 10–99 ms69 samples: 10–99 msSame coarse buckets; no precise latency equality
Outcome endpoint66: 10–99 ms; 3 delayed: 100–999 msSame bucket countsTruncated and cancelled endpoints are not success
nginx CPU10–99 ms / 23-request arm10–99 ms / 23-request armCoarse kernel ticks; no resolved delta
Sampled max RSSBelow 8 MiB in all runs8–15 MiB in all runsObserved difference, not isolated allocation cost
Response semanticsReference69/69 comparisons matchedNo differences in compared client outcomes
EVIDENCE BUDGET

Bounded metadata, not body capture.

Largest retained event record: 359 bytes against a 512-byte limit. Total retained evidence stayed below 1 MiB. Records contain allowlisted classes, timing/size buckets and validation states — no response bodies, captured raw headers, credentials, queries, addresses or stable client IDs.

OBSERVATION TIMING

Retrospective by construction.

Every B record declares phase=log and server_commit_point=unknown. Declared Content-Length, nginx output counters and client-validated length remain separate quantities. An upstream header time is not client TTFB.

The validated first-payload milestone was a read-unit prefix of up to 256 bytes, not necessarily the first individual payload byte. Timing began after the TLS handshake. A fixed 150-ms log-settling wait was outside client timing.

06 / OPEN QUESTIONS

Scoped metadata
detection verified.
Containment is not.

The semantic oracle can be reused as a hypothesis in later protocols. The transport mechanisms, response commitment and costs require their own evidence.

HTTP/2 / NOT RUN

Per-stream correlation, END_STREAM and RST_STREAM, output-frame accounting, HPACK, flow control, GOAWAY and neighboring-stream fairness remain unvalidated.

HTTP/3 / NOT RUN

QUIC buffers and retransmission, stream FIN/reset, QPACK, flow control, packet loss and actual client prefix receipt need independent study.

CONTAINMENT / NOT RUN

No early detection, clean replacement, stream abort, response buffering strategy, challenge or daemon intervention was implemented or measured.

Further limits: no concurrency/fairness campaign, precise CPU or per-request memory microbenchmark, TLS segmentation trace, body-only detection or type-only injected positive control. Nothing in R0 establishes production readiness or protection from a vulnerability.

The research stops here for R0. A future experiment would require its own scope and authorization. An observed absence of a need for new code is a valid endpoint, not a mandate to invent the next mechanism.

07 / PROVENANCE

Source pinned.
Limitations retained.

The result comes from a separately authorized, isolated R0 lab. Local evidence and earlier inconclusive setup attempts were preserved without mixing them into the primary 138-request result.

Experiment date
2026-10-22
nxTLS revision
a7986bd6f1d349772172fa62130432fee74eba40 (main, clean before and after)
nginx
1.31.7 / unmodified verified baseline; no third-party addons, patch or rebuild
Compiler / TLS
Clang 21.1.8 / static BoringSSL 594a44291086dcc7cef06cabec4c0b47afd674c0
nginx archive
523 staged and vendored regular source files matched the pinned archive; SHA-256 89ea8a3dc171511f7325043b50e4c036248d9fad5feb7ec809c0b82d5df42c65
Binary SHA-256
f2342202b88270a85742690faf8f6e7fda27f5b4e7ca251da6096d5ff8b7292a; corroborates the existing baseline receipt, not a new reproducible-build proof
Local lab only
/tmp/response-aware-edge-security-r0/ with oracle.json, nginx.conf.in, r0.py, README.txt, REPORT.txt and retained runtime evidence. These artifacts are not served by this public page.
Diagnostics
Initial socket-permission and logging setup issues and a corrected X-Accel-Redirect fixture assumption remain recorded as inconclusive attempts. The task executed 164 HTTP requests total, including 26 diagnostic requests excluded from the 138-request primary matrix.

The lab used unprivileged IPv4 loopback endpoints, ephemeral TLS test certificates and synthetic content only. Processes were cleaned up; nxTLS source/decisions, BoringSSL, website and private nginx configuration were not modified by the experiment. Source pin verification is distinct from a public source release or independently repeated result.