Skip to content

Commit ad6a5a2

Browse files
committed
Merge FEATURE-example-names: remove redundant filename prefixes
User-approved exception: merge the reviewed naming cleanup and then continue investigating the descendant-retirement socket contract and full TLS-on H3 RSS gate. Those failures remain unresolved and their validation evidence is preserved.
2 parents ecc410b + e71638b commit ad6a5a2

126 files changed

Lines changed: 811 additions & 765 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎.gitignore‎

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -133,13 +133,13 @@ __pycache__/
133133
!scripts/test-v3-package-workflow.py
134134
!scripts/prepare-v3-package-ci.py
135135

136-
!test/integ/v3_examples_test.py
136+
!test/integ/examples_test.py
137137
!scripts/test-v3-cutover.py
138138
!scripts/check-v3-runtime-coexistence.py
139139

140140
# TASK-185 release runner and dependency-free receipt contracts.
141141
!scripts/run-v3-release-gates.py
142-
!scripts/lib/v3_release_*.py
142+
!scripts/lib/release_*.py
143143
!test/integ/release_gate_runner_test.py
144144
!test/integ/release_artifact_test.py
145145

@@ -150,17 +150,17 @@ __pycache__/
150150
!scripts/check-v3-public-tls.py
151151
!scripts/check-v3-public-http2.py
152152
!scripts/test-v3-public-http2.py
153-
!test/installed/v3_http3_credentials.py
154-
!test/installed/v3_http3_semantics.py
155-
!test/installed/v3_http3_lifecycle.py
156-
!test/installed/v3_http3_qpack.py
153+
!test/installed/http3_credentials.py
154+
!test/installed/http3_semantics.py
155+
!test/installed/http3_lifecycle.py
156+
!test/installed/http3_qpack.py
157157

158-
!test/installed/v3_http3_flow.py
158+
!test/installed/http3_flow.py
159159

160160
# TASK-198 opt-in benchmark tools and contracts.
161161
!scripts/run-v3-native-benchmarks.py
162162
!scripts/test-v3-native-benchmark.py
163-
!test/installed/v3_benchmark_client.py
163+
!test/installed/benchmark_client.py
164164

165165
# TASK-199 packaged release adapters.
166166
!scripts/run-v3-packaged-adapters.py

‎Makefile.am‎

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -299,14 +299,14 @@ check-local: check-v3-compiled-operations check-headers check-examples lint-warn
299299
@rm -rf "$(abs_top_builddir)/.shared-check-stage"
300300

301301
# TASK-108 (PRD-V3N-REQ-001/002): the native TLS-off linkage audit.
302-
# Builds the v3_native_linkage program (v3core archive only) and runs
302+
# Builds the native_linkage program (v3core archive only) and runs
303303
# scripts/audit-v3-native-linkage.sh over it: a banned include in the
304304
# v3 surface or a third-party runtime library in the binary fails check.
305305
check-v3-native-linkage:
306306
@$(MAKE) -n -C src -W libhttpserver_v3core.la libhttpserver.la AM_LDFLAGS= >check-v3-cxx-link.log
307307
@grep -E -- '--tag=CXX.*--mode=link.*-o libhttpserver.la ' check-v3-cxx-link.log >/dev/null || { cat check-v3-cxx-link.log; echo "FAIL: aggregate must use the C++ linker"; exit 1; }
308308
@echo "=== check-v3-native-linkage: native provider surface audit ==="
309-
@$(MAKE) $(AM_MAKEFLAGS) -C "$(top_builddir)/test" v3_native_linkage >/dev/null
309+
@$(MAKE) $(AM_MAKEFLAGS) -C "$(top_builddir)/test" native_linkage >/dev/null
310310
@BUILD_DIR="$(abs_top_builddir)" SRC_DIR="$(top_srcdir)" V3_TLS_MODE="$(enable_v3_tls)" $(top_srcdir)/scripts/audit-v3-native-linkage.sh
311311

312312
# Enforce the explicit native v3 example source/build inventory.
@@ -550,35 +550,35 @@ EXTRA_DIST += docs/task-180-resource-limits.md
550550
EXTRA_DIST += docs/task-181-diagnostics.md
551551

552552
EXTRA_DIST += scripts/test-v3-installed-consumer.py scripts/test-v3-package-workflow.py scripts/prepare-v3-package-ci.py \
553-
scripts/lib/v3_package_matrix.py scripts/lib/v3_package_process.py scripts/lib/v3_package_commands.py \
554-
scripts/lib/v3_package_traffic.py scripts/lib/v3_package_integration.py docs/task-182-package-validation-evidence.md \
553+
scripts/lib/package_matrix.py scripts/lib/package_process.py scripts/lib/package_commands.py \
554+
scripts/lib/package_traffic.py scripts/lib/package_integration.py docs/task-182-package-validation-evidence.md \
555555
.github/workflows/v3-package-validation.yml
556556

557557
EXTRA_DIST += docs/v2-to-v3-migration.md docs/v3-api.md docs/task-183-migration-evidence.md examples/README.md
558558

559559
EXTRA_DIST += scripts/audit-v3-native-linkage.sh scripts/test-v3-cutover.py scripts/check-v3-runtime-coexistence.py docs/task-184-cutover-evidence.md
560560

561561
# Pre-tag gates are explicit; ordinary check runs only receipt contracts.
562-
EXTRA_DIST += scripts/run-v3-release-gates.py scripts/lib/v3_release_artifact.py \
563-
scripts/lib/v3_release_checks.py scripts/lib/v3_release_execution.py docs/task-185-release-gates.md
562+
EXTRA_DIST += scripts/run-v3-release-gates.py scripts/lib/release_artifact.py \
563+
scripts/lib/release_checks.py scripts/lib/release_execution.py docs/task-185-release-gates.md
564564
check-v3-release-gates:
565565
@python3 $(top_srcdir)/scripts/run-v3-release-gates.py $(RELEASE_GATE_ARGS)
566566
check-v3-tag-ready:
567567
@python3 $(top_srcdir)/scripts/run-v3-release-gates.py --check-tag-ready $(RELEASE_GATE_MANIFEST)
568568
.PHONY: check-v3-release-gates check-v3-tag-ready
569569

570-
EXTRA_DIST += scripts/check-v3-public-tls.py test/installed/v3_tls_consumer.cpp
570+
EXTRA_DIST += scripts/check-v3-public-tls.py test/installed/tls_consumer.cpp
571571

572-
EXTRA_DIST += scripts/lib/v3_public_tls_profiles.py test/installed/v3_tls_profiles.cpp test/installed/v3_tls_client.cpp
572+
EXTRA_DIST += scripts/lib/public_tls_profiles.py test/installed/tls_profiles.cpp test/installed/tls_client.cpp
573573
EXTRA_DIST += scripts/check-v3-public-http2.py scripts/test-v3-public-http2.py \
574-
scripts/lib/v3_public_http2_inventory.py scripts/lib/v3_public_http2_h2.py scripts/lib/v3_public_http2_policy.py \
575-
test/installed/v3_http2_consumer.cpp test/installed/v3_http2_node.mjs test/installed/v3_http2_raw.mjs \
576-
examples/v3_http2.cpp specs/architecture/v3/TASK-195-design.md \
574+
scripts/lib/public_http2_inventory.py scripts/lib/public_http2_h2.py scripts/lib/public_http2_policy.py \
575+
test/installed/http2_consumer.cpp test/installed/http2_node.mjs test/installed/http2_raw.mjs \
576+
examples/http2.cpp specs/architecture/v3/TASK-195-design.md \
577577
specs/architecture/v3/TASK-195-implementation-evidence.md specs/architecture/v3/TASK-195-receipt.json
578578

579579
EXTRA_DIST += scripts/test-v3-http3-full-gates.py scripts/check-v3-public-http3.py scripts/test-v3-public-http3.py \
580-
scripts/lib/v3_public_http3_inventory.py test/installed/v3_http3_consumer.cpp \
581-
test/installed/v3_http3_aioquic.py test/integ/http3-client-go/public.go
580+
scripts/lib/public_http3_inventory.py test/installed/http3_consumer.cpp \
581+
test/installed/http3_aioquic.py test/integ/http3-client-go/public.go
582582
EXTRA_DIST += specs/architecture/v3/TASK-196-design.md \
583583
specs/architecture/v3/TASK-196-implementation-evidence.md specs/architecture/v3/TASK-196-receipt.json
584584

@@ -595,21 +595,21 @@ bench:
595595
--output "$(BENCH_OUTPUT)" --tls "$(BENCH_TLS)" --compiler "$(CXX)" \
596596
--client-python "$(BENCH_PYTHON_COMMAND)" $(BENCH_ARGS)
597597
BENCH_PYTHON_COMMAND = python3
598-
EXTRA_DIST += scripts/run-v3-native-benchmarks.py scripts/lib/v3_native_benchmark.py \
599-
scripts/test-v3-native-benchmark.py test/installed/v3_benchmark_consumer.cpp \
600-
test/installed/v3_benchmark_client.py docs/native-v3-benchmarks.md \
598+
EXTRA_DIST += scripts/run-v3-native-benchmarks.py scripts/lib/native_benchmark.py \
599+
scripts/test-v3-native-benchmark.py test/installed/benchmark_consumer.cpp \
600+
test/installed/benchmark_client.py docs/native-v3-benchmarks.md \
601601
specs/architecture/v3/TASK-198-evidence.md specs/architecture/v3/TASK-198-receipt.json
602602

603603
EXTRA_DIST += scripts/run-v3-packaged-adapters.py scripts/check-v3-public-http1.py \
604-
scripts/test-v3-packaged-adapters.py scripts/lib/v3_release_package_adapters.py \
605-
scripts/lib/v3_release_package_provenance.py test/installed/v3_websocket_consumer.cpp \
604+
scripts/test-v3-packaged-adapters.py scripts/lib/release_package_adapters.py \
605+
scripts/lib/release_package_provenance.py test/installed/websocket_consumer.cpp \
606606
docs/v3-packaged-release-adapters.md
607607

608608
EXTRA_DIST += test/installed/task199-capabilities.md \
609609
specs/architecture/v3/TASK-199-implementation-evidence.md \
610610
specs/architecture/v3/TASK-199-implementation-receipt.json
611611

612-
EXTRA_DIST += scripts/lib/v3_examples.py scripts/lib/v3_example_consumers.py \
612+
EXTRA_DIST += scripts/lib/example_inventory.py scripts/lib/example_consumers.py \
613613
specs/architecture/v3/v2-parity-inventory.md
614614

615615
EXTRA_DIST += docs/v3-source-layout.md scripts/check-v3-compiled-operations.py
@@ -619,4 +619,4 @@ check-v3-compiled-operations: $(top_builddir)/src/libhttpserver.la
619619

620620
.PHONY: check-v3-compiled-operations
621621

622-
EXTRA_DIST += docs/v3-protocol-limits.md scripts/check-v3-protocol-limits.py test/installed/v3_protocol_limits_consumer.cpp
622+
EXTRA_DIST += docs/v3-protocol-limits.md scripts/check-v3-protocol-limits.py test/installed/protocol_limits_consumer.cpp

‎README.md‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1500,7 +1500,7 @@ libmicrohttpd was built without WebSocket support — `register_ws_resource`
15001500
throws `feature_unavailable`. See [Feature
15011501
availability](#feature-availability) for how to detect this at runtime
15021502
without preprocessor gates, and
1503-
[`examples/websocket_echo.cpp`](examples/websocket_echo.cpp) for a
1503+
[`examples/websocket_echo.cpp`](examples/legacy/websocket_echo.cpp) for a
15041504
worked example.
15051505

15061506
[Back to TOC](#table-of-contents)
@@ -1569,7 +1569,7 @@ ws.stop_and_wait();
15691569
```
15701570

15711571
See [`examples/daemon_info.cpp`](examples/daemon_info.cpp) and
1572-
[`examples/external_event_loop.cpp`](examples/external_event_loop.cpp)
1572+
[`examples/external_event_loop.cpp`](examples/legacy/external_event_loop.cpp)
15731573
for runnable demonstrations.
15741574

15751575
[Back to TOC](#table-of-contents)
@@ -1930,7 +1930,7 @@ to the canonical example for each topic covered in this manual.
19301930

19311931
* [`examples/daemon_info.cpp`](examples/daemon_info.cpp) — introspect
19321932
the running daemon (bound port, listen FD, active connections).
1933-
* [`examples/external_event_loop.cpp`](examples/external_event_loop.cpp) —
1933+
* [`examples/external_event_loop.cpp`](examples/legacy/external_event_loop.cpp) —
19341934
drive `EXTERNAL_SELECT` from the application's loop via `run_wait`.
19351935
* [`examples/custom_access_log.cpp`](examples/custom_access_log.cpp) —
19361936
server-wide access-log callback.
@@ -1950,7 +1950,7 @@ to the canonical example for each topic covered in this manual.
19501950

19511951
### WebSockets
19521952

1953-
* [`examples/websocket_echo.cpp`](examples/websocket_echo.cpp) —
1953+
* [`examples/websocket_echo.cpp`](examples/legacy/websocket_echo.cpp) —
19541954
`websocket_handler` subclass registered via `register_ws_resource`.
19551955

19561956
### Benchmarks

‎docs/external-loop-contract.md‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ joins workers without further host dispatch. Unregister host handles and
4545
quiesce callbacks before server destruction; destruction cannot overlap host
4646
calls. Snapshot copies never retain socket ownership.
4747
48-
The public-header-only `examples/v3_external_event_loop.cpp` uses POSIX `poll`
48+
The public-header-only `examples/external_event_loop.cpp` uses POSIX `poll`
4949
or Windows `WSAPoll`, retains each key/generation pair, and rebuilds its complete
5050
registration set after dispatch. It waits indefinitely when the library has no
5151
deadline. An optional positive seconds argument bounds the whole demonstration
@@ -54,8 +54,8 @@ invocation; it is not a periodic wake fallback.
5454
With an examples-enabled Autotools build:
5555
5656
```sh
57-
make -C _build/task-125/examples v3_external_event_loop
58-
_build/task-125/examples/v3_external_event_loop 10
57+
make -C _build/task-125/examples external_event_loop
58+
_build/task-125/examples/external_event_loop 10
5959
# Use the PORT printed by the example in a second terminal:
6060
curl --fail http://127.0.0.1:PORT/hello
6161
```

‎docs/native-tls-build.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@ installed witness holds a usable connection across rotation and validates the
258258
new certificate plus rejected-publication preservation.
259259

260260
Public HTTP/2 uses the same native server, route table, hooks, peer policy and
261-
exchange API as HTTP/1. See [the public example](../examples/v3_http2.cpp) and
261+
exchange API as HTTP/1. See [the public example](../examples/http2.cpp) and
262262
[TASK-195 design](../specs/architecture/v3/TASK-195-design.md). TLS-off
263263
configuration rejects HTTP/2 before binding. TLS 1.2 HTTP/2 rejects forbidden
264264
ciphers before publishing request hooks.

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

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,13 @@ TCP/TLS/QUIC transport evidence; these are different kinds of proof.
2020

2121
| Capability | Public native API status | Example or evidence |
2222
| --- | --- | --- |
23-
| Plaintext HTTP/1.0 and HTTP/1.1 | Managed and external listeners available | `v3_routes`, `v3_external_event_loop` |
24-
| HTTP/1.1 WebSocket Upgrade | Coroutine API available without legacy WS build flags | `v3_websocket_echo` |
25-
| Certificate TCP TLS HTTP/1 listeners | Public credential store, managed/external listeners in TLS-on builds | `test/installed/v3_tls_consumer.cpp` |
26-
| HTTP/2 and HTTP/3 listeners | TLS-on: TCP ALPN `h2`; explicit UDP QUICv1/TLS1.3 ALPN `h3`, managed/external | `v3_protocol_options`, `v3_http3` |
23+
| Plaintext HTTP/1.0 and HTTP/1.1 | Managed and external listeners available | `routes`, `external_event_loop` |
24+
| HTTP/1.1 WebSocket Upgrade | Coroutine API available without legacy WS build flags | `websocket_echo` |
25+
| Certificate TCP TLS HTTP/1 listeners | Public credential store, managed/external listeners in TLS-on builds | `test/installed/tls_consumer.cpp` |
26+
| HTTP/2 and HTTP/3 listeners | TLS-on: TCP ALPN `h2`; explicit UDP QUICv1/TLS1.3 ALPN `h3`, managed/external | `protocol_options`, `http3` |
2727
| HTTP/2 and HTTP/3 WebSocket | RFC8441/RFC9220 Extended CONNECT shares the bounded session API | Installed independent wire corpora |
28-
| Common HTTP/1.1, HTTP/2, HTTP/3 handlers | Semantic exchange contract exercised for each version | `test/unit/v3_examples_test.cpp` |
29-
| Certificate rotation | Public `tls_credentials::replace`, immutable accepted selections | `examples/v3_tls_rotation` (canonical source in `test/examples`), installed TLS runner |
28+
| Common HTTP/1.1, HTTP/2, HTTP/3 handlers | Semantic exchange contract exercised for each version | `test/unit/example_handlers_test.cpp` |
29+
| Certificate rotation | Public `tls_credentials::replace`, immutable accepted selections | `examples/tls_rotation` (canonical source in `test/examples`), installed TLS runner |
3030

3131
`server_options::validate()` checks configuration semantics. TLS-on encrypted
3232
listeners also require compatible published credentials. HTTP/3 requires a UDP
@@ -49,7 +49,7 @@ evidence supplements the retained private transport and Extended CONNECT gates.
4949
| Regex route and `{name\|regex}` constraints | Removed from the native route table | Match in application handlers or a prefix wrapper; reject an invalid capture there |
5050
| Route registration after start | Register before `listen()` | Native registrations return `invalid_state` after listen |
5151

52-
The [route example](../examples/v3_routes.cpp) registers GET and HEAD explicitly:
52+
The [route example](../examples/routes.cpp) registers GET and HEAD explicitly:
5353
HEAD is not an implicit promise that every GET route also accepts HEAD.
5454
Synchronous adapters have no streaming, upgrade, or suspension control. Use a
5555
coroutine exchange for those operations. They run on worker threads, so blocking
@@ -139,7 +139,7 @@ when an exchange has already committed or disconnected.
139139
| `stop()` called inside handler | `request_stop()` | Nonblocking initiation safe in handlers; cancels active exchanges, including the caller; no reply is guaranteed |
140140
| Controlling-thread shutdown | `stop()` | Joins workers; call outside counted handler work |
141141
| Graceful drain | `begin_drain(milliseconds, drain_ticket&)`, controlling-thread `ticket.wait(result)` | Deadline-bound completed/expired result; counted handler waits return `would_deadlock` |
142-
| `get_fdset`, `run`, `run_wait`, `add_connection` | External `readiness_driver::interests()` / `dispatch()` | Preserve generation tokens, host deadlines and worker wakeups; see `v3_external_event_loop` and the external-loop contract |
142+
| `get_fdset`, `run`, `run_wait`, `add_connection` | External `readiness_driver::interests()` / `dispatch()` | Preserve generation tokens, host deadlines and worker wakeups; see `external_event_loop` and the external-loop contract |
143143

144144
## Protocol framing and TLS migration
145145

@@ -168,15 +168,15 @@ cancellation without joining application code. Public ACME publication/removal
168168
uses application-supplied material and exact SNI/sole `acme-tls/1` on TCP443.
169169
Post-handshake auth remains unavailable; see the [public TLS lifetime contract](native-tls-build.md).
170170

171-
The [public listener rotation example](../test/examples/v3_tls_rotation.cpp)
171+
The [public listener rotation example](../test/examples/tls_rotation.cpp)
172172
uses `server::tls_credentials::replace()`: successful publication replaces the
173173
active generation, accepted sessions retain their contexts, and failed
174174
replacement leaves the active publication unchanged. It uses only installed
175175
public headers. `check-v3-public-tls.py` verifies selected certificates and held
176176
handshakes/connections across replacement through installed shared/static
177177
libraries. The private rotation suite remains supporting lifetime evidence. Build the public
178178
demonstration with `--enable-examples` and run
179-
`./examples/v3_tls_rotation CERTIFICATE_DIRECTORY managed 0`;
179+
`./examples/tls_rotation CERTIFICATE_DIRECTORY managed 0`;
180180
see the [complete example commands](../examples/README.md).
181181

182182
BSD, Windows and other nonlocal runs belong to CI and the v3 PR; the

‎docs/v3-api.md‎

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@ with TLS ALPN `h2`. Explicit UDP listeners serve QUICv1 HTTP/3 with ALPN `h3`.
1717
HTTP/2 has no cleartext upgrade or prior-knowledge listener.
1818
Provider availability from \ref httpserver::query_features is a separate fact.
1919

20-
\include v3_protocol_options.cpp
20+
\include protocol_options.cpp
2121

2222
External hosts drive \ref httpserver::server::readiness_driver interests,
2323
generations, wakeups and deadlines. See the [external loop contract](https://github.com/etr/libhttpserver/blob/v3/docs/external-loop-contract.md).
2424

25-
\include v3_external_event_loop.cpp
25+
\include external_event_loop.cpp
2626

2727
\section native_v3_routes Routes, exchanges and bodies
2828

@@ -38,8 +38,8 @@ reading with \ref httpserver::body_reader, commit before writing with
3838
\ref httpserver::response_definition and \ref httpserver::send_definition
3939
provide owned/reopened/leased body sources and per-send producers.
4040

41-
\include v3_routes.cpp
42-
\include v3_route_handlers.hpp
41+
\include routes.cpp
42+
\include route_handlers.hpp
4343

4444
See the [complete runnable example index](../examples/README.md#native-v3-examples)
4545
for request fields/cookies/query decoding, body admission/trailers, Basic/Digest,
@@ -66,10 +66,10 @@ canonical attribute ordering, SameSite=None and bounded GMT Expires behavior.
6666
writable; keep the session alive through close notification. The public example
6767
uses HTTP/1.1 Upgrade. Native H2 uses RFC8441 Extended CONNECT and native H3
6868
uses RFC9220 Extended CONNECT through the same operation. The public
69-
examples/v3_http3.cpp example demonstrates a certificate-backed UDP listener and
69+
examples/http3.cpp example demonstrates a certificate-backed UDP listener and
7070
keeps the WebSocket session alive through Close/FIN.
7171

72-
\include v3_websocket_echo.cpp
72+
\include websocket_echo.cpp
7373

7474
\section native_v3_shutdown Shutdown and outcomes
7575

@@ -92,7 +92,7 @@ runtime through actual callback retirement; native stop never joins application
9292
lookups. Public ACME publish/remove accepts application-supplied material and
9393
selects only exact SNI plus sole acme-tls/1 on authentic TCP443.
9494

95-
The installed public listener example at test/examples/v3_tls_rotation.cpp serves
95+
The installed public listener example at test/examples/tls_rotation.cpp serves
9696
requests across valid/rejected live replacement. Read the [TLS usage and lifetime
9797
contract](https://github.com/etr/libhttpserver/blob/v3/docs/native-tls-build.md).
9898
TLS-off retains the same declarations and typed unavailable operations.
@@ -136,7 +136,7 @@ MAX_STREAMS only after reliable FIN/reset acknowledgment; retained IDs cannot be
136136
recreated. The fixed lifetime history remains a connection envelope, even after
137137
live application charges return to baseline.
138138
139-
See `examples/v3_http3.cpp` for one route registry serving TCP H1/H2 and UDP H3,
139+
See `examples/http3.cpp` for one route registry serving TCP H1/H2 and UDP H3,
140140
with an RFC9220 echo route and either loop mode.
141141
142142
## Protocol capacity policy

‎docs/v3-packaged-release-adapters.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ release acceptance.
88

99
## Python interface
1010

11-
Import `scripts/lib/v3_release_package_adapters.py` from the extracted archive:
11+
Import `scripts/lib/release_package_adapters.py` from the extracted archive:
1212

1313
```python
1414
run_public_capabilities(inputs, output, run_id)

0 commit comments

Comments
 (0)