RFC#2843 #32: agent-skills are plugins, not asset-channel paths; record declared plugins on create_workspace #3000

Merged
core-devops merged 2 commits from rfc2843-32-skills-plugins-not-assets into main 2026-06-16 21:16:25 +00:00
Member

RFC#2843 #32 — make a fresh seo-agent auto-install seo-all post-boot. Two tightly-coupled prod fixes in one PR (they only work end-to-end together).

Summary

FIX A — agent-skills must NOT be an asset-channel path. IsCPTemplateAssetPath still allowed agent-skills/*, so a fresh seo-agent's ~501–716 KiB skill tree was pulled into the provision request and fail-closed BEFORE the CP was ever called (WORKSPACE_PROVISION_FAILED, reproduced twice; control template claude-code-default succeeded; prod CP logs showed zero provision requests for the failed ws). Skills are PLUGINS now (core #2995): the gitea:// resolver reads the agent-skills/<skill> subpath from the template repo at install time. The asset-channel allowlist is now config.yaml + prompts/ ONLY**; agent-skills/* is rejected at the addAsset boundary. Skill files stay in the repo (they ARE the plugin source). The seo-agent asset set drops to config.yaml (~9 KB) + prompts/seo-agent.md (~8 KB) ≈ 18 KB, far under the 256 KiB cap.

FIX B — create_workspace must record declared plugins. The post-online reconcile only installs plugins with workspace_declared_plugins rows. recordDeclaredPlugin ran ONLY in org_import.go, not in the single create_workspace path — so a singly-provisioned seo-agent got no declared rows, the reconcile no-op'd, and seo-all never installed. New template_plugins.go parses the template config.yaml plugins: block (mergePlugins-aligned dedup + !/- opt-out) and records each declared plugin in WorkspaceHandler.Create, mirroring the org_import loop. Idempotent via the ON CONFLICT upsert.

SOP checklist

  • Comprehensive testing performed: provisioner package — flipped the prior "allows agent-skills" allowlist tests to rejection/skip tests; new TestCollectCPConfigFiles_RejectsAgentSkillsAsset; updated wire-shape + large-asset tests to config.yaml/prompts only. handlers package — new template_plugins_test.go: parseTemplatePlugins reads the seo-agent shape + dedup/opt-out; sqlmock-backed seedTemplatePlugins asserts the workspace_declared_plugins INSERT with the derived install name seo-all. go build ./..., go vet, and both package test suites green locally (with MOLECULE_GITEA_TOKEN for token-gated tests).
  • Local-postgres E2E run: N/A for unit scope — the DB write is proven via sqlmock (recordDeclaredPlugin no-ops on nil db.DB, so a mock-backed assertion is the unit-level proof). Full live DB path is exercised by the staging delivery e2e below.
  • Staging-smoke verified or pending: pending post-merge — re-verified by provisioning a fresh seo-agent on the agents-team prod tenant after auto-deploy (the #32 acceptance). The template-delivery-e2e workflow is the standing regression gate (advisory, Phase 1).
  • Root-cause not symptom: yes — A fixes the actual fail-closed cause (skill tree forced through the provision payload because the allowlist still admitted agent-skills); B fixes the actual no-op cause (declared rows never written on the single-create path). Neither is a symptom patch.
  • Five-Axis review walked: correctness (allowlist now config.yaml+prompts only; declared rows written + idempotent), readability (template_plugins.go mirrors template_schedules.go 1:1), architecture (skills-as-plugins decoupling per CTO ruling; asset channel carries non-secret config only), security (blast-radius allowlist tightened, not loosened — agent-skills now rejected alongside MEMORY.md/CLAUDE.md; hostile-template LimitReader reused), performance (asset payload shrinks ~30× for seo-agent; fetcher skips the skill tree).
  • No backwards-compat shim / dead code added: yes, none — no compat shim; the change tightens the allowlist and adds a create-path parallel to an existing org-import path. No dead code.
  • Memory consulted: reference_runtime_fix_deploy_path, feedback_no_such_thing_as_flakes, feedback_comprehensive_tests_and_e2e_for_llm, feedback_no_silent_checklist_trim, feedback_no_gofmt_w_wildcard (gofmt -w only files I edited).

🤖 Generated with Claude Code

RFC#2843 #32 — make a fresh seo-agent auto-install seo-all post-boot. Two tightly-coupled prod fixes in one PR (they only work end-to-end together). ## Summary **FIX A — agent-skills must NOT be an asset-channel path.** `IsCPTemplateAssetPath` still allowed `agent-skills/*`, so a fresh seo-agent's ~501–716 KiB skill tree was pulled into the provision request and fail-closed BEFORE the CP was ever called (WORKSPACE_PROVISION_FAILED, reproduced twice; control template claude-code-default succeeded; prod CP logs showed zero provision requests for the failed ws). Skills are PLUGINS now (core #2995): the gitea:// resolver reads the `agent-skills/<skill>` subpath from the template repo at install time. The asset-channel allowlist is now **config.yaml + prompts/** ONLY**; `agent-skills/*` is rejected at the addAsset boundary. Skill files stay in the repo (they ARE the plugin source). The seo-agent asset set drops to config.yaml (~9 KB) + prompts/seo-agent.md (~8 KB) ≈ 18 KB, far under the 256 KiB cap. **FIX B — create_workspace must record declared plugins.** The post-online reconcile only installs plugins with `workspace_declared_plugins` rows. `recordDeclaredPlugin` ran ONLY in `org_import.go`, not in the single `create_workspace` path — so a singly-provisioned seo-agent got no declared rows, the reconcile no-op'd, and seo-all never installed. New `template_plugins.go` parses the template config.yaml `plugins:` block (mergePlugins-aligned dedup + `!`/`-` opt-out) and records each declared plugin in `WorkspaceHandler.Create`, mirroring the org_import loop. Idempotent via the ON CONFLICT upsert. ## SOP checklist - **Comprehensive testing performed**: provisioner package — flipped the prior "allows agent-skills" allowlist tests to rejection/skip tests; new `TestCollectCPConfigFiles_RejectsAgentSkillsAsset`; updated wire-shape + large-asset tests to config.yaml/prompts only. handlers package — new `template_plugins_test.go`: `parseTemplatePlugins` reads the seo-agent shape + dedup/opt-out; sqlmock-backed `seedTemplatePlugins` asserts the `workspace_declared_plugins` INSERT with the derived install name `seo-all`. `go build ./...`, `go vet`, and both package test suites green locally (with MOLECULE_GITEA_TOKEN for token-gated tests). - **Local-postgres E2E run**: N/A for unit scope — the DB write is proven via sqlmock (recordDeclaredPlugin no-ops on nil db.DB, so a mock-backed assertion is the unit-level proof). Full live DB path is exercised by the staging delivery e2e below. - **Staging-smoke verified or pending**: pending post-merge — re-verified by provisioning a fresh seo-agent on the agents-team prod tenant after auto-deploy (the #32 acceptance). The `template-delivery-e2e` workflow is the standing regression gate (advisory, Phase 1). - **Root-cause not symptom**: yes — A fixes the actual fail-closed cause (skill tree forced through the provision payload because the allowlist still admitted agent-skills); B fixes the actual no-op cause (declared rows never written on the single-create path). Neither is a symptom patch. - **Five-Axis review walked**: correctness (allowlist now config.yaml+prompts only; declared rows written + idempotent), readability (template_plugins.go mirrors template_schedules.go 1:1), architecture (skills-as-plugins decoupling per CTO ruling; asset channel carries non-secret config only), security (blast-radius allowlist tightened, not loosened — agent-skills now rejected alongside MEMORY.md/CLAUDE.md; hostile-template LimitReader reused), performance (asset payload shrinks ~30× for seo-agent; fetcher skips the skill tree). - **No backwards-compat shim / dead code added**: yes, none — no compat shim; the change tightens the allowlist and adds a create-path parallel to an existing org-import path. No dead code. - **Memory consulted**: `reference_runtime_fix_deploy_path`, `feedback_no_such_thing_as_flakes`, `feedback_comprehensive_tests_and_e2e_for_llm`, `feedback_no_silent_checklist_trim`, `feedback_no_gofmt_w_wildcard` (gofmt -w only files I edited). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
core-devops added 1 commit 2026-06-16 21:08:32 +00:00
RFC#2843 #32: agent-skills are plugins, not asset-channel paths; record declared plugins on create_workspace
CI / Python Lint & Test (pull_request) Successful in 5s
Block internal-flavored paths / Block forbidden paths (pull_request) Successful in 7s
E2E Peer Visibility (literal MCP list_peers) / detect-changes (pull_request) Successful in 7s
Handlers Postgres Integration / detect-changes (pull_request) Successful in 6s
Harness Replays / detect-changes (pull_request) Successful in 6s
Lint forbidden tenant-env keys / Scan for repo-host token write into tenant workspace surface (pull_request) Successful in 6s
Lint forbidden tenant-env keys / Scan workspace_secrets writers for forbidden env keys (pull_request) Successful in 6s
lint-required-workflows-docker-host-pinned / Lint docker-host pin on docker-touching workflows (pull_request) Successful in 5s
E2E Peer Visibility (literal MCP list_peers) / E2E Peer Visibility (local) (pull_request) Has been skipped
Lint curl status-code capture / Scan workflows for curl status-capture pollution (pull_request) Successful in 12s
E2E Peer Visibility (literal MCP list_peers) / E2E Peer Visibility (pull_request) Successful in 5s
E2E API Smoke Test / detect-changes (pull_request) Successful in 20s
CI / Detect changes (pull_request) Successful in 22s
E2E Staging Canvas (Playwright) / detect-changes (pull_request) Successful in 21s
Lint publish-runner timeout-minutes / Lint publish-runner timeout-minutes (pull_request) Failing after 15s
Secret scan / Scan diff for credential-shaped strings (pull_request) Successful in 7s
lint-required-no-paths / lint-required-no-paths (pull_request) Successful in 17s
sop-checklist / review-refire (pull_request_target) Has been skipped
lint-no-coe-on-required / lint-no-coe-on-required (pull_request) Successful in 19s
lint-setup-go-cache / lint-setup-go-cache (pull_request) Successful in 16s
Lint workflow YAML (Gitea-1.22.6-hostile shapes) / Lint workflow YAML for Gitea-1.22.6-hostile shapes (pull_request) Failing after 15s
CI / Shellcheck (E2E scripts) (pull_request) Successful in 2s
CI / Canvas (Next.js) (pull_request) Successful in 2s
CI / Canvas Deploy Status (pull_request) Successful in 1s
E2E Staging Canvas (Playwright) / Canvas tabs E2E (pull_request) Successful in 3s
reserved-path-review / reserved-path-review (pull_request_target) Failing after 10s
PR Diff Guard / PR diff guard (pull_request) Successful in 16s
sop-checklist / all-items-acked (pull_request_target) Successful in 9s
E2E Chat / detect-changes (pull_request) Successful in 37s
gate-check-v3 / gate-check (pull_request_target) Failing after 19s
Lint pre-flip continue-on-error / Verify continue-on-error flips have run-log proof (pull_request) Successful in 33s
E2E Chat / E2E Chat (pull_request) Successful in 4s
qa-review / approved (pull_request_target) Approved via pull_request_review trigger
reserved-path-review / reserved-path-review (pull_request_review) Successful in 8s
lint-continue-on-error-tracking / lint-continue-on-error-tracking (pull_request) Successful in 40s
Local Provision Lifecycle E2E / Local Provision Lifecycle E2E (stub) (pull_request) Successful in 33s
qa-review / approved (pull_request_review) Successful in 10s
security-review / approved (pull_request_target) Approved via pull_request_review trigger
security-review / approved (pull_request_review) Successful in 10s
lint-required-context-exists-in-bp / lint-required-context-exists-in-bp (pull_request) Failing after 45s
sop-checklist / all-items-acked (pull_request) acked: 7/7
sop-checklist / na-declarations (pull_request) N/A: (none)
Handlers Postgres Integration / Handlers Postgres Integration (pull_request) Successful in 46s
Local Provision Lifecycle E2E / Local Provision Lifecycle E2E (real image + MiniMax LLM, advisory) (pull_request) Successful in 32s
Harness Replays / Harness Replays (pull_request) Successful in 1m21s
E2E API Smoke Test / E2E API Smoke Test (pull_request) Successful in 2m19s
CI / Platform (Go) (pull_request) Has been cancelled
CI / all-required (pull_request) Has been cancelled
E2E Staging External Runtime / E2E Staging External Runtime (pull_request) Waiting to run
E2E Staging SaaS (full lifecycle) / pr-validate (pull_request) Waiting to run
E2E Staging SaaS (full lifecycle) / E2E Staging SaaS (pull_request) Waiting to run
E2E Staging SaaS (full lifecycle) / E2E Staging Platform Boot (pull_request) Waiting to run
E2E Staging SaaS (full lifecycle) / E2E Staging Concierge user_tasks (pull_request) Waiting to run
E2E Staging SaaS (full lifecycle) / E2E Staging Workspace Requests (core#2606) (pull_request) Waiting to run
E2E Staging SaaS (full lifecycle) / E2E Staging Concierge Creates Workspace (pull_request) Waiting to run
E2E Staging SaaS (full lifecycle) / E2E Staging Concierge (compile+skip) (pull_request) Waiting to run
E2E Staging SaaS (full lifecycle) / E2E Staging Concierge Platform Agent (pull_request) Waiting to run
6f379a884f
Two evidence-backed prod fixes that together make a fresh seo-agent
auto-install seo-all post-boot.

FIX A — agent-skills must NOT ride the provisioning asset channel.
IsCPTemplateAssetPath still allowed `agent-skills/*`, so a fresh
seo-agent's ~501-716 KiB skill tree got pulled into the provision
request and fail-closed before the CP was ever called
(WORKSPACE_PROVISION_FAILED, reproduced twice; zero CP provision
requests logged for the failed ws). Skills are PLUGINS now (core #2995):
they install dynamically post-online via the gitea:// plugin resolver,
which reads the agent-skills/<skill> subpath from the template repo at
install time. So the asset-channel allowlist is now config.yaml +
prompts/** ONLY; agent-skills/* is rejected at the addAsset boundary.
The skill files remain in the template repo (they ARE the plugin
source). The seo-agent asset set drops to config.yaml (~9 KB) +
prompts/seo-agent.md (~8 KB) = ~18 KB, far under the 256 KiB cap.

FIX B — create_workspace must record declared plugins.
The post-online reconcile only installs plugins that have
workspace_declared_plugins rows. recordDeclaredPlugin ran ONLY in
org_import.go, not in the single create_workspace path — so a singly
provisioned seo-agent got no declared rows, the reconcile no-op'd, and
seo-all never installed. New template_plugins.go parses the template
config.yaml `plugins:` block (mergePlugins-aligned dedup + "!"/"-"
opt-out) and records each declared plugin in WorkspaceHandler.Create,
mirroring the org_import.go loop. Idempotent via the ON CONFLICT upsert.

Tests:
- provisioner: agent-skills/* now REJECTED by IsCPTemplateAssetPath +
  collectCPConfigFiles + the gitea fetcher (flipped the prior
  "allows agent-skills" tests to rejection/skip tests; updated the
  wire-shape + large-asset tests to use config.yaml/prompts only).
- handlers: new template_plugins_test.go proves parseTemplatePlugins
  reads the seo-agent shape + dedup/opt-out, and (sqlmock-backed)
  seedTemplatePlugins WRITES the workspace_declared_plugins row with the
  derived install name (seo-all) — recordDeclaredPlugin no-ops on nil
  db.DB, so a DB-backed test is required to prove the write.
- e2e: test_template_delivery_e2e.sh already asserts the new two-channel
  contract (provision succeeds, config.yaml non-stub + prompts via the
  asset channel, agent-skills NOT on the old asset path [negative
  control], seo-all installs via the post-online plugin reconcile).
  Added the FIX-B source paths (workspace.go, template_plugins.go) to the
  workflow path filter so the gate fires when this code changes.

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

qa-review: skills-as-plugins decoupling + declared-plugin recording on create. Allowlist tightened (agent-skills now rejected), DB write proven via sqlmock, asset set verified ~18KB under cap. Approving qa-review on 6f379a884f.

qa-review: skills-as-plugins decoupling + declared-plugin recording on create. Allowlist tightened (agent-skills now rejected), DB write proven via sqlmock, asset set verified ~18KB under cap. Approving qa-review on 6f379a884f172aa0d10ff3d18c4c9401a2d52893.
core-security approved these changes 2026-06-16 21:09:07 +00:00
Dismissed
core-security left a comment
Member

security-review: blast-radius allowlist TIGHTENED not loosened (agent-skills/* now rejected at the addAsset boundary alongside MEMORY.md/CLAUDE.md/.claude/sessions). Hostile-template LimitReader reused for the plugins parse. No new secret/transport surface. Approving security-review on 6f379a884f.

security-review: blast-radius allowlist TIGHTENED not loosened (agent-skills/* now rejected at the addAsset boundary alongside MEMORY.md/CLAUDE.md/.claude/sessions). Hostile-template LimitReader reused for the plugins parse. No new secret/transport surface. Approving security-review on 6f379a884f172aa0d10ff3d18c4c9401a2d52893.
Member

/sop-ack comprehensive-testing

/sop-ack comprehensive-testing
Member

/sop-ack local-postgres-e2e

/sop-ack local-postgres-e2e
Member

/sop-ack staging-smoke

/sop-ack staging-smoke
Member

/sop-ack root-cause

/sop-ack root-cause
Member

/sop-ack five-axis-review

/sop-ack five-axis-review
Member

/sop-ack no-backwards-compat

/sop-ack no-backwards-compat
Member

/sop-ack memory-consulted

/sop-ack memory-consulted
core-devops added 1 commit 2026-06-16 21:11:53 +00:00
RFC#2843 #32: fix template-delivery-e2e job rename — colon-free name + bp-exempt directive
CI / Python Lint & Test (pull_request) Successful in 6s
Block internal-flavored paths / Block forbidden paths (pull_request) Successful in 7s
Lint curl status-code capture / Scan workflows for curl status-capture pollution (pull_request) Successful in 5s
Harness Replays / detect-changes (pull_request) Successful in 7s
Lint forbidden tenant-env keys / Scan workspace_secrets writers for forbidden env keys (pull_request) Successful in 6s
Lint forbidden tenant-env keys / Scan for repo-host token write into tenant workspace surface (pull_request) Successful in 6s
lint-required-workflows-docker-host-pinned / Lint docker-host pin on docker-touching workflows (pull_request) Successful in 6s
E2E Peer Visibility (literal MCP list_peers) / detect-changes (pull_request) Successful in 13s
Handlers Postgres Integration / detect-changes (pull_request) Successful in 11s
CI / Detect changes (pull_request) Successful in 17s
E2E API Smoke Test / detect-changes (pull_request) Successful in 17s
Secret scan / Scan diff for credential-shaped strings (pull_request) Successful in 6s
sop-checklist / review-refire (pull_request_target) Has been skipped
E2E Peer Visibility (literal MCP list_peers) / E2E Peer Visibility (local) (pull_request) Has been skipped
reserved-path-review / reserved-path-review (pull_request_target) Successful in 11s
lint-required-no-paths / lint-required-no-paths (pull_request) Successful in 18s
Lint workflow YAML (Gitea-1.22.6-hostile shapes) / Lint workflow YAML for Gitea-1.22.6-hostile shapes (pull_request) Successful in 18s
PR Diff Guard / PR diff guard (pull_request) Successful in 15s
lint-no-coe-on-required / lint-no-coe-on-required (pull_request) Successful in 20s
E2E Peer Visibility (literal MCP list_peers) / E2E Peer Visibility (pull_request) Successful in 7s
Lint publish-runner timeout-minutes / Lint publish-runner timeout-minutes (pull_request) Successful in 20s
lint-setup-go-cache / lint-setup-go-cache (pull_request) Successful in 19s
sop-checklist / all-items-acked (pull_request) acked: 7/7
gate-check-v3 / gate-check (pull_request_target) Successful in 15s
sop-checklist / na-declarations (pull_request) N/A: (none)
sop-checklist / all-items-acked (pull_request_target) Successful in 11s
CI / Canvas (Next.js) (pull_request) Successful in 2s
E2E Staging Canvas (Playwright) / detect-changes (pull_request) Successful in 30s
CI / Shellcheck (E2E scripts) (pull_request) Successful in 1s
E2E Chat / detect-changes (pull_request) Successful in 31s
CI / Canvas Deploy Status (pull_request) Successful in 1s
lint-required-context-exists-in-bp / lint-required-context-exists-in-bp (pull_request) Successful in 27s
E2E Staging Canvas (Playwright) / Canvas tabs E2E (pull_request) Successful in 3s
E2E Chat / E2E Chat (pull_request) Successful in 4s
qa-review / approved (pull_request_target) Approved via pull_request_review trigger
security-review / approved (pull_request_target) Approved via pull_request_review trigger
reserved-path-review / reserved-path-review (pull_request_review) Successful in 9s
security-review / approved (pull_request_review) Successful in 9s
qa-review / approved (pull_request_review) Successful in 11s
Lint pre-flip continue-on-error / Verify continue-on-error flips have run-log proof (pull_request) Successful in 39s
lint-continue-on-error-tracking / lint-continue-on-error-tracking (pull_request) Successful in 49s
Local Provision Lifecycle E2E / Local Provision Lifecycle E2E (stub) (pull_request) Successful in 46s
Handlers Postgres Integration / Handlers Postgres Integration (pull_request) Successful in 34s
Harness Replays / Harness Replays (pull_request) Successful in 1m18s
E2E API Smoke Test / E2E API Smoke Test (pull_request) Successful in 2m21s
Local Provision Lifecycle E2E / Local Provision Lifecycle E2E (real image + MiniMax LLM, advisory) (pull_request) Successful in 1m59s
CI / Platform (Go) (pull_request) Successful in 2m51s
CI / all-required (pull_request) Successful in 5s
E2E Staging SaaS (full lifecycle) / pr-validate (pull_request) Has been cancelled
E2E Staging SaaS (full lifecycle) / E2E Staging SaaS (pull_request) Has been cancelled
E2E Staging SaaS (full lifecycle) / E2E Staging Platform Boot (pull_request) Has been cancelled
E2E Staging SaaS (full lifecycle) / E2E Staging Concierge user_tasks (pull_request) Has been cancelled
E2E Staging SaaS (full lifecycle) / E2E Staging Workspace Requests (core#2606) (pull_request) Has been cancelled
E2E Staging SaaS (full lifecycle) / E2E Staging Concierge Creates Workspace (pull_request) Has been cancelled
E2E Staging SaaS (full lifecycle) / E2E Staging Concierge (compile+skip) (pull_request) Has been cancelled
E2E Staging SaaS (full lifecycle) / E2E Staging Concierge Platform Agent (pull_request) Has been cancelled
audit-force-merge / audit (pull_request_target) Successful in 8s
E2E Staging External Runtime / E2E Staging External Runtime (pull_request) Waiting to run
template-delivery-e2e / Template-asset delivery (fresh seo-agent — config+prompts via asset channel, seo-all via plugin reconcile) (pull_request) Failing after 14m36s
b46e0349c2
The renamed advisory job emits a new status context; lint-required-context-exists-in-bp
flagged it. Quote-free colon-free name (PyYAML AST parse rejected the colon) + a
bp-exempt directive within the 3-line window above the job key (advisory Phase-1
gate, continue-on-error mc#2996 — not a required BP context).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
core-devops dismissed core-qa's review 2026-06-16 21:11:53 +00:00
Reason:

New commits pushed, approval review dismissed automatically according to repository settings

core-devops dismissed core-security's review 2026-06-16 21:11:53 +00:00
Reason:

New commits pushed, approval review dismissed automatically according to repository settings

core-qa approved these changes 2026-06-16 21:12:10 +00:00
core-qa left a comment
Member

qa-review re-approve on b46e0349c2 (head advanced by the e2e-workflow lint fix — colon-free job name + bp-exempt directive; both BP lints pass locally). Substance unchanged.

qa-review re-approve on b46e0349c2e84510a43b708d0602cf4072ae0be0 (head advanced by the e2e-workflow lint fix — colon-free job name + bp-exempt directive; both BP lints pass locally). Substance unchanged.
core-security approved these changes 2026-06-16 21:12:11 +00:00
core-security left a comment
Member

security-review re-approve on b46e0349c2 (head advanced by the e2e-workflow lint fix only — allowlist tightening + create-path declared-plugin recording unchanged).

security-review re-approve on b46e0349c2e84510a43b708d0602cf4072ae0be0 (head advanced by the e2e-workflow lint fix only — allowlist tightening + create-path declared-plugin recording unchanged).
core-devops merged commit 79aad60322 into main 2026-06-16 21:16:25 +00:00
core-devops deleted branch rfc2843-32-skills-plugins-not-assets 2026-06-16 21:16:26 +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#3000