molecule-core/docs/internal-content-policy.md
claude-ceo-assistant 3501e6bfd7 fix(post-suspension): vanity import paths go.moleculesai.app/core/{platform,tests/harness/cp-stub} (closes molecule-ai/internal#71 phase 2)
Migrates the two Go modules under molecule-core off the dead
github.com/Molecule-AI/molecule-monorepo/... identity onto the vanity
host go.moleculesai.app. Also fixes the historical naming
inconsistency where the Gitea repo is molecule-core but the Go module
path said molecule-monorepo.

Module changes:
- workspace-server/go.mod:
    github.com/Molecule-AI/molecule-monorepo/platform
    -> go.moleculesai.app/core/platform
- tests/harness/cp-stub/go.mod:
    github.com/Molecule-AI/molecule-monorepo/tests/harness/cp-stub
    -> go.moleculesai.app/core/tests/harness/cp-stub

Surfaces touched
- 174 *.go files (374 import lines) — every import under
  workspace-server/ + tests/harness/cp-stub/
- 2 Dockerfiles (workspace-server/Dockerfile + Dockerfile.tenant) —
  -ldflags strings updated in lockstep with the module rename so
  buildinfo.GitSHA injection still resolves correctly
- README + docs + scripts + comment URLs to git.moleculesai.app form
- NEW workspace-server/internal/lint/import_path_lint_test.go —
  structural lint gate rejecting future github.com/Molecule-AI/ or
  Molecule-AI/molecule-monorepo references. Identical template to the
  other migration PRs (plugin-gh-identity#3, molecule-cli#2,
  molecule-controlplane#32).

Cross-repo dep allowlist (documented in lint gate)
workspace-server requires molecule-ai-plugin-gh-identity, whose own
vanity migration is PR molecule-ai-plugin-gh-identity#3. Until that PR
merges + a tag is cut at go.moleculesai.app/plugin/gh-identity, the
two locations referencing the legacy github.com path
(workspace-server/go.mod require, cmd/server/main.go import) remain
allowlisted. Follow-up PR drops the allowlist + updates both refs in
one shot once gh-identity is fully migrated.

Test plan
- go build ./... clean for both modules
- go test ./... green except two pre-existing failures
  (TestStartSweeper_RecordsMetricsOnSuccess flaky-on-suite,
  TestLocalResolver_BubblesUpCopyFailure relies on read-only fs perms
  but runs as root on operator host) — both reproduce identically on
  baseline main pre-migration; NOT regressions of this PR
- Mutation-tested: lint gate fails on canaries in .go + .md;
  allowlist correctly suppresses cross-repo dep references in go.mod
  while still flagging unrelated additions

Open dependency
- go.moleculesai.app responder must be deployed before fresh-clone
  external builds resolve the vanity path. Existing CI / Docker builds
  ride pinned go.sum + self-referential module path + responder is
  not on critical path for those.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 22:37:42 +00:00

3.7 KiB

Internal content policy

The molecule-ai/molecule-core repo is public. Anything internal (positioning, competitive briefs, sales playbooks, PMM/press drip, draft campaigns, raw research notes, ops runbooks, retrospectives) lives in Molecule-AI/internal.

This page is the canonical decision tree.

Quick decision

"I'm an agent (or human) about to write a markdown file. Where does it go?"

If the artifact is… Put it in…
Competitive brief, market analysis, raw research notes Molecule-AI/internal/research/
PMM positioning draft, sales playbook, press release pre-publish Molecule-AI/internal/marketing/
Draft campaign asset (still iterating, not yet customer-visible) Molecule-AI/internal/marketing/campaigns/
Roadmap discussion, planning doc, retrospective Molecule-AI/internal/PLAN.md or Molecule-AI/internal/retrospectives/
Runbook, ops procedure, incident postmortem Molecule-AI/internal/runbooks/
Public-ready blog post (final draft, ready to ship to docs site) molecule-ai/molecule-core/docs/blog/
Public-ready tutorial / quickstart molecule-ai/molecule-core/docs/tutorials/
Public DevRel content (code samples, demos for users) molecule-ai/molecule-core/docs/devrel/
API reference, architecture docs for external developers molecule-ai/molecule-core/docs/api/
Code, tests, infrastructure wherever is appropriate inside this repo

Rule of thumb: "Would I be comfortable if a competitor / journalist / customer read this verbatim today?" — yes → monorepo/docs/. No / not yet → internal/.

Why

This repo is publicly indexable. Anything pushed here is permanently in git history, search-engine indexed, and accessible to anyone who clones. Past incidents (audit 2026-04-23) found:

  • Competitive teardowns of CrewAI / Paperclip / VoltAgent at root /research/
  • 45 marketing artifacts at root /marketing/ including pmm/positioning.md, press/launch.md, sales/enablement.md
  • 31 draft campaign files at /docs/marketing/
  • Junk temp files at root: comment-1172.json, tick-reflections-temp.md

All migrated to internal/from-monorepo-2026-04-23/ for curator triage.

Enforcement

Three layers, all required:

  1. .gitignore — blocks the directories at git add time. Quietest layer; doesn't fire if someone uses git add -f.
  2. CI workflow block-internal-paths.yml — fails any PR that adds a forbidden path. Mechanical backstop. Cannot be bypassed without editing the workflow + PR review.
  3. Agent promptsSHARED_RULES.md rule (in molecule-ai-org-template-molecule-dev) tells every agent role to write internal content to Molecule-AI/internal directly via gh repo clone + commit + PR. This is the prevention-at-source layer.

If you're hitting the CI gate and your file genuinely belongs in this repo, edit FORBIDDEN_PATTERNS in the workflow with reviewer signoff. Don't work around the gate by renaming files.

How to write to the internal repo (for agents)

# One-time clone (idempotent — re-running is a no-op)
mkdir -p ~/repos
test -d ~/repos/internal || gh repo clone Molecule-AI/internal ~/repos/internal

cd ~/repos/internal
git pull origin main
mkdir -p research
cat > research/<slug>.md <<EOF
# <title>

…content…
EOF

git checkout -b <agent-role>/research-<slug>
git add research/<slug>.md
git commit -m "research: add <slug>"
git push -u origin HEAD
gh pr create --base main --fill

Yes, this is more steps than cd molecule-monorepo && git add research/foo.md. That cost is intentional: the friction is the point. Public space and internal space are different products with different audiences and different durability guarantees.