Repository navigation
rfc: let Studio reach managed clusters on the CLI's login until its OAuth client lands - #1152
Conversation
… its OAuth client lands RFC 1017's A2 has Studio reach managed clusters only as a standard OAuth public client, which waits on the managed control plane. Until then, Studio takes the data token that `omnigraph credentials export` exchanges from the person's login: by export alone, in memory, asked for again after a 401, and kept only while the target still names that managed endpoint. The amendment records that interim and what it accepts for now (the CLI's token, which removing admission does not retract, and no separate client identity), and names the superseded sentence in the decision log.
ReviewThis amendment lets Studio use the managed data token from the person’s CLI login until Studio can be a standard OAuth public client. The direction is sound, and the three security costs are real: the same reusable bearer, no online retraction, and no separate client identity. The text needs to match the CLI that issues that token, and the exception needs one end condition. I recommend changes before merge. The OAuth client flow in A2 can stay. The interim can stay once it describes Blocking
A 401 from the data server is outside that set. Asking export again returns the same cached bearer while The server accepts a lifetime of 60 to 86400 seconds ( Replace that sentence with the cache rule, the 3600-second mint, the issuer’s right to shorten, and the 86400-second ceiling for a cached
The old sentence required a standard OAuth public client for an OIDC server, self-hosted or managed. The new sentence says that rule holds “once the managed control plane supports one”. A self-hosted OIDC server does not wait on that control plane. The interim then allows borrowing for managed clusters only. Self-hosted OAuth is left between those two clauses. The interim ends with “Until the client lands” and “The client replaces it”. The opening sentence ends when the control plane supports a client. A2 already requires both: the control plane must enable the resource profile and register Studio, and Studio must implement the client. Use that conjunction as the only end. Keep the self-hosted OAuth rule in force now. Put the same end in the 2026-10-25 decision-log entry. That entry currently repeats the widened reading.
The target table says a managed cluster is “Deferred to A2” for RFC process step 4 says a post-merge amendment rewrites each body sentence it changes, and the decision log names each superseded sentence. This PR rewrites the A2 opening sentence and quotes it. It leaves the table cell and the Opening Studio sentences in place. Add one explicit entry. Either the launcher stays refused and Studio uses this token only after a person selects a managed target inside Studio, or the table and Opening Studio change and the log names those sentences. One of those is the current rule.
CI run on this head reports
Optional
Tradeoffs and liabilityThe accepted costs match the token. Invariant 10 stays intact at the server. The client does not supply an actor. The loss is client separation: Studio and the CLI are one principal for up to 24 hours, and removing issuer membership does not cut that window short. This adds no code and no second authority. It adds a prose exception that issue #1025 was opened to avoid. The exception is removable only by a later edit. Five similar interims would leave five borrowed-token paths in the appendix while the target table still says “Deferred”. Put the one-line exception in the target table, with the two-part end condition, so removal deletes one sentence. Robustness of client separation is the quality this interim gives up. That is a fair short-term choice for Studio on a managed cluster before the control plane registers it. Clarity has to carry the bound, because nothing in code expires the exception. What matches
Validation
|
…-token exception Restores A2's opening rule, so the self-hosted OAuth rule stays in force, and keeps the exception to Studio on a managed cluster a person selects inside Studio; the launcher stays refused. The exception ends when the managed control plane enables the resource profile and registers Studio and Studio implements the client. It describes `credentials export` as the CLI behaves: the cached data token while it validates, a 3600-second mint the issuer may shorten, up to 86400 seconds for a cached `cluster token`, the same token after a 401, and a failed export on an endpoint pin mismatch. The decision-log entry names the qualified sentence and the unchanged launcher refusal.
ReviewI recommend merge. Commit This amendment lets Studio send the CLI's managed data token until Studio can be a standard OAuth public client. The token is a reusable bearer. Studio and the CLI are one Cedar principal. The server cannot give Studio a smaller grant. The text now matches the command that prints that token. Earlier findings
Optional
BlockingNone. Tradeoffs and liabilityThe accepted costs match the token. Invariant 10 stays intact at the server. The client does not supply an actor. The loss is client separation: Studio and the CLI are one principal for up to 24 hours, and removing organization membership does not cut that window short. A policy change denies that principal on a later request. RFC 0053 states that an already admitted mutation or stream runs to its end. The diff is one RFC file. The code remains the source of the export behavior. The RFC adds one prose exception with one end. Removal deletes that paragraph and the decision-log entry. The launcher cell stays "Deferred to A2", so the opener rule stays one sentence. Five similar interims would be five paragraphs in A2. That shape is easier to delete than five borrowed paths hidden in the target table. Robustness of client separation is the quality this interim gives up. That is a fair short-term choice before the control plane registers Studio. Clarity has to carry the bound, because code does not expire the exception. This commit makes that bound true. What matches
RFC processThe amendment qualifies the accepted A2 sentence and leaves that sentence in the body. The 2026-10-25 log entry quotes it, limits the qualification to Studio on a managed cluster a person selects inside Studio, and states that the launcher refusal is unchanged. Validation
Recommendation: merge. |
Summary
Amends RFC 1017's appendix A2 ("OAuth for standard clients and managed access") with one stated exception for Studio.
A2's rule stays as it was: a client other than the CLI reaches an OIDC-enabled server, self-hosted or managed, as a standard OAuth public client. For a managed cluster, that client waits on the managed control plane enabling the resource profile and registering Studio. Until that holds and Studio implements the client, Studio may reach a managed cluster with the CLI's data token for it.
Scope: only after a person selects a managed target inside Studio. The launcher stays refused (the target table and Opening Studio are unchanged).
Source: the token comes from
omnigraph credentials export --target NAME, the one credential command that accepts a managed target. It writes only to a Unix FIFO and never starts an interactive login.What export returns:
cluster token --ttlcan last up to 86400 seconds.After a 401, export returns the same token while the cache validates. A target whose endpoint pin no longer matches fails the export.
Studio's obligations: keep the token in memory, and only while
target inspectstill names that managed target at that endpoint.What the exception accepts for now, all of which the OAuth client removes:
Following the RFC process, the decision log names the qualified sentence and the unchanged launcher refusal.
Checks
python3 scripts/check-docs.py: Documentation OK (400 Markdown files checked)typoson the changed file: cleanThe export behavior was checked against
crates/omnigraph-cli/src/managed/data.rs:issue_for_principal);data_endpoint_mismatch.The server's 60–86400-second window is in
crates/omnigraph-server/src/data_tokens.rs.CI Gatefails oncargo deny(RUSTSEC-2026-0387 oncrypto-bigint0.5.5), which is on the parent and addressed by #1151.Tracking: #1025.