Skip to content

Warn on generated wrapper overwrites and status diagnostics#90537

Merged
vincentkoc merged 4 commits into
openclaw:mainfrom
TurboTheTurtle:codex/90518-wrapper-status-diagnostics
Jun 23, 2026
Merged

Warn on generated wrapper overwrites and status diagnostics#90537
vincentkoc merged 4 commits into
openclaw:mainfrom
TurboTheTurtle:codex/90518-wrapper-status-diagnostics

Conversation

@TurboTheTurtle

@TurboTheTurtle TurboTheTurtle commented Jun 5, 2026

Copy link
Copy Markdown
Contributor

Summary

  • warn before overwriting a customized generated launchd env wrapper during gateway service install/repair/restart rewrite
  • preserve install warnings in JSON daemon install output
  • preserve restart overwrite warnings in JSON daemon restart output
  • add a status hint when missing-secret diagnostics are running outside the installed service wrapper context

Fixes #90518

Real behavior proof

Behavior addressed: Generated macOS LaunchAgent env wrappers can be regenerated during gateway service rendering. After this patch, when the existing generated wrapper has local custom behavior, OpenClaw emits an overwrite warning that points operators to openclaw gateway install --wrapper <path> / OPENCLAW_WRAPPER, then restores the generated wrapper.

Real environment tested: Local macOS developer machine. The wrapper overwrite behavior proof below was run on PR head 00829a3ed4 with the Node source CLI via node --import tsx, temp HOME, synthetic profile pr90537proof, synthetic LaunchAgent label ai.openclaw.pr90537proof, and no secret values. The current-head restart JSON proof below was run on PR head 50786f859d with a temp HOME, temp OPENCLAW_STATE_DIR, synthetic LaunchAgent label ai.openclaw.pr90537restart, isolated launchctl shim, and redacted gateway token.

Exact steps or command run after this patch: Ran a local terminal proof script that imports ./src/daemon/launchd.ts, calls stageLaunchAgent with service env entries, edits the generated *-env-wrapper.sh to add a redacted custom-secret-provider-marker, restages once with the structured warning callback, restages once without the callback to exercise CLI-style stdout warnings, and removes the temp HOME.

Evidence after fix: Terminal output copied from the run on 00829a3ed4:

Real behavior proof for PR #90537
Date: 2026-06-05T04:08:12.652Z
Command: node --import tsx --input-type=module imports ./src/daemon/launchd.ts
Commit: 00829a3ed4
Temp HOME: /var/folders/.../openclaw-90537-stage-proof.XXXXXX
LaunchAgent label: ai.openclaw.pr90537proof

== first stage creates generated wrapper ==
Staged LaunchAgent: /var/folders/.../openclaw-90537-stage-proof.XXXXXX/Library/LaunchAgents/ai.openclaw.pr90537proof.plist
Logs: /var/folders/.../openclaw-90537-stage-proof.XXXXXX/Library/Logs/openclaw/gateway-pr90537proof.log
plist exists: yes
env file exists: yes
wrapper exists: yes
generated wrapper has exec: yes

== customize generated wrapper like a local secret-provider hook ==
custom marker before restage: yes

== restage with structured warning callback ==
stdout warning emitted: no
structured warnings: 1
warning: Existing generated LaunchAgent env wrapper at /var/folders/.../openclaw-90537-stage-proof.XXXXXX/.openclaw-pr90537proof/service-env/ai.openclaw.pr90537proof-env-wrapper.sh contains custom behavior and will be overwritten; move custom behavior to openclaw gateway install --wrapper <path> or OPENCLAW_WRAPPER.
custom marker after restage: no
wrapper restored to generated: yes

== restage without warning callback shows CLI-style warning ==
Warning: Existing generated LaunchAgent env wrapper at /var/folders/.../openclaw-90537-stage-proof.XXXXXX/.openclaw-pr90537proof/service-env/ai.openclaw.pr90537proof-env-wrapper.sh contains custom behavior and will be overwritten; move custom behavior to openclaw gateway install --wrapper <path> or OPENCLAW_WRAPPER.

Staged LaunchAgent: /var/folders/.../openclaw-90537-stage-proof.XXXXXX/Library/LaunchAgents/ai.openclaw.pr90537proof.plist
Logs: /var/folders/.../openclaw-90537-stage-proof.XXXXXX/Library/Logs/openclaw/gateway-pr90537proof.log
stdout contains overwrite warning: yes
stdout recommends --wrapper: yes

== cleanup ==
temp HOME removed: yes

Current-head restart JSON evidence: Terminal output copied from the run on 50786f859d:

Real behavior proof for PR #90537 restart JSON warning
Date: 2026-06-05T05:30:54.3NZ
Command: node --import tsx --input-type=module imports runDaemonRestart({ json: true })
Equivalent CLI path under test: openclaw gateway restart --json
Commit: 50786f859d
Temp HOME: /var/folders/.../openclaw-90537-restart-json-proof.XXXXXX
LaunchAgent label: ai.openclaw.pr90537restart

== stage synthetic LaunchAgent with generated env wrapper ==

Staged LaunchAgent: /var/folders/.../openclaw-90537-restart-json-proof.XXXXXX/Library/LaunchAgents/ai.openclaw.pr90537restart.plist
Logs: /var/folders/.../openclaw-90537-restart-json-proof.XXXXXX/Library/Logs/openclaw/gateway.log
wrapper exists: yes
generated wrapper has exec: yes

== customize generated wrapper like a local secret-provider hook ==
custom marker before restart: yes

== run restart JSON lifecycle path ==
{
  "action": "restart",
  "ok": true,
  "result": "scheduled",
  "message": "restart scheduled, gateway will restart momentarily",
  "service": {
    "label": "LaunchAgent",
    "loaded": true,
    "loadedText": "loaded",
    "notLoadedText": "not loaded"
  },
  "warnings": [
    "Existing generated LaunchAgent env wrapper at /var/folders/.../openclaw-90537-restart-json-proof.XXXXXX/.openclaw-pr90537restart/service-env/ai.openclaw.pr90537restart-env-wrapper.sh contains custom behavior and will be overwritten; move custom behavior to openclaw gateway install --wrapper <path> or OPENCLAW_WRAPPER."
  ]
}
json action: restart
json result: scheduled
json warning count: 1
json contains overwrite warning: yes
json recommends --wrapper: yes
json recommends OPENCLAW_WRAPPER: yes

== post-restart wrapper state ==
custom marker after restart: no
wrapper restored to generated: yes
launchctl shim calls:
launchctl print gui/501/ai.openclaw.pr90537restart
launchctl print gui/501/ai.openclaw.pr90537restart

== cleanup ==
temp HOME removed: yes

Observed result after fix: The customized generated wrapper is detected before overwrite, the structured warning path records exactly one warning for JSON/doctor-style callers, the stdout path prints the same warning for CLI-style callers, the warning names both --wrapper and OPENCLAW_WRAPPER, and the wrapper is restored to the generated content after restage. The restart path now threads the same structured warning callback through runServiceRestart into the launchd restart adapter, so openclaw gateway restart --json can serialize the overwrite warning instead of losing it to a null/stdout-only path.

What was not tested: Full openclaw gateway install --force launchd bootstrap was not repeated from this source checkout because this checkout does not have a built dist/index.js service entrypoint; the installed user gateway was left untouched. The current-head restart proof invokes the daemon CLI lifecycle runner used by openclaw gateway restart --json directly from source so the proof can target a synthetic LaunchAgent without stopping or restarting the real user gateway.

Supplemental local checks on current head 50786f859d:

node scripts/run-vitest.mjs src/daemon/launchd.test.ts src/cli/daemon-cli/lifecycle-core.test.ts src/cli/daemon-cli/install.test.ts
node scripts/run-tsgo.mjs -p tsconfig.core.json --incremental --tsBuildInfoFile .artifacts/tsgo-cache/core.tsbuildinfo
node scripts/run-tsgo.mjs -p test/tsconfig/tsconfig.test.src.json --incremental --tsBuildInfoFile .artifacts/tsgo-cache/test-src.tsbuildinfo
git diff --check

Checks

  • node scripts/test-projects.mjs src/daemon/launchd.test.ts src/cli/daemon-cli/install.test.ts src/commands/status.test.ts
  • node scripts/run-vitest.mjs src/daemon/launchd.test.ts src/cli/daemon-cli/lifecycle-core.test.ts src/cli/daemon-cli/install.test.ts
  • node_modules/.bin/oxfmt --write --no-error-on-unmatched-pattern src/daemon/service-types.ts src/daemon/launchd.ts src/daemon/launchd.test.ts src/cli/daemon-cli/install.ts src/cli/daemon-cli/install.test.ts src/commands/doctor-gateway-services.ts src/commands/status.service-summary.ts src/commands/status.daemon.ts src/commands/status.command.ts src/commands/status.test.ts

@openclaw-barnacle openclaw-barnacle Bot added gateway Gateway runtime cli CLI command changes commands Command implementations size: M triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. labels Jun 5, 2026
@clawsweeper

clawsweeper Bot commented Jun 5, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs maintainer review before merge. Reviewed June 21, 2026, 7:41 AM ET / 11:41 UTC.

Summary
The PR adds macOS launchd generated-wrapper overwrite warnings, threads install/restart service warnings into JSON output, and adds a status hint when CLI secret diagnostics run outside the installed service wrapper context.

PR surface: Source +108, Tests +166. Total +274 across 12 files.

Reproducibility: yes. The linked issue at #90518 includes an isolated macOS LaunchAgent repro, and current main plus v2026.6.9 still show the same unconditional generated-wrapper write path; I did not rerun the macOS repro in this read-only review.

Review metrics: none identified.

Stored data model
Persistent data-model change detected: serialized state: src/daemon/launchd.ts. Confirm migration or upgrade compatibility proof before merge.

Root-cause cluster
Relationship: fixed_by_candidate
Canonical: #90518
Summary: This PR is the linked candidate fix for the canonical macOS generated-wrapper overwrite and status-diagnostics issue.

Members:

Proposal only: this assessment does not dispatch repair, suppress jobs, mutate sibling items, close, or merge anything.

Merge readiness
Overall: 🦞 diamond lobster
Proof: 🦞 diamond lobster
Patch quality: 🦞 diamond lobster
Result: ready for maintainer review.

Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch.

Next step before merge

  • [P2] No repair lane is needed because the open PR already contains the focused implementation and this review found no actionable patch defect.

Security
Cleared: The diff adds diagnostics and optional internal warning plumbing only; it does not add dependencies, workflows, credential storage, secret printing, or a new wrapper execution contract.

Review details

Best possible solution:

Land the focused launchd/status diagnostics after normal maintainer review, while keeping the related legacy auth-profile migration note separate unless it is independently reproduced.

Do we have a high-confidence way to reproduce the issue?

Yes. The linked issue at #90518 includes an isolated macOS LaunchAgent repro, and current main plus v2026.6.9 still show the same unconditional generated-wrapper write path; I did not rerun the macOS repro in this read-only review.

Is this the best way to solve the issue?

Yes. The PR fixes the narrow owner boundaries: launchd warns at the generated-wrapper write site, daemon lifecycle preserves structured warnings, doctor can surface repair notes, and status uses installed service metadata without provider-specific behavior or new config.

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against d1cbe29f3d52.

Label changes

Label justifications:

  • P2: This is a normal-priority gateway service diagnostics fix for a confirmed macOS wrapper overwrite and misleading missing-secret status path with a clear linked issue and workaround.
  • rating: 🦞 diamond lobster: Overall readiness is 🦞 diamond lobster; proof is 🦞 diamond lobster and patch quality is 🦞 diamond lobster.
  • status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Sufficient (terminal): The PR body includes terminal proof from a real macOS developer machine showing after-fix wrapper overwrite warnings and JSON restart warning serialization with synthetic LaunchAgent state and redacted data.
  • proof: sufficient: Contributor real behavior proof is sufficient. The PR body includes terminal proof from a real macOS developer machine showing after-fix wrapper overwrite warnings and JSON restart warning serialization with synthetic LaunchAgent state and redacted data.
Evidence reviewed

PR surface:

Source +108, Tests +166. Total +274 across 12 files.

View PR surface stats
Area Files Added Removed Net
Source 8 115 7 +108
Tests 4 167 1 +166
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 12 282 8 +274

What I checked:

  • Repository policy read: Read the full root AGENTS.md and applied the PR review guidance for gateway/service compatibility, whole-surface review, proof, and owner-history checks. (AGENTS.md:21, d1cbe29f3d52)
  • Current main still overwrites generated launchd wrapper: Current main writes buildLaunchAgentEnvironmentWrapper() directly to the generated wrapper path without reading existing content or warning first. (src/daemon/launchd.ts:214, d1cbe29f3d52)
  • Latest release still lacks the fix: v2026.6.9 contains the same direct generated-wrapper write path and no wrapper-context status hint, so this PR is not obsolete by release behavior. (src/daemon/launchd.ts:213, c645ec4555c0)
  • PR adds warning at the launchd write site: PR head reads the existing generated wrapper, compares it with the generated content, emits a structured/stdout warning, then rewrites the generated wrapper. (src/daemon/launchd.ts:184, 7386fe85f4a0)
  • PR preserves restart warnings in JSON output: PR head uses the daemon action context warnings array and passes a warn callback through service.restart so restart JSON can include launchd overwrite warnings. (src/cli/daemon-cli/lifecycle-core.ts:473, 7386fe85f4a0)
  • PR adds status wrapper-context hint: PR head compares the installed service wrapper path with the current CLI OPENCLAW_WRAPPER value and prints a sanitized warning only when secret diagnostics are present and the paths differ. (src/commands/status.command.ts:95, 7386fe85f4a0)

Likely related people:

  • steipete: Authored the persistent gateway wrapper support and recent docs around launchd daemon helpers and status command wiring, which define the supported durable wrapper path this PR now recommends. (role: feature owner / recent area contributor; confidence: high; commits: 9f9bd41f40df, 975d40d47483, 976ea3ff5091; files: src/cli/daemon-cli/install.ts, src/commands/daemon-install-helpers.ts, src/daemon/program-args.ts)
  • vincentkoc: Recent current-main history and the latest release tag include launchd/service-state and release work adjacent to the generated wrapper and update/reinstall path. (role: recent launchd/release area contributor; confidence: medium; commits: a15797ad1129, 900a834c6088, c645ec4555c0; files: src/daemon/launchd.ts, src/cli/update-cli/update-command.ts)
  • TurboTheTurtle: Has current-main launchd update-job recognition work adjacent to this service-maintenance path, in addition to authoring this focused candidate fix. (role: recent adjacent contributor / current fix author; confidence: medium; commits: 49e5091f180e, 7386fe85f4a0; files: src/daemon/launchd.ts, src/cli/update-cli/update-command.ts)
  • bek91: Recent macOS launchd stop/restart lifecycle work touched the managed-service restart path adjacent to the restart wrapper rewrite behavior. (role: recent launchd lifecycle contributor; confidence: low; commits: 69974530987c; files: src/daemon/launchd.ts)
What the crustacean ranks mean
  • 🦀 challenger crab: rare, exceptional readiness with strong proof, clean implementation, and convincing validation.
  • 🦞 diamond lobster: very strong readiness with only minor maintainer review expected.
  • 🐚 platinum hermit: good normal PR, likely mergeable with ordinary maintainer review.
  • 🦐 gold shrimp: useful signal, but proof or patch confidence is still limited.
  • 🦪 silver shellfish: thin signal; proof, validation, or implementation needs work.
  • 🧂 unranked krab: not merge-ready because proof is missing/unusable or there are serious correctness or safety concerns.
  • 🌊 off-meta tidepool: rating does not apply to this item.

Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics.

How this review workflow works
  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.

@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. P2 Normal backlog priority with limited blast radius. labels Jun 5, 2026
@openclaw-barnacle openclaw-barnacle Bot added proof: supplied External PR includes structured after-fix real behavior proof. and removed triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. labels Jun 5, 2026
@TurboTheTurtle

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 5, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. and removed rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. labels Jun 5, 2026
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label Jun 5, 2026

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 5, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@clawsweeper clawsweeper Bot added status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. and removed status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. labels Jun 5, 2026

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 5, 2026

Copy link
Copy Markdown
Contributor

🦞👀
ClawSweeper picked this up.

Command router queued. I will update this comment with the next step.

Re-review progress:

@clawsweeper clawsweeper Bot added rating: 🌊 off-meta tidepool PR readiness rating does not apply to this item. proof: sufficient ClawSweeper judged the real behavior proof convincing. and removed rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. rating: 🌊 off-meta tidepool PR readiness rating does not apply to this item. labels Jun 5, 2026
@clawsweeper clawsweeper Bot added rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. labels Jun 5, 2026
@TurboTheTurtle
TurboTheTurtle marked this pull request as ready for review June 5, 2026 17:51
@clawsweeper clawsweeper Bot added rating: 🦞 diamond lobster Very strong PR readiness with only minor maintainer review expected. and removed rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. labels Jun 5, 2026
@TurboTheTurtle

Copy link
Copy Markdown
Contributor Author

I checked the failed Labeler / label check. The failure is not from this PR branch or tests; the job hit a GitHub App installation API rate limit while reading labels:

HttpError: API rate limit exceeded for installation ID 106147218
x-ratelimit-remaining: 0

The later current-head CI run is green, ClawSweeper has this at ready for maintainer look, and I re-enabled maintainer edits (maintainer_can_modify: true) on the PR.

I tried to rerun the failed labeler job, but GitHub rejected it with Must have admin rights to Repository, so a maintainer/admin rerun is needed to clear that stale failed check.

@TurboTheTurtle
TurboTheTurtle force-pushed the codex/90518-wrapper-status-diagnostics branch from 50786f8 to 7386fe8 Compare June 13, 2026 05:33
@TurboTheTurtle

Copy link
Copy Markdown
Contributor Author

Rebased this branch onto current upstream/main and resolved the conflict in src/cli/daemon-cli/lifecycle-core.test.ts by keeping both current type imports used by the test file.

Validation on head 7386fe85f4a0e8c5552c9731ea8d0570c52a2723:

node scripts/run-vitest.mjs src/cli/daemon-cli/lifecycle-core.test.ts src/daemon/launchd.test.ts
# passed: 2 Vitest shards, 2 files / 115 tests

git diff --check upstream/main..HEAD
# passed

git log --format='%h %an <%ae> %s' upstream/main..HEAD
# 7386fe85f4 Andy Ye <[email protected]> fix(gateway): preserve restart warnings in json
# e3ec88d763 Andy Ye <[email protected]> fix(gateway): warn on launchd restart wrapper rewrites
# 5a4a761dc5 Andy Ye <[email protected]> fix(gateway): warn on generated wrapper overwrites

@clawsweeper re-review

@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label Jun 13, 2026
@clawsweeper

clawsweeper Bot commented Jun 13, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label Jun 13, 2026
@vincentkoc
vincentkoc force-pushed the codex/90518-wrapper-status-diagnostics branch from 7386fe8 to 3b4833c Compare June 23, 2026 04:35
@vincentkoc
vincentkoc force-pushed the codex/90518-wrapper-status-diagnostics branch from 3b4833c to c6b6589 Compare June 23, 2026 05:29
@vincentkoc
vincentkoc merged commit ca2f4c0 into openclaw:main Jun 23, 2026
92 of 93 checks passed
@vincentkoc

Copy link
Copy Markdown
Member

Merged via squash.

Thanks @TurboTheTurtle!

@TurboTheTurtle
TurboTheTurtle deleted the codex/90518-wrapper-status-diagnostics branch June 23, 2026 05:58
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request Jun 24, 2026
…#90537)

Merged via squash.

Prepared head SHA: c6b6589
Co-authored-by: TurboTheTurtle <[email protected]>
Co-authored-by: vincentkoc <[email protected]>
Reviewed-by: @vincentkoc
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

cli CLI command changes commands Command implementations gateway Gateway runtime P2 Normal backlog priority with limited blast radius. proof: sufficient ClawSweeper judged the real behavior proof convincing. proof: supplied External PR includes structured after-fix real behavior proof. rating: 🦞 diamond lobster Very strong PR readiness with only minor maintainer review expected. size: M status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

macOS update/reinstall can overwrite generated gateway env wrapper and make status misleading for secret-provider setups

2 participants