feat(sre): register privileged authority and isolate Kubernetes credentials - #551
Draft
Pal Lakatos-Toth (pallakatos) wants to merge 33 commits into
Draft
feat(sre): register privileged authority and isolate Kubernetes credentials#551Pal Lakatos-Toth (pallakatos) wants to merge 33 commits into
Pal Lakatos-Toth (pallakatos) wants to merge 33 commits into
Conversation
…tials Introduce operator-controlled UID enrollment, reviewed legacy-grant migration, renewable router-private Kubernetes identity and a filtered HTTPS compatibility proxy. Preserve Azure identity and pinned Hermes interfaces; block legacy token aliases and Secret-watch authority. Add lifecycle preflights, retained admission gates and real Kind acceptance coverage. Live API qualification and genuine sign-offs remain pending. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: eb3654cd-f1e0-445a-8734-430800af1903
Dependency Review✅ No vulnerabilities or license issues or OpenSSF Scorecard issues found.OpenSSF Scorecard
Scanned Files
|
Restore the external-mesh no-probe rejection contract while keeping authority preflight ahead of artifact resolution and every deployment write. Cover a valid core target whose SRE preflight fails without mutation. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: eb3654cd-f1e0-445a-8734-430800af1903
Publish real standard conditions and CRD metadata, distinguish immutable Secret type rejection from admission-policy denial, and make CLI fixture resource matching exact. Add hostile-input regressions for the CodeQL-reported readiness flows without changing flagged production paths, destinations or authentication. Specific false-positive dispositions still require approval. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: eb3654cd-f1e0-445a-8734-430800af1903
Select the existing AWS-LC provider before this test creates TLS clients or servers, so nextest isolation does not rely on another test initializing process state. Record the user-approved dispositions for the four specific CodeQL HTTP-flow false positives; production proxy paths and destinations remain unchanged. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: eb3654cd-f1e0-445a-8734-430800af1903
Supply the required inference reference in both legacy control-consumer and reserved-source admission fixtures so real API tests reach their intended policy boundary. Report only harness source coordinates, exit code and an allowlisted category when commands fail; keep credentials and response bodies out of diagnostics. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: eb3654cd-f1e0-445a-8734-430800af1903
…ests Use the existing pinned Kind/kubectl/Helm tools and identical node configuration for a fast independent API-server dry-run. Preserve only allowlisted 422 causes for the exact public SRE CRD, retain generic command privacy, and classify native kubectl CRD Invalid errors. No production or schema change; root cause remains to be established by hosted API evidence. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: eb3654cd-f1e0-445a-8734-430800af1903
Hosted Kubernetes v1.31.0 rejected the public CRD with HTTP 422: both custom namespace field accesses are undefined. Add a diagnostic-only escaped-accessor candidate and real positive/negative instance checks in the disposable schema job. The unchanged production schema must still pass its own gate; candidate success cannot turn that failure green. Production/schema files remain unchanged pending parent review. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: eb3654cd-f1e0-445a-8734-430800af1903
Kubernetes v1.31 rejects the custom namespace accesses as undefined fields. Use the schema's CEL-escaped accessors while keeping the wire fields, namespace equality and singleton checks unchanged. Disposable API evidence accepts the corrected CRD and canonical instance and rejects foreign-namespace and noncanonical instances. Full SRE migration qualification remains required. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: eb3654cd-f1e0-445a-8734-430800af1903
Helm 4.2.4 in real Kind acceptance rejects the removed list --all flag before staging. Retain Helm 3 behavior; retry only its exact unsupported-flag error after confirming Helm 4, whose default inventory includes all statuses. Share this bounded compatibility path across SRE install and authority stage. Propagate all other discovery errors and preserve context, existing releases, ownership checks and staging semantics. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: eb3654cd-f1e0-445a-8734-430800af1903
The staged legacy fixtures cannot acknowledge inference policies before enrollment. During this setup only, use Helm 4 legacy built-in readiness waits, retaining Helm 3 behavior. The immediately following real SRE migration gate remains mandatory and fatal before unrelated tests; no production readiness or policy is relaxed. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: eb3654cd-f1e0-445a-8734-430800af1903
Retarget the next prerequisite to kars-bridge. Carry only predecessor audit records and merge ancestry; retain all SRE schema, CLI and acceptance repairs. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: eb3654cd-f1e0-445a-8734-430800af1903
Pal Lakatos-Toth (pallakatos)
changed the base branch from
public/pr6-credential-sources
to
kars-bridge
September 8, 2026 16:41
Add a disposable image-free controller Pod admission proof and bounded policy/ReplicaSet diagnostics. Preserve migration/readiness gates and publish no workload specs, credentials, argv or generic API bodies. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: eb3654cd-f1e0-445a-8734-430800af1903
Handle adjacent JSON objects as well as Lists and expose only fixed diagnostic stages before parsing. No policy or runtime behavior changes. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: eb3654cd-f1e0-445a-8734-430800af1903
A missing observation on an unrelated resource policy must not suppress controller Pod creation diagnostics. Wait first, collect actual admission evidence, and still fail the observation gate. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: eb3654cd-f1e0-445a-8734-430800af1903
The actual API admits the public Pod and Deployment but the Deployment remains unobserved. Record controller-manager restart/exit metadata and only fixed panic categories plus public Go frame names, stripping all log contents and arguments. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: eb3654cd-f1e0-445a-8734-430800af1903
After the unchanged production probe fails, test only the API-evidenced additionalProperties:true adapter candidate in disposable Kind. Preserve all admission policies, require actual controller Pod creation and exact tenant/private denials, and verify arbitrary JSON params survive. Production schemas and readiness gates remain unchanged. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: eb3654cd-f1e0-445a-8734-430800af1903
Use a field-local preserved-unknown object schema in both Rust generation and Helm instead of boolean additionalProperties. Actual Kubernetes 1.31 A/B evidence restores controller-manager and Pod creation while preserving nine ordinary/private admission and JSON round-trip outcomes; no policy is relaxed. Run the admission cases against the successful shipped schema and fix test imports for real harness discovery. Rust, schema drift and full migration qualification remain required in hosted CI before readiness. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: eb3654cd-f1e0-445a-8734-430800af1903
Bind synthetic token Secrets to real fixture ServiceAccount UIDs with complete public CA and namespace data, preventing healthy TokenController garbage collection or JWT generation. Preserve precise admission and immutable-type denials, prove unowned same-name identity quarantine and replacement, and retain primary failures during fenced cleanup. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: eb3654cd-f1e0-445a-8734-430800af1903
The real token fixture lifecycle now passes on hosted Kind, but a later reviewed migration is Blocked. Identify exact checked-in controller rejection sites and numeric Kubernetes statuses before teardown without printing status detail, API bodies or credentials; keep the fatal acceptance gate unchanged. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: eb3654cd-f1e0-445a-8734-430800af1903
Do not delete a fixture ServiceAccount if Secret cleanup fails: native TokenController could otherwise garbage-collect a foreign token Secret replacement. Independent cleanup continues and the original acceptance failure remains primary. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: eb3654cd-f1e0-445a-8734-430800af1903
Run a bearer-only actual controller ServiceAccount UID proof against the unchanged chart policies and roles, using pinned historical reader bindings with unrelated survivors. Compare exact UID/RV-fenced retirement dry-runs before, during and after a disposable exact-named reader bind grant. Preserve custom-role denials, pending-only admission and all persistent reviewed resources; never execute images or publish credentials. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: eb3654cd-f1e0-445a-8734-430800af1903
The hosted proof found that the immutable legacy chart has no helpers template. Render only its three actual required files, and report sanitized public diagnostic source coordinates without exception text or request data. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: eb3654cd-f1e0-445a-8734-430800af1903
Hosted Kind proved the same controller-principal retirement PATCH is denied by RBAC without named reader bind and accepted with only that bind, while the custom role remains denied. The wrong-UID control is Kubernetes 422 immutable-field validation, not resourceVersion Conflict; require that exact metadata.uid cause without counting arbitrary 422s as proof. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: eb3654cd-f1e0-445a-8734-430800af1903
Actual Kubernetes proof requires the named default reader bind permission even for subtractive updates. Add only that name; never grant wildcard bind, escalation, cluster-admin or custom-role authority. Prepare identical UID/RV-fenced patches and dry-run every retirement before any real mutation, preserving unrelated subjects and the legacy consumer on preflight failure. Keep API races fail-closed without claiming multi-resource rollback. Full hosted Rust and migration qualification remain required before readiness. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: eb3654cd-f1e0-445a-8734-430800af1903
Create only the 18 CRDs rendered from the exact historical archive after validating inventory, schema content and absence. Attach legitimate release ownership and wait for Established plus API discovery before the unchanged historical post-install hook. Reject adoption, conflicting creates and unrelated API errors; preserve migration ordering and production guards. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: eb3654cd-f1e0-445a-8734-430800af1903
Use Helm's field manager for create-only legacy CRD setup, in addition to its release labels and annotations. Add a disposable same-Kind API A/B proof of kubectl-create versus Helm ownership through unchanged apply and a dry-run current-schema upgrade, with UID-fenced cleanup and allowlisted conflict reporting. Never force conflicts or adopt existing objects. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: eb3654cd-f1e0-445a-8734-430800af1903
The same-Kind A/B demonstrated FieldManagerConflict for POST-created historical CRDs with both kubectl-create and helm managers. Keep archive identity/absence validation read-only and use the existing versioned legacy waiter for initial Helm install; Helm waits on templated CRDs before post-install hooks and retains native Apply ownership. Prove the actual historical install, hook and current-authority server dry-run in the disposable API job, then reset its cluster before existing policy qualification. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: eb3654cd-f1e0-445a-8734-430800af1903
Real legacy migration now reaches Ready with denial-before-issuance and rotation proof, but subsequent SRE install times out with ReplicaSetCreateError. Capture only allowlisted policy facts from runtime status and add same-Kind dry-run ordinary/private ReplicaSet cases under the existing Deployment controller principal, paired with actual cluster-scope authorization reviews. Preserve all production policies and RBAC unchanged. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: eb3654cd-f1e0-445a-8734-430800af1903
Pin the three affected consumers to the GHSA-2883-xcg3-v3hh patch. Use temporary hosted lock-only generation against the public registry because the configured local feed exposes proxy URLs and SHA-1 metadata. Require matching public SHA-512 integrity and unchanged versions/tree for every other package before capturing generated locks for review. No audit waiver or policy changes. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: eb3654cd-f1e0-445a-8734-430800af1903
Import byte-identical npm-generated public-registry locks from hosted run 34348098105, artifact 10102603454. Independently verify official SHA-512 integrity and unchanged versions/tree for all non-js-yaml packages. Runtime OpenClaw passes 250 tests; mesh passes 68 with three existing skips; both bulk audits report zero blocking advisories. Remove temporary lock-generation CI steps, leaving only the six manifest/lock files changed for the shared patch. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: eb3654cd-f1e0-445a-8734-430800af1903
Actual Kubernetes 1.31 evidence shows the built-in Deployment controller can create ReplicaSets cluster-wide but cannot create Pods or use SRE registrar authority. Permit that existing cluster-wide capability only for apps/replicasets admission, retaining all other predicates and granting no RBAC privileges. Add real UID-linked private Deployment-to-ReplicaSet-to-unscheduled-Pod acceptance, alongside unchanged tenant denials. Python regressions: 67 passed; Helm lint and exact rendered-policy preservation checks passed. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: eb3654cd-f1e0-445a-8734-430800af1903
Full Kind now creates the private SRE Pod but the running router remains NotReady. Add allowlisted bare/absolute command and verified loopback-TLS diagnostics. A temporary hosted smoke probe reuses SHA256-verified binaries from run 34350195081 only after proving unchanged production sources, without Cargo or private credentials. Preserve the actual readiness gate and all production code. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: eb3654cd-f1e0-445a-8734-430800af1903
Verified-image and real Pod evidence rule out executable lookup; certificate-verified loopback readiness requests time out while registration remains Ready. Log only fixed authority stages/categories, HTTP status, timeout/connect booleans and slow-check duration. Never log URLs, response bodies, errors or credentials; retain every authorization decision and timeout. Add log-boundary regressions and remove the completed temporary image probe. Python: 69 passed; changed Rust files formatted, with all compilation/tests delegated to existing hosted CI and no local Cargo. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: eb3654cd-f1e0-445a-8734-430800af1903
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.
Current control-plane compatibility repair
Current head:
4e012ec7f9cece155c19a8f272f976a7ae2ff469. The bootstrap failure was not a rejected controller Pod: Kubernetes v1.31.0's controller-manager crashed in CEL OpenAPI type checking when the new policy inspectedKarsSREAction.spec.action.paramsrepresented by booleanadditionalProperties: true.The repair preserves
type: objectand arbitrary nested JSON using field-localx-kubernetes-preserve-unknown-fields: true, consistently in Rust schema generation and Helm. No admission policy, approval requirement or namespace restriction is removed. Hosted A/B evidence recovered controller-manager and real Deployment/ReplicaSet/Pod creation, with all nine ordinary/private admission and JSON round-trip cases matching: https://github.com/Azure/kars/actions/runs/34262068112/job/102182569705 . That diagnostic job intentionally retained the original baseline failure; it was not reported green.The repaired shipped-schema probe now executes those cases too. Parent corrected the diagnostic test imports for the actual full-harness discovery command; all 35 Python cases, Helm lint and Rust syntax/format checks pass locally. Shared Cargo was not taken from another owner: Rust/build/Clippy/schema-drift and full fatal migration qualification remain required from the new hosted run, https://github.com/Azure/kars/actions/runs/34265939336 .
This PR remains draft, outside the three completed author-waived foundation landings. No application readiness, customer-cluster change, main promotion or full SRE privacy closure is claimed yet. Older bootstrap hypotheses and failures below are historical and superseded by this evidence.
Current integration candidate and staged acceptance
Current head:
ee24037189eff7beb96e1ba7d1961f5569e93ee8, now directly based on assembled foundations365483a1inkars-bridge. The ancestry refresh carried only predecessor audit records; all SRE repairs remain intact.The preceding full Kind run confirmed real authority-stage preview/apply succeeds after the Helm 3/4 discovery fix. It then exposed a harness sequencing conflict: Helm 4's default watcher waited for SRE inference-policy acknowledgements before the required explicit enrollment phase could run.
Repair
7f7a4ac4changes only prepared-legacy test setup to Helm 4's built-in-resource (--wait=legacy) readiness strategy, preserving Helm 3's existing wait. The immediately following real SRE migration remains mandatory/fatal before unrelated tests. No production readiness, policy, admission check or migration requirement is relaxed.Fresh full qualification: https://github.com/Azure/kars/actions/runs/34252594680 . This PR remains draft and technically unqualified until that lifecycle completes. It is not covered by the author waiver used for #547-#549. Earlier failed-run details below are historical.
Current lifecycle follow-up: Helm 3/4 release discovery
Current head:
86162297a2ee6f6044c9487b3a978a8c2fe47a46. The corrected CRD was accepted in the full Kind run, which then exposed a separate real CLI compatibility defect: Helm 4.2.4 rejects the removedhelm list --allflag during authority staging.The shared install/stage discovery helper preserves Helm 3 behavior. It retries without
--allonly after that exact flag error and a confirmed Helm 4 version, whose default includes all release statuses. Authorization, malformed inventory, namespace/context, ownership and other error paths stay fail-closed; an error never becomes an absent release or permission to adopt. No dependencies or Rust implementation changed.Targeted command/helper/authority coverage and the actual installed Helm flag parser passed locally. Full hosted lifecycle qualification is running at https://github.com/Azure/kars/actions/runs/34247989763 . This PR remains draft and outside the three author-waived foundation landings. Earlier schema repair and failure evidence below are retained as history.
Current schema repair and remaining qualification
Current head:
447312d1afb0a77ccbd2d144d74a4a293a6ceedd. The real Kubernetes v1.31 API rejected the SRE registration CRD with HTTP 422 because both customnamespaceCEL accesses were undefined. The repair uses__namespace__in CEL while preserving the JSON field names, namespace equality and singleton-name constraints.Actual shipped-schema gate now passes: https://github.com/Azure/kars/actions/runs/34241285988/job/102112345148 . The prior controlled API comparison demonstrated corrected CRD/canonical acceptance (201) and the intended foreign-namespace/noncanonical rejections (422): https://github.com/Azure/kars/actions/runs/34239442081/job/102106020705 .
Full SRE migration/lifecycle qualification remains pending, and this PR remains draft. This is not closure of the downstream credential-privacy blocker and is not covered by the author's signature waiver for #547-#549. No source constraints, required gates or customer deployment safeguards were weakened. Earlier preparation/failed-run details below are historical.
Publication order
This is the security prerequisite between #549 and #550. It targets the qualified credential-source branch; the governed-service layer must incorporate this prerequisite and its privacy-epoch guard before its remaining HIGH finding can close. Do not merge into the intermediate feature branch. After preceding slices land, retarget to protected
kars-bridge, refresh exact-head qualification and obtain genuine approval. Final promotion tomainremains separate.Why this prerequisite is required
The existing SRE agent holds a Kubernetes credential with cluster-wide Secret access. Merely mounting the new governed-service control token only in the router does not protect it from that API credential. Safe replacement requires operator-authorized UID enrollment, reviewed retirement of legacy grants, and a real compatible diagnostic path—not a permission drop that leaves SRE broken.
Scope
KarsSRERegistration/canonical, pinned to exact controller/release, source Sandbox and runtime Namespace identities. Registrar permission is unbound by default; occupancy, names, labels and Helm-looking metadata do not delegate privilege.Documentation:
docs/how-to/sre-authority.md. Shared privacy logic is covered by audit, no-stub, crypto and runtime-affecting Kind guards. Dependencies add standard TLS support only; unrelated lockfile resolution changes were removed.Initial CLI compatibility correction
The first hosted CLI run caught four external-mesh rejection regressions: SRE preflight ran before an already-invalid external mesh target was rejected. Repair
05b3a77crestores that no-probe rejection order while keeping authority preflight before artifact resolution and every deployment write. The existing assertions remain intact, and a valid-core/preflight-failure regression proves no writes occur. New exact-head qualification is required.Confirmed request-boundary evidence and approved alert triage
The initial full run found registration display/status conventions missing; these are now implemented with real standard conditions and shared transition-time helpers. The existing 17-criterion conformance suite passes. Secret-type mutations now require the specific Kubernetes immutable-field 422 cause, while schema-valid CREATE/annotation probes still require the intended VAP 403.
For CodeQL alerts 780/781/782/783, independent source/SARIF review confirmed that the reported flows originate in Axum server-injected State rather than HTTP input. Eight hostile header/query/body scenarios exercised fixed-file rereads, renewal and inventory; operations stayed on the selected backend. Flagged production blobs and authentication were not rewritten. All 50 focused SRE tests and strict combined Clippy passed.
The user explicitly approved false-positive dispositions for ONLY those four alerts, each with its own evidence comment. CodeQL queries and source coverage remain enabled. This assumes trusted controller/kubelet configuration and private-volume integrity; it is not a declaration that privileged configuration tampering is harmless, and it is not audit sign-off or merge/deployment approval. The separate CLI fixture alert was addressed in code by exact resource-argument matching, not dismissed. Real Kubernetes migration qualification and genuine author/reviewer signatures remain required.
Isolated TLS regression setup correction
The full
941d6c2brun passed 2,572 of 2,573 cases; the new boundary case failed before executing its inputs because isolated nextest execution had no Rustls CryptoProvider selected. The longer step included test-binary compilation, not a hanging boundary request. Commit99787682initializes the existing AWS-LC provider within that test. It now passes alone, without relying on another test initializing process-global state. Production proxy code and the reviewed CodeQL input boundaries are unchanged. The real Kubernetes migration gate has not yet run successfully and remains required.Current held acceptance issue
The
99787682run clears Rust and CodeQL, but Kind stops during legacy-fixture preparation before the authority/migration proof. The sanitized failure identifies a kubectl command after the old source/consumer were created; bounded diagnosis is in progress. The migration gate is not considered passed. This later draft remains outside the foundation integration queue and must not block assembling already-qualified earlier slices.Evidence and remaining gates
Current candidate:
997876825aa54cded225b2ef4a82050b2e5bc8c8, based on #549 head8b206065.docs/security-audits/2026-09-08-sre-authority-prerequisite.md. Genuine author and independent reviewer sign-offs are pending; no signatures or human approvals have been fabricated.This draft does not yet close #550 until actual API qualification and integration are complete. It is not full Bridge publication, arbitrary-credential integration, a task runtime or a shared budget broker. No customer/H100 deployment, Azure mutation, public image release, integration merge or main merge is performed by preparing it.
Latest acceptance-fixture correction (
3c9523e8)The previous hosted Kind run stopped during fixture preparation: the legacy control consumer omitted required
spec.inferenceRef. This test-only correction supplies that field in both the consumer fixture and the reserved-source admission probe, with regression coverage against the actual Helm schema. Command failures now identify harness source coordinates, exit status and an allowlisted error category without printing argv, credentials or response bodies.Thirteen pure harness regressions pass. Fresh hosted CI/Kind is pending; this does not claim completed real-API migration qualification or closure of the downstream governed-services privacy blocker. No production behavior, permissions, dependencies or audit requirements changed. The PR remains draft and outside the qualified foundation assembly queue.