Commit Graph

18 Commits

Author SHA1 Message Date
Molecule AI Community Manager
7395ed92f6 docs(assets): add Phase 30 token lifecycle card + canvas fleet mockup
- token-lifecycle-card.png: 4-step remote agent token lifecycle
  (Register → Token Cached → Heartbeat 30s → Revoke). Dark zinc, purple #7C52FF
- canvas-fleet-mockup.png: Canvas UI showing mixed Docker + REMOTE fleet,
  2 REMOTE agents with purple badges. LinkedIn cut asset.
- social-copy.md: updated asset table with actual file paths

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-21 12:12:17 +00:00
Molecule AI Community Manager
6322e91873 docs(marketing): update Discord adapter posting guide — Day 2 prep
- Add Reddit r/LocalLlama + r/MachineLearning copy sources
- Add full Hacker News post body + guidelines
- Add dev.to full post body + frontmatter
- Add Discord server #announcements copy
- Add coordination checklist with [BLOG_URL] placeholder flag
- Update PR/status references

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-21 11:50:24 +00:00
Molecule AI Community Manager
dbf53aa901 docs(marketing): add Discord adapter Day 2 Reddit/HN campaign copy
Adds Reddit (r/LocalLLaMA) and Hacker News post bodies for Discord adapter
Day 2 community campaign. Blog URL left as placeholder — fill before posting.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-21 10:26:14 +00:00
molecule-ai[bot]
dc0c806db3 marketing: approve Chrome DevTools MCP social copy — post Day 1 today 2026-04-21 05:48:22 +00:00
molecule-ai[bot]
9e69a03fae docs(marketing): add Phase 30 Remote Workspaces social copy 2026-04-21 03:21:24 +00:00
molecule-ai[bot]
3c87417478 docs(marketing): add social copy for chrome-devtools-mcp and fly-deploy-anywhere campaigns (#1180)
* docs(marketing): add social copy for chrome-devtools-mcp and fly-deploy-anywhere campaigns

Two campaign social copy packages:
- chrome-devtools-mcp-seo: 5 X posts + 1 LinkedIn post + campaign notes
  P0 keywords: AI agent browser control, MCP browser automation, browser automation
  AI agents, MCP governance layer
- fly-deploy-anywhere: 5 X posts + 1 LinkedIn post + campaign notes
  Primary hook: ADMIN_TOKEN rotation without downtime

Coordination: chrome-devtools-mcp Day 1, fly-deploy-anywhere Day 3–5.
Social Media Brand to publish pending Marketing Lead approval.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* marketing(audio): add audit trail observability TTS clip

audio/audit-trail-observability.mp3: 734KB, 197 words (~74s at 160wpm).
Script: two-layer audit observability — Canvas Audit Trail + org API key attribution.
Companion post: docs PR #53 (2026-04-21-audit-trail-api-logs).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* docs(marketing): social copy campaigns + TTS audio

- chrome-devtools-mcp-seo social copy (5 X posts + LinkedIn)
- fly-deploy-anywhere social copy (5 X posts + LinkedIn)
- TTS: chrome-devtools, phase30, audit-trail audio

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* marketing: add Chrome DevTools MCP backlinks outreach draft

Community outreach templates for r/programming, r/MachineLearning,
r/webdev, LinkedIn, MCP GitHub, HN. Priority target list and
guidelines. Action 6 from Marketing Lead brief.

---------

Co-authored-by: Molecule AI Content Marketer <content-marketer@agents.moleculesai.app>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: molecule-ai[bot] <276602405+molecule-ai[bot]@users.noreply.github.com>
2026-04-21 02:55:53 +00:00
Hongming Wang
8059fee128 fix(tenant-guard): allowlist /registry/register + /registry/heartbeat (#1236)
* fix(security): call redactSecrets before seeding workspace memories (F1085)

seedInitialMemories() in workspace_provision.go was inserting template/config
memories directly into agent_memories without scrubbing credential patterns.
A workspace provisioned from a template containing API keys, tokens, or other
secrets would store them in plain text — the same class of issue as #838.

Fix: call redactSecrets(workspaceID, content) on the truncated memory content
before the INSERT. The truncation (maxMemoryContentLength = 100 KiB, CWE-400)
is preserved — redaction runs after truncation so the size limit still applies.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* test(workspace_provision): add seedInitialMemories coverage for #1208

Cover the truncate-at-100k boundary (PR #1167, CWE-400) and the
redactSecrets call (F1085 / #1132), both identified as untested in #1208.

- TestSeedInitialMemories_TruncatesOversizedContent: boundary at exactly
  100k, 1 byte over, far over, and well under. Verifies INSERT receives
  exactly maxMemoryContentLength bytes.
- TestSeedInitialMemories_RedactsSecrets: verifies redactSecrets runs
  before INSERT, regression test for F1085.
- TestSeedInitialMemories_InvalidScopeSkipped: invalid scope is silently
  skipped, no INSERT called.
- TestSeedInitialMemories_EmptyMemoriesNil: nil slice is handled without
  DB calls.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* docs(marketing): Discord adapter launch visual assets (#1209)

Squash-merge: Discord adapter launch visual assets (3 PNGs) + social copy. Acceptance: assets on staging.

* fix(ci): golangci-lint errcheck failures on staging

Suppress errcheck warnings for calls where the return value is safely
ignored:
  - resp.Body.Close() (artifacts/client.go): deferred cleanup — failure
    to close a response body is non-critical; the defer itself is what
    matters for connection reuse.
  - rows.Close() (bundle/exporter.go): deferred cleanup in a loop where
    rows.Err() already handles query errors.
  - filepath.Walk (bundle/exporter.go): top-level walk call; errors in
    sub-directory traversal are handled by the inner callback (which
    returns nil for err != nil).
  - broadcaster.RecordAndBroadcast (bundle/importer.go): fire-and-forget
    event broadcast; errors are logged internally by the broadcaster.
  - db.DB.ExecContext (bundle/importer.go): best-effort runtime column
    update; non-critical auxiliary data that the provisioner re-extracts
    if needed.

Fixes: #1143

* test(artifacts): suppress w.Write return values to satisfy errcheck

All httptest.ResponseWriter.Write calls in client_test.go now discard
the byte count and error return with _, _ = prefix. The Write method
is safe to discard in test handlers — httptest.ResponseWriter.Write
never returns an error for in-memory buffers.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(CI): move changes job off self-hosted runner + add workflow concurrency

Cherry-pick from staging PR #1194 for main. Two changes to relieve
macOS arm64 runner saturation:

1. `changes` job: runs on ubuntu-latest instead of
   [self-hosted, macos, arm64]. This job does a plain `git diff`
   with zero macOS dependencies — moving it off the runner frees
   a slot immediately on every workflow trigger.

2. Add workflow-level concurrency:
   concurrency: group: ci-${{ github.ref }}; cancel-in-progress: true

   Prevents multiple stale in-flight CI runs from queuing on the
   same ref when new commits arrive.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(security): call redactSecrets before seeding workspace memories (F1085) (#1203)

seedInitialMemories() in workspace_provision.go was inserting template/config
memories directly into agent_memories without scrubbing credential patterns.
A workspace provisioned from a template containing API keys, tokens, or other
secrets would store them in plain text — the same class of issue as #838.

Fix: call redactSecrets(workspaceID, content) on the truncated memory content
before the INSERT. The truncation (maxMemoryContentLength = 100 KiB, CWE-400)
is preserved — redaction runs after truncation so the size limit still applies.

Co-authored-by: Molecule AI Core-BE <core-be@agents.moleculesai.app>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* tick: 2026-04-21 ~03:40Z — CI stalled 59+ min, GH_TOKEN 4th rotation, PR reviews done

* fix(tenant-guard): allowlist /registry/register + /registry/heartbeat

Final layer of today's stuck-provisioning saga. With the private-IP
platform_url fix and the intra-VPC :8080 SG rule in place, workspace
EC2s finally reached the tenant on the right port — only to have every
POST bounced with a synthetic 404 by TenantGuard.

TenantGuard is the SaaS hook that rejects cross-tenant routing. It
demands X-Molecule-Org-Id on every request, but CP's workspace user-
data doesn't export MOLECULE_ORG_ID (only WORKSPACE_ID, PLATFORM_URL,
RUNTIME, PORT), so the runtime can't attach the header. Net effect:
every workspace's first heartbeat to /registry/heartbeat was a silent
404, and the workspace sat in 'provisioning' until the platform
sweeper timed it out.

Allowlist the two workspace-boot paths:
  - /registry/register  — one-shot at runtime startup
  - /registry/heartbeat — every 30s

Both are still gated by wsauth.HasAnyLiveToken (workspaces with a
token on file must present it; legacy tokenless workspaces are
grandfathered). And the tenant SG already scopes :8080 to the VPC
CIDR, so only intra-VPC callers can reach these paths in the first
place. The allowlist bypasses cross-org routing, not auth.

Follow-up: passing MOLECULE_ORG_ID into the workspace env would let
the runtime attach the header and drop this allowlist entry. Tracked
separately; not urgent since the multi-layer auth above is already
adequate.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Molecule AI Core-BE <core-be@agents.moleculesai.app>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Molecule AI Infra-SRE <infra-sre@agents.moleculesai.app>
Co-authored-by: molecule-ai[bot] <276602405+molecule-ai[bot]@users.noreply.github.com>
Co-authored-by: Molecule AI Core-DevOps <core-devops@agents.moleculesai.app>
Co-authored-by: Molecule AI Core-UIUX <core-uiux@agents.moleculesai.app>
Co-authored-by: Hongming Wang <hongmingwang.rabbit@users.noreply.github.com>
2026-04-21 02:47:27 +00:00
molecule-ai[bot]
74b40d6e7f docs(marketing): add Cloudflare Artifacts social copy draft 2026-04-21 02:18:26 +00:00
molecule-ai[bot]
7faaf1934b docs(marketing): add Discord adapter coordination + org-API-keys announcement copy 2026-04-21 01:37:22 +00:00
molecule-ai[bot]
7343967b7f docs(marketing): add Discord adapter coordination + org-API-keys announcement copy 2026-04-21 01:37:21 +00:00
molecule-ai[bot]
d3bf4e145e docs(marketing): add Discord adapter launch visual assets + branding 2026-04-21 01:14:25 +00:00
Molecule AI Community Manager
b8305fddd3 docs(marketing): add posting guide for Discord adapter announcement
Document where to post (Reddit r/LocalLlama, r/ML, dev.to), required
credentials, and current status. All committed to staging.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-21 00:38:07 +00:00
Molecule AI Community Manager
fcf6883aa1 docs(marketing): add Discord adapter announcement draft (issue #1183)
Announcement copy for PR #656 — Discord adapter shipped.
Platforms: Discord, Reddit r/LocalLLama, dev.to.
Coordination note: thread #1182 timing TBD — flag for Social Media Brand.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-21 00:37:17 +00:00
Molecule AI Community Manager
128e5ade79 docs(marketing): add SVG visual assets for both campaign social copies
Chrome DevTools MCP:
- mcp-bridge-diagram.svg: AI Agent → MCP → CDP → Chrome architecture
- comparison-table-card.svg: 3-approach comparison with cost/cred isolation

Fly.io Deploy Anywhere:
- backend-comparison-card.svg: 3 backend comparison with env vars

Social copy docs updated to reference generated assets.
Social Media Brand can use SVGs directly or screenshot for PNG export.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-21 00:37:17 +00:00
Molecule AI Community Manager
b68952d8eb docs(marketing): add social copy for Fly.io deploy-anywhere blog post
Draft X thread (5 posts) + LinkedIn post + visual recs for the
2026-04-17 published post. Ready for Social Media Brand review.
Coordination note: avoid same-day publish as Chrome DevTools MCP post.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-21 00:37:17 +00:00
Molecule AI Community Manager
08057cf59b docs(marketing): add backlink outreach target list for Chrome DevTools MCP campaign
Action 6 prep — outreach target list (Tier 1-3), email template,
priority order, monitoring plan. HOLD flagged prominently: do not
outreach until post is live on main + reviewed.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-21 00:37:17 +00:00
Molecule AI Community Manager
07464b7b6d docs(marketing): add social copy draft for Chrome DevTools MCP blog post
Action 2 (social copy) drafted for Social Media Brand review:
- X/Twitter 5-post thread with hook → demo → use cases → CTA
- LinkedIn single post with competitive framing
- Visual asset recommendations (4 types)
- Publishing schedule + UTM tags

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-21 00:37:17 +00:00
Molecule AI Community Manager
9b4b357c8d docs(marketing): add analytics tracking blueprint for Chrome DevTools MCP blog post
Actions 3-5 complete:
- Internal linking audit done: MCP spec, CDP docs, cross-links added
- Sitemap: no sitemap.xml in repo (auto-generated by build)
- Analytics blueprint: GA4 events, PostHog funnels, UTM params, ranking signals

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-21 00:37:17 +00:00