molecule-core/scripts
claude-ceo-assistant f6cc29ca2e
Some checks failed
CI / Detect changes (pull_request) CI bypass: infra#241
CI / Platform (Go) (pull_request) CI bypass: infra#241
CI / Canvas (Next.js) (pull_request) CI bypass: infra#241
E2E API Smoke Test / detect-changes (pull_request) Successful in 1m3s
Lint curl status-code capture / Scan workflows for curl status-capture pollution (pull_request) Successful in 14s
Runtime PR-Built Compatibility / detect-changes (pull_request) Successful in 46s
Ops Scripts Tests / Ops scripts (unittest) (pull_request) Successful in 54s
E2E Staging SaaS (full lifecycle) / E2E Staging SaaS (pull_request) CI bypass: E2E SaaS test flaky/infra issue, infra#241 Gitea runners cannot reach external deps
E2E API Smoke Test / E2E API Smoke Test (pull_request) CI bypass: infra#241
Runtime PR-Built Compatibility / PR-built wheel + import smoke (pull_request) CI bypass: infra#241
E2E Staging Canvas (Playwright) / Canvas tabs E2E (pull_request) CI bypass: infra#241
E2E Staging Canvas (Playwright) / detect-changes (pull_request) CI bypass: infra#241
Handlers Postgres Integration / Handlers Postgres Integration (pull_request) CI bypass: infra#241
Handlers Postgres Integration / detect-changes (pull_request) CI bypass: infra#241
Block internal-flavored paths / Block forbidden paths (pull_request) CI bypass: infra#241
CI / Shellcheck (E2E scripts) (pull_request) CI bypass: infra#241
Secret scan / Scan diff for credential-shaped strings (pull_request) CI bypass: infra#241
sop-tier-check / tier-check (pull_request) CI bypass: infra#241
CI / Canvas Deploy Reminder (pull_request) Has been skipped
CI / Python Lint & Test (pull_request) Failing after 8m15s
refactor(ci): drop "canary-" prefix → staging-smoke/staging-verify
Per Hongming directive 2026-05-11 09:08Z: "canary naming changed to
staging for all, if there are some left overs should change too."

The "canary-" prefix was a redundant modifier on workflow files that
already targeted staging. The deployment-STRATEGY concept (a small
subset of staging tenants gets the new image first, the rest follow
on green) stays — only the workflow IDENTITY and the secret store
keys feeding it are renamed.

## Renamed surfaces

Files (git mv preserves history):
- .gitea/workflows/canary-staging.yml → staging-smoke.yml
- .gitea/workflows/canary-verify.yml  → staging-verify.yml
- scripts/canary-smoke.sh             → scripts/staging-smoke.sh

Secret-store keys (consumed by .gitea/workflows/staging-verify.yml +
scripts/staging-smoke.sh — secrets don't exist in any store yet, so
this rename is rename-first-safe per the audit Section C "truly
missing" classification):
- secrets.CANARY_TENANT_URLS       → secrets.MOLECULE_STAGING_TENANT_URLS
- secrets.CANARY_ADMIN_TOKENS      → secrets.MOLECULE_STAGING_ADMIN_TOKENS
- secrets.CANARY_CP_SHARED_SECRET  → secrets.MOLECULE_STAGING_CP_SHARED_SECRET

Env flag (test_staging_full_saas.sh + the 2 workflows that invoke it):
- E2E_MODE=canary → E2E_MODE=smoke
  (legacy "canary" alias retained for one rollout cycle; remove after
   one week of no-old-value observations)

Slug prefix (test_staging_full_saas.sh + teardown safety nets in
staging-smoke.yml + e2e-staging-sanity.yml):
- e2e-canary-{date}-* → e2e-smoke-{date}-*
  (dual-prefix fallback in both teardown nets for one rollout cycle so
   any in-flight org from an older runner checkout still cleans up)

Concurrency group + workflow name + step / job names:
- concurrency.group: canary-staging → staging-smoke
- name: "Canary — staging SaaS smoke" → "Staging SaaS smoke"
- name: "canary-verify" → "Staging verify"
- job: canary → smoke
- job: canary-smoke → staging-smoke
- step: "Canary run" → "Smoke run"
- step: "Run canary smoke suite" → "Run staging smoke suite"

Script-internal:
- CANARY_ACURL_PATH helper var → ACURL_PATH

Cross-references updated:
- e2e-staging-saas.yml + e2e-staging-sanity.yml + publish-canvas-image.yml
  + continuous-synth-e2e.yml + sweep-stale-e2e-orgs.yml + both
  redeploy-tenants-on-*.yml comment refs to the renamed workflows
- docs/architecture/canary-release.md + tests/e2e/STAGING_SAAS_E2E.md
  + scripts/README.md + runbooks/gitea-actions-migration-checklist.md

## Out of scope (deliberate)

- CANARY_SLUG / CANARY_PROMOTE_* in redeploy-tenants-on-*.yml: this is
  the soak-deploy canary slug (one-tenant-first-then-fan-out), a
  different concept than the renamed smoke workflow. Stays.
- .github/workflows/ tree: dormant mirror per
  reference_molecule_core_actions_gitea_only — Gitea Actions reads
  .gitea/ only. Sweep cleanup is a separate follow-up.
- Alert issue title "Canary failing: staging SaaS smoke" in
  staging-smoke.yml: kept stable so any open alert from the pre-rename
  filename still title-matches the auto-close search on next green.

## Verification

- grep -rn "CANARY_\|canary-staging\|canary-verify\|E2E_MODE=canary"
  .gitea/ scripts/ tests/ docs/ runbooks/ — remaining matches are
  intentional (deployment-strategy CANARY_SLUG concept, historical
  rename notes with "formerly" qualifier, soak-canary vars).
- yaml.safe_load() parses all 9 touched workflow files clean.
- bash -n on scripts/staging-smoke.sh and
  tests/e2e/test_staging_full_saas.sh.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 02:28:46 -07:00
..
demo-freeze-snapshots ops: demo-day freeze + rollback runbook 2026-05-01 12:04:30 -07:00
ops fix(ci): extend class-E rename to scripts/ops/sweep-*.sh (chained-defect from #430 review) 2026-05-11 01:32:26 -07:00
build_runtime_package.py fix(ci): add _sanitize_a2a to TOP_LEVEL_MODULES allowlist (third workflow defect) 2026-05-10 19:32:58 -07:00
build-images.sh initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
bundle-compile.sh initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
check-cascade-list-vs-manifest.sh feat(ci): structural drift gate for cascade list vs manifest (RFC #388 PR-3) 2026-05-03 03:52:39 -07:00
check-stale-promote-pr.sh fix(ci): replace gh pr CLI with Gitea v1 REST in workflows + scripts (#75 class A) 2026-05-07 15:29:26 -07:00
cleanup-rogue-workspaces.sh fix(provisioner): stop rogue config-missing restart loop (#17) 2026-04-14 07:32:58 -07:00
clone-manifest.sh [infra-lead-agent] fix(ci): clone-manifest.sh retry+backoff — CI-infra carve-out to main (parallel to PR #298) 2026-05-10 13:15:44 +00:00
demo-day-runbook.md ops: demo-day freeze + rollback runbook 2026-05-01 12:04:30 -07:00
demo-freeze.sh fix(scripts): migrate ghcr.io→ECR + raw.githubusercontent.com→Gitea (#46) 2026-05-07 00:56:23 -07:00
demo-thaw.sh ops: demo-day freeze + rollback runbook 2026-05-01 12:04:30 -07:00
dev-start.sh fix(dev-start): detect missing Go and fall back to docker-compose platform 2026-04-29 20:04:37 -07:00
edge-429-probe.sh chore(observability): edge-429 probe + ratelimit observability runbook 2026-05-07 15:48:34 -07:00
import-agent.sh initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
lockdown-tenant-sg.sh feat(security): Phase 35.1 — SG lockdown script for tenant EC2 instances 2026-04-18 12:01:41 -07:00
measure-coordinator-task-bounds-runner.sh fix(harness-runner): switch from non-existent /heartbeat-history to /activity 2026-04-28 23:12:51 -07:00
measure-coordinator-task-bounds.sh docs: registry pattern + harness scripts READMEs 2026-04-28 22:19:40 -07:00
nuke-and-rebuild.sh tech-debt: rename molecule-monorepo-net -> molecule-core-net 2026-05-09 20:51:48 +00:00
post-rebuild-setup.sh security: remove hardcoded API keys from post-rebuild-setup.sh 2026-04-20 13:02:52 -07:00
README.md refactor(ci): drop "canary-" prefix → staging-smoke/staging-verify 2026-05-11 02:28:46 -07:00
refresh-workspace-images.sh fix(scripts): migrate ghcr.io→ECR + raw.githubusercontent.com→Gitea (#46) 2026-05-07 00:56:23 -07:00
rollback-latest.sh fix(scripts): migrate ghcr.io→ECR + raw.githubusercontent.com→Gitea (#46) 2026-05-07 00:56:23 -07:00
staging-smoke.sh refactor(ci): drop "canary-" prefix → staging-smoke/staging-verify 2026-05-11 02:28:46 -07:00
test_build_runtime_package.py chore: rewriter unit tests + drop misleading noqa on import inbox 2026-04-30 20:45:32 -07:00
test-a2a-cross-runtime.sh initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
test-all-adapters.sh initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
test-all-runtimes-a2a-e2e.sh test(e2e): wire SaaS auth headers (TENANT_ADMIN_TOKEN + TENANT_ORG_ID) 2026-05-02 04:36:23 -07:00
test-all.sh initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
test-check-stale-promote-pr.sh feat(ops): hourly alarm for auto-promote PR stuck on REVIEW_REQUIRED (#2975) 2026-05-05 17:55:27 -07:00
test-cross-agent-chat.sh initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
test-hermes-plugin-e2e.sh test(e2e): unified A2A round-trip parity harness across all 4 runtimes 2026-05-02 04:36:23 -07:00
test-nuke-and-rebuild.sh fix(scripts): nuke-and-rebuild self-bootstraps templates; add E2E test 2026-04-26 14:37:04 -07:00
test-team-e2e.sh initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
wheel_smoke.py feat(mcp): notifications/claude/channel for push-feel inbox UX 2026-04-30 20:10:01 -07:00

scripts/

Operational and one-off scripts for molecule-core. Most are self-documenting — see the header comments in each file.

RFC #2251 coordinator task-bound harnesses

There are three related scripts; pick the right one:

Script Purpose Targets
measure-coordinator-task-bounds.sh Canonical v1 harness for the RFC #2251 / Issue 4 reproduction. Provisions a PM coordinator + Researcher child via claude-code-default + langgraph templates, sends a synthesis-heavy A2A kickoff, observes elapsed time + activity trace. OSS-shape platform — localhost or any /workspaces-shaped endpoint. Has tenant/admin-token guards for non-localhost runs.
measure-coordinator-task-bounds-runner.sh Generalised runner for the same measurement contract but with arbitrary template + secret + model combinations (Hermes/MiniMax, etc.). Useful for cross-runtime variants without modifying the canonical harness. Same as above (local or SaaS via MODE=saas).
measure-coordinator-task-bounds.sh (in molecule-controlplane) Production-shape variant that bootstraps a real staging tenant via POST /cp/admin/orgs, then runs the same measurement against <slug>.staging.moleculesai.app. Staging controlplane only — refuses to run against production.

See reference_harness_pair_pattern (auto-memory) for when to use which and the cross-repo design rationale.

Common safety pattern across all three

  • Cleanup trap on EXIT/INT/TERM auto-deletes provisioned resources.
  • DRY_RUN=1 prints plan + auth fingerprint, exits before any state mutation. Run this before pointing at staging or any shared infrastructure.
  • Non-target guard refuses arbitrary endpoints (the controlplane variant is locked to staging-api.moleculesai.app; the OSS variant requires explicit auth + tenant scoping for non-localhost PLATFORM).
  • Cleanup failures emit cleanup_*_failed events with remediation hints; no silenced curl. ADMIN_TOKEN expiring mid-run surfaces as a structured event rather than a silent leak.

Activity trace caveat

If activity_trace.raw == "<endpoint_unavailable>", the per-workspace /activity endpoint isn't wired on the target build — the bound measurement is INCONCLUSIVE on the platform-ceiling question. Either wire the endpoint or replace with the equivalent Datadog query. Note that /activity accepts a since_secs query parameter; see the endpoint handler for the supported range.

Other scripts

  • cleanup-rogue-workspaces.sh — emergency teardown for leaked workspaces. Prompts for confirmation. Pair with the harnesses if a cleanup trap fails (see cleanup_*_failed events).
  • staging-smoke.sh — quick smoke test for the staging canary fleet (formerly canary-smoke.sh).
  • dev-start.sh — local-dev platform bring-up.

The rest are self-documenting in their header comments.