You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 94195e7
Browse filesBrowse the repository at this point in the historyBrowse files
Manual Groundwork implementation in `/home/etr/progs/libhttpserver/.worktrees/TASK-191`, branch `task/TASK-191`, from `v3` at `ed3b1441df190d3972c0944b0daa12aa3089f331`. The caller owns validation, finalization, merge and cleanup. Task tracking remains In Progress. No executor memory store was configured; reusable setup facts are retained here and in the journal.
4
+
5
+
## Verified cause and authorized scheduling amendment
6
+
7
+
Evidence root: `build/task191`. Invocation-unique journal: `.debug/h3-semantic-drain-1fn2v4xl/journal.md`. Immutable TASK-185 logs, manifests, process receipts, qlogs and captures were read and hashed in `retained-identities.json`. The retained capture shows accepted FIN packet 32, ACK only through 31, then authenticated client H3_NO_ERROR close 256. Fresh unchanged-source attempts 02–09 passed; bounded attempt 10 reproduced the fault: accepted FIN packet 33, ACK only through 32, then client close 256. Its bounded authenticated decoder slice is `reproduction-10/quic-go/causal-wire.tsv`. Original source copies and the original independently rebuilt client binary are retained with hashes.
8
+
9
+
The pinned quic-go v0.55.0 native H3 `Conn.clearStream` closes after GOAWAY when its final tracked request reaches EOF. Native application consumption can precede the delayed ACK for the server FIN. The server correctly interrupts its still-incomplete ticket upon authenticated peer closure. The fixture's historical `drain deadline expired` message describes its incomplete result; it does not establish five elapsed wall-clock seconds. Treating a clean close as an ACK would violate required receipt retirement and immutable incomplete outcomes. Forcing server PING timing would leave the race unresolved.
10
+
11
+
The first observation discriminator, `reproduction-green-01`, waited for native FIN ACK and the ticket before reading the response. It established successful server drain but failed the client response because this pinned stack discards unread buffered data at remote close. This failed attempt remains retained.
12
+
13
+
The caller explicitly authorized a client-only scheduling amendment after fresh reproduction. The positive schedule preopens stream 8 locally before drain and sends **no bytes or FIN** on it. Native H3 tracking then stays alive while the accepted response reaches EOF. A connection-specific tracer requires real outgoing ACK coverage of an actual accepted stream-0 FIN packet, followed by the original completed-ticket event and remote authenticated application close 256. The client cancels each half of the local hold once after closure. All observation/closure work shares the original five-second drain budget; there is no sleep, fabricated ACK, protocol-library change or server dependency on that local hold.
14
+
15
+
The original accepted stream 0, exact response status 200 and empty payload, preopened late stream 4 and rejection 267, ordered GOAWAY IDs 4611686018427387900 and 4, original deadlines, capture reconciliation, H1/H2 parity and all existing semantic predicates remain. `drain-ack-witness.json` identifies the actual qlog and FIN packet. Independent qlog validation rejects missing/gapped/out-of-order FIN ACKs, client closure before server closure, any wire frame naming stream 8, and any server observation naming that hold. The unchanged aioquic 1.3.0 client remains the independent control.
16
+
17
+
No production engine, recovery, transport, budget, cancellation or public API code changes. PRD-V3N-REQ-007/008/025/031/032/033 and architecture §§3.3–3.5 / DR-V3-001/006/008 continue to require one semantic exchange, connection-owned compression/recovery, serialized owner cancellation, reserved critical capacity and deadline-bound tickets. This private fixture work establishes no new public H3 listener capability.
18
+
19
+
## Deterministic contracts and causal RED/GREEN
20
+
21
+
`runner-red.log` contains five expected failing assertions on the original runner: final accounting masked the causal fixture failure, and unsolicited/duplicate/malformed accounting was not classified correctly. The repair treats accounting as a bounded teardown record, never as a semantic acknowledgement. It preserves stdout lifecycle ordering, rejects unknown lifecycle events, duplicate/malformed accounting and lifecycle output after accounting, and reports actual nonzero fixture exit with fully captured causal stderr. Cleanup nonzero status remains in `exits.json`. Successful artifact validation still requires exactly one final record and unchanged exact packet/byte reconciliation.
22
+
23
+
`go-red.log` fails at the missing native FIN-ACK observation assertion. `go-green.log` and `go-refactor-green.log` establish exact accepted-stream ownership, ACK gaps, retransmitted FIN coverage, nil/duplicate ACK stability. The final Go tests additionally cover bounded cancellation and exactly-once terminal notification, with `go-race.log` and `go-vet-final.log` retaining race-enabled tests and vet results. Refactoring isolates the connection-specific `drainACKWitness` from the existing flow observer.
24
+
25
+
`native-witness-red.log` fails the missing independent qlog predicate. Its GREEN verifies FIN → covering ACK → server close, rejects absent/reordered/gapped ACK evidence and a transmitted local hold. Final runner contract logs preserve semantic/full/WebSocket/QUIC checks; QUIC contract tests explicitly skip four endpoint-dependent cases when that unit invocation lacks `QUIC_INTEROP_ENDPOINT`. Actual endpoint/capture interoperability remains required separately by the aggregate gate.
26
+
27
+
The protected owner regression runs two explicit authenticated schedules over the same held request, GOAWAY output and late-stream rejection. FIN ACK followed by peer close completes with remaining 0; immediate peer close before that ACK stays incomplete with remaining 2. Both preserve exactly-once terminal claim, application-key disposal on silent draining, aliases until the protocol endpoint, final route detachment and immutable result across subsequent ticks/waits. It adds 60 checks to the existing owner suite: 34 cases / 393 checks. Existing drain tests retain unrelated completion rejection, partial/lost/reordered control output, QPACK retirement, multiple waiters, real deadline expiry, reset cancellation and pending-send lifetime. Existing owner tests retain protected cached close output, closing keys, pending UDP storage/debit and endpoint arbitration.
28
+
29
+
## Required local verification and receipts
30
+
31
+
Fresh normal and ASan/nonrecovering UBSan C++20 TLS-off/on lanes use Clang 18.1.3, `--disable-examples`, `-std=c++20 -pthread -O1 -g -fno-omit-frame-pointer`. TLS-on uses the retained genuine OpenSSL 3.5.9 prefix `/home/etr/progs/libhttpserver/build/tooling/provider`, its include/lib directories and `-lssl -lcrypto`. Sanitizers add `-fsanitize=address,undefined -fno-sanitize-recover=undefined -fsanitize-address-use-after-scope` and retain `ASAN_OPTIONS=detect_leaks=1:detect_stack_use_after_return=1:halt_on_error=1`, `UBSAN_OPTIONS=halt_on_error=1:print_stacktrace=1` outside ptrace. No sanitizer diagnostics are disabled or suppressed. An initial sandboxed configure hit the explicit LeakSanitizer ptrace failure; those logs were archived before unsandboxed execution. An initial owner test execution from the build root had test-root lookup errors; the corrected test-directory execution is the baseline evidence.
32
+
33
+
`run_lanes.py` records exact configure/library/scoped-test commands, environment, exits and durations. Library build precedes tests; TESTS/check_PROGRAMS/noinst_PROGRAMS are scoped together. The unchanged full-runner selections cover all H3/QUIC framing, stream, cancellation, drain, QPACK, lifecycle, scheduling, recovery, flow, pacing, identity, sizing and WebSocket suites; TLS-on adds handshake/provider/network-owner/interop suites and explicitly builds network/parity/QUIC fixtures.
Each off lane includes 46 littletest programs plus two standalone corpus/replay programs; each on lane adds seven littletest programs. The cases/checks columns count littletest assertions, with standalone corpus records validated independently by the full runner.
43
+
44
+
The authoritative completion evidence is the task-local lane `receipt.json` and `final-summary.json`; no missing or failing required gate can be replaced by this table. Normal/ASan independent semantic gates are retained at `semantic-normal-current` and `semantic-asan-final`. They require both original pinned stacks, executed H1/H2 parity, fresh exits/captures/qlogs and the original received GOAWAY/closure predicates. The complete nine-stage runner is retained at `full`, with its source/inventory/exclusion/tool/provider identities, authenticated QUIC interop, semantic matrix, RFC 9220 WebSocket matrix and actual fuzz-off/fuzz-on receipts. A successful local acceptance requires its `manifest.json` status `passed` and all nine stages; an aggregate stopping earlier is incomplete.
45
+
46
+
Tool identities: aioquic 1.3.0, quic-go v0.55.0, Go 1.25.1 from the retained tools, tshark 4.6.4 and the existing pinned upstream QUIC runner commit 740c05a10b61d65e8abd3ad38d60898004d335d9. Reusable caches remain at `/tmp/task185-tools/{gopath,gocache}`. Actual executable, provider, source, binary, library and receipt hashes are captured in aggregate/final task manifests. No new installed public-runtime witness is claimed because no public runtime path changed. No production concurrency change requires a new TSan lane; the client observer is race-tested separately. TASK-200 retains timer-teardown race ownership.
47
+
48
+
Changed C++ cpplint, Python compilation, Go vet/race tests, littletest result/skip contract and `git diff --check` are required local checks. Two retained runs of the unchanged external decoder's 50 ms absence contract hit process-start scheduling timeout under compiler load; unchanged rerun receipts record final outcome. This does not change the original witness deadline or substitute another gate. Nonlocal BSD/macOS/Windows/backend checks remain unexecuted and CI/v3-PR owned under AGENTS.md.
49
+
50
+
Archive `build/task191` and the unique `.debug` journal through the caller before cleanup. Preserve TASK-185 artifacts/status, TASK-200 ownership, unrelated FEATURE worktrees and the clean primary checkout. This executor performs no validation-loop, merge, cleanup, push, tag or publication.
0 commit comments