Skip to content

Commit 4604fa2

Browse files
committed
Merge TASK-199: Deliver packaged public-capability and benchmark adapters
Publish archive-bound installed public-capability and native benchmark adapters with independent receipt validation, provenance checks, semantic rejection contracts, and documented execution evidence. TASK-185 retains final runner wiring and release acceptance. Nonlocal platform checks remain assigned to CI and the v3 PR.
2 parents ff83e59 + 0b37560 commit 4604fa2

31 files changed

Lines changed: 3729 additions & 60 deletions

‎.gitignore‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,3 +155,8 @@ __pycache__/
155155
!scripts/run-v3-native-benchmarks.py
156156
!scripts/test-v3-native-benchmark.py
157157
!test/installed/v3_benchmark_client.py
158+
159+
# TASK-199 packaged release adapters.
160+
!scripts/run-v3-packaged-adapters.py
161+
!scripts/check-v3-public-http1.py
162+
!scripts/test-v3-packaged-adapters.py

‎Makefile.am‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -590,3 +590,12 @@ EXTRA_DIST += scripts/run-v3-native-benchmarks.py scripts/lib/v3_native_benchmar
590590
scripts/test-v3-native-benchmark.py test/installed/v3_benchmark_consumer.cpp \
591591
test/installed/v3_benchmark_client.py docs/native-v3-benchmarks.md \
592592
specs/architecture/v3/TASK-198-evidence.md specs/architecture/v3/TASK-198-receipt.json
593+
594+
EXTRA_DIST += scripts/run-v3-packaged-adapters.py scripts/check-v3-public-http1.py \
595+
scripts/test-v3-packaged-adapters.py scripts/lib/v3_release_package_adapters.py \
596+
scripts/lib/v3_release_package_provenance.py test/installed/v3_websocket_consumer.cpp \
597+
docs/v3-packaged-release-adapters.md
598+
599+
EXTRA_DIST += test/installed/task199-capabilities.md \
600+
specs/architecture/v3/TASK-199-implementation-evidence.md \
601+
specs/architecture/v3/TASK-199-implementation-receipt.json

‎README.md‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@ There is no v2 source or ABI compatibility shim. Include native headers such as
3333
| Certificate rotation | Public `tls_credentials::replace`; accepted sessions retain immutable selections |
3434
| TLS-off encrypted listeners | Same declarations; typed `not_supported` before binding |
3535

36+
The [packaged release adapters](docs/v3-packaged-release-adapters.md) bind public
37+
capability and benchmark receipts to a distribution archive, staged installation
38+
and selected clients. See the [current capability report](test/installed/task199-capabilities.md).
39+
3640
Build native examples with `./bootstrap`, an out-of-tree configure using
3741
`CXX=clang++ CXXFLAGS='-std=c++20 -O0 -g'`, `--enable-examples` and
3842
`--disable-v3-tls`, then `make -j2`. For the optional native provider use

‎docs/native-tls-build.md‎

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,9 @@ in both builds, without backend headers or configuration macros. Availability of
2929
the provider is distinct from availability of TCP TLS, HTTP/2, and HTTP/3. TCP TLS is available in TLS-on builds for certificate, initial mTLS and eligible
3030
external-PSK HTTP/1.0 and HTTP/1.1 in both managed and external modes. Certificate
3131
and initial mTLS profiles also serve enabled HTTP/2 through TLS ALPN `h2`.
32-
HTTP/3 public listeners remain unavailable. `listen()`
33-
rejects unsupported protocol/profile requests before binding;
32+
HTTP/3 public listeners use explicit UDP endpoints with QUICv1, TLS1.3 and
33+
ALPN `h3`, with certificate or initial mTLS credentials in both loop modes.
34+
`listen()` rejects unsupported protocol/profile requests before binding;
3435
`server_options::validate()` remains semantic.
3536

3637
Run `make check-v3-native-linkage` in each mode. It inspects the executable behind
@@ -59,7 +60,8 @@ checks configure/build provenance, installed metadata, effective public headers,
5960
recursive dependency graphs and all static-archive members, including unused
6061
members. Provider build proof remains distinct from encrypted listener or QUIC
6162
interoperability proof. Nonlocal BSD, macOS and Windows execution belongs to CI
62-
and the v3 PR; public H2/H3 listeners remain later-task work.
63+
and the v3 PR. Installed public H2/H3 and credential/profile witnesses are
64+
composed by the [archive-bound release adapters](v3-packaged-release-adapters.md).
6365

6466
Run the clean installed-consumer matrix from a bootstrapped source checkout:
6567

@@ -248,8 +250,8 @@ ordinary HTTP use normal credentials; challenge sessions cannot route HTTP. This
248250
API performs no certificate issuance or challenge-client orchestration.
249251

250252
TLS-off installs identical declarations and secure key operations, with typed
251-
`not_supported` for credential/runtime/ACME availability. Public H2/H3 listeners
252-
remain later-task work; external PSK remains HTTP/1-only. The installed rotation
253+
`not_supported` for credential/runtime/ACME availability. Certificate and initial
254+
mTLS profiles support public H2/H3 listeners; external PSK remains HTTP/1-only. The installed rotation
253255
example takes `certificate-directory managed|external port`, opens a real public
254256
listener and accepts `replace`, `invalid` and `stop` on stdin. Its independent
255257
installed witness holds a usable connection across rotation and validates the
@@ -276,3 +278,12 @@ remaining requests and WebSockets at its absolute deadline. A retained ticket
276278
keeps the original deadline result; its remaining count describes unfinished
277279
work at expiry, even after actual retirement. A counted handler cannot wait
278280
on its own drain ticket.
281+
282+
## Current packaged capability evidence
283+
284+
The [TASK-199 report](../test/installed/task199-capabilities.md) identifies the
285+
current archive/install/tool inputs and independent receipt validation for
286+
shared/static consumers in managed/external modes. Supported TLS/H2/UDP-H3
287+
configurations bind and complete exchanges; missing credentials and invalid
288+
configurations retain their separate pre-bind rejection checks. Historical
289+
TASK-179 and TASK-182 records describe their original execution boundaries.

‎docs/native-v3-benchmarks.md‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,3 +113,15 @@ observations >=0.99 seconds, CPU/wall <=0.2 of one core and warm RSS growth
113113
`resource_limits`, installed public H2/H3 drivers and 90-second resource probe
114114
separately; benchmark throughput does not replace their proof. Private resource
115115
fixtures remain supporting evidence. Nonlocal platform checks belong to CI/v3 PR.
116+
117+
## Distribution-bound release adapter
118+
119+
[`run-v3-packaged-adapters.py`](v3-packaged-release-adapters.md) exposes the
120+
`native-throughput-latency` family with explicit archive digest, extracted
121+
source, build/install/provider/tool identities and a caller-selected run ID.
122+
Independent validation rehashes its complete retained artifacts and invokes
123+
the existing measurement/provenance validators. `--require-full-workload`
124+
rejects reduced measurements. The [TASK-199 integration report](../test/installed/task199-capabilities.md)
125+
uses 16 measured requests per cell across the complete four TLS-off and sixteen
126+
TLS-on cells; it is reduced integration evidence. Full workload defaults and
127+
TASK-185 release performance gates remain unchanged.

‎docs/v2-to-v3-migration.md‎

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,12 @@ TASK-193 adds public certificate TCP TLS through
185185
Associate a shared store with each TLS listener and publish PEM values with
186186
`replace`; accepted sessions retain immutable selections during replacement.
187187
Managed and external loops support the same HTTP/1 routes. TASK-194 extends
188-
installed witnesses to mTLS/PSK/ACME and live listener rotation. H2/H3 public
189-
listeners remain subsequent repair tasks; unsupported combinations retain typed
188+
installed witnesses to mTLS/PSK/ACME and live listener rotation. TASK-195 through
189+
TASK-197 provide public H2/H3 listeners and semantic/lifecycle integration; unsupported combinations retain typed
190190
pre-bind outcomes. TLS-off exposes the same declarations and typed unavailable
191191
credential/runtime operations.
192+
193+
Current distribution/install-aware execution and independently validated
194+
receipts are documented by [TASK-199](../test/installed/task199-capabilities.md)
195+
and the [packaged adapter interface](v3-packaged-release-adapters.md). Historical
196+
release inventories remain unchanged; TASK-185 owns final release acceptance.
Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
# Packaged release adapters
2+
3+
TASK-199 provides two bounded families for TASK-185 to call after updating from
4+
`v3`: `public-capabilities` and `native-throughput-latency`. The adapters do not
5+
import TASK-185, discover another checkout, select a fallback installation, or
6+
replace its release inventories. TASK-185 owns its final runner wiring and full
7+
release acceptance.
8+
9+
## Python interface
10+
11+
Import `scripts/lib/v3_release_package_adapters.py` from the extracted archive:
12+
13+
```python
14+
run_public_capabilities(inputs, output, run_id)
15+
run_native_benchmarks(inputs, output, run_id, workload)
16+
validate_public_receipt(path, expected_identity, expected_run_id)
17+
validate_benchmark_receipt(path, expected_identity, expected_run_id,
18+
require_full_workload=False)
19+
identity(inputs, workload=None)
20+
```
21+
22+
`inputs` is a mapping or argparse namespace with `archive`, `archive_sha256`,
23+
`source`, `build`, `prefix`, `provider_prefix`, `tls`, `compiler`, `client_python`,
24+
`node`, and `quic_go`. Paths identify the selected archive, its unchanged
25+
extraction, out-of-source build, staged installation and provider. `tls` is
26+
`yes` or `no`. Every execution uses a caller-selected new 32-character lowercase
27+
hexadecimal run ID and a previously nonexistent output directory. Existing
28+
outputs, including failed attempts, are preserved.
29+
30+
The supported clients are hyper-h2 4.4.1, aioquic 1.3.0, Node 24.15.0, and the
31+
quic-go v0.55.0 public client built from the distributed Go sources. The compiler
32+
must support C++20. TLS-on requires the explicitly selected OpenSSL 3.5 LTS
33+
provider. Public TLS ACME tests bind authentic TCP port 443; use the established
34+
isolated network namespace on hosts that cannot provide that port. Altering the
35+
port or trusting injected local-port metadata is not an alternative witness.
36+
37+
## CLI and independent validation
38+
39+
```sh
40+
CLIENT_PYTHON scripts/run-v3-packaged-adapters.py \
41+
--family public-capabilities \
42+
--archive ARCHIVE --archive-sha256 EXPECTED_SHA256 \
43+
--source EXTRACTED_SOURCE --build BUILD --prefix PREFIX \
44+
--provider-prefix PROVIDER --tls yes \
45+
--compiler COMPILER --client-python CLIENT_PYTHON \
46+
--node NODE --quic-go QUIC_GO --run-id RUN_ID --output NEW_OUTPUT
47+
```
48+
49+
Repeat with a distinct installation/build/output for TLS-off. Each public lane
50+
contains four shared/static × managed/external cells for H1, RFC6455, TLS, H2
51+
and H3. Encrypted protocols have typed pre-bind rejection witnesses in TLS-off.
52+
Supported credentials-backed TLS, H2 and explicit UDP H3 configurations bind
53+
and complete independent protocol exchanges in TLS-on; missing credentials,
54+
invalid configuration and mixed rollback remain separate negative cases.
55+
56+
Select `--family native-throughput-latency` for benchmarking. Defaults remain
57+
4096 measured requests, 256 warmup requests (protocol epochs may increase
58+
warmup), 1024-byte payloads, four workers, H1/H2 concurrency eight, H3 concurrency
59+
four, and a 300-second client deadline. `--requests 16 --warmup 4` is reduced
60+
integration evidence. It cannot satisfy `--require-full-workload`.
61+
62+
To validate in a new process, use the same selected inputs, workload and run ID
63+
with `--validate NEW_OUTPUT/receipt.json`. Validation rehashes the archive,
64+
extraction, build, installation, provider, tools and Python client modules. It
65+
reads evidence without modifying it. For full benchmark release proof add
66+
`--require-full-workload`; TASK-185 must also apply its existing release gates.
67+
68+
## Receipt schema and retained artifacts
69+
70+
The outer JSON receipt has `schema_version=1`, `family`, `status`, `run_id`,
71+
`identity`, `inventory`, `inventory_sha256`, `children`, `full_workload`,
72+
`artifact_roots`, `artifact_extras`, `artifacts` and `nonlocal_checks`. Failed
73+
attempts retain `status=failed` and `error` and cannot pass validation.
74+
75+
`identity` binds the archive digest and every regular distributed source member,
76+
source/build/install paths, installed header/library/pkg-config hashes,
77+
configuration hashes, provider files, executable hashes, pinned client versions
78+
and module hashes, and workload. Archive paths must be safe, consistent,
79+
unique and regular files/directories; symlink/hardlink members are rejected.
80+
A genuine extraction needs no `.git` directory.
81+
82+
`children` maps the exact family members to receipt artifact records. Every
83+
artifact record contains absolute `path`, `bytes` and `sha256`. The complete
84+
catalog covers child receipts, command outputs, process receipts, copied
85+
consumers/fixtures/client code, objects, depfiles, link maps, executable files
86+
and benchmark raw samples. Compilation must use installed public headers,
87+
C++20, and archive-distributed copied sources. Private headers, source/build
88+
includes and `HTTPSERVER_COMPILATION` cannot supply public proof. Every cell must retain its family's compile and dependency records, including
89+
H1 WebSocket, TLS profile/rotation, and H2/H3 example consumers where applicable.
90+
Static link maps must show contributing members from the selected installed
91+
archive and no foreign libhttpserver archive contribution; an unused LOAD entry
92+
cannot supply proof. Shared runtime inspection must resolve the selected
93+
installation. The first readiness line must contain at least one valid bound
94+
port. Readiness alone cannot
95+
supply response proof. Child inventories and decoded lifecycle/semantic
96+
observations remain subject to their original validators.
97+
98+
H1 validation requires exact HTTP/1.0 or HTTP/1.1 response prefixes and exactly
99+
two recorded persistent and pipelined responses. WebSocket peer-close evidence
100+
records actual pending receive entry, completion with the public
101+
`connection_closed` outcome, and handler retirement before server stop. The
102+
legacy `cancelled_receive` count represents this observed transport termination;
103+
it does not assert an `outcome_code::cancelled` result. TLS profile rows retain
104+
and validate positive and negative authentication, handler deltas, decoded
105+
responses, callback cancellation/retirement, SNI generations, session rotation,
106+
and applicable ACME observations independently of their scenario names.
107+
108+
TLS authentication rejection controls retain the independent provider client's
109+
exit 2 only with a decoded `connected=false` handshake and the exact bounded
110+
client argument shape. The explicit peer-close cancellation control retains its
111+
intentional killed-client terminal. These controls cannot supply a successful
112+
protocol exchange; positive clients and server cleanup must exit zero.
113+
114+
Keep the archive, extraction, builds, installs, provider, clients, output roots
115+
and recorded external consumer directories available for revalidation. Catalog
116+
pruning, deleted provenance, changed process output, altered samples/statistics,
117+
reused run IDs and different expected package/archive identities fail. Do not
118+
copy historical receipts into a new execution. Nonlocal BSD/macOS/Windows
119+
checks are explicitly unexecuted locally and belong to CI and the v3 PR.
120+
121+
## Contract checks
122+
123+
```sh
124+
python3 scripts/test-v3-packaged-adapters.py
125+
python3 scripts/test-v3-installed-consumer.py
126+
python3 scripts/test-v3-public-http2.py
127+
python3 scripts/test-v3-public-http3.py
128+
python3 scripts/test-v3-native-benchmark.py
129+
```
130+
131+
These dependency-free tests use temporary real artifacts and deterministic
132+
failure injection. Synthetic parsing fixtures are not live integration proof.
133+
Ordinary `make check` runs contracts, never the live network matrix or full
134+
benchmark. Fresh execution identities and outcomes are recorded separately in
135+
TASK-199 evidence, preserving historical TASK-179 classifications.

0 commit comments

Comments
 (0)