Phase 3a-PR-D of internal#77 (task #235). Completes the cross-repo
composition migration started by PR #5 (sibling-clone+symlink) and
the platform-side !external resolver shipped in molecule-core#105.
CHANGES
- org.yaml: replace
- !include dev-lead/workspace.yaml
with
- !external
repo: molecule-ai/molecule-dev-department
ref: main
path: dev-lead/workspace.yaml
Composition is now platform-side: at POST /org/import time the
workspace-server fetches molecule-ai/molecule-dev-department at
ref=main into <orgBaseDir>/.external-cache/, grafts the dev-lead
subtree, and rewrites every files_dir to be cache-prefixed.
- dev-lead symlink deleted. The post-suspension sibling-clone deploy
contract (operator must keep both repos as siblings under
/org-templates/) is no longer required. The platform fetches the
subtree on demand.
- .gitignore: add .external-cache/ entry. Operators see the cache
populate during imports; we don't track it.
DEPLOYMENT IMPACT
Operators running molecule-core PR #105 or later can import this
template without operator-side molecule-dev-department clone
(task #230 becomes obsolete). Operators running an older platform
binary will see import fail with 'unknown !external tag' — visible
error, not silent breakage.
To pin a specific tag/SHA for production stability, change ref: main
to e.g. ref: v1.0.0 (currently no tags published; landing this
unlocks the option).
VERSIONING
No DB schema change. No public API change. Pure org-template
composition shape change. Existing imports of older snapshots of
this template still work — !include + symlink were never the only
composition mechanism, and operators who have the symlink can
re-add it locally if they need to roll back.
VERIFIED LOCALLY 2026-05-08
--- PASS: TestPRD_MigratedParentTemplateImports (0.55s)
post-migration parent resolves to 39 workspaces
(5 PM-tree + 6 Marketing-tree + 28 dev-tree, fetched from
molecule-ai/molecule-dev-department@main via the production
gitFetcher into .external-cache/).
FOLLOW-UP TASKS
- Update molecule-dev-department's local-e2e-setup.sh to drop the
symlink check (now that parent template doesn't ship one).
- Decide fate of TestLocalE2E_DevDepartmentExtraction +
TestLocalE2E_FilesDirConsumption (they tested the symlink-based
composition; now skip gracefully because no template uses that
shape — keep as opt-in regression coverage).
- Tag molecule-ai/molecule-dev-department v1.0.0 + pin ref here.
Refs:
internal#77 — extraction RFC (Phase 3a phasing in comment 1995)
molecule-core#105 — !external resolver
molecule-core#106 — !external integration + e2e tests
task #235 (PR-D)
task #230 — obsolete after this PR
Hongming GO 2026-05-08 ('do PR-B/C/D')
Phase 3d of internal#77 (dev-department extraction).
What changed:
Deletions:
- 17 orphan workspace folders not reachable from any teams/*.yaml
!include chain in this template (caught at extract time by
validate-tree.py): backend-engineer{,-2,-3}, frontend-engineer{,-2,-3},
qa-engineer{,-2,-3}, security-auditor{,-2}, platform-engineer,
devops-engineer, sre-engineer, offensive-security-engineer,
devrel-engineer, triage-operator-2, uiux-designer.
- 27 dev-tree workspace folders extracted to molecule-ai/molecule-dev-department
(history preserved via git filter-repo): dev-lead, core-{lead,be,fe,qa,
security,uiux,devops,offsec}, cp-{lead,be,qa,security}, app-{lead,fe,qa},
technical-writer, infra-{lead,sre,runtime-be}, sdk-{lead,dev}, plugin-dev,
release-manager, integration-tester, fullstack-engineer,
documentation-specialist, triage-operator.
- 8 teams/<dev-tree>.yaml composition files (dev.yaml, core-platform.yaml,
controlplane.yaml, app-docs.yaml, infra.yaml, sdk.yaml,
documentation-specialist.yaml, triage-operator.yaml).
Additions:
- dev-lead → ../molecule-dev-department/dev-lead/ (symlink). Resolves
correctly when both repos are cloned as siblings under operator's
/org-templates/ (current convention: /org-templates/molecule-dev/
+ /org-templates/molecule-dev-department/). Platform's
resolveYAMLIncludes follows the symlink at file-read while its
security check (filepath.Abs/Rel) operates on path strings, so
'dev-lead/workspace.yaml' counts as 'inside parent root' even though
its content lives in the sibling repo. Contract pinned by
molecule-core PR #102's tests.
Edits:
- org.yaml workspaces: gains '!include dev-lead/workspace.yaml' (third
root after pm.yaml + marketing.yaml). The other two roots are
unchanged.
- teams/pm.yaml children: removed dev.yaml, documentation-specialist.yaml,
triage-operator.yaml, triage-operator-2 (orphan). Comments document
where each moved.
- teams/marketing.yaml children: removed devrel-engineer (orphan).
This template is now ~50% smaller and contains only parent-only roles:
PM + Research (research-lead, market-analyst, technical-researcher,
competitive-intelligence) + Marketing (marketing-lead, content-marketer,
product-marketing-manager, community-manager, seo-growth-analyst,
social-media-brand). Engineering org tree is composed in via
the dev-lead symlink + dev-department repo.
Refs:
internal#77 — extraction RFC
molecule-ai/molecule-dev-department PRs #1, #2, #3 (scaffold + extract + atomize)
molecule-core PR #102 — symlink-resolution contract test
Hongming GO 2026-05-08 ("approved, keep going" + "dont wait for me, follow the plan")
SOP Phase 3d — task #225
Every persona's initial-prompt.md starts with `git clone https://github.com/Molecule-AI/<repo>.git`
which now hard-fails because the GitHub org was suspended on 2026-05-06. This
blocks every fresh agent at boot.
Changes:
- All 49 persona initial-prompt.md files: rewrite clone URLs to
https://git.moleculesai.app/molecule-ai/<repo>.git, and switch the
in-URL token from \${GITHUB_TOKEN} to \${GITEA_TOKEN} (matches the
env-var contract documented in SHARED_RULES.md after the gh→tea migration).
- 4 schedule files (landingpage-check, landingpage-seo-check,
daily-changelog) — same rewrite.
- org.yaml defaults block (3 refs + the 'if [ -n "\$GITHUB_TOKEN" ]'
guard renamed to GITEA_TOKEN to match the new var).
- SHARED_RULES.md DOCUMENTATION_POLICY full-policy URL.
- documentation-specialist/system-prompt.md: reframed the org-profile
table row (was 'renders on github.com/Molecule-AI', now noted as
the now-suspended org page kept for reference).
Scope per Task #168: non-Go-module URL refs only. No go.mod / go.sum
in this repo, so this PR is complete coverage for this repo.
After this lands every persona will boot with a working clone again.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Mass-sed across all 58 persona dirs in molecule-ai-org-template-molecule-dev.
Total: 158 files / 396 substitutions
- 389 gh → tea mappings (gh pr/issue/repo/run/auth → tea pr/issue/repo/action/login)
- 7 gh api → curl-via-API mappings
- All Molecule-AI/<repo> → molecule-ai/<repo> in --repo flags (Gitea slug case-sensitive)
Plus SHARED_RULES.md migration callout block + tea install snippet:
- Tea v0.9.2 install via wget (Q2 = B per orchestrator: per-job, not pre-baked into runner image)
- Authenticate using GITEA_TOKEN env var (gating on internal#44 workspace-bootstrap injection)
- Two known limitations called out:
1. GITEA_TOKEN required for tea/curl auth (internal#44 pending)
2. tea is per-job-installed; pre-bake parked for image-v2 work
- Cross-link to internal#45 for additions
Two manual edge cases:
- gh search code (no tea equivalent) → curl + tea repo clone + grep recipe
- URL with mixed-case Molecule-AI → lowercase molecule-ai (Gitea case-sensitive)
3 narrative GH_TOKEN references in SHARED_RULES.md intentionally preserved
(describe an env var name, not commands).
Q1=A (mega-PR) per orchestrator dispatch 2026-05-07T09:50:08.
Refs: molecule-ai/internal#45, molecule-ai/internal#44 (GITEA_TOKEN dep)
Per saved memory feedback_act_runner_needs_config_file_env: runners 1-8
were spawned without -e CONFIG_FILE=/config.yaml; act_runner fell back
to /data/config.yaml and ignored runner.envs the whole time. Orchestrator
recreated 1-8 with full proper env. All 16 now uniform with
AGENT_TOOLSDIRECTORY + RUNNER_TOOL_CACHE + GITHUB_SERVER_URL + GH_HOST.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Per saved memory feedback_runner_config_partial_deploy: orchestrator
identified that runners 1-8 last restarted before AGENT_TOOLSDIRECTORY
+ RUNNER_TOOL_CACHE were added; cycle 7 retrigger landed ~50% on stale
runners. Orchestrator restarted 1-8 at ~09:37; this empty commit
re-triggers CI on the now-consistent runner pool.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Empty commit to re-run CI against the act_runner config that landed
in /opt/molecule/runners/config.yaml (cycle ~58 internal#46 Phase 3).
No source change. CI now runs setup-python with /tmp/hostedtoolcache,
which works (verified in cycle 6 task 1022 log, careful-bash#2).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Gitea is case-sensitive on owner slugs; canonical is lowercase
`molecule-ai/...`. Mixed-case `Molecule-AI/...` refs fail-at-0s
when the runner tries to resolve the cross-repo workflow / checkout.
Same fix as molecule-controlplane#12. Mechanical case-correction;
no behavior change beyond making CI resolve again.
Refs: internal#46
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>