Skip to content

Stop offering a proxy migration and a CA repair the otel Claude attach cannot perform - #902

Merged
philcunliffe merged 7 commits into
masterfrom
fix/issue-885
Aug 19, 2026
Merged

Stop offering a proxy migration and a CA repair the otel Claude attach cannot perform#902
philcunliffe merged 7 commits into
masterfrom
fix/issue-885

Conversation

@philcunliffe

@philcunliffe philcunliffe commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Both findings in #885 reproduce, and both are fallout from #818 (LLP 0262), where the claude client's attach became otel-only: one settings write, no repointed base URL, no CA, no keychain trust, no launchd env.

1. The proxy-mode migration prompt

@hypaware/claude's picker row still declared compose.gateway_proxy_mode: true, which is the only gate on maybeOfferProxyModeMigration. So a bare hyp attach claude on an install whose gateway config lacks proxy_mode asked:

Claude can attach through HypAware's local HTTPS proxy instead of a repointed base URL ... macOS will then ask to trust the HypAware Local CA.

Every clause is false for an otel attach, and a yes wrote proxy_mode, restarted the daemon, and waited on a CA mint the following attach never consults. The scripted shapes (--json, non-TTY, attach all) carried the matching pointer note at a migration that does not exist.

Fix, as the corpus already settled it. LLP 0243 carries Extended-by: LLP 0262 (... the Claude row stops declaring compose.gateway_proxy_mode ...; the composition rule itself is unchanged). The row drops the flag. The composition rule and the migration machinery stay generic for any client still captured by the proxy, and keep their coverage: the tests now drive them through a staged installed plugin whose picker row declares the flag.

Two knock-ons of dropping the flag, both wanted:

  • the picker fold no longer composes proxy_mode: true for a claude pick, so a fresh install mints no CA it will never present (LLP 0243's own "a Codex-only install mints no CA it will never use", now true of claude too);
  • the hyp init claude preset, which writes literally what the fold composes, stops writing the key for the same reason. Left in, it would trip the gateway's own stale-CA warning on first boot.

2. hyp status CA-trust advice

describeCaTrust(false) claimed "Remote Control inbound will not work, run hyp attach claude to retry" and describeLaunchdEnv(false) claimed "run hyp attach claude to set it". Confirmed: installCaTrust and installLaunchdEnv have no callers outside test/ since #818, and Remote Control does not rest on the trust any more, because the base URL is never repointed (LLP 0262 R6). Both lines now state the fact, and the block names the one command that does act on what it reports:

  proxy trust:
    ca fingerprint: AB:CD:EF
    login keychain: not trusted
    launchd env:    NODE_USE_SYSTEM_CA=1 set
    note:           only proxy_mode capture uses this CA, and the claude attach no longer does
                    'hyp detach claude --purge' removes the CA, its keychain trust, and the launchd env

--json keeps its existing keys and adds the tri-state proxy_trust.proxy_mode_configured field.

docs/PRIVACY.md carried the same stale claim ("attach installs the CA into your login keychain") and now describes it as residue of an earlier release.

Reproduced first

Four assertions written against the current code, all failing before the fix:

  • test/core/attach-proxy-migration.test.js - "claude is never offered the proxy-mode switch: its attach is otel-only" (the question was asked) and "a scripted claude attach carries no base-URL pointer note" (the note was written).
  • test/core/status-proxy-trust.test.js - the trusted and untrusted cases now assert no hyp attach claude anywhere in the block, and the purge pointer instead.

Checks

  • npm test: 4486 pass, 0 fail.
  • npm run typecheck: clean.
  • npm run smoke: claude_attach_detach, walkthrough_picker_to_first_query, client_attach_idempotent, client_attach_on_join, claude_telemetry_capture, status_diagnostics all green (the first two carried the old expectations and are updated here).

For the reviewer

With the claude row's declaration gone, no bundled picker row declares gateway_proxy_mode, so maybeOfferProxyModeMigration and enableGatewayProxyMode are dormant in a stock install. They are kept, not deleted: LLP 0262 keeps the gateway proxy fully supported for the clients that still route through it, LLP 0243 says the composition rule is unchanged, and retiring the machinery outright is a design call worth making deliberately rather than as fallout from a wording fix. Both remain under test.

Fixes #885

@philcunliffe

Copy link
Copy Markdown
Contributor Author

neutral review round: e1ea1a2b - findings (5), fixed 4

Verdict: findings. The production surface of this PR is small and its direction is right, but the one line it adds (hyp status's new proxy-trust note) is unconditional, and on an install that still captures by proxy it prints destructive advice. Four findings fixed and pushed as ac994ce9; one is recorded below as accepted-by-design rather than changed, because fixing it would revert the PR's intent.

Verification on the fix commit: npm test green (4487 pass, 0 fail, 1 skipped), npm run typecheck clean, smokes status_diagnostics and claude_attach_detach ok.


1. medium - src/core/commands/status.js:549 - the new note tells a live proxy_mode install to delete the CA it is using. FIXED

The note is unconditional inside if (report.proxyTrust), and the comment justifying that ("The block only ever renders on a CA a past proxy attach minted") is false. prepareInterception (hypaware-core/plugins-workspace/ai-gateway/src/source.js:479) calls ensureLocalCa on every daemon start whenever proxy_mode is true, and proxy_mode remains a supported key that maybeOfferProxyModeMigration can still write. On such a host hyp status now says "only proxy_mode capture uses this CA, and the claude attach no longer does" and points at hyp detach claude --purge. Following it deletes the key the running interception terminates TLS with; the next start mints a different CA, every proxied client fails its handshake, and nothing left in the product restores the keychain trust (installCaTrust in src/core/tls/darwin_trust.js has zero production callers). ProxyTrustReport carried no way to tell residue from live use.

Fix: ProxyTrustReport gains proxyModeConfigured, read off the effective gateway entry in collectProxyTrust (src/core/daemon/status.js:1591). The note branches on it - residue keeps the purge line, a live proxy_mode gateway is told the gateway still terminates TLS with this CA and is given no command to run. --json gains proxy_mode_configured beside the two probes. New regression test: "a live proxy_mode gateway is never told to purge the CA it is using" in test/core/status-proxy-trust.test.js.

2. medium - hypaware-core/plugins-workspace/claude/hypaware.plugin.json:57 - a re-init drops proxy_mode from a still-proxying machine. NOT CHANGED (by design; flagged)

Dropping gateway_proxy_mode means composePickerConfig no longer writes proxy_mode for the claude row. The carry-forward protection only applies when existing is passed, and src/core/cli/walkthrough.js:685 never passes it (only src/core/cli/wizard/pick.js:387 does). So a hyp init --force on a pre-0262 install whose ~/.claude/settings.json still carries HTTPS_PROXY composes a gateway without proxy_mode, prepareInterception takes the tunnelOnly branch, and capture silently drops to zero rows with only an aigw.proxy_mode_stale_ca daemon-log line.

Left as-is deliberately: this is exactly the composition rule composePickerConfig already documents ("a non-interactive --force re-init composes from scratch by design - the whole-file overwrite is its own consent", LLP 0243/0244), the interactive lane still carries forward, and re-adding the key would revert the change this PR exists to make. Worth a follow-up only if the 0262 migration wants to guarantee the re-attach runs alongside the re-init.

3. low - src/core/commands/clients.js:914 - the migration question promises a trust dialog that cannot happen. FIXED

The PR keeps maybeOfferProxyModeMigration generic (and adds tests pinning it as live behavior), but the question still said "macOS will then ask to trust the HypAware Local CA". Nothing calls installCaTrust, and enableGatewayProxyMode (src/core/config/gateway_proxy_enable.js) contains no keychain or launchd-env work at all - a yes writes proxy_mode, restarts, and stops. That is the same defect class this PR fixes for claude, left standing one row over.

Fix: the question now says the restart mints the CA and that nothing adds it to a system trust store, so the client trusts it through its own settings. The @ref LLP 0244#attach-offers gloss no longer claims a "coming trust dialog".

4. low - hypaware-core/plugins-workspace/claude/src/index.js:549 - inverted justification in the preset comment. FIXED

The comment said writing proxy_mode: true would "leave the gateway logging its own stale-CA warning". aigw.proxy_mode_stale_ca fires only on the !config.proxyMode branch (ai-gateway/src/source.js:432); with the key written the gateway logs aigw.interception_ready instead. The code change is right, the stated reason was backwards, and CLAUDE.md asks for honest annotations. Restated to what the key would actually cost (a CA nothing presents, plus a proxy-trust block reporting state no attach here can change).

5. low - docs/PRIVACY.md:83 - the hunk contradicts itself. FIXED

"hyp detach claude deliberately keeps the CA and any trust in place, so a later re-attach does not ask for your password again" sits directly under "Nothing installs this CA into a system trust store any more". No attach path can raise a password dialog now. Rewritten to say the detach leaves an earlier release's CA and grant alone because a detach is not a statement about the certificate and no attach re-creates the grant. The same stale claim in src/core/cli/core_commands.js:329 (hyp detach --help) is fixed the same way. The README "Proxy mode" section still carries it and is outside this diff.

@philcunliffe

Copy link
Copy Markdown
Contributor Author

Verdict

The change is correct in its core claim: dropping compose.gateway_proxy_mode from the claude picker row is the fix LLP 0243's Extended-by: line already settled, the fold and mergePlugin carry-forward are untouched, the finale CA wait is guarded on effective proxy_mode rather than on the pick, and no other bundled row declared the flag. installCaTrust / installLaunchdEnv genuinely have no non-test callers, so removing hyp attach claude from the trust block's advice is right.

Three findings, all in the new proxy trust note and its input. All three fixed in a7e8a1d (pushed to fix/issue-885). None block the PR's thesis.

Findings

1. medium - src/core/commands/status.js:570 (pre-fix): the note recommends a command that silently ends Claude capture

The residue branch told the user 'hyp detach claude --purge' removes the CA, its keychain trust, and the launchd env. That is not a CA-only purge. runClientLifecycle (src/core/commands/clients.js:113-155) runs the full detach for claude first - detachClientFromDisk strips the managed env keys from ~/.claude/settings.json and the spool sweep runs - and only then calls purgeProxyTrustResidue (clients.js:1615).

The exact population this branch targets is a machine migrated from proxy attach to the LLP 0262 otel attach: residue CA + keychain trust + launchd env, proxy_mode off. That is also the population that is currently otel-attached and capturing. Following the advice as written turns off all Claude Code capture, and nothing in the note said so.

Fixed by naming the side effect rather than inventing a CA-only path (LLP 0262 #migration itself names detach --purge as the CA exit, so the pointer stays):

    note:           only proxy_mode capture uses this CA, and no plugin here is configured for it
                    'hyp detach claude --purge' removes the CA, its keychain trust, and the launchd env
                    it detaches claude on the way, so re-attach it afterwards to keep capturing

Covered by a new assertion in the residue test in test/core/status-proxy-trust.test.js.

2. low - src/core/daemon/status.js:1591 (pre-fix): proxyModeConfigured was a plain boolean, so false meant both "off" and "cannot tell"

const proxyModeConfigured = gateway?.config?.proxy_mode === true - unlike its two siblings in ProxyTrustReport, which are deliberately boolean | null for exactly this reason. Two concrete misreports:

  • config is null whenever the local config fails to parse and there is no central layer (src/core/daemon/status.js:700: const config = (centralConfig || localConfig) ? merged.effective : null). A machine whose gateway is running proxy_mode: true from its last good boot, whose config file the user just broke, got the residue note and was told to purge the CA the live interception is terminating TLS with. That is precisely the case the second commit added this branch to prevent.
  • The lookup did not skip enabled === false, while every other consumer in the same file does (activePlugins, status.js:813). A disabled gateway entry still carrying proxy_mode: true was reported as live, withholding the purge from a machine where it is unambiguously safe.

Fixed: proxyModeConfigured is now boolean | null (ProxyTrustReport in src/core/daemon/types.d.ts widened and documented), null when config === null, and the scan filters entry.enabled !== false. The text renderer grew a third branch for null ("the config could not be read, so whether this CA is live or residue is unknown" + "fix the config first"), which offers neither the purge nor an attach. --json proxy_mode_configured is tri-state alongside ca_trusted / launchd_env_set. Two new tests cover the disabled-entry and unparseable-config cases.

3. low - src/core/commands/status.js:563 (pre-fix): the live branch hardcoded a client it cannot know

The proxy_mode: true branch said "the claude attach does not use it". proxy_mode is retained for codex, claude-desktop, openclaw, hermes, and raw SDK traffic (LLP 0262 #migration), so on a codex-only install with proxy_mode: true the note named a client that may not be installed at all and said nothing about the clients that actually depend on the CA.

Fixed: the live branch now reads "the clients captured through the proxy need it; turn proxy_mode off before purging" and names no client. The residue branch still has to name one, because hyp detach takes a client argument - that coupling is now explained in the comment above the block rather than left implicit. A doesNotMatch guard on the old wording is in the live-proxy_mode test.

Not findings (checked and clear)

  • Manifest / preset / compose changes: dropping compose.gateway_proxy_mode leaves composePickerConfig's fold and mergePlugin's carry-forward intact (a prior proxy_mode: true survives a reconfigure, since prior.config spreads last).
  • hypaware-core/plugins-workspace/claude/src/index.js: the preset dropping proxy_mode: true is consistent with the fold, and its @ref LLP 0262#requirements is honest.
  • CA minting in ai-gateway/src/source.js is gated on proxyMode, so no CA is minted for a claude-only install.
  • No em dashes, no semicolons introduced; @ref annotations on the touched constructs re-checked against LLP 0262 / 0237 / 0239 and still apply.
  • One PR-body inaccuracy, not code: the body says "--json keys are unchanged", but proxy_trust.proxy_mode_configured is a new key. Additive, so harmless, but worth correcting in the release note if the body is reused.

Checks after the fixes

  • npm test: 4489 pass, 0 fail, 1 skipped.
  • npm run typecheck: clean.
  • npm run smoke -- status_diagnostics: green.

Left open

Nothing. All three findings are fixed and pushed as a7e8a1d.

The PR's own open question stands as the author framed it and is not a review finding: with the claude row's declaration gone, maybeOfferProxyModeMigration and enableGatewayProxyMode are dormant in a stock install. Keeping them is the right call for a wording fix; retiring them is a separate design decision.

@philcunliffe

Copy link
Copy Markdown
Contributor Author

Triage at the review-round cap (head a7e8a1d)

The review-round budget is exhausted, so this head was triaged for residual findings. Outcome: no true blockers remain; the PR can merge safely. Deferred findings are tracked in #923.

Verification performed at a7e8a1d

  • All three findings from the final review round (ac994ce9) were re-checked against the code, not taken on faith: the residue note now states the detach side effect and tells the user to re-attach (src/core/commands/status.js:589-593), proxyModeConfigured is tri-state with null on an unreadable config and skips enabled: false gateway entries (src/core/daemon/status.js:1595-1605, src/core/daemon/types.d.ts:317-326), and the live branch names no client (src/core/commands/status.js:578-582). Each has a covering test in test/core/status-proxy-trust.test.js.
  • Independently re-ran the suite in a clean worktree at this head: npm test 4489 pass / 0 fail / 1 skipped, npm run typecheck clean.

Residual findings, classified

  1. Deferred (design follow-up, not a blocker): hyp init --force on a pre-0262 still-proxying machine composes a gateway without proxy_mode and capture drops to tunnelOnly (round-1 finding 2, accepted-by-design). The compose-from-scratch behaviour is the documented rule (src/core/cli/walkthrough.js:963-968, LLP 0243/0244), the interactive lane carries forward, the trigger is an explicit whole-file overwrite, and re-adding the key would revert the change the accepted corpus settled (LLP 0243 Extended-by: LLP 0262). Tracked in Follow-up: deferred review findings from PR #902 #923 with the suggested mitigation (guarantee re-attach alongside forced re-init).
  2. Preference (docs polish): the PR body's "--json keys are unchanged" is inaccurate, proxy_trust.proxy_mode_configured is a new additive key. Tracked in Follow-up: deferred review findings from PR #902 #923.
  3. Preference (docs polish, outside this diff): the README "Proxy mode" section still carries the stale password-dialog claim round 1 fixed elsewhere. Tracked in Follow-up: deferred review findings from PR #902 #923.

No residual finding could cause wrong behaviour, data loss, a security hole, a crash, or a perf regression at this head.

@philcunliffe

Copy link
Copy Markdown
Contributor Author

Triage re-run for head af988db (merge of master into fix/issue-885)

The only new commit since the prior triage (a7e8a1d) is a merge of origin/master. Re-verified at this head:

  • All review-round fixes survived the merge: the claude picker row still declares no compose.gateway_proxy_mode, the proxy trust note keeps its three branches (live / residue / unreadable-config), proxyModeConfigured is still tri-state with the disabled-entry filter, and the migration question no longer promises a trust dialog.
  • npm test: 4535 pass, 0 fail, 1 skipped. npm run typecheck: clean.
  • The residual findings are unchanged and remain non-blocking: the hyp init --force compose-from-scratch behaviour on a pre-0262 install (accepted-by-design, LLP 0243/0244), the PR-body --json wording, and the README "Proxy mode" section outside this diff.

Outcome: no true blockers; the PR can still merge safely. Deferred findings remain tracked in #923.

@philcunliffe
philcunliffe marked this pull request as ready for review August 19, 2026 09:12
@philcunliffe philcunliffe added the neutral:approved neutral reviewed this and holds it for a maintainer merge (own or adopted PR; LLP 0025/0030) label Aug 19, 2026
test and others added 7 commits August 19, 2026 14:54
…h cannot perform (#885)

Two user-facing instructions left over from LLP 0262, where the `claude`
client's attach became otel-only: one settings write, no repointed base URL,
no CA, no keychain, no launchd env.

1. `hyp attach claude` on an install whose gateway config lacks `proxy_mode`
   offered the LLP 0244 migration, because `@hypaware/claude`'s picker row
   still declared `compose.gateway_proxy_mode`. Every clause of the question
   was false: the otel attach repoints no base URL, and a yes wrote
   `proxy_mode`, restarted the daemon, and blocked on a CA mint the following
   attach never consults. The scripted shapes carried the matching one-line
   pointer at a migration that does not exist. LLP 0243's own `Extended-by`
   line already settled the fix: the claude row stops declaring the flag,
   while the composition rule itself is unchanged. The `hyp init claude`
   preset, which writes literally what the fold composes, stops writing
   `proxy_mode: true` for the same reason: a claude-only install would mint a
   CA it never presents and then trip the gateway's own stale-CA warning.

2. `hyp status`'s proxy-trust block told a macOS host with a leftover CA that
   an untrusted keychain breaks Remote Control inbound and that
   `hyp attach claude` retries the trust, and that the same command sets
   `NODE_USE_SYSTEM_CA`. Nothing installs either any more (`installCaTrust` /
   `installLaunchdEnv` have no production callers since the otel switch), and
   Remote Control no longer rests on the trust at all, since the base URL is
   never repointed (LLP 0262 R6). Both lines now state the fact, and the block
   names the one command that acts on what it reports: `hyp detach claude
   --purge`.

The migration machinery stays generic for any client still captured by the
proxy, and keeps its coverage: the tests drive it through a staged installed
plugin whose picker row declares the flag, instead of through `claude`.

docs/PRIVACY.md carried the same stale claim ("attach installs the CA into
your login keychain") and now describes it as residue of an earlier release.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…stall to purge its CA

Review of e1ea1a2 found the new `hyp status` proxy-trust note is
unconditional, while `proxy_mode: true` still has the gateway mint and
present that CA on every start (ai-gateway/src/source.js prepareInterception).
On such an install the note read "only proxy_mode capture uses this CA, and
the claude attach no longer does" and told the user to run
`hyp detach claude --purge`, which deletes the key the running interception
terminates TLS with; the next start mints a different one and nothing in the
product restores the keychain trust.

- ProxyTrustReport carries `proxyModeConfigured`, read off the effective
  gateway entry, because neither probe can tell a live CA from residue.
- The note branches on it: residue keeps the purge, a live proxy_mode
  gateway is told what still depends on the CA and given nothing to run.
  `--json` gains `proxy_mode_configured` alongside.
- The migration question no longer promises "macOS will then ask to trust
  the HypAware Local CA": `installCaTrust` has had no production caller
  since the attach went otel-only, so a yes mints the CA and stops there.
- The preset comment claimed writing `proxy_mode: true` would leave the
  gateway logging its stale-CA warning; that warning only fires on the
  `!proxyMode` branch. Restated to what the key would actually cost.
- PRIVACY.md and `hyp detach --help` no longer say a detach keeps the trust
  "so a later re-attach does not ask for your password again", which
  contradicts the same section's "nothing installs this CA into a system
  trust store any more".

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…detach, or read an unreadable config as proxy_mode off
…ttach performs (#923)

LLP 0262 moved Claude Code off proxy capture and took the last production
caller of `installCaTrust` with it: nothing in the tree installs the
interception CA into a trust store any more. The README's "Proxy mode"
section was outside that change's diff and still described the removed
step in the present tense, including the claim that a detach keeps the
keychain trust "so re-attaching does not ask again".

That last sentence is the one that costs the reader something. It reads
the keychain trust an older release left on their account as a
convenience being held for them, when it is a leftover nothing
re-creates and only `hyp detach <client> --purge` or `hyp daemon
uninstall` clears.

The section now says trust is file-scoped to the proxied client's own
settings, puts the keychain grant in the past tense as something earlier
releases did, and tells a reader who ran one of those that the trust
setting is still on their account until they remove it.

`test/core/readme-proxy-trust-claims.test.js` is the gate: it pairs the
fact that no production module outside `src/core/tls/darwin_trust.js`
names `installCaTrust` with the claims the README may not make while
that holds.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…es (#933 review)

The fix for #923 corrected the CA-trust bullet and left the bullet under it
making the same stale promise: "On macOS, a proxy attach also leaves a
login-session variable behind." `installLaunchdEnv` has no production caller,
so no attach runs `launchctl setenv NODE_USE_SYSTEM_CA 1` or writes the login
agent. The bullet's own body had already drifted to past tense, so it
contradicted its own lead. A reader turning proxy mode on for codex or
claude-desktop was told to expect a session-wide variable and a login item
that are never created.

Also: "nothing installs it into a system trust store" understated the change,
since the system keychain was never touched either way. What stopped is the
login-keychain install, so the sentence now names it.

The guard test only banned the three sentences this branch rewrote, so a
paragraph re-documented from scratch could re-assert every one of them in
fresh words and stay green. It now carries both halves: the banned claims,
and the sentences the README has to keep saying instead. Its tree-fact
assertion covers both trust writers, since the keychain root and the launchd
variable that made the root count are one grant in two halves.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The proxy-mode rewrite told README readers that no attach installs the
interception CA into an OS trust store, and left `docs/PRIVACY.md` and
`hyp detach --help` asserting the opposite in the present tense. The
privacy document is where a reader checks what touched their machine and
the help text is read at the moment of deciding, so those two were the
worse copies to defer.

- docs/PRIVACY.md: the keychain install, the password dialog, and the
  `launchctl setenv` step move to the past tense, and the lifetime
  paragraph stops selling a plain detach as holding the grant open for a
  re-attach that never asks again.
- src/core/cli/core_commands.js: `hyp detach --help` says the kept trust
  is a leftover no attach re-creates, not a spared dialog.
- README.md: `hyp detach <client>` does not unconditionally clear the
  launchd variable and its login agent. `releaseProxyModeLaunchdEnv`
  returns early unless the marker still records a proxy attach, so on a
  machine migrated to another attach mode (the machine the bullet is
  about) a plain detach is a no-op for the leftover. Only `--purge` and
  `hyp daemon uninstall` run the release unconditionally.

The gate grows to match. Its claim lists are now per document, because
the three say the same thing in three registers and the README's
sentences read as non-sequiturs in a terminal help string; the old shared
`REQUIRED_TRUTHS` was applied as a cross-product over `SCANNED`, so the
widening the file invited would have demanded the README's verbatim prose
of every document that joined. The installer scan is word-bounded so a
future `installCaTrustForHost` is not read as this one, and its failure
message says a module *names* a writer rather than accusing it of
installing trust, which is all a text scan can prove. Renamed off
`readme-` now that it covers three files.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

neutral:approved neutral reviewed this and holds it for a maintainer merge (own or adopted PR; LLP 0025/0030)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Proxy-mode migration prompt and hyp status CA-trust advice both describe an attach the otel-only Claude adapter no longer performs

1 participant