From the live end-to-end test of the phase-5 transport on the real release binary (feat/control-trust-genesis @ 11ff761). The core is correct and fully tested in the harness (component test an_operator_approves_via_the_cli_path_and_config_changes_through_the_cas proves park→approve→apply→verify with the fixture isolation seam). But in a SHIPPED build the mutation path is fail-closed at two independent points, so it cannot yet be exercised in production:
- No CLI issues a proposal grant.
register-client grants read domains only (granted_proposal_domains: null on the genesis-registered client, verified live). control.request_apply therefore refuses every real client — verified live: a read-only client with mutations ENABLED calling request_apply with a valid payload gets unknown_operation and writes no journal row. There is no register-client --proposal-domain or grant-widening command. To make the control plane actually mutate anything, v1 needs a grant-widening ceremony (meta-authority) that issues a proposal domain to a registered client.
- Operator approve fails closed.
zeroclaw control approve passes Evidence::unknown() → OperatorIneligible in production (no reachability prover for same-host separation). So even a parked proposal could not be approved in a shipped build.
Both are correct default-closed behavior, not bugs — but together they mean phase 5's user-facing capability is inert until (a) a proposal-grant issuance ceremony and (b) a real reachability prover (or an out-of-process operator backchannel) exist. Flagging so the roadmap is honest: the mutating control plane is BUILT and TESTED but not yet REACHABLE end-to-end in production.
Also (real user-facing bug): the enable-mutations ceremony renders raw unresolved Fluent keys on the release binary — observed live: {cli-control-enable-mutations-confirm}, {cli-control-enable-mutations-operator}, {cli-control-mutations-enabled}. The keys were added to cli.ftl in source but do not resolve in the built binary (likely a generated/embedded catalogue not regenerated, or a missing translation entry). Fix the i18n wiring so the ceremony prompts render.
Minor (cosmetic, fail-closed): control.request_apply appears in a mutations-enabled session's tools/list even for a client lacking the proposal grant, but the handler returns unknown_operation. Visible-but-unusable is the safe direction; consider hiding it unless the proposal grant is held, to match the documented '(c) proposal grant' visibility claim.
Live-verified GOOD behavior: genesis + client registration; enable-mutations writes a sealed management.record; mutations-enabled makes request_apply visible; read-only client is refused with no journal row (fail-closed at the grant gate); no MCP path reaches config apply. Part of #35, relates to #31.
From the live end-to-end test of the phase-5 transport on the real release binary (feat/control-trust-genesis @ 11ff761). The core is correct and fully tested in the harness (component test
an_operator_approves_via_the_cli_path_and_config_changes_through_the_casproves park→approve→apply→verify with the fixture isolation seam). But in a SHIPPED build the mutation path is fail-closed at two independent points, so it cannot yet be exercised in production:register-clientgrants read domains only (granted_proposal_domains: nullon the genesis-registered client, verified live).control.request_applytherefore refuses every real client — verified live: a read-only client with mutations ENABLED calling request_apply with a valid payload getsunknown_operationand writes no journal row. There is noregister-client --proposal-domainor grant-widening command. To make the control plane actually mutate anything, v1 needs a grant-widening ceremony (meta-authority) that issues a proposal domain to a registered client.zeroclaw control approvepassesEvidence::unknown()→OperatorIneligiblein production (no reachability prover for same-host separation). So even a parked proposal could not be approved in a shipped build.Both are correct default-closed behavior, not bugs — but together they mean phase 5's user-facing capability is inert until (a) a proposal-grant issuance ceremony and (b) a real reachability prover (or an out-of-process operator backchannel) exist. Flagging so the roadmap is honest: the mutating control plane is BUILT and TESTED but not yet REACHABLE end-to-end in production.
Also (real user-facing bug): the enable-mutations ceremony renders raw unresolved Fluent keys on the release binary — observed live:
{cli-control-enable-mutations-confirm},{cli-control-enable-mutations-operator},{cli-control-mutations-enabled}. The keys were added to cli.ftl in source but do not resolve in the built binary (likely a generated/embedded catalogue not regenerated, or a missing translation entry). Fix the i18n wiring so the ceremony prompts render.Minor (cosmetic, fail-closed):
control.request_applyappears in a mutations-enabled session's tools/list even for a client lacking the proposal grant, but the handler returnsunknown_operation. Visible-but-unusable is the safe direction; consider hiding it unless the proposal grant is held, to match the documented '(c) proposal grant' visibility claim.Live-verified GOOD behavior: genesis + client registration; enable-mutations writes a sealed management.record; mutations-enabled makes request_apply visible; read-only client is refused with no journal row (fail-closed at the grant gate); no MCP path reaches config apply. Part of #35, relates to #31.