diff --git a/.github/workflows/harness-replays.yml b/.github/workflows/harness-replays.yml index b53d0b3f..23681ff7 100644 --- a/.github/workflows/harness-replays.yml +++ b/.github/workflows/harness-replays.yml @@ -119,6 +119,17 @@ jobs: # symptom, different root cause: staging still has the in-image # clone path, hits the auth error directly). # + # 2026-05-08 sub-finding (#192): the clone step ALSO fails when + # any referenced workspace-template repo is private and the + # AUTO_SYNC_TOKEN bearer (devops-engineer persona) lacks read + # access. Root cause: 5 of 9 workspace-template repos + # (openclaw, codex, crewai, deepagents, gemini-cli) had been + # marked private with no team grant. Resolution: flipped them + # to public per `feedback_oss_first_repo_visibility_default` + # (the OSS surface should be public). Layer-3 (customer-private + + # marketplace third-party repos) tracked separately in + # internal#102. + # # Token shape matches publish-workspace-server-image.yml: AUTO_SYNC_TOKEN # is the devops-engineer persona PAT, NOT the founder PAT (per # `feedback_per_agent_gitea_identity_default`). clone-manifest.sh diff --git a/manifest.json b/manifest.json index e7b69ef7..2ac2f462 100644 --- a/manifest.json +++ b/manifest.json @@ -1,5 +1,5 @@ { - "_comment": "Pin refs to release tags for reproducible builds. 'main' is OK while all repos are internal.", + "_comment": "OSS surface registry — every repo listed here MUST be public on git.moleculesai.app. Layer-3 customer/private templates are NOT registered here; they are handled at provision-time via the per-tenant credential resolver (see internal#102 RFC). 'main' refs are pinned to tags before broad rollout.", "version": 1, "plugins": [ {"name": "browser-automation", "repo": "molecule-ai/molecule-ai-plugin-browser-automation", "ref": "main"}, @@ -40,7 +40,6 @@ {"name": "free-beats-all", "repo": "molecule-ai/molecule-ai-org-template-free-beats-all", "ref": "main"}, {"name": "medo-smoke", "repo": "molecule-ai/molecule-ai-org-template-medo-smoke", "ref": "main"}, {"name": "molecule-worker-gemini", "repo": "molecule-ai/molecule-ai-org-template-molecule-worker-gemini", "ref": "main"}, - {"name": "reno-stars", "repo": "molecule-ai/molecule-ai-org-template-reno-stars", "ref": "main"}, {"name": "ux-ab-lab", "repo": "molecule-ai/molecule-ai-org-template-ux-ab-lab", "ref": "main"}, {"name": "mock-bigorg", "repo": "molecule-ai/molecule-ai-org-template-mock-bigorg", "ref": "main"} ] diff --git a/scripts/clone-manifest.sh b/scripts/clone-manifest.sh index 3ad98580..4e9e5d99 100755 --- a/scripts/clone-manifest.sh +++ b/scripts/clone-manifest.sh @@ -8,27 +8,24 @@ # Requires: git, jq (lighter than python3 — ~2MB vs ~50MB in Alpine) # # Auth (optional): -# When MOLECULE_GITEA_TOKEN is set, embed it as the basic-auth password so -# private Gitea repos clone successfully. When unset, clone anonymously -# (works only for repos that are public on git.moleculesai.app). +# Post-2026-05-08 (#192): every repo in manifest.json is public on +# git.moleculesai.app. Anonymous clone works for the entire registered +# set. The OSS-surface contract is recorded in manifest.json's _comment +# — Layer-3 customer/private templates (e.g. reno-stars) are NOT in the +# manifest; they are handled at provision-time via the per-tenant +# credential resolver (internal#102 RFC). # -# This is the path the publish-workspace-server-image.yml workflow uses: -# it injects AUTO_SYNC_TOKEN (devops-engineer persona PAT, repo:read on -# the molecule-ai org) so the in-CI pre-clone step succeeds for ALL -# manifest entries — including the 5 private workspace-template-* repos -# (codex, crewai, deepagents, gemini-cli, langgraph) and all 7 -# org-template-* repos. +# MOLECULE_GITEA_TOKEN is therefore optional today. Kept supported for +# two reasons: (a) historical CI configs that still inject +# AUTO_SYNC_TOKEN remain harmless, (b) reserved for the case where a +# private internal-only template is later registered via a ci-readonly +# team grant — review must explicitly sign off on that, since it +# violates the public-OSS-surface contract. # -# The token never enters the Docker image: this script runs in the -# trusted CI context BEFORE `docker buildx build`, populates +# The token (when set) never enters the Docker image: this script runs +# in the trusted CI context BEFORE `docker buildx build`, populates # .tenant-bundle-deps/, then `Dockerfile.tenant` COPYs from there with # the .git directories already stripped (see line ~67 below). -# -# For backward compatibility — and so a fresh clone works without -# secrets when (eventually) the workspace-template-* repos flip public — -# the unset path remains a plain anonymous HTTPS clone. That path will -# FAIL with "could not read Username" on private repos today; CI MUST -# set MOLECULE_GITEA_TOKEN. set -euo pipefail