Skip to content

Rewrite the CLI in Rust as a 2.x minor release with full parity #72

Open

Description

@rmcdaniel

Decision

Native Server 3.0 is released. The CLI moves from PHP to Rust and ships as a CLI 2.x minor release: 2.5.0, or the next free minor after #61's 2.4.0. The operator directed the rewrite; General approved the scope below on 2026-11-03.

Version decision (General, 2026-11-03, reversing the earlier 3.0.0 plan). The rewrite keeps every command, flag, JSON shape and exit code, so semver makes it a minor release. A major version would also break PHP Server compatibility. Published PHP Server 2.11.8 advertises client_compatibility.clients.cli.supported_versions: ">=2.0.0,<3.0.0", and the CLI warns on every command when its version is outside that range. No further PHP Server releases are planned, so the range will not widen. Native Server does not constrain the CLI version. General will ask Server to advertise a client-compatibility block in 3.1.0 with ranges that admit the 2.x line.

Users keep the same dw command, install path and automation contract. Nobody should need to change a script, profile or pipeline because the implementation language changed.

Scope

  • Same repository, same dw binary name, same release channels, installers, Homebrew formula and dw upgrade path.
  • The Rust CLI depends on the published durable-workflow crate from sdk-rust, pinned to the latest qualified release. Missing client capabilities are filed as sdk-rust issues. Client code is not copied into the CLI.
  • The PHP implementation (PHAR and static-PHP binaries) is in maintenance until the Rust release ships: security and correctness fixes only. After that the PHAR gets a published deprecation date.
  • The release notes state plainly that the implementation changed (a static Rust binary instead of the PHAR or static-PHP). Asset names and install channels stay the same, so dw upgrade moves 2.3.x users with no action on their part.

Acceptance

  1. Command parity. Every command group in the 2.x CLI exists with the same names, arguments, options, environment variables and profile config file. Any intentional difference is listed in the release's upgrade notes with a reason.
  2. Automation contract. --output=json and --output=jsonl produce the same envelopes, validated against the published schemas/output manifests. Exit codes keep their current categories (usage, network, authentication, not-found, server, timeout, compatibility).
  3. Parity harness. A repository command runs the PHP 2.x and Rust binaries against published Server 2.11.8 (PHP) and native Server 3.0.5. It compares stdout JSON shapes, exit codes and stderr categories after normalizing timestamps and ids. Stderr must also match on PHP 2.11.8, so the Rust 2.x build triggers no compatibility warning there. It runs in CI for each migrated slice.
  4. Correctness contracts carry over. Fixes made to the PHP CLI during the rewrite are reproduced in Rust with the same tests. That includes Preserve the selected run identity during bulk cancellation #59 (bulk cancel targets the exact selected run) and the human-output sanitization from Expose command keys with safe human output and exact JSON values #61.
  5. Release integrity from day one. The Rust release workflow keeps exact-source builds, SHA256SUMS, SLSA attestations and public-download verification. It also uploads every asset before publication for stable releases and prereleases, so immutable releases (Make published CLI releases immutable without breaking asset publication #64) can be enabled without weakening the PHAR path. Code from the release (installers, the published dw) runs only in read-only jobs, never in the job that holds write or OIDC permissions (Run post-release verification outside the privileged release job (MEDIUM) #75).
  6. Installed qualification. Before the Rust release is called delivered, the published binaries are installed through each installer and pass the harness against the published Servers above.

Plan

Each slice is a draft PR labelled agent:cli with Security review (or General while Security is out).

  1. Preserve the selected run identity during bulk cancellation #59 fixed in PHP and released as 2.3.4.
  2. Rust skeleton: Cargo crate, profile/config loading, output envelopes, exit codes, and the parity harness with one command wired through.
  3. Slices: workflow, namespace and schedule first, then the remaining groups (activity, worker, task-queue, search-attribute, schema, system, env, server, storage, query/workflow tasks, service-call, bridge, debug/doctor/watch/upgrade).
  4. Release workflow for the Rust binaries, then the 2.x minor release and installed qualification.

Related: #59, #60, #61, #64.

Activity

  1. added
    kind:featureA public product capability or experience is requested
    priority:P1High-priority product or release risk
    repo:cliOwned by the CLI repository
    status:in-progressApproved work is actively being implemented or validated
    on Nov 3, 2026
  2. rmcdaniel commented on Nov 3, 2026

    @rmcdaniel
    MemberAuthor

    Known issue (General's decision, 2026-11-03): the raw worker commands (workflow-task:poll and related) in the 2.x CLI fail against native Server 3.0.x because native omits the worker-protocol protocol_version body field. The fix ships in Server 3.1.0 (durable-workflow/server#1001). No client workaround goes into the PHAR. The Rust CLI keeps the same body check, so its parity harness runs those commands against 3.1.0 or later.

  3. changed the title [-]Rewrite the CLI in Rust for 3.0.0 with full 2.x parity[/-] [+]Rewrite the CLI in Rust as a 2.x minor release with full parity[/+] on Nov 4, 2026
  4. rmcdaniel commented on Nov 4, 2026

    @rmcdaniel
    MemberAuthor

    Version decision updated in the body: the Rust CLI ships as a 2.x minor (2.5.0 or the next free minor), not 3.0.0. PHP Server 2.11.8 advertises CLI support >=2.0.0,<3.0.0 and won't be re-released, so a 3.0.0 CLI would warn on every command against PHP 2.x Servers. The rewrite is non-breaking, so semver makes it a minor anyway.

  5. rmcdaniel commented on Nov 4, 2026

    @rmcdaniel
    MemberAuthor

    Step 2 is merged: #76 (b460f0e1) adds the Rust skeleton, the 2.x command catalog and the parity harness.

    • Ported: option parsing, profiles, output modes, error envelope, exit codes, env:*, server:health, and 2.x command lookup/listings.
    • Parity: against published 2.3.5 on published PHP 2.11.8 and native 3.0.5, 72/73 cases match with 0 unexpected.
    • Accepted difference, for the release notes: 2.x prints its single-suggestion "Do you want to run …?" prompt to stdout even when stdin is not a terminal. The Rust build prompts only on a terminal.

    General's requirements before any Rust release (2.5.0):

    Next slice: the compatibility preflight and server:info.

  6. rmcdaniel commented on Nov 4, 2026

    @rmcdaniel
    MemberAuthor

    Progress: #79 is merged (28e3a04c). It ports the compatibility preflight, session and --version warnings, exit-8 refusals, server:info/cluster:info and PHP-exact JSON encoding, and CI compares the compatibility checks against the 2.x PHP classes. #80 (per-command --help parity) is in review.

    Recorded follow-up from #79's review: php::float_to_json rounds ties at 1e14 and above half-up, where PHP uses half-to-even (for example 1149865714285714.2). Fix before 2.5.0.

  7. rmcdaniel commented on Nov 4, 2026

    @rmcdaniel
    MemberAuthor

    Planning note for the remaining command slices: path encoding of IDs.

    Most 2.x workflow commands put IDs and names into the URL without encoding them. Affected:

    • redrive, archive, history:export, query, signal and update;
    • watch ("/workflows/{$workflowId}/runs/{$runId}").

    Only five commands use rawurlencode, for example activity:describe. In 2.x, an ID containing /, ?, #, % or a space therefore reaches a different route or query, or fails.

    The Rust port builds paths through the SDK's segment encoder (sdk-rust#183, which is rawurlencode-compatible). For those IDs it sends the route the user meant, so it will differ from 2.x on exactly those inputs. For IDs made only of unreserved characters (A-Za-z0-9-._~), the requests are byte-identical.

    Proposal: encode every segment and list this as an intentional difference in the release notes. The alternative is to reproduce the unencoded paths. I'll add parity cases that keep IDs to unreserved characters, plus one case per affected command that records the difference.

  8. rmcdaniel commented on Nov 4, 2026

    @rmcdaniel
    MemberAuthor

    Decision (General, 2026-11-03): encode every path segment, and list it as an intentional difference in the 2.5.0 release notes. Do not reproduce the 2.x unencoded paths: an unencoded ../ or ? in an ID is a path-injection risk, not only a wrong route.

    Condition: parity cases against both published Servers (PHP 2.11.8 and native 3.0.5) with IDs containing /, a space, %, ? and #. Each must reach the right workflow, or get a clean 404 or validation refusal; it must never reach a different route. Server mishandling of %2F gets filed against server with a repro, not worked around in the CLI.

    Probe results today (both Servers, raw HTTP):

    Request PHP 2.11.8 native 3.0.5
    start with /, space, %, ?, #, @ or ~ in workflow_id 422 validation_failed 422 validation_failed
    start with : or . in workflow_id 201 201
    GET /api/workflows/a%20b, a%25b, a%3Fb, a%23b, %2E%2E 404 JSON instance_not_found, decoded id same
    GET /api/workflows/cli%3Aenc describes cli:enc describes cli:enc
    GET /api/workflows/a%2Fb, ..%2Fhealth 404 Apache HTML page (no JSON) 404 JSON, workflow_id a/b / ../health
    • No request reached another route on either Server.
    • The only mishandling is PHP Server's HTML 404 for %2F. Apache's default AllowEncodedSlashes Off causes it, and it is filed as server#1013.
    • Because neither Server accepts / in a workflow ID, the impact is the missing JSON refusal, not an unreachable workflow.
    • : is a valid ID character that the Rust CLI sends as %3A while 2.x sent it raw. Both Servers decode it to the same workflow, so the request is equivalent.

    Plan for the slices: each ported command that takes an ID or name in its path gets parity cases against both Servers:

    • /, space, %, ? and # IDs, which expect the clean 404 or 422; the PHP %2F case is recorded as an expected difference citing server#1013;
    • a : ID that reaches the real workflow.

    The same applies to other path segments (signal, query and update names, schedule and activity IDs) as those commands land.

  9. rmcdaniel commented on Nov 4, 2026

    @rmcdaniel
    MemberAuthor

    cli#81 merged as ae2c3c6, with a tree equal to the cleared head 1d35507. Review nits carried to the next slice:

    • Keep raw non-UTF-8 argv bytes (today they print as U+FFFD) before any command that takes a file-path argument is ported.
    • Parse SHELL_VERBOSITY with PHP (int) semantics (-1x → quiet).
    • Resolve a $SHELL with a trailing slash the way basename does.
    • format_status: split and lowercase ASCII only.
    • A mismatched closing style tag throws, as Symfony does.
    • Unclaimed differences: --output=-h validation order; dw -- -h.
  10. rmcdaniel commented on Nov 4, 2026

    @rmcdaniel
    MemberAuthor

    Two more items to decide in the command slices, both raised by sdk-rust#183's clearance:

    • Redirects. The SDK never follows them (Policy::none); a 3xx comes back as a RawResponse. The 2.x Server client used Symfony HttpClient's default: it follows up to 20 redirects and drops Authorization when the host changes. Plan: report a 3xx as an error and never re-send the bearer token to the Location. Record it as an intentional difference, with a parity case using the mock Server.
    • --tls-verify=false. 2.x prints no warning. The SDK logs one warn on the durable_workflow::tls target. Plan: install no tracing subscriber by default, so stderr stays byte-identical to 2.x; revisit if Security wants a visible warning.
  11. rmcdaniel commented on Nov 4, 2026

    @rmcdaniel
    MemberAuthor

    Release workflow decisions (General, 2026-11-03). All three defaults were accepted, with conditions:

    1. dw.phar is dropped in 2.5.0.
      • Before the cut, neither the cli README nor durable-workflow.github.io may contain dw.phar download instructions. Grep both and send a docs PR.
      • The removal goes at the top of the release notes, with the replacement command.
      • All other asset names are unchanged. dw-*.dependencies.json becomes a Cargo.lock inventory under a new schema id.
    2. A separate release-rust.yml with a two-way version gate. release-rust.yml releases only versions >= 2.5.0; release.yml refuses them.
      • The release.yml refusal merges before any 2.5.0 tag exists.
      • A static test pins both gates.
      • The PR-only build and verify path holds no secrets and no id-token.
      • release.yml retires after 2.5.0.
    3. dw upgrade is a release gate. The critical path is the published 2.x upgrade code (latest stable: 2.3.5) fetching 2.5.0 under the asset names it already expects.
      • Port the Rust upgrade command, with parity.
      • End-to-end check: install the latest published 2.x, run dw upgrade to a 2.5.0 candidate release, and confirm the binary is checksum-verified and runs.
      • Run it for both the PHAR-install and the binary-install paths, on linux x86_64, linux aarch64 and macOS arm64.
  12. rmcdaniel commented on Nov 4, 2026

    @rmcdaniel
    MemberAuthor

    2.5.0 notes review (General, 2026-11-03). The wording is approved. Additions due before the tag:

    • A Windows verified path: download, Get-FileHash against SHA256SUMS, attestation, copy; no iex (cli#85).
    • --tls-verify=false must warn on stderr (security requirement). 2.x printed no warning, so list this as an intentional difference. This replaces my earlier "no subscriber" plan.
    • Under intentional differences, once that slice lands: "3xx responses are reported as errors, and the token is never re-sent."
    • Keep "2.x standalone binaries upgrade with dw upgrade" only if the release-gate e2e check (published 2.3.5 → candidate, all 3 platforms) passes. Name any failing platform explicitly.
    • Cite the actual parity numbers from the final run in the version-bump PR.
    • PHAR-migration text sent to durable-workflow-github-io.
  13. 30 remaining items

  14. rmcdaniel commented on Nov 4, 2026

    @rmcdaniel
    MemberAuthor

    General approves the proposed single next source slice in6641873059: workflow:list and only the SDK transport adapter required for it, using the accepted public Rust SDK4.12.0 raw API. CLI owns implementation after the bounded61 maintenance correction. Preserve namespace selection, filters/pagination, exact output envelopes, error/exit categories, compatibility preflight and all accepted completion/doctor/runtime/security behavior. Add mock/PHP parity and no-request/refusal/error controls, then one ordinary draft with exact CI and independent Security review.

    The static audit is accepted as a release-readiness finding: current18/86 executable command coverage,68 unavailable commands and skipped live parity templates do not qualify stable2.5.0. Continue subsequent command groups as distinct source slices and keep the explicit Intel-installer/TLS gaps in the plan. No broader port, live Server experiment, tag/publisher or stable selector change is admitted by this decision.

  15. rmcdaniel commented on Nov 4, 2026

    @rmcdaniel
    MemberAuthor

    Current source order and concrete advancement: #61 safety correction and #102 P1 lock repair are accepted on actual main 0ce81284363ae3bc0832b95282d79ee0b3552834; public SDK =4.12.0 / checksum 620a8287af73c363dac61f0a91f20971a39f3b8cdc9513fbea85cdbd95a74ba4 is unchanged. The Rust command surface still has the previously recorded 18/86 executable coverage and 68 unavailable commands; neither the lock repair nor maintenance controls adds a handler or qualifies stable 2.5.0.

    The P1 distribution path is now concrete: maintenance source #103 is merged; its CI constraint is corrected on #104 successor c14c7868, which has 12/12 fresh checks and awaits independent Security carry / General normal merge, then actual-target acceptance. CLI prepared the separate current-main PHP/Rust/reconciliation control repair with 120 local passing controls, still unpushed behind that checkpoint. General's latest source order places that repair next, followed by the separate Server520 history-export help truth correction. No larger CLI slice is mixed into the security/control changes.

    CLI then owns the already approved workflow:list plus only its required public-SDK raw-request adapter. Inspection confirms the SDK can provide the existing namespace/auth/base-path/TLS/protocol headers through one raw request; no second HTTP client or retry layer is needed. Preserve the PHP command's filter/page-size behavior, compatibility preflight, Server envelope and namespace enrichment, human/JSON/jsonl output, refusal/error/exit categories and unsafe remote-text handling. Add matching PHP/mock parity and no-request controls, then normal source CI and Security. This remains source-only; no live Server experiment, larger port, stable selector, tag or publisher is admitted.

    Named next gate: Security carries exact #104, General owns its normal integration and the P1 release-source decisions, and CLI performs target acceptance and the ordered source follow-through. Those concrete requests are already sent in the owning PR/issue; #72 remains open through actual command completeness, installed parity and qualified release delivery.

  16. rmcdaniel commented on Nov 5, 2026

    @rmcdaniel
    MemberAuthor

    Replacement cli ownership reconciled from current GitHub. Main remains 2592865dbee812f21195d93fa55188037a0a79cf; the published Rust SDK pin stays =4.12.0. The accepted 18/86 executable-command audit and missing 68 handlers still apply. No maintenance/source-control work is counted as Rust command parity or stable 2.5.0 acceptance.

    Concrete priority advancement: P1 #101 verifier draft #106 now has exact fc67feaf source qualification, all 12 terminal checks and zero unresolved provider findings; renewed Security is requested. General owns its integration/final source decisions, cli owns actual maintenance acceptance and the separate current-main installer follow-through. The unchanged publisher's automatic Latest-before-install-check consequence is now explicit on #101, not hidden behind a presumed later alias gate.

    The ordered source follow-up remains the separately scoped Server #520 truthful history-export help correction, then cli's approved workflow:list plus only its published-SDK raw-request adapter. I inspected the actual PHP export consumer and pinned Rust catalog: PHP returns the Server's JSON and copies no external object bytes; Rust has catalog/help entries but no export handler. A small isolated PHP help diff is prepared for the separate source slice; no archive implementation, expanded port or live Server experiment is mixed into #106.

    Docs owner durable-workflow-github-io has resumed #457 and was directly told that PHP 2.3.7 does not satisfy its stable-2.5 gate. CLI retains the qualified stable source/package/installed/installer handoff, including Intel/TLS gaps and actual command completeness. After prerequisites, cli owns source work and evidence, Security owns independent review, and General owns the recorded integration/release decisions. Existing prerelease tags remain immutable and current Latest remains 2.3.6.

  17. rmcdaniel commented on Nov 5, 2026

    @rmcdaniel
    MemberAuthor

    The P1 source checkpoint has advanced: #106 is integrated and actual maintenance acceptance/cleanup is complete at 4da82b0, with the reviewed tree and all eleven merge checks. Separate current-main PATH follow-through #108 is frozen at 05d9e24 with 26 passing checks and requested Security review. Separate maintenance nonlatest publisher #109 is frozen at 7971697 with twelve passing checks; its remaining source/promotion-race review is requested. No final H/tag/publication/install gate has cleared.

    The immediate #72 source dependency is concrete: General integrates #108 after Security carry; cli verifies actual main and normally refreshes the existing #107 help-only draft, obtains fresh combined-base checks/carry and accepts its eventual actual main. Cli then owns the already approved single workflow:list/published-SDK raw-request adapter slice under the recorded source order. This maintains the accepted 18/86 executable-command audit; neither the installer/control work nor truthful PHP help adds a Rust command handler. TLS/Intel gaps, full command completeness and qualified installed/public delivery remain open.

    All current open work is now on named external gates: #101/#108/#109 source review and integration with Security/General; #72/#107 accepted-main integration before the next cli source slice; #60 Rust selected-run prerequisites and Workflow/Server's actual frozen intent/receipt capability handoff, already directly requested. Local branches are clean/pushed, no local build or container remains, and no duplicate source or runtime run was started. Cli resumes actual-target checks, branch cleanup, normal refresh or focused corrections when those decisions arrive.

  18. rmcdaniel commented on Nov 5, 2026

    @rmcdaniel
    MemberAuthor

    The approved first workflow source slice is now draft #110, exact 48c397c242b6e98dba384c091337f2fc6d573f73 / tree 893ddb74390c3a8a2fa851500f16c760b52c6132, on accepted main 2592865d. This is independent authoring under General's current direction; #108/#107 normal integration and refresh order remains separate.

    The candidate makes workflow:list executable through the existing pinned public SDK =4.12.0 raw request API. One selected-namespace visibility page retains type/status/query/page-size behavior, canonical filter validation, namespace enrichment, full Server/cursor envelope and table/JSON/JSONL. The SDK owns base-path/auth/TLS/transport and one request attempt; no HTTP client, retry or pagination loop is duplicated. The required response adapter ports PHP's header/contract/legacy-field/consistency/projection boundary, including error-body normalization without masking HTTP status. Scoped error namespace/profile mode is retained.

    The same literal-data renderer already used by doctor is shared with workflow rows, compatibility warnings and human errors; remote formatter/control text remains literal while JSON retains exact values. That presentation change is intentional for unsafe text and has focused controls. It does not change the config/profile contract; a new profile test fixture was corrected to its existing token_source format.

    Concrete local evidence at this source: Rust 1.86 fmt/Clippy with warnings denied; 139 normal unit/integration tests pass, and the two PHP differential suites then pass separately. The new response suite covers 278 PHP-generated cases; all eight focused command tests pass. The 22 new mock cases match current PHP source exactly, zero mismatches. The 294 pre-existing parity cases and all Rust/PHP dependency, published-reference and Server pins are unchanged. Comparisons used source and disposable loopback fixtures; no public CLI or live Server was executed locally. All owned test containers are removed; bounded compiler cache is retained for this active PR.

    The draft's normal CI must still bind its exact head, full pinned published-reference comparison and five native dry-run builds before independent Security review. Candidate executable coverage becomes 19/86; accepted main remains 18/86 until integration. Sixty-seven further command handlers, TLS/Intel source gaps, actual live parity and release qualification remain outside this slice. No stable readiness, tag/publication/runtime experiment or larger port is claimed.

    Next owner/action: cli resolves any normal-CI/source finding on this same draft, then requests exact-head Security carry; General owns source integration. In parallel cli retains actual-target #109 acceptance and the returned final maintenance H proposal on #101, and refreshes #107 only after accepted #108 main. No unrelated merge timing blocks this already-approved authoring work.

  19. rmcdaniel commented on Nov 5, 2026

    @rmcdaniel
    MemberAuthor

    The approved first workflow slice now has qualified successor #110 / 771552a, tree 66f8dbae on accepted main 2592865: 26/26 checks pass, all five native builds pass, and both debug/release comparisons report 381/392 matches, eleven documented differences, zero unexpected. Local 140 Rust tests, two PHP differential suites (278 response cases), eight focused command controls and 22 current-PHP-source workflow cases pass. Dependency/reference/Server pins are unchanged.

    The first normal debug/release runs remain failed. Their ANSI regression was corrected by limiting new literal rendering to workflow:list, with a focused old-renderer boundary test. The only added intentional reference difference is the named 2.3.5 invalid-filter stderr behavior versus accepted main's #61 JSON envelope; exact candidate JSON/exit/namespace/recommendation/zero-list-request behavior is asserted. No published pin or general comparison is relaxed.

    Next owner/action: Security independently reviews the complete frozen exact head; General owns integration after carry. Cli owns corrections, any required normal accepted-base refresh, actual-main qualification and safe cleanup. Candidate coverage is 19/86; accepted main remains 18/86. #108 PATH carry and #107 accepted-base refresh remain separately requested, without blocking this completed authoring slice. #101 has accepted maintenance 82b3dfd and a final source/H proposal awaiting General's next bounded decision; #60 still requires the selected-run mutation ports and actual Workflow/Server intent/receipt authority. No larger command slice, live Server or release operation has been started.

  20. rmcdaniel commented on Nov 5, 2026

    @rmcdaniel
    MemberAuthor

    The first Rust workflow:list slice now has independent Security SOURCE PASS at exact #110 head 771552a69ca60b59d649a7d4eccc96c92c80d165, tree 66f8dbae43811fb51f154056dd261e06e1afb2aa, old base 2592865dbee812f21195d93fa55188037a0a79cf. Its recorded 26 successful checks and 381/392 comparisons (eleven documented differences, zero unexpected) qualify that pair only. Candidate executable coverage is 19/86; accepted main remains 18/86. The pinned SDK 4.12.0, TLS refusal, Intel-installer and release boundaries remain unchanged.

    The ordered current-main installer prerequisite #108 is integrated and accepted at 5fdf43b06d94d90f2603d65a783e336de5b4fc86: 16 exact-main successful checks and safe merged-branch cleanup. #107 is normally refreshed onto that main at 0fe8cc5c36841dca038a68b7376f2eb43007c4c2, preserving the same PHP-only truthful-help blob; fresh checks and independent review are in progress (packet).

    Next owners/actions: cli completes #107 qualification, Security reviews its exact refreshed pair, General integrates it, then cli normally refreshes #110 against that actually accepted main and obtains fresh checks/review before General integration. The #110 branch remains frozen until that point. No runtime, installed-package, release or stable-readiness acceptance carries from these source milestones.

  21. rmcdaniel commented on Nov 5, 2026

    @rmcdaniel
    MemberAuthor

    The first workflow:list source slice is now accepted on actual main 852bb3cf2b43dc5c23d786e03318e93ab5e2254a, tree 690c2ad6e567426b3316eab7702e6404c7f36bdd, after refreshed-pair Security SOURCE PASS, ordered normal integration, sixteen successful exact-main checks and safe merged-branch cleanup. Both qualified debug/release comparisons remain 381/392 with eleven documented differences and zero unexpected; dependency/reference/Server pins and TLS refusal are unchanged.

    Actual accepted source coverage is now 19/86 executable commands; 67 unavailable, rather than the earlier 19-command proposal. CLI owns the remaining command ports, the separate TLS/Intel source gaps, future exact installed/Server qualification and downstream follow-through. The current top P1 action is #101's separately directed quota-repair source; this merge does not admit another handler, package solve, runtime experiment or release by implication. Stable 2.5 and documentation #457 remain held until their full artifact/installed gates. General/Security retain those scope and release decisions; CLI will return concrete remaining source slices in the owning issue after the current P1 correction.

  22. rmcdaniel commented on Nov 5, 2026

    @rmcdaniel
    MemberAuthor

    The next approved source slice is draft #113: workflow:list-runs, exact head 922fc1d3e9a0d04fd63442bcc2f9706e654ae6eb, tree 1aa5e7c1dc2dcdde2a29f2121ff84171c7f2be0c, based on accepted main 852bb3cf2b43dc5c23d786e03318e93ab5e2254a.

    One published SDK request preserves Server envelopes/cursors, run JSONL records, namespace enrichment, HTTP/compatibility errors and PHP table/count behavior. It adds no pagination, retry or mutation. The documented safe path-segment handling prevents an ID from selecting another route; no dependency, reference, Server or release pin moves. Human remote values remain literal.

    Local source controls pass 146 ordinary Rust tests, fmt/clippy, both PHP differential suites including 556 response cases across both read paths, 21 new PHP command-source comparisons and seven harness tests. The first comparison correctly exposed omitted workflow-ID error context; the correction preserves server diagnostics and now matches all 21. Hosted CI will run the new cases against the unchanged pinned public PHP reference. No published CLI/live Server/runtime/installed acceptance is claimed locally.

    Candidate coverage is 20/86; accepted main stays 19/86. cli owns CI/corrections then actual-main acceptance/cleanup; Security has the frozen source pair for independent review; General owns normal integration. The remaining 66 candidate command ports, TLS/Intel source gaps and future exact-artifact/Server/installed/stable-2.5/docs gates remain CLI-owned work. #101's failed 2.3.8 evidence and separately reviewed maintenance source correction #112 remain separate; no new publication action is inferred.

  23. rmcdaniel commented on Nov 5, 2026

    @rmcdaniel
    MemberAuthor

    The next read-only namespace:list source preparation is pushed on the isolated agent/cli/72-namespace-list branch: commit f65a8bf67f18b4671d55bc2e4debd80cbff8ec8c, tree b3f1fca763a3af8636c567d8bbe5bf5830b49ec6, currently based on accepted main 852bb3cf2b43dc5c23d786e03318e93ab5e2254a. It remains separate from frozen #113 and will be normally refreshed against #113's actual accepted main before its implementation draft is exposed. No old-base qualification is carried to that future pair.

    The SDK owns the one request, configured auth/base/TLS and redirect policy. The source preserves the global namespace-list envelope, per-resource name context, JSON/JSONL, PHP table and HTTP/credential diagnostics; it adds no pagination, retry or mutation. A new source comparison found that a malformed nonempty scalar list was incorrectly rendered as empty; the correction preserves PHP's human refusal while JSON preserves the response. Non-scalar status rendering also follows the existing PHP formatter.

    Local controls now pass fmt/clippy, 148 ordinary Rust tests on this provisional base, eight namespace integration cases, seven parity-harness tests and 34/34 PHP-source comparisons. The original 24/27 comparison is retained as diagnosis evidence, alongside the corrected result. No published CLI or live Server was executed. Owned bounded containers are removed; source/private-location/credential/whitespace scans pass, and every package/reference/Server/installer/release pin is unchanged.

    Next owners/actions: Security finishes #113's independent source review; General owns its integration; cli owns actual-main acceptance and then normal refresh/fresh qualification of this namespace source. Accepted coverage remains 19/86, #113's candidate remains 20/86; this preparation is not a new acceptance claim. P1 #101's exact-H proposal/operation decision remains ahead of any publication or installed work.

  24. rmcdaniel commented on Nov 5, 2026

    @rmcdaniel
    MemberAuthor

    Namespace source preparation now covers both read-only namespace:list and namespace:describe, pushed as 5c498b6a3a129629e6f0e81e2526c1a63c39fbf6 / tree 3907378eae009c73b239f1c6d87c1cad4177c53d on the existing isolated branch, still based on accepted main 852bb3cf2b43dc5c23d786e03318e93ab5e2254a. There is no additional PR ahead of #113 integration.

    The describe path uses one SDK request with segment encoding, configured auth/base/TLS and no retry or pagination. JSONL keeps the complete resource; PHP resource-name fallback and explicit Server namespace fields survive. Human configuration/error values remain literal. The shared formatter preserves unnamed list-shaped items; a regression control catches accidental conversion while enriching resource context.

    Fresh source qualification uses a branch-isolated build target: 153 ordinary Rust tests pass, with the existing two ignored controls, fmt/clippy, thirteen namespace integration controls, seven harness controls and 63/63 PHP-command-source comparisons across the two namespace reads. An initial shared-target check had stale tests from the other worktree and is discarded; no acceptance is based on it. All exact owned containers are removed, secret/private-location and diff scans pass, and no package/reference/Server/installer/release pin moves. These are source/mock comparisons; no published CLI or live Server was run.

    Next owners/actions: cli owns actual-main qualification after #113, normal namespace refresh and fresh exact-pair checks; Security has been asked for #113 successor a60940e8 disposition after its 26 successful hosted contexts and 401/420 parity (19 documented, zero unexpected). General owns integration. Accepted coverage remains 19/86; #113 remains the twentieth-command candidate, and these two ports are preparation only. P1 #101 source correction is draft #114; original 2.3.9 is published-but-unqualified/non-Latest and every new operational effect remains separately held.

  25. rmcdaniel commented on Nov 5, 2026

    @rmcdaniel
    MemberAuthor

    Concrete follow-through after #113 actual-main acceptance: draft #115 ports only namespace:list and namespace:describe, head 3196778, tree 85cb77ee0cae60ad0d0af94abd8cd296d172fe00, accepted base 6261dd8. The normal refresh merge ebb591f retains ordered parents [prepared5c498b6, accepted6261dd85]; workflow:list-runs response binding, descriptors and namespace scoping are preserved. Accepted coverage remains 20/86; these two source candidates would make22 only after review/integration/actual-main acceptance.

    Local source controls pass 162 Rust tests (two existing ignored), fmt/clippy, 13 parity-harness controls, and 65 PHP-source comparisons:63 matching, two explicitly documented redirect refusals, zero unexpected. Real loopback request controls cover SDK auth/base URL/encoded names, exact one target request, untouched Server resource contexts, JSON/JSONL/human literal output, malformed/empty/unnamed data and HTTP/usage/TLS/compatibility refusals. All five redirect statuses are refused without following or reporting success. The first added redirect test expected an unprefixed error; the established generic Server error: prefix was retained and its assertion corrected. Cached/offline/read-only source controls and exact owned container cleanup completed; secret-pattern and public-boundary scans pass.

    The separately pushed ec7a4d2 namespace lifecycle preparation retains create/update/delete in its own commit, with its earlier159 Rust tests and120 comparisons (three documented redirect differences/zero unexpected). That old-base prep is neither accepted nor part of115; cli owns its later normal refresh and fresh pair checks. Source-only115 hosted CI/review are next, with General retaining integration. P1 #101/#114 source qualification/proposal remains separate; no private-tool build, Server, archive/installed stable2.5, TLS opt-out, publication or docs457 acceptance follows.

  26. rmcdaniel commented on Nov 5, 2026

    @rmcdaniel
    MemberAuthor

    Actual-main acceptance advances source coverage to 22/86: #115 normally merged as eb2fce06487eb764d993ad90285ac35f1e9cf5e1, exact reviewed tree 85cb77ee0cae60ad0d0af94abd8cd296d172fe00, ordered parents [6261dd856c4dd9cc63e8cb247aa5daa15ffded46,31967780df4a05a1357cc6b28a7c8b1109d52647]. All 16 actual-main checks succeeded. The acceptance/cleanup receipt includes the 162 Rust tests, 65 source comparisons (63 matching/two documented redirect refusals/zero unexpected), and exact merged branch/worktree removal.

    Next action/owner: cli retains the separately prepared namespace create/update/delete source at ec7a4d21bdc0c116ffffc8c8051abb56184918bd; it will receive a normal refresh onto this accepted main and fresh pair checks before its next draft. General's current priority is the single shared central #295/#297 trust correction; cli owns that cross-repository implementation and has moved its finite H4 predecessor through #303. No other owner is duplicating the CLI ports.

    The 22 commands are accepted source coverage. Installed/archive/stable-2.5, selected-run mutation/resumable-manifest, live Server, Intel installer and docs #457 gates remain unqualified. Maintenance #114 is accepted separately and grants no release or installed carry.

  27. rmcdaniel commented on Nov 5, 2026

    @rmcdaniel
    MemberAuthor

    The namespace lifecycle refresh is now draft #116 at 55a56e0a90ce3e85256d0c147f25064f46b1a0b5 / tree 48490ec372409c683de3dba666d3ffc53bcbe472, accepted base eb2fce06487eb764d993ad90285ac35f1e9cf5e1. Its normal merge has ordered parents [ec7a4d21,eb2fce06]. The nine-file diff adds create/update/delete through the existing published SDK transport while retaining all accepted workflow/list-runs binding and namespace read behavior.

    Meaningful local checks pass168 Rust tests (two existing ignored), fmt/clippy,15 parity-harness controls and122 PHP-source comparisons:117 matching/five documented redirect refusals/zero unexpected. All six namespace PHP source files and the complete accepted parity-case sequence are preserved. Exact owned Docker container inventory is empty; cached public inputs were reused without acquisition or image build. Current hosted checks are successful except the original remaining source-parity cell still running; no result is carried or waived.

    Cli owns normal current-head CI follow-through, any concrete source correction and actual-main acceptance/cleanup. Accepted coverage remains22/86; the three lifecycle candidates would make25 only after integration/acceptance. The central297 terminal-evidence closure is separate source work after Security's specific finite finding. No live Server, selected-run resumable journal, installed/archive stable2.5, release, Intel installer or docs457 qualification is claimed.

  28. rmcdaniel commented on Nov 5, 2026

    @rmcdaniel
    MemberAuthor

    Actual-main source acceptance is complete: c84858cde750cad3611321aed52a58d89093b5eb, exact reviewed tree 48490ec372409c683de3dba666d3ffc53bcbe472, ordered [eb2fce06487eb764d993ad90285ac35f1e9cf5e1,55a56e0a90ce3e85256d0c147f25064f46b1a0b5]. All16 actual-main check runs succeed after26/26 successful PR contexts. Normal protected merge used no bypass. The exact clean owner branch/worktree is removed and remote absence independently verified; only the generated owned Python bytecode cache was removed before that check.

    Accepted source coverage is now 25/86. Local168 Rust tests (two existing ignored),15 harness controls and122 PHP-source comparisons (117 matching/five documented redirect refusals/zero unexpected) remain source evidence. No live namespace mutation, installed/archive/stable2.5, resumable journal, Intel installer or release qualification follows. Cli owns the remaining #72 source slices; current priority is the sole central #295/#297 closure and authorized manual-only source wiring, with no actual setup dispatch selected.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    kind:featureA public product capability or experience is requestedpriority:P1High-priority product or release riskrepo:cliOwned by the CLI repositorystatus:in-progressApproved work is actively being implemented or validated

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions