Conversation
Wire up the reviewer-audience (8 subcommands) and admin-audience (12 subcommands) CLI binaries on top of the trace-commons-operator-client foundation crate. Each binary takes a top-level --endpoint, --bearer-token-env, --allowed-hosts, and --json flag and delegates per-endpoint typing to the foundation Client. A shared operator_common module exposes table / kv / map rendering helpers consumed by both bins via #[path = ...]. Coverage matches the Ironclaw reference handlers in crates/ironclaw_reborn_cli/src/commands/traces.rs at the same paths (/v1/review/*, /v1/admin/*, /v1/benchmarks/*, /v1/datasets/replay, /v1/analytics/summary).
This was referenced May 19, 2026
zmanian
added a commit
that referenced
this pull request
May 20, 2026
Lands the four-PR stack (#124, #125, #126, #127) as a single squash commit on main. ## What's in this squash **1. `trace-commons-operator-client` foundation crate** (was #124) - `Client` wrapper around `reqwest::Client` with bearer-token resolution from env, host allowlist enforcement, typed error mapping for `{"error": "<Label>"}` refusals. - Error taxonomy: `BearerMissing`, `InvalidEndpoint`, `HostNotAllowed`, `Transport`, `HttpFailure`, `ServerLabel`, `MalformedResponse`. `Error::user_diagnostic()` strips query strings + fragments. - `HostAllowlist` (CSV, exact-match, case-insensitive) sourced from `--allowed-hosts` or `TRACE_COMMONS_ALLOWED_HOSTS`. - Output helpers: `JsonEnvelope` wrapper for `--json` mode, ASCII table renderer, key-value block renderer. **2. `trace-commons-review` (8 cmds) + `trace-commons-admin` (12 cmds)** (was #125) - Single shared bearer per binary (`TRACE_COMMONS_REVIEWER_BEARER`, `TRACE_COMMONS_ADMIN_BEARER`). - 37 binary tests across both (parse-through, body validation, wiremock round-trips). **3. `trace-commons-worker` (8 cmds) + `trace-commons-tenant` (11 cmds)** (was #126) - Worker uses per-subcommand bearer envs (8 distinct env vars, one per route gate). Verified by `worker_per_route_bearer_resolution_uses_distinct_envs`. - Tenant uses single shared `TRACE_COMMONS_TENANT_BEARER`. - Operator runbook at `docs/operator/operator-binaries.md`. - CI smoke job `operator-binaries-smoke` in `.github/workflows/ci.yml`, sibling to `pilot-bootstrap-smoke`. **4. Privacy-filter-canary port** (was #127) - New `trace_commons_operator_client::privacy_filter` module: `PrivacyFilterAdapter` trait, `CommandPrivacyFilterAdapter`, `SafePrivacyFilterRedaction`, `adapter_from_env`, `canary_leaked_tokens`. Wire shapes byte-identical to Ironclaw's sidecar protocol. - Dual-name env-var compat: `TRACE_COMMONS_PRIVACY_FILTER_*` canonical, `IRONCLAW_TRACE_*` legacy fallback with warn-on-use. - `trace-commons-tenant privacy-filter-canary` stub replaced with the real handler. ## Operator surface added | Binary | Cmds | Bearer model | |---|---:|---| | `trace-commons-review` | 8 | Single `TRACE_COMMONS_REVIEWER_BEARER` | | `trace-commons-admin` | 12 | Single `TRACE_COMMONS_ADMIN_BEARER` | | `trace-commons-worker` | 8 | Per-subcommand defaults | | `trace-commons-tenant` | 11 | Single `TRACE_COMMONS_TENANT_BEARER` | | **Total** | **39** | | These mirror the 39 operator commands removed from Ironclaw in nearai/ironclaw#3738. ## Verification ``` cargo check --workspace --all-targets (-D warnings) # clean cargo test --workspace --no-run (-D warnings) # clean cargo clippy --workspace --all-targets (-D warnings) # clean cargo test -p trace-commons-operator-client # 39 passed cargo test -p trace-commons-server --bins # all green bash scripts/operator/operator-smoke.sh # SmokeOperatorBinariesOK ``` Superseded PRs (closed): #124, #125, #126.
3 tasks
Collaborator
Author
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Context
PR #2 of the three-PR stack bringing operator-side CLI workflows to this repo. Stacked on #124 (the
trace-commons-operator-clientfoundation). Companion to the prune in nearai/ironclaw#3738 — these binaries take over 20 of the 39 operator commands that left Ironclaw.Merge order: #124 first, then this PR.
What lands
Two new binaries under
crates/trace-commons-server/src/bin/, both depending ontrace-commons-operator-client:trace-commons-review(8 cmds) — gated byTRACE_COMMONS_REVIEWER_BEARERquarantine-listGET /v1/review/quarantineactive-learning-review-queueGET /v1/review/active-learningreview-decisionPOST /v1/review/decisionreview-lease-claimPOST /v1/review/lease/claimreview-lease-claim-nextPOST /v1/review/lease/claim-nextreview-lease-claim-batchPOST /v1/review/lease/claim-batchreview-lease-releasePOST /v1/review/lease/releaseappend-credit-eventPOST /v1/review/credit-eventtrace-commons-admin(12 cmds) — gated byTRACE_COMMONS_ADMIN_BEARERmaintenance-runPOST /v1/admin/maintenance/runretention-jobs-listGET /v1/admin/retention/jobsretention-job-itemsGET /v1/admin/retention/jobs/{id}/itemsexport-access-grants-listGET /v1/admin/export/access-grantsexport-jobs-listGET /v1/admin/export/jobsbenchmark-convertPOST /v1/admin/benchmark/convertbenchmark-lifecycle-updatePOST /v1/admin/benchmark/lifecyclereplay-dataset-exportPOST /v1/admin/replay/dataset-exportreplay-export-manifestsGET /v1/admin/replay/export-manifestsanalytics-summaryGET /v1/admin/analytics/summaryoperational-summaryGET /v1/admin/operational/summaryconfig-statusGET /v1/admin/config/statusAuth model
Each binary takes a single top-level
--bearer-token-env <ENV>flag (defaults:TRACE_COMMONS_REVIEWER_BEARER/TRACE_COMMONS_ADMIN_BEARER). No per-subcommand bearer overrides here — that's worker territory and lands in PR #3.CLI surface
Both binaries share the foundation flag set:
--endpoint <URL>orTRACE_COMMONS_ENDPOINT--bearer-token-env <NAME>--allowed-hosts <CSV>orTRACE_COMMONS_ALLOWED_HOSTS--json(global; switches every subcommand to theJsonEnvelopewrapper format)Tests
Verification
Net diff
3 files added (2 binaries + shared
operator_commonrendering helpers), 1 modified (Cargo.toml). +2,555 LOC.Deviations from the Ironclaw reference at
3b5ca1fde:crates/ironclaw_reborn_cli/src/commands/traces.rsreplay-dataset-exportalways parses the response body asserde_json::Value(orNullfor empty) before writing to--output. Ironclaw used apretty_trace_commons_bodyhelper; the foundation client returns the raw body which we either pretty-print or pass through verbatim.config-statusis JSON-only in the reference; preserved here (the--jsonflag is a no-op for it, the response is always pretty-printed JSON).operational-summarynon-JSON rendering is simplified (field: valuelines + nested maps viarender_json_maprather than the reference's per-section compact totals). Fields are all present; layout differs.maintenance-runnon-JSON rendering omits the reference's audit-chain / reconciliation extra-section lines and renders only the documented scalar field set.--jsonmode forwards the full server response unchanged.Out of scope
docs/operator/operator-binaries.md) — lands with PR dstack enclave design: KEK strategy brief + private vector spec #3 once all four binaries exist.scripts/operator/operator-smoke.sh— lands with PR dstack enclave design: KEK strategy brief + private vector spec #3.🤖 Generated with Claude Code