Skip to content

chore: rebrand icons + LICENSE cleanup + HANDOFF.md - #1

Merged
HongmingWang-Rabbit merged 2 commits into
mainfrom
chore/branding-icons
Apr 13, 2026
Merged

chore: rebrand icons + LICENSE cleanup + HANDOFF.md#1
HongmingWang-Rabbit merged 2 commits into
mainfrom
chore/branding-icons

Conversation

@HongmingWang-Rabbit

Copy link
Copy Markdown
Contributor

Summary

  • Replace brand icon across canvas favicon (src/app/icon.png), in-app logo (public/molecule-icon.png), and README branding paths (docs/assets/branding/)
  • Fix residual "Agent Molecule" → "Molecule AI" in LICENSE copyright + Additional Use Grant
  • Fix stale "Starfire" comment header in .githooks/pre-commit
  • Add HANDOFF.md capturing cross-session migration context

Test plan

  • canvas/public/molecule-icon.png and canvas/src/app/icon.png updated
  • README <picture> block resolves (icon used as placeholder for text lockups until real text logos land)
  • go test -race ./..., pytest (workspace-template + sdk), vitest, canvas + mcp-server builds all green
  • Full stale-brand audit clean: no Starfire/agent-molecule/ZhanlinCui refs outside HANDOFF.md and the dated edit-history entry (which references the real external starfire-test-plugin repo, intentionally preserved)

🤖 Generated with Claude Code

Hongming Wang and others added 2 commits April 13, 2026 13:03
Swap in the new molecular-graph icon across canvas favicon, in-app logo,
and README branding paths. Add HANDOFF.md as the cross-session context
doc carried over from the Starfire→Molecule AI migration. Fix stale
"Starfire" reference in the pre-commit hook header.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Two copyright/use-grant lines still referenced the pre-rebrand legal
entity name. Aligns LICENSE with the brand mapping in HANDOFF.md §2.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@HongmingWang-Rabbit
HongmingWang-Rabbit merged commit 49bafe3 into main Apr 13, 2026
4 checks passed
@HongmingWang-Rabbit
HongmingWang-Rabbit deleted the chore/branding-icons branch April 13, 2026 20:14
HongmingWang-Rabbit pushed a commit that referenced this pull request Apr 14, 2026
Covers today's quality + infra pass: brand/structural cleanup, MCP
per-domain refactor (1697 -> 89 lines, 87 tools), canvas ConfirmDialog
unification, 4 platform handler decompositions (+47 Go tests), E2E
hardening for Phase 30.1/30.6 auth, and two new CI jobs (e2e-api +
shellcheck).

- CLAUDE.md: updated test counts (Go 536, canvas 357, SDK 121, MCP 97,
  workspace 1084); documented MCP per-domain split + new api.ts; added
  handler-decomposition section; Phase 30.1/30.6 auth callout; new
  CI jobs; env vars cross-ref.
- PLAN.md: Phase 31 "Quality + Infra Pass" marked shipped; test totals
  refreshed to 2,295.
- README.zh-CN.md: license badge MIT -> BSL 1.1; added BSL license block.
- docs/api-protocol/platform-api.md: registry table gains Auth column
  documenting Phase 30.1 bearer-token and Phase 30.6 X-Workspace-ID
  requirements on heartbeat/update-card/discover/peers.
- docs/development/local-development.md: updated stale test counts;
  added e2e-api + shellcheck CI jobs; pointer to new testing-e2e.md.
- docs/development/testing-e2e.md: new — per-script reference, auth
  prerequisites, local run, CI coverage, adding-a-new-check checklist.
- docs/edit-history/2026-04-13.md: top-of-file summary section added
  spanning PRs #1-#8; preserves existing per-feature entries below.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
HongmingWang-Rabbit added a commit that referenced this pull request Apr 14, 2026
docs: sync documentation with 2026-04-13 merges (PRs #1-#8)
HongmingWang-Rabbit added a commit that referenced this pull request Apr 14, 2026
…ware

feat(platform): TenantGuard middleware — public repo's only SaaS hook (Phase 32 PR #1)
HongmingWang-Rabbit pushed a commit that referenced this pull request Apr 14, 2026
- CLAUDE.md: Go test count 740 → 746; MOLECULE_ORG_ID env var documented.
- PLAN.md: new "Recently launched (2026-04-14 tick-8)" block covering
  Phase 32 PR #1 + paired private molecule-controlplane repo scaffolding.
- docs/edit-history/2026-04-14.md: tick-8 breakdown.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
HongmingWang-Rabbit pushed a commit that referenced this pull request Apr 16, 2026
Code review fixes:
- 🟡 #1: Replace python3 with jq in Dockerfile template stages (~50MB → ~2MB)
- 🟡 #2: Add clone count verification to scripts/clone-manifest.sh
  (set -e + expected vs actual count check — fails build if any clone fails)
- 🟡 #3: Drop 'unsafe-eval' from CSP (not needed for Next.js production
  standalone builds, only dev mode). Updated test assertion.
- 🟡 #4: Remove broken pyproject.toml from workspace-template/ (it claimed
  to package as molecule-ai-workspace-runtime but the directory structure
  didn't match — the real package ships from the standalone repo)
- 🔵 #1: Add version-pinning TODO comment to manifest.json
- 🔵 #3: Add full repo URLs + test counts for SDK/MCP/CLI/runtime in CLAUDE.md

Security (GitGuardian alert):
- Removed Telegram bot token (8633739353:AA...) from template-molecule-dev
  pm/.env — replaced with ${TELEGRAM_BOT_TOKEN} placeholder
- Removed Claude OAuth token (sk-ant-oat01-...) from template-molecule-dev
  root .env — replaced with ${CLAUDE_CODE_OAUTH_TOKEN} placeholder
- Both tokens need immediate rotation by the operator

Tests: Platform middleware tests updated + all pass.
molecule-ai Bot pushed a commit that referenced this pull request Apr 17, 2026
….6, EvoMap Evolver

Three new entries from today's survey (MA + TR + CI parallel scan):

- OpenAI Codex Agent [HIGH] — relaunched Apr 17 as full autonomous agent
  product: parallel subagents, cross-session memory, self-wake scheduling,
  macOS computer control. Distinct threat from openai-agents-sdk. Direct
  overlap with workspace lifecycle + agent_memories + workspace_schedules.

- Qwen3.6-35B-A3B [MEDIUM] — open-weight MoE model (35B/3B active) for
  agentic coding; HN #1 story today (984 pts); commoditizes model layer for
  self-hosted orchestrators; erodes cost moat for cloud-locked competitors.

- EvoMap Evolver [LOW] — A2A-native GEP self-evolution engine; worker nodes
  use A2A_HUB_URL protocol compatible with our A2A stack; SKILL.md + Skill
  Store align with agentskills.io; EvolutionEvent JSONL audit ledger is
  reference design for governance canvas (#582). Integration opportunity.

GH issues filed:
- #594: molecule-audit-ledger (HMAC-SHA256, ~7 dev-days, SOC2/EU AI Act)
- #595: Cloudflare Artifacts demo before May public beta (2-week window)
- #596: add Molecule AI as compound-engineering-plugin target (2-4h upstream PR)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
molecule-ai Bot pushed a commit that referenced this pull request Apr 17, 2026
…4-17

Two new ecosystem entries from daily trending survey:

- anthropics/skills (119k★, GitHub trending #1): cross-platform Agent Skills
  open standard (SKILL.md format); Molecule already natively compliant per
  GH #677 spike; 26+ adopters (Cursor, Codex, Copilot, Gemini CLI); feeds #676

- microsoft/apm (1.8k★, v0.8.11): Agent Package Manager for apm.yml manifests
  managing plugins/skills/MCP servers; overlaps with Molecule plugin system;
  content-security (apm audit) worth borrowing for #675; tracked in GH #694

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
molecule-ai Bot pushed a commit that referenced this pull request Apr 18, 2026
Two new entries from daily eco-watch survey:

- microsoft/markitdown (111k★, MIT): document ingestion MCP tool that fills
  the #1 content gap across all Molecule AI agent roles. `markitdown-mcp`
  exposes a single convert_to_markdown(uri) MCP tool supporting PDF/DOCX/PPTX/
  XLSX/images/audio/HTML/CSV/JSON/XML/ZIP/YouTube/EPubs. Plugin proposal queued
  (molecule-markitdown — pending GH_TOKEN rotation).

- czlonkowski/n8n-mcp (18.3k★, MIT, v2.47.12): "platform-as-MCP-server" bridge
  exposing n8n's 400+ integration nodes as 20+ MCP tools. Complements existing
  n8n entry (line 903). Plugin proposal queued (molecule-n8n — pending token).

Both entries added to competitor-snapshot YAML (LOW threat) and ## Entries
narrative section.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
HongmingWang-Rabbit added a commit that referenced this pull request Apr 20, 2026
- org.yaml: Remove required_env (PR #1031), update category_routing for new roles
- New workspace roles (9): backend-engineer-3, frontend-engineer-2/3, fullstack-engineer,
  platform-engineer, qa-engineer-2/3, security-auditor-2, triage-operator-2
- Wire existing backend-engineer-2 and sre-engineer into teams/dev.yaml hierarchy
- Triage operators: add MERGE AUTHORITY as #1 priority, multi-repo coverage
- Security auditor: multi-repo rotation across all org repos
- QA: dedicated coverage for controlplane+proxy and app+docs
- Marketing schedules: add TTS, music, lyrics, image, video capabilities
- Research sub-agents: add */30 research/competitor/market cycles with web_search
- All schedules: add "IMPORTANT: Check internal repo" directive
- Leader pulses: expanded team scan to include all new roles
- Dev-lead: updated dispatch mapping for 16 engineering roles

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
HongmingWang-Rabbit pushed a commit that referenced this pull request May 3, 2026
Independent code review of #2555 caught two contrast regressions left
by the bulk perl pass:

1. text-white → text-ink mass-substitution silently broke destructive
   and primary buttons. text-ink resolves to #15181c (warm-paper
   near-black) in light mode — dark text on bg-red-600 / bg-amber-600
   / bg-emerald-600 / bg-blue-600 / bg-accent / bg-accent-strong /
   bg-good / bg-bad fails WCAG contrast and looks broken. Per-line
   pass flips text-ink → text-white only when a saturated bg utility
   is present; tinted-state pills (bg-red-950/50 etc.) keep their
   intentionally-retained text-* literals.

2. Original mapping table was missing bg-zinc-600 (most-used
   hover-state literal for cancel buttons — caused them to JUMP from
   warm cream resting state to dark zinc on hover in light mode) and
   text-zinc-700/800/900 (separator dots and decorative dim text
   invisible on warm-paper light bg). Extended mapping fills these
   gaps with bg-surface-card / text-ink-soft.

Also: drop stale tailwind.config.ts reference from components.json
(file deleted by the v3→v4 migration); switch baseColor zinc →
neutral and enable cssVariables since v4 uses CSS-driven tokens.
Future shadcn-cli invocations would have failed or written malformed
components without this.

27 sites in 27 files affected by #1, ~20 sites in 20 files by #2.
1214/1214 unit tests still pass; build still clean.

Findings courtesy of multi-model review per code-review-and-quality
skill — different blind spots catch different bugs.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
HongmingWang-Rabbit pushed a commit that referenced this pull request Jun 12, 2026
Addresses both review subagents' REQUEST_CHANGES verdicts on
PR #1929:

Code review (correctness)
- #1: Move schedule seeding to AFTER provisionWorkspaceAuto
  succeeds so the scheduler never fires cron rows against a
  workspace whose backend never wired. Failed-backend workspaces
  no longer end up with orphan template_schedules rows.
- #2: seedTemplateSchedules now returns (seeded, skipped int) so
  the caller can observe partial-seed states; workspace.go Create
  logs the (seeded, skipped) pair when skipped > 0, surfacing
  silent partial-loss that the prior (int) return masked.

Security review (hostile-template defenses)
- #3 / #4: parseTemplateSchedules reads config.yaml through an
  io.LimitReader bounded by maxTemplateConfigYAMLBytes (1 MiB)
  and rejects files over the cap before yaml.Unmarshal runs.
  Defends against billion-laughs / anchor-explosion DoS.
- #3: schedules slice length capped at maxTemplateSchedules (100,
  10x the largest current production grid). Hostile template with
  50k schedules now rejected at parse time, not after 50k inserts.
- #3: cron_expr length capped at maxScheduleCronExprLen (128) per
  schedule; resolved prompt body capped at maxSchedulePromptBytes
  (16 KiB) per schedule. Oversized entries are skipped (counted
  as `skipped`) so one bad row doesn't break the rest.
- #3: Seed loop honours ctx.Err() so an aborted Create request
  stops further inserts rather than running to completion on a
  dead goroutine.
- #8: Schedule names quoted via %q in all log lines so CRLF in a
  hostile name can't injection-pollute stdout/Loki.

Tests
- TestParseTemplateSchedules_RejectsOversizeFile — gate against
  the LimitReader cap (1 MiB + 1 byte of '#').
- TestParseTemplateSchedules_RejectsTooManySchedules — gate
  against the schedule-count cap (maxTemplateSchedules + 1
  minimal entries).
- Full handlers test suite still green (17.4s).

Non-fix surface
- Code-review #3 (runtime-default fallback also seeds): runtime-
  default templates do not currently ship a schedules: block so
  this is benign in practice; documented behavior in the comment.
- Code-review #4 (files_dir in workspace-template config.yaml):
  not part of the current template_registry schema; flagged for
  follow-up if templates start declaring files_dir.
- Security-review #7 (cron prompt as agent self-message escalation
  vector): out of scope per security reviewer's own note; tracked
  separately. Will file an issue.

Verified locally:
  go vet ./...                 → clean
  go build ./...               → clean
  gofmt -d <changed files>     → clean
  go test ./internal/handlers/ → PASS (7 unit tests for parser,
                                  full suite 17.4s)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
HongmingWang-Rabbit added a commit that referenced this pull request Jun 12, 2026
…able provider/model list from the registry

P3 item 1 (retire-list #1 surface). GET /templates (templates.go List) now
ANNOTATES each registry-known runtime's template with an authoritative
registry-served selectable list, sourced from the provider registry
(workspace-server/internal/providers, the P2-A synced SSOT) instead of the
template's hand-authored config.yaml providers:/runtime_config.models block:

- registry_backed: true when the runtime is in the registry runtimes: block.
- registry_providers: the runtime's NATIVE provider set (ProvidersForRuntime),
  each with display_name + auth_env + billing_mode (platform_managed if the
  registry IsPlatform predicate holds, else byok) — the SSOT the canvas
  Provider dropdown consumes instead of its hardcoded VENDOR_LABELS map.
- registry_models: the runtime's NATIVE model ids (ModelsForRuntime), each
  annotated with its DERIVED provider (DeriveProvider) + the billing_mode that
  provider implies — so the canvas shows the billing source of the DERIVED
  provider (folds in #1931 intent) and can render no model the registry did
  not list for the runtime ("only registered selectable").

Additive + federation-ready + fail-OPEN: the existing template-served
Models/Providers/ProviderRegistry fields are UNCHANGED, so non-registry
runtimes (external/mock/kimi/future third-party) and older canvases keep
working — a runtime absent from the registry yields registry_backed=false and
no synthesized block. NO hard-reject: templates whose model isn't
registry-derivable are still served (WARN-level only; legacy-vocab reconcile
is P4).

Reuses the package-level providerRegistry() accessor + LLMBillingModePlatformManaged/
LLMBillingModeBYOK constants from llm_billing_mode.go (P2-B / #1972, now on
main) — one accessor + one constant set for the package; both the billing
derivation and this templates projection wrap the same providers.LoadManifest()
SSOT and the same wire strings.

Proxy ResolveUpstream / billing DeriveProvider untouched (P1/P2). Templates'
own config.yaml providers: codegen untouched (P4).

TDD: TestTemplatesList_RegistryServesSelectableModels (a template's bogus model
id never leaks into the registry-served list; native ids present),
TestTemplatesList_RegistryAnnotatesDerivedProviderAndBilling (derived
provider + platform_managed/byok per model; provider display_name/auth_env/
billing from the registry), TestTemplatesList_NonRegistryRuntimeFallsOpenToTemplate
(mock runtime: registry_backed=false, template fields untouched). All existing
TestTemplatesList_* stay green (template-served fields unchanged). Rebased onto
main after P2-B (#1972) landed; full handlers+providers suites green alongside it.

internal#718 P3 — not merged; CTO merge-go after Five-Axis (UI/API-affecting).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
HongmingWang-Rabbit pushed a commit that referenced this pull request Jun 12, 2026
Both tutorials cited misattributed PRs and claimed shipped runtimes that
didn't exist (RFC internal#730 finding):
- google-adk-runtime.md: cited 'PR #550' (actually a MemoryTab test suite) +
  'already first-class'. Rewritten to the REAL implementation — ADK engine-only
  (google-adk[mcp]==2.1.0, no [a2a]), Vertex AI via ADC (keyless), a2a-1.x
  bridge — with correct PR refs (template PR #1, core #2003, ci #26) + a
  landing-status banner.
- gemini-cli-runtime.md: cited 'PR #379' (actually CI cleanup); no gemini-cli
  runtime exists in manifest/knownRuntimes. Added a correction banner pointing
  to the real google-adk runtime.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
HongmingWang-Rabbit pushed a commit that referenced this pull request Jun 12, 2026
org_import.go tried to use  to skip provisioning after a
config-generation failure, but  is a recursive function,
not a loop —  is a compile error.

Replace it with a  label placed after the provisioning
block.  This keeps the fail-closed behavior (mark workspace failed + surface
the error in the canvas) while still running schedules, channels, and child
recursion for the workspace.

Researcher review 9329 blocker #1.
HongmingWang-Rabbit pushed a commit that referenced this pull request Jun 12, 2026
… EC2 orphan (#1)

When cpProv.Start succeeds but the DB UPDATE for instance_id fails,
workspace row lacks the instance_id. Without it, later Stop/IsRunning
lookups return empty, leaving the EC2 instance orphaned (untouchable
and unbilled).

Make the persist failure fatal:
1. Mark the workspace failed via markProvisionFailed so the operator
   sees the problem and can retry. The instance_id is logged prominently
   so an operator can manually reconcile.
2. DO NOT auto-terminate the live EC2 — the instance may contain
   valuable state the operator wants to recover. The CP orphan sweeper
   will handle cleanup if the workspace is later removed.

Fixes ticket #1 from Researcher cleanup audit.
HongmingWang-Rabbit pushed a commit that referenced this pull request Jun 12, 2026
…ith-visibility (#1)

Reviewer RC 9344 requested changes:
1. REMOVED auto-terminate (was not present, reaffirmed no-destroy policy).
2. ADDED bounded retry (3 attempts, 100ms→200ms→400ms backoff) for the
   instance_id persist UPDATE. Transient DB blips no longer orphan EC2s.
3. If all retries fail → mark workspace FAILED and record orphaned
   instance_id in broadcast event + last_sample_error for operator/reaper
   reconciliation. The live EC2 is left running.
4. Scope kept to workspace_provision.go + workspace_provision_test.go only.
5. Fixed test expectations for retry path.

Regression tests:
- TestProvisionWorkspaceCP_InstanceIDPersistFail_MarksFailed:
  all-attempts-fail → marked failed + instance_id recorded + Stop NOT called
- TestProvisionWorkspaceCP_InstanceIDPersistFail_RetrySucceeds:
  first-fail-second-success → no failure mark + proceeds normally
HongmingWang-Rabbit pushed a commit that referenced this pull request Jun 12, 2026
…2 10782 follow-up)

Augments the prior fail-CLOSED fix on reserved-path-review.sh (76a8a057).
Researcher adjudication (job 467485/run 346968, on molecule-runner-robot-1-4
image CACHED — confirmed NOT infra) found a SECOND defect: the workflow
checks out the BASE ref (f44d688) and runs `bash .gitea/scripts/
reserved-path-review.sh`, but #2570 is the PR that INTRODUCES that
script — so on this PR the script is ABSENT on base → 'No such file or
directory', the check hard-fails. This is a bootstrap / self-reference
problem: the guard gates the very PR that adds the guard. Unfixable
without a workflow change.

Fix: refine the checkout strategy in the workflow to break the
self-reference while preserving the security model:

1. The SCRIPT is now checked out from the PR HEAD (not base), so the
   gate is always present — including on the bootstrap PR that adds
   the gate. `actions/checkout` uses `ref: ${{ github.event.pull_request.head.sha }}`
   for this. (`pull_request_target` ensures the run runs with the
   BASE commit's permissions, not the PR's — so the PR author cannot
   inject code that runs in the workflow's auth context. The head
   checkout is for FILE READING only.)

2. The reserved-paths MANIFEST (.gitea/reserved-paths.txt) is read
   from the BASE branch via `git show <base.sha>:.gitea/reserved-paths.txt`
   and staged to .gitea/reserved-paths.txt in the workspace. This
   preserves the original security intent: a PR author cannot widen
   the gate by adding new reserved patterns in their own PR (the
   manifest is base-sourced for every steady-state PR).

3. Bootstrap PR fallback: if `git show` on the base manifest fails
   (the single PR that INTRODUCES the manifest — base has no file
   yet), the workflow falls back to the head's manifest and emits a
   loud `::notice::` log line so reviewers see the bootstrap path
   ran. The script still executes — this is NOT an unconditional
   pass; it is a graceful one-time bootstrap.

4. The script is invoked with `RESERVED_PATHS_FILE: .gitea/reserved-paths.txt`
   so it uses the (base-overridden or head-fallback) manifest we just
   staged — not whatever the script's own RESERVED_PATHS_FILE default
   resolves to.

5. The DETECTIVE backstop (audit-force-merge.sh emitting
   incident.reserved_self_merge) is unchanged — intentionally
   fail-OPEN-by-design per its own header.

New regression tests (5 added on top of the prior 9, now 14 total):

  T6d: workflow checks out PR HEAD (so the gate script is present, including on the bootstrap PR)
  T6e: workflow fetches .gitea/reserved-paths.txt from BASE via git show (security model preserved)
  T6f: workflow logs the bootstrap fallback explicitly
  T6g: workflow does NOT have an unconditional pass shortcut (re-introduce-fail-open guard)
  T6h: workflow passes RESERVED_PATHS_FILE explicitly to the script

ALL 14 TESTS PASS locally. Combined with the prior fix at 76a8a057:

  Defect #1 (CR2 10782, fail-OPEN return-code): CLOSED at 76a8a057
    (script now branches on MATCH_RC explicitly; 0/1/2 with 2+ failing closed;
    9 regression tests lock the contract).

  Defect #2 (Researcher adjudication, bootstrap / self-reference):
    CLOSED here (workflow now checks out PR HEAD + reads base manifest
    via git show + bootstrap fallback for the introducing PR; 5 new
    regression tests lock the contract).

Head moves from 76a8a057 to (new) on the same
chore/core-self-merge-guard-reserved-paths branch. The CR-A approval
chain (agent-researcher 04:43Z) and CR2 REQUEST_CHANGES (10782, also
from agent-researcher) are against the prior head 57557d8c — they will
need to re-review this new head. Spec-only execution — no review/decisions,
no self-merge. CR2 10782 fix (this is the augmented 03744380).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant