WAI for coding agents on the toolchain's names: wai mcp (toolsets core and dev, tools named by their operations), the room service's API with catalogue operationIds, wai setup-agent #505

Merged
dcharlot merged 7 commits from wai/dx-agent-mcp-2 into main 2026-10-27 10:14:04 -04:00
Owner

Replaces #500. The agent door on the toolchain names approved on 2026-10-27: wai mcp (agent.mcp), the room service's OpenAPI description, and wai setup-agent (agent.setup), rebased onto main (91cfa9d0, after #504) as a linear branch.

What is in it

Commits 1 to 3 are #500's three commits cherry-picked onto main, unchanged but for two conflict resolutions (the dispatch in wai.rs and the CHANGELOG). Commits 4 to 7 adopt the names.

One verb table. wai mcp and wai setup-agent are entries of dx::VERBS, beside hello, create, dev and verify. wai.rs no longer has a second COMMANDS table. A verb now ends in one of two ways. It is a check (0 held, 1 did not, 2 usage), or it returns a status from the toolchain's exit table, which setup-agent uses.

wai mcp: tools are operations, named by them, in toolsets. Each tool's entry names its catalogue operation. The tool name is that operation with _ for the dot, and nothing else names it. --toolset chooses the sets, and core is offered when none is named.

Toolset Tools
core envelope_inspect, registry_list, registry_show, receipt_verify, package_build, conformance_list, conformance_run, docs_search
dev dev_start, dev_stop, room_grant, room_join, room_leave, room_session
  • receipt_verify takes the four kinds the old verify_* tools each took one of: delivery, claim, room_session and audit_bundle. The kind is given in kind or read from the arguments, and the answer carries it.
  • The dev tools act on the target local alone, and refuse any other target. room_grant still refuses any service that is not on loopback, before it connects.
  • tools/list gives each tool's operation and toolset in _meta (wai/operation, wai/toolset).
  • The development room's program is found the way wai dev finds it: beside wai, then on PATH.
  • envelope_inspect counts what this build decodes the way wai inspect does, the floor included.
  • The quickstart's wai now holds the feature mcp, so the server that setup-agent registers is in the archive's binary.

wai::ops holds the naming rule: noun.verb, lowercase ASCII letters, the verb from the closed list. It also lists the few names the catalogue itself gives whose last word is not on that list (room.session, agent.mcp, toolchain.hello, toolchain.doctor, ops.schema, edge.derive, meter.calibrate, audit.report); those keep their names as given. The tool table and the API description are both tested against this rule.

wai setup-agent:

  • It always writes AGENTS.md. It touches CLAUDE.md only where the project already has one, and then adds an import of AGENTS.md to it.
  • --toolset registers the server with the toolsets it names.
  • Off a terminal it answers in the JSON envelope envelope/1: op, ok, error {code, message, hint, retryable} and result. On exit 4 the envelope also carries proposed and confirm.
  • Its exit statuses follow the toolchain's table: 2 usage, 3 permission, 4 confirmation required, 5 not found, 7 other I/O.

The room service's API. Each of the 40 operationIds in openapi.json is now a catalogue name:

  • room.show (GET /room) and room.grant (POST /grant) are taken from the catalogue as it gives them.
  • The rest follow the rule:
    • the service: service.show, service.check
    • admission: admission.show
    • end-to-end encrypted rooms: mls.tail, mls.import, mls.update
    • co-performance: performance.list, performance.show, schedule.create, handover.create, window.create, fidelity.create
    • watch rooms: time.show, source.fetch, watchchallenge.create, watch.tail, watch.show, watch.join, watch.update
    • remote desktop: control.grant, remote.show, remote.verify
    • conversations: conversation.show, .join, .tail, .import, .update, .leave, conversationchallenge.create, message.create, acknowledgement.create, member.delete
    • calls: callchallenge.create, call.create, call.invite, inbox.show, answer.create, call.show

The paths stay as the service serves them; none is under /v1/ today. The description now lists wai dev's front (/room-api) as a second server. In the contract test, each route row carries its operation name. The test checks:

  • the description gives each operation that name;
  • each name keeps the rule and names one operation;
  • room.show and room.grant are on the routes the catalogue gives them.

tests/mcp_dev_room.rs checks that the tool room_grant and POST /grant are the one operation, room.grant.

Checks

Check Host Result
cargo test --locked --no-default-features --features mcp --bin wai --test cli_mcp --test cli_setup_agent Framework (Linux) 17 + 10 + 6 passed
cargo test --locked --no-default-features --lib ops:: Framework 1 passed
cargo test --locked --no-default-features --features quickstart --bin wai --test floor --test cli_dx (DX-A's tests, with the new dispatch) Framework 18 + 2 + 3 passed
joule-moq-room: cargo test --locked --test openapi_contract --test mcp_dev_room Framework 4 + 1 passed
clippy (--bin wai --tests with mcp, with quickstart, with no feature; --lib for ops; joule-moq-room --all-targets) filtered to the touched files Framework none left, after the one this branch fixes (items after a test module)
check-tests-in-ci.py, check-workflow-concurrency.sh, check-spec-refs.py, check-wai-section-refs.py, check-no-vanity-metrics.sh, test-public-text-checks.sh, check-comparative-prose.sh, check-orphan-sources.py local all pass
check-public-names.sh on the changed files; the commit messages and this body against the same patterns (grep -E) local clean
wfsteps.py HEAD origin/main <#500 head> <this branch's CI commit>; the YAML parse of every workflow local 0 problems; parses

Falsifications

Each was run with the branch committed: break one thing, run the guarding test, then restore with git checkout --.

Broken Guard Result
tool docs.search renamed spec.search cli_mcp (the tool list is the catalogue's) 2 failed: the_handshake_and_the_tool_list, the_registry_and_the_specification
tool receipt.verify renamed receipt.get --bin wai (every_tool_is_an_operation_named_by_the_rule_once) failed: get is not one of the verbs
operationId of POST /watch/join set to watchJoin openapi_contract (every_operation_is_named_as_the_catalogue_names_it) failed: left: Some("watchJoin") right: Some("watch.join")
setup-agent writes CLAUDE.md where the project has none cli_setup_agent failed: no CLAUDE.md is made where the project has none

Not done

  • quantum toolset: not mounted. The quantum server's tools are named run_quantum_circuit, lint_qasm and so on, not quantum_*. Mounting it as it is would publish names that break the rule. Doing it properly would mean renaming its tools (a change to wai-quantum) or linking its engine into wai. wai-quantum mcp stays as it is, and no public text lists a quantum toolset.
  • No room_create or ops_search. The room service keeps one room, created when it starts, and dev_start starts it. There is no operation catalogue (wai ops) yet to search.
  • The dev tools still run joule-moq-room dev, not wai dev --json. wai dev has no control lines and no in-process participant yet.
  • The API's paths are not under /v1/. Moving them, behind a front that mounts /v1/rooms/{room}/, is a follow-up, so that deployed clients keep working.
  • MCP revision 2026-07-28 is not negotiated. The server answers 2025-06-18, 2025-03-26 and 2024-11-05.
  • No AGENTS.md in DX-A's examples yet.

🤖 Generated with Claude Code

Replaces #500. The agent door on the toolchain names approved on 2026-10-27: `wai mcp` (`agent.mcp`), the room service's OpenAPI description, and `wai setup-agent` (`agent.setup`), rebased onto main (`91cfa9d0`, after #504) as a linear branch. ## What is in it Commits 1 to 3 are #500's three commits cherry-picked onto main, unchanged but for two conflict resolutions (the dispatch in `wai.rs` and the CHANGELOG). Commits 4 to 7 adopt the names. **One verb table.** `wai mcp` and `wai setup-agent` are entries of `dx::VERBS`, beside `hello`, `create`, `dev` and `verify`. `wai.rs` no longer has a second `COMMANDS` table. A verb now ends in one of two ways. It is a check (0 held, 1 did not, 2 usage), or it returns a status from the toolchain's exit table, which `setup-agent` uses. **`wai mcp`: tools are operations, named by them, in toolsets.** Each tool's entry names its catalogue operation. The tool name is that operation with `_` for the dot, and nothing else names it. `--toolset` chooses the sets, and `core` is offered when none is named. | Toolset | Tools | |---|---| | `core` | `envelope_inspect`, `registry_list`, `registry_show`, `receipt_verify`, `package_build`, `conformance_list`, `conformance_run`, `docs_search` | | `dev` | `dev_start`, `dev_stop`, `room_grant`, `room_join`, `room_leave`, `room_session` | - `receipt_verify` takes the four kinds the old `verify_*` tools each took one of: `delivery`, `claim`, `room_session` and `audit_bundle`. The kind is given in `kind` or read from the arguments, and the answer carries it. - The `dev` tools act on the target `local` alone, and refuse any other target. `room_grant` still refuses any service that is not on loopback, before it connects. - `tools/list` gives each tool's operation and toolset in `_meta` (`wai/operation`, `wai/toolset`). - The development room's program is found the way `wai dev` finds it: beside `wai`, then on `PATH`. - `envelope_inspect` counts what this build decodes the way `wai inspect` does, the floor included. - The quickstart's `wai` now holds the feature `mcp`, so the server that `setup-agent` registers is in the archive's binary. **`wai::ops`** holds the naming rule: `noun.verb`, lowercase ASCII letters, the verb from the closed list. It also lists the few names the catalogue itself gives whose last word is not on that list (`room.session`, `agent.mcp`, `toolchain.hello`, `toolchain.doctor`, `ops.schema`, `edge.derive`, `meter.calibrate`, `audit.report`); those keep their names as given. The tool table and the API description are both tested against this rule. **`wai setup-agent`:** - It always writes `AGENTS.md`. It touches `CLAUDE.md` only where the project already has one, and then adds an import of `AGENTS.md` to it. - `--toolset` registers the server with the toolsets it names. - Off a terminal it answers in the JSON envelope `envelope/1`: `op`, `ok`, `error {code, message, hint, retryable}` and `result`. On exit 4 the envelope also carries `proposed` and `confirm`. - Its exit statuses follow the toolchain's table: 2 usage, 3 permission, 4 confirmation required, 5 not found, 7 other I/O. **The room service's API.** Each of the 40 `operationId`s in `openapi.json` is now a catalogue name: - `room.show` (`GET /room`) and `room.grant` (`POST /grant`) are taken from the catalogue as it gives them. - The rest follow the rule: - the service: `service.show`, `service.check` - admission: `admission.show` - end-to-end encrypted rooms: `mls.tail`, `mls.import`, `mls.update` - co-performance: `performance.list`, `performance.show`, `schedule.create`, `handover.create`, `window.create`, `fidelity.create` - watch rooms: `time.show`, `source.fetch`, `watchchallenge.create`, `watch.tail`, `watch.show`, `watch.join`, `watch.update` - remote desktop: `control.grant`, `remote.show`, `remote.verify` - conversations: `conversation.show`, `.join`, `.tail`, `.import`, `.update`, `.leave`, `conversationchallenge.create`, `message.create`, `acknowledgement.create`, `member.delete` - calls: `callchallenge.create`, `call.create`, `call.invite`, `inbox.show`, `answer.create`, `call.show` The paths stay as the service serves them; none is under `/v1/` today. The description now lists `wai dev`'s front (`/room-api`) as a second server. In the contract test, each route row carries its operation name. The test checks: - the description gives each operation that name; - each name keeps the rule and names one operation; - `room.show` and `room.grant` are on the routes the catalogue gives them. `tests/mcp_dev_room.rs` checks that the tool `room_grant` and `POST /grant` are the one operation, `room.grant`. ## Checks | Check | Host | Result | |---|---|---| | `cargo test --locked --no-default-features --features mcp --bin wai --test cli_mcp --test cli_setup_agent` | Framework (Linux) | 17 + 10 + 6 passed | | `cargo test --locked --no-default-features --lib ops::` | Framework | 1 passed | | `cargo test --locked --no-default-features --features quickstart --bin wai --test floor --test cli_dx` (DX-A's tests, with the new dispatch) | Framework | 18 + 2 + 3 passed | | `joule-moq-room`: `cargo test --locked --test openapi_contract --test mcp_dev_room` | Framework | 4 + 1 passed | | clippy (`--bin wai --tests` with `mcp`, with `quickstart`, with no feature; `--lib` for `ops`; `joule-moq-room --all-targets`) filtered to the touched files | Framework | none left, after the one this branch fixes (items after a test module) | | `check-tests-in-ci.py`, `check-workflow-concurrency.sh`, `check-spec-refs.py`, `check-wai-section-refs.py`, `check-no-vanity-metrics.sh`, `test-public-text-checks.sh`, `check-comparative-prose.sh`, `check-orphan-sources.py` | local | all pass | | `check-public-names.sh` on the changed files; the commit messages and this body against the same patterns (`grep -E`) | local | clean | | `wfsteps.py HEAD origin/main <#500 head> <this branch's CI commit>`; the YAML parse of every workflow | local | 0 problems; parses | ## Falsifications Each was run with the branch committed: break one thing, run the guarding test, then restore with `git checkout --`. | Broken | Guard | Result | |---|---|---| | tool `docs.search` renamed `spec.search` | `cli_mcp` (the tool list is the catalogue's) | 2 failed: `the_handshake_and_the_tool_list`, `the_registry_and_the_specification` | | tool `receipt.verify` renamed `receipt.get` | `--bin wai` (`every_tool_is_an_operation_named_by_the_rule_once`) | failed: `get is not one of the verbs` | | `operationId` of `POST /watch/join` set to `watchJoin` | `openapi_contract` (`every_operation_is_named_as_the_catalogue_names_it`) | failed: `left: Some("watchJoin") right: Some("watch.join")` | | `setup-agent` writes `CLAUDE.md` where the project has none | `cli_setup_agent` | failed: `no CLAUDE.md is made where the project has none` | ## Not done - **`quantum` toolset: not mounted.** The quantum server's tools are named `run_quantum_circuit`, `lint_qasm` and so on, not `quantum_*`. Mounting it as it is would publish names that break the rule. Doing it properly would mean renaming its tools (a change to `wai-quantum`) or linking its engine into `wai`. `wai-quantum mcp` stays as it is, and no public text lists a quantum toolset. - **No `room_create` or `ops_search`.** The room service keeps one room, created when it starts, and `dev_start` starts it. There is no operation catalogue (`wai ops`) yet to search. - **The dev tools still run `joule-moq-room dev`, not `wai dev --json`.** `wai dev` has no control lines and no in-process participant yet. - **The API's paths are not under `/v1/`.** Moving them, behind a front that mounts `/v1/rooms/{room}/`, is a follow-up, so that deployed clients keep working. - **MCP revision 2026-07-28 is not negotiated.** The server answers 2025-06-18, 2025-03-26 and 2024-11-05. - **No `AGENTS.md` in DX-A's examples yet.** 🤖 Generated with [Claude Code](https://claude.com/claude-code)
`wai mcp` (the feature `mcp`) is a Model Context Protocol server (2025-06-18) on
standard input and output. Its tools, in one table (src/bin/wai_cli/mcp/tools.rs):
inspect an envelope or a package; list and describe registered capabilities; verify a
delivery receipt, a claim with the context the tool takes, a live-room session and a
stream audit bundle, each answering with the verifier's verdict and reason code;
package a media file under `wai wrap`'s rules, inside the project directory only; list
and run a conformance corpus's independent verifier; search the specification; and,
marked development only, drive a development room on loopback (`joule-moq-room dev`):
start it, mint grants for test principals (any service whose address is not a loopback
address is refused before a connection is made), join and publish as them, read the
session, stop it. Each tool carries safety hints; `--read-only` offers only those that
read or run a verifier.

`wai setup-agent` writes AGENTS.md and CLAUDE.md (which imports it) and registers the
server in the project's MCP configuration files by their documented formats. A file
that exists is changed only after its diff is shown and confirmed (asked on a terminal,
or --confirm; otherwise exit 4 with every diff and the confirming command), --dry-run
writes nothing, nothing outside the project directory is written, and its output is
JSON off a terminal.

Both are reached through one table of verbs in wai.rs, so a name is one line. `wrap`
returns its printed lines and its facts, which the packaging tool reads.

tests/cli_mcp.rs drives the binary with an MCP client: every tool, and the verifiers
agreeing vector by vector with jwp-conformance, claim-conformance,
live-conformance/rooms and live-conformance/audit. tests/cli_setup_agent.rs runs the
command in scratch projects, fresh and with files that exist.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
`joule-moq-room dev` (src/dev.rs) runs the relay and the room service in one process
on loopback, with keys made at start and kept only in memory, media held to no
receipts and rate limits open, and says on standard error that it is for development
only. It answers JSON control lines: join (a test principal enters with its grant and
a proof, publishes audio and video, and the answer waits for the clock's join and
publishes), leave, session (the room as live-rooms §9 gives it to a verifier) and
stop. Its log goes to standard error. tokio's io-std feature, for its standard input
and output.

openapi.json describes every route of the service in each of its modes: requests,
answers and statuses. tests/openapi_contract.rs holds it to the code: the routes the
routers match are exactly its operations; each status it lists for an operation is one
the operation's handlers return, and each status they return is listed; and the
service, run beside a relay in each mode (a plain room, end-to-end encryption,
admission by age, co-performance, a watch room, a remote desktop room, a conversation,
calls, and without its relay), answers every operation with a status it lists.

tests/mcp_dev_room.rs builds `wai` with the feature `mcp` in a target directory of its
own and drives `wai mcp` with an MCP client: a development room started, two test
principals granted, joined and publishing, the session verified, a changed record
refused, a leave verified, and a grant from a service off the machine refused.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
wai-conformance runs tests/cli_mcp.rs and tests/cli_setup_agent.rs, with the binary's
unit tests, under the feature `mcp` on each leg. The room service's workflow runs every
target, and now says what tests/openapi_contract.rs and tests/mcp_dev_room.rs hold.
wai/README.md says how a project is set up for a coding agent and what `wai mcp`
offers; CHANGELOG records both commands and the API description.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
The two verbs join the one table, dx::VERBS, beside hello, create, dev and
verify; wai.rs keeps no second command table. A verb ends either as a check
(0 held, 1 did not, 2 usage) or with an exit status of the toolchain's table,
which setup-agent uses.

wai mcp (agent.mcp): each tool is an operation of the catalogue, named by it
with `_` for the dot, and nothing else names it. The tools come in toolsets,
chosen with --toolset (core when none is named):
- core: envelope_inspect, registry_list, registry_show, receipt_verify,
  package_build, conformance_list, conformance_run, docs_search;
- dev: dev_start, dev_stop, room_grant, room_join, room_leave, room_session,
  on the target local alone (a target named must be it).
receipt_verify takes the four kinds the verify tools took one each (delivery,
claim, room_session, audit_bundle), by `kind` or read from the arguments, and
answers with the kind beside the verifier's verdict. tools/list gives each
tool's operation and toolset in its _meta. The development room's program is
found as wai dev finds it: beside wai, then on PATH. envelope_inspect counts
what this build decodes as wai inspect does, the floor included.

wai setup-agent (agent.setup): AGENTS.md always; a CLAUDE.md only where the
project has one, which gains an import of AGENTS.md. --toolset registers the
server with those toolsets. Off a terminal it answers in the toolchain's JSON
envelope (envelope/1: op, ok, error {code, message, hint, retryable}, result,
and on exit 4 the proposed changes and the confirming command), with the
table's exit statuses: 2 usage, 3 permission, 4 confirmation required, 5 not
found, 7 another I/O error.

wai::ops holds the rule operation names keep: noun.verb, lowercase letters,
the verb from a closed list, and the few names the catalogue gives as they are
(room.session among them). The quickstart's wai holds `mcp`, so the server
setup-agent registers is in the archive's binary.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
openapi.json names its 40 operations as the toolchain's catalogue does,
noun.verb: room.show (GET /room) and room.grant (POST /grant) as the catalogue
gives them, and the rest by its rule (service.show and service.check, the
health; admission.show; mls.tail, mls.import, mls.update; performance.list
and .show, schedule.create, handover.create, window.create, fidelity.create;
time.show, source.fetch, watchchallenge.create, watch.tail, watch.show,
watch.join, watch.update; control.grant, remote.show, remote.verify;
conversation.show, .join, .tail, .import, .update, .leave,
conversationchallenge.create, message.create, acknowledgement.create,
member.delete; callchallenge.create, call.create, call.invite, inbox.show,
answer.create, call.show). The paths stay as the service serves them. The
description lists the service behind wai dev's front (/room-api) as a server.

tests/openapi_contract.rs gives each operation its name beside its handlers and
checks that the description names it so, that each name keeps wai::ops's rule
and names one operation, and that room.show and room.grant are the routes the
catalogue gives them. tests/mcp_dev_room.rs drives `wai mcp --toolset core,dev`
under the new tool names and checks that the tool room_grant and POST /grant
are the one operation room.grant, and that no other tool shares an API
operation's name.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
wai-conformance runs `--lib ops::` beside the mcp and setup-agent tests, and
its comment says what they now hold (the tool list as operations, toolsets,
the dev tools' target, setup-agent's envelope and exit statuses). The room
service's workflow comment says the contract test checks every operationId.
wai/README.md gives the toolsets and their tools, and setup-agent's CLAUDE.md
and --toolset; the room service's README the operationIds; the CHANGELOG
entry is rewritten for the names.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
wai mcp: the tools table's test module after every item (clippy items_after_test_module)
All checks were successful
standards workspaces build + test / joule-code-rs (joule-code/joule-code-rs, joule-code-rs, linux-arm64, true) (pull_request) Successful in 8m42s
WAI conformance / delivery telemetry · CMCD and CMSD against an independent library (pull_request) Successful in 27s
WAI conformance / cross-arch byte-equality · linux-arm64 (pull_request) Successful in 38s
WAI conformance / C2PA manifest emission · signed, read back, validated (pull_request) Successful in 1m52s
WAI conformance / each feature of the independent verifiers' steps compiles alone (pull_request) Successful in 11m5s
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Successful in 10m13s
WAI HTTP delivery / HTTP corpus · every patch and mutation in exactly one shard (pull_request) Successful in 7s
WAI conformance / cargo-class corpora · linux-arm64 (pull_request) Successful in 23m46s
WAI HTTP delivery / HTTP corpus · verified both ways, and the differential (pull_request) Successful in 2m55s
WAI examples / WAI examples · android-app · linux-arm64 (pull_request) Successful in 7m0s
WAI HTTP delivery / cache rules · controls and labelled caches (pull_request) Successful in 1m16s
wai-pack / wai-pack · the floor through a media prober (pull_request) Successful in 24s
wai-pack / wai-pack · linux-arm64 (pull_request) Successful in 1m35s
wai-pack / wai-pack · dependency licences (pull_request) Successful in 1m21s
wai-sink-android native sink library / the JNI layer and the platform-free half on the host JVM · linux-arm64 (pull_request) Successful in 2m24s
wai-pack / wai-pack · independent verifier (Python) (pull_request) Successful in 6m54s
wai-audit collector and player integration / collector, player integration and the browser end to end · macos (pull_request) Successful in 1m41s
standards workspaces build + test / macOS energy backends (pull_request) Successful in 11m37s
WAI conformance / cross-arch byte-equality · macos (pull_request) Successful in 36s
WAI conformance / codec wrappers · fuzz smoke, text decode limits, C entry points, provenance, the semantic path (pull_request) Successful in 1m11s
WAI energy receipts / energy receipts · macos (pull_request) Successful in 9m20s
wai-ledger service / service · macos (pull_request) Successful in 1m28s
WAI conformance / cargo-class corpora · macos (pull_request) Successful in 27m49s
WAI conformance / independent verifiers · claims, JWP, key discovery and integer payloads (Python) (pull_request) Successful in 1h9m8s
wai-ops-gpu integer operators on GPUs / Metal GPU and browser WebGPU (macos) (pull_request) Successful in 15m28s
WAI examples / WAI examples · the archive, the readiness check, the browser and Apple · macos (pull_request) Successful in 18m18s
wai-pack / wai-pack · macos (pull_request) Successful in 4m44s
wai-quantum studio and desktop / desktop app · macos (pull_request) Successful in 4m52s
wai-sink-android native sink library / every ABI, the AAR, and the instrumented tests in a headless emulator · macos (pull_request) Successful in 10m38s
wai-sink-swift native sink package / libwai slices, desktop tests, simulator tests · macos (pull_request) Successful in 20m17s
bff1736e36
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Sign in to join this conversation.
No reviewers
No labels
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
Transaction-Science/open-standards!505
No description provided.