fix(canvas): SSOT-drive runtime picker so google-adk shows correctly #2016

Merged
core-be merged 2 commits from feat/google-adk-runtime-ssot into main 2026-05-31 09:46:31 +00:00
Member

Problem

The ConfigTab runtime dropdown filtered GET /templates through a hardcoded SUPPORTED_RUNTIME_VALUES allowlist (claude-code/codex/openclaw/hermes). google-adk ships in manifest.json and the workspace-server knownRuntimes registry, but this frontend Set silently dropped it — so a google-adk workspace's Config tab rendered the wrong runtime option, and Save & Restart would clobber the runtime (same class as the hermes "Claude Code (default)" bug, #1894).

Fix (SSOT-driven)

GET /templates is already gated to the manifest maintained set by loadRuntimesFromManifest, so the picker should trust the backend, not re-filter it.

  • canvas ConfigTab.tsx: remove SUPPORTED_RUNTIME_VALUES; show every runtime /templates serves, hiding one only when its template declares displayable: false. Add google-adk to the offline fallback.
  • workspace-server templates.go: add optional Displayable *bool (yaml+json, omitempty) plumbed config.yaml → /templates, so a runtime opts out of the picker declaratively (replaces the hardcoded frontend gate).

Tests

  • ConfigTab.googleAdk.test.tsx — google-adk selected; displayable:false hidden.
  • TestTemplatesList_DisplayableFlag — nil/true/false + omitempty JSON contract.

Local: vitest changed-area 76 passed; go test ./internal/handlers ok; eslint+gofmt+vet clean.

🤖 Generated with Claude Code

## Problem The ConfigTab runtime dropdown filtered `GET /templates` through a hardcoded `SUPPORTED_RUNTIME_VALUES` allowlist (`claude-code/codex/openclaw/hermes`). `google-adk` ships in `manifest.json` and the workspace-server `knownRuntimes` registry, but this frontend Set silently dropped it — so a google-adk workspace's Config tab rendered the wrong runtime option, and **Save & Restart would clobber the runtime** (same class as the hermes "Claude Code (default)" bug, #1894). ## Fix (SSOT-driven) `GET /templates` is already gated to the manifest maintained set by `loadRuntimesFromManifest`, so the picker should trust the backend, not re-filter it. - **canvas `ConfigTab.tsx`**: remove `SUPPORTED_RUNTIME_VALUES`; show every runtime `/templates` serves, hiding one only when its template declares `displayable: false`. Add `google-adk` to the offline fallback. - **workspace-server `templates.go`**: add optional `Displayable *bool` (yaml+json, omitempty) plumbed config.yaml → `/templates`, so a runtime opts out of the picker declaratively (replaces the hardcoded frontend gate). ## Tests - `ConfigTab.googleAdk.test.tsx` — google-adk selected; `displayable:false` hidden. - `TestTemplatesList_DisplayableFlag` — nil/true/false + omitempty JSON contract. Local: vitest changed-area 76 passed; `go test ./internal/handlers` ok; eslint+gofmt+vet clean. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
core-be added 1 commit 2026-05-31 08:27:12 +00:00
fix(canvas): SSOT-drive runtime picker so google-adk shows correctly
ci-arm64-advisory / fast-checks (pull_request) Waiting to run
CI / all-required (pull_request) Failing after 1s
Block internal-flavored paths / Block forbidden paths (pull_request) Failing after 1s
CI / Detect changes (pull_request) Failing after 0s
CI / Python Lint & Test (pull_request) Failing after 0s
CI / Platform (Go) (pull_request) Has been skipped
E2E API Smoke Test / detect-changes (pull_request) Failing after 1s
CI / Canvas (Next.js) (pull_request) Has been skipped
CI / Shellcheck (E2E scripts) (pull_request) Has been skipped
CI / Canvas Deploy Reminder (pull_request) Has been skipped
E2E Chat / detect-changes (pull_request) Failing after 0s
E2E Staging Canvas (Playwright) / detect-changes (pull_request) Failing after 0s
Handlers Postgres Integration / detect-changes (pull_request) Failing after 0s
E2E API Smoke Test / E2E API Smoke Test (pull_request) Has been skipped
E2E Chat / E2E Chat (pull_request) Has been skipped
E2E Staging Canvas (Playwright) / Canvas tabs E2E (pull_request) Has been skipped
Handlers Postgres Integration / Handlers Postgres Integration (pull_request) Has been skipped
Harness Replays / detect-changes (pull_request) Failing after 1s
Harness Replays / Harness Replays (pull_request) Has been skipped
Lint forbidden tenant-env keys / Scan workspace_secrets writers for forbidden env keys (pull_request) Failing after 2s
Lint no tenant GITEA or GITHUB token write / Scan for repo-host token write into tenant workspace surface (pull_request) Failing after 1s
lint-required-no-paths / lint-required-no-paths (pull_request) Failing after 1s
verify-providers-gen / Regenerate providers artifact and fail on drift (pull_request) Failing after 1s
Secret scan / Scan diff for credential-shaped strings (pull_request) Failing after 1s
gate-check-v3 / gate-check (pull_request) Failing after 1s
Lint shellcheck (arm64 pilot) / shellcheck-arm64 (pilot) (pull_request) Successful in 13s
sop-checklist / review-refire (pull_request) Has been skipped
sop-checklist / na-declarations (pull_request) N/A: (none)
sop-tier-check / tier-check (pull_request) Successful in 32s
sop-checklist / all-items-acked (pull_request) Successful in 1m16s
qa-review / approved (pull_request) Refired via /qa-recheck by unknown
security-review / approved (pull_request) Refired via /security-recheck by unknown
b611b1a9bf
The ConfigTab runtime dropdown filtered GET /templates through a hardcoded
SUPPORTED_RUNTIME_VALUES allowlist (claude-code/codex/openclaw/hermes).
google-adk shipped in manifest.json + the workspace-server knownRuntimes
registry but was dropped by this frontend Set, so a google-adk workspace's
Config tab rendered the wrong runtime option and a Save would clobber the
runtime to the wrong value.

Make the picker trust the backend SSOT: /templates is already gated to the
manifest maintained set by loadRuntimesFromManifest. Remove the allowlist;
hide a runtime only when its template declares displayable:false (new
optional flag plumbed manifest config.yaml -> templateSummary -> /templates).

- canvas/ConfigTab.tsx: drop SUPPORTED_RUNTIME_VALUES; filter on
  r.displayable===false; add google-adk to offline FALLBACK list.
- workspace-server templates.go: add Displayable *bool (yaml+json,
  omitempty) so a template can opt out of the picker declaratively.
- tests: ConfigTab.googleAdk.test.tsx (google-adk selected + displayable
  hidden) + TestTemplatesList_DisplayableFlag (nil/true/false + JSON contract).

Refs project_canvas_runtime_dropdown_ssot_fix.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
core-qa approved these changes 2026-05-31 08:35:03 +00:00
Dismissed
core-qa left a comment
Member

QA review: SSOT-driven runtime picker — verified the dropdown now derives from /templates (manifest-gated) instead of the hardcoded allowlist; new ConfigTab.googleAdk test covers google-adk selected + displayable:false hidden; TestTemplatesList_DisplayableFlag covers nil/true/false + JSON omitempty. LGTM.

QA review: SSOT-driven runtime picker — verified the dropdown now derives from /templates (manifest-gated) instead of the hardcoded allowlist; new ConfigTab.googleAdk test covers google-adk selected + displayable:false hidden; TestTemplatesList_DisplayableFlag covers nil/true/false + JSON omitempty. LGTM.
core-security approved these changes 2026-05-31 08:35:03 +00:00
Dismissed
core-security left a comment
Member

Security review: change is display/filtering only; no auth/secret surface touched. Displayable is an additive opt-out flag (pointer, omitempty), no privilege implications. LGTM.

Security review: change is display/filtering only; no auth/secret surface touched. Displayable is an additive opt-out flag (pointer, omitempty), no privilege implications. LGTM.
Member

/qa-recheck

/qa-recheck
Member

/security-recheck

/security-recheck
core-be added 1 commit 2026-05-31 09:17:32 +00:00
ci: re-trigger after gitea restart task desync (no-op)
ci-arm64-advisory / fast-checks (pull_request) Waiting to run
Lint shellcheck (arm64 pilot) / shellcheck-arm64 (pilot) (pull_request) Successful in 13s
Block internal-flavored paths / Block forbidden paths (pull_request) Successful in 5s
CI / Detect changes (pull_request) Successful in 5s
CI / Python Lint & Test (pull_request) Successful in 4s
E2E API Smoke Test / detect-changes (pull_request) Successful in 6s
E2E Chat / detect-changes (pull_request) Successful in 6s
E2E Staging Canvas (Playwright) / detect-changes (pull_request) Successful in 6s
Harness Replays / detect-changes (pull_request) Successful in 4s
Handlers Postgres Integration / detect-changes (pull_request) Successful in 7s
Lint forbidden tenant-env keys / Scan workspace_secrets writers for forbidden env keys (pull_request) Successful in 4s
Lint no tenant GITEA or GITHUB token write / Scan for repo-host token write into tenant workspace surface (pull_request) Successful in 4s
Secret scan / Scan diff for credential-shaped strings (pull_request) Successful in 8s
gate-check-v3 / gate-check (pull_request) Successful in 12s
qa-review / approved (pull_request) Successful in 5s
security-review / approved (pull_request) Successful in 6s
sop-checklist / na-declarations (pull_request) N/A: (none)
verify-providers-gen / Regenerate providers artifact and fail on drift (pull_request) Successful in 35s
sop-checklist / review-refire (pull_request) Has been skipped
sop-checklist / all-items-acked (pull_request) Successful in 7s
sop-tier-check / tier-check (pull_request) Successful in 6s
lint-required-no-paths / lint-required-no-paths (pull_request) Successful in 1m12s
CI / Shellcheck (E2E scripts) (pull_request) Successful in 6s
E2E API Smoke Test / E2E API Smoke Test (pull_request) Successful in 1m42s
E2E Chat / E2E Chat (pull_request) Successful in 8s
E2E Staging Canvas (Playwright) / Canvas tabs E2E (pull_request) Successful in 3s
Harness Replays / Harness Replays (pull_request) Successful in 3s
Handlers Postgres Integration / Handlers Postgres Integration (pull_request) Successful in 2m28s
CI / Platform (Go) (pull_request) Successful in 7m53s
CI / Canvas (Next.js) (pull_request) Successful in 7m24s
CI / all-required (pull_request) Successful in 22m29s
CI / Canvas Deploy Reminder (pull_request) Has been skipped
audit-force-merge / audit (pull_request) Successful in 7s
418db083ff
Empty commit on the PR branch to get a clean CI run; the prior run's
tasks were orphaned by the 2026-05-31 08:30 gitea restart (task-not-found).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
core-qa approved these changes 2026-05-31 09:17:33 +00:00
core-qa left a comment
Member

Re-approve after CI re-trigger empty commit (4cb9f0e2); code unchanged.

Re-approve after CI re-trigger empty commit (4cb9f0e2); code unchanged.
core-security approved these changes 2026-05-31 09:17:35 +00:00
core-security left a comment
Member

Re-approve after CI re-trigger empty commit (4cb9f0e2); code unchanged.

Re-approve after CI re-trigger empty commit (4cb9f0e2); code unchanged.
core-be merged commit e45033e15c into main 2026-05-31 09:46:31 +00:00
Sign in to join this conversation.
3 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: molecule-ai/molecule-core#2016