fix(ci): validate manifest repos exist before clone + prune broken entries (#2192) #2218

Closed
core-be wants to merge 5 commits from fix/2192-manifest-repo-existence-check into main
Member

Summary

Closes #2192.

Adds scripts/check-manifest-repos-exist.sh — a fail-fast guard that verifies every repo in manifest.json resolves (HTTP 200) via the Gitea API before the expensive clone-manifest.sh step runs. Surfaces missing entries with per-line ::error:: annotations naming the broken repo so the failure is self-explanatory, not a generic git 404.

Integrates the check into publish-workspace-server-image.yml immediately before the Pre-clone manifest deps step. This is the push-time complement to PR #2186's PR-time manifest-entry-existence gate.

Also prunes two workspace_template entries whose repos do not exist:

  • google-adk (added 2026-05-28 in 0359912d but repo never created)
  • seo-agent (added 2026-05-25 in ef865141 but repo never created)

These dangling entries would have caused the next main push's publish workflow to fail with a cryptic git clone error.

Test plan

  • scripts/check-manifest-repos-exist.sh manifest.json passes locally (28/28 repos HTTP 200)
  • bash -n scripts/check-manifest-repos-exist.sh syntax OK
  • Removed google-adk + seo-agent verified via Gitea API (both return 404)
  • CI / all-required green on this PR
## Summary Closes #2192. Adds `scripts/check-manifest-repos-exist.sh` — a fail-fast guard that verifies every repo in `manifest.json` resolves (HTTP 200) via the Gitea API before the expensive `clone-manifest.sh` step runs. Surfaces missing entries with per-line `::error::` annotations naming the broken repo so the failure is self-explanatory, not a generic git 404. Integrates the check into `publish-workspace-server-image.yml` immediately before the **Pre-clone manifest deps** step. This is the push-time complement to PR #2186's PR-time `manifest-entry-existence` gate. Also prunes two `workspace_template` entries whose repos do not exist: - `google-adk` (added 2026-05-28 in `0359912d` but repo never created) - `seo-agent` (added 2026-05-25 in `ef865141` but repo never created) These dangling entries would have caused the next main push's publish workflow to fail with a cryptic git clone error. ## Test plan - [x] `scripts/check-manifest-repos-exist.sh manifest.json` passes locally (28/28 repos HTTP 200) - [x] `bash -n scripts/check-manifest-repos-exist.sh` syntax OK - [x] Removed `google-adk` + `seo-agent` verified via Gitea API (both return 404) - [ ] CI / all-required green on this PR
core-be added 5 commits 2026-06-04 06:09:32 +00:00
Canvas chat lost the user's own message when they exited the chat before
the agent replied, for push-mode (HTTP-dispatched) workspaces.

Root cause: chat-history is reconstructed solely from activity_logs rows
(activity_type='a2a_receive', source_id IS NULL). For push-mode that row
was written ONLY in logA2ASuccess/logA2AFailure, AFTER the full agent
A2A round-trip. The user message was never persisted at ingest. If the
user exited the chat (fetch abort on unmount / tab close / dropped conn)
before the agent finished, no row was ever written and the message was
permanently lost on reopen. poll-mode was unaffected (logA2AReceiveQueued
already persists at ingest). This is the inbound mirror of the reno-stars
2026-05-05 outbound data-loss incident (RFC #2945).

Fix: persistUserMessageAtIngest() does a synchronous INSERT of the user
message (status='pending', response_body NULL) BEFORE dispatchA2A, on a
context.WithoutCancel context so a client disconnect cannot abort the
write. logA2ASuccess finalizes that row via UPDATE (no duplicate user
bubble — preserves the one-row-(user,agent) read contract). logA2AFailure
with an ingest row is a no-op: the pending row already durably holds the
message, and busy->enqueue requests stay pending to be answered by the
queue drain. Best-effort: on persist failure, falls back to the legacy
post-round-trip INSERT (never worse than pre-fix, never blocks the send).
The read path already renders a user bubble from a row with empty
response_body, so the message shows on reopen even before the agent
answers.

8 new TDD regression tests (a2a_ingest_persist_test.go). Full
internal/handlers + internal/messagestore suites green.

Refs: molecule-ai/internal#470

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Drives the real ProxyA2A HTTP handler through the literal bug scenario:
canvas message/send, mock agent hangs, client request context cancelled
(user exits chat) before any reply. Asserts the ingest INSERT fires
synchronously before dispatch (on context.WithoutCancel) so the user
message is durable even though no logA2ASuccess/finalize ever runs —
exactly the pre-fix loss window, now closed.

Refs: molecule-ai/internal#470

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
ci: no-op re-trigger for qa-review re-evaluation [dev-lead]
Block internal-flavored paths / Block forbidden paths (pull_request) Successful in 3s
CI / Detect changes (pull_request) Successful in 4s
CI / Shellcheck (E2E scripts) (pull_request) Successful in 11s
CI / Platform (Go) (pull_request) Successful in 4m20s
E2E API Smoke Test / detect-changes (pull_request) Successful in 4s
E2E Chat / detect-changes (pull_request) Successful in 4s
E2E Staging Canvas (Playwright) / detect-changes (pull_request) Successful in 4s
E2E Staging SaaS (full lifecycle) / E2E Staging SaaS (pull_request) Has been skipped
Handlers Postgres Integration / detect-changes (pull_request) Successful in 3s
Harness Replays / detect-changes (pull_request) Successful in 2s
Runtime PR-Built Compatibility / detect-changes (pull_request) Successful in 4s
Secret scan / Scan diff for credential-shaped strings (pull_request) Successful in 3s
gate-check-v3 / gate-check (pull_request) Successful in 3s
E2E Staging SaaS (full lifecycle) / pr-validate (pull_request) Successful in 21s
qa-review / approved (pull_request) Failing after 3s
security-review / approved (pull_request) Failing after 3s
sop-checklist / na-declarations (pull_request) N/A: (none)
sop-checklist / all-items-acked (pull_request) Successful in 3s
sop-tier-check / tier-check (pull_request) Successful in 4s
lint-required-no-paths / lint-required-no-paths (pull_request) Successful in 56s
CI / Canvas (Next.js) (pull_request) Successful in 6m18s
CI / Python Lint & Test (pull_request) Successful in 6m15s
CI / all-required (pull_request) Successful in 5m36s
E2E Staging Canvas (Playwright) / Canvas tabs E2E (pull_request) Successful in 3s
Harness Replays / Harness Replays (pull_request) Successful in 2s
Runtime PR-Built Compatibility / PR-built wheel + import smoke (pull_request) Successful in 2s
E2E API Smoke Test / E2E API Smoke Test (pull_request) Successful in 44s
Handlers Postgres Integration / Handlers Postgres Integration (pull_request) Successful in 2m17s
E2E Chat / E2E Chat (pull_request) Failing after 5m6s
CI / Canvas Deploy Reminder (pull_request) Has been skipped
sop-checklist / review-refire (pull_request_target) Has been skipped
sop-checklist / all-items-acked (pull_request_target) Has been cancelled
sop-tier-check / tier-check (pull_request_target) Failing after 5s
608fc28d96
fix(ci): validate manifest repos exist before clone + prune broken entries (#2192)
cascade-list-drift-gate / check (pull_request) Failing after 5s
CI / Detect changes (pull_request) Successful in 5s
E2E Chat / detect-changes (pull_request) Successful in 6s
E2E Staging SaaS (full lifecycle) / E2E Staging SaaS (pull_request) Has been skipped
E2E Staging Canvas (Playwright) / detect-changes (pull_request) Successful in 6s
CI / Shellcheck (E2E scripts) (pull_request) Successful in 10s
Block internal-flavored paths / Block forbidden paths (pull_request) Successful in 14s
Handlers Postgres Integration / detect-changes (pull_request) Successful in 4s
Harness Replays / detect-changes (pull_request) Successful in 3s
Lint curl status-code capture / Scan workflows for curl status-capture pollution (pull_request) Successful in 3s
E2E API Smoke Test / detect-changes (pull_request) Successful in 22s
E2E Staging SaaS (full lifecycle) / pr-validate (pull_request) Successful in 28s
Runtime PR-Built Compatibility / detect-changes (pull_request) Successful in 6s
Lint pre-flip continue-on-error / Verify continue-on-error flips have run-log proof (pull_request) Failing after 55s
Secret scan / Scan diff for credential-shaped strings (pull_request) Failing after 29s
lint-required-no-paths / lint-required-no-paths (pull_request) Successful in 56s
lint-required-context-exists-in-bp / lint-required-context-exists-in-bp (pull_request) Failing after 59s
lint-continue-on-error-tracking / lint-continue-on-error-tracking (pull_request) Failing after 1m2s
gate-check-v3 / gate-check (pull_request_target) Successful in 4s
sop-checklist / review-refire (pull_request_target) Has been skipped
qa-review / approved (pull_request_target) Failing after 3s
sop-checklist / all-items-acked (pull_request) acked: 0/7 — missing: comprehensive-testing, local-postgres-e2e, staging-smoke, +4 — body-unfilled: comprehensive-testing, local-postgres-e2
sop-checklist / na-declarations (pull_request) N/A: (none)
sop-checklist / all-items-acked (pull_request_target) Successful in 3s
security-review / approved (pull_request_target) Failing after 3s
E2E Chat / E2E Chat (pull_request) Successful in 2s
sop-tier-check / tier-check (pull_request_target) Successful in 3s
Harness Replays / Harness Replays (pull_request) Successful in 1s
E2E Staging Canvas (Playwright) / Canvas tabs E2E (pull_request) Successful in 2s
E2E API Smoke Test / E2E API Smoke Test (pull_request) Successful in 41s
Ops Scripts Tests / Ops scripts (unittest) (pull_request) Successful in 1m2s
Lint workflow YAML (Gitea-1.22.6-hostile shapes) / Lint workflow YAML for Gitea-1.22.6-hostile shapes (pull_request) Successful in 1m47s
Runtime PR-Built Compatibility / PR-built wheel + import smoke (pull_request) Successful in 2s
Handlers Postgres Integration / Handlers Postgres Integration (pull_request) Successful in 1m3s
audit-force-merge / audit (pull_request_target) Has been skipped
CI / Platform (Go) (pull_request) Successful in 6m15s
CI / Canvas (Next.js) (pull_request) Successful in 6m14s
CI / Canvas Deploy Reminder (pull_request) Has been skipped
CI / Python Lint & Test (pull_request) Successful in 7m44s
CI / all-required (pull_request) Successful in 8m26s
b936869cc0
Adds scripts/check-manifest-repos-exist.sh — a fail-fast guard that
verifies every repo in manifest.json resolves (HTTP 200) via the Gitea
API before the expensive clone-manifest.sh step runs. Surfaces missing
entries with per-line ::error:: annotations naming the broken repo so
the failure is self-explanatory, not a generic git 404 (issue #2192).

Integrates the check into publish-workspace-server-image.yml immediately
before the Pre-clone manifest deps step. This is the push-time complement
to PR #2186's PR-time manifest-entry-existence gate.

Also prunes two workspace_template entries whose repos do not exist:
- google-adk (added 2026-05-28 in 0359912d but repo never created)
- seo-agent (added 2026-05-25 in ef865141 but repo never created)

These dangling entries would have caused the next main push's publish
workflow to fail with a cryptic git clone error.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
core-be closed this pull request 2026-06-04 06:11:47 +00:00
Some optional checks failed
cascade-list-drift-gate / check (pull_request) Failing after 5s
CI / Detect changes (pull_request) Successful in 5s
E2E Chat / detect-changes (pull_request) Successful in 6s
E2E Staging SaaS (full lifecycle) / E2E Staging SaaS (pull_request) Has been skipped
E2E Staging Canvas (Playwright) / detect-changes (pull_request) Successful in 6s
CI / Shellcheck (E2E scripts) (pull_request) Successful in 10s
Block internal-flavored paths / Block forbidden paths (pull_request) Successful in 14s
Handlers Postgres Integration / detect-changes (pull_request) Successful in 4s
Harness Replays / detect-changes (pull_request) Successful in 3s
Lint curl status-code capture / Scan workflows for curl status-capture pollution (pull_request) Successful in 3s
E2E API Smoke Test / detect-changes (pull_request) Successful in 22s
E2E Staging SaaS (full lifecycle) / pr-validate (pull_request) Successful in 28s
Runtime PR-Built Compatibility / detect-changes (pull_request) Successful in 6s
Lint pre-flip continue-on-error / Verify continue-on-error flips have run-log proof (pull_request) Failing after 55s
Secret scan / Scan diff for credential-shaped strings (pull_request) Failing after 29s
lint-required-no-paths / lint-required-no-paths (pull_request) Successful in 56s
lint-required-context-exists-in-bp / lint-required-context-exists-in-bp (pull_request) Failing after 59s
lint-continue-on-error-tracking / lint-continue-on-error-tracking (pull_request) Failing after 1m2s
gate-check-v3 / gate-check (pull_request_target) Successful in 4s
sop-checklist / review-refire (pull_request_target) Has been skipped
qa-review / approved (pull_request_target) Failing after 3s
sop-checklist / all-items-acked (pull_request) acked: 0/7 — missing: comprehensive-testing, local-postgres-e2e, staging-smoke, +4 — body-unfilled: comprehensive-testing, local-postgres-e2
sop-checklist / na-declarations (pull_request) N/A: (none)
sop-checklist / all-items-acked (pull_request_target) Successful in 3s
security-review / approved (pull_request_target) Failing after 3s
E2E Chat / E2E Chat (pull_request) Successful in 2s
sop-tier-check / tier-check (pull_request_target) Successful in 3s
Harness Replays / Harness Replays (pull_request) Successful in 1s
E2E Staging Canvas (Playwright) / Canvas tabs E2E (pull_request) Successful in 2s
E2E API Smoke Test / E2E API Smoke Test (pull_request) Successful in 41s
Required
Details
Ops Scripts Tests / Ops scripts (unittest) (pull_request) Successful in 1m2s
Lint workflow YAML (Gitea-1.22.6-hostile shapes) / Lint workflow YAML for Gitea-1.22.6-hostile shapes (pull_request) Successful in 1m47s
Runtime PR-Built Compatibility / PR-built wheel + import smoke (pull_request) Successful in 2s
Handlers Postgres Integration / Handlers Postgres Integration (pull_request) Successful in 1m3s
Required
Details
audit-force-merge / audit (pull_request_target) Has been skipped
CI / Platform (Go) (pull_request) Successful in 6m15s
CI / Canvas (Next.js) (pull_request) Successful in 6m14s
CI / Canvas Deploy Reminder (pull_request) Has been skipped
CI / Python Lint & Test (pull_request) Successful in 7m44s
CI / all-required (pull_request) Successful in 8m26s
Required
Details

Pull request closed

Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: molecule-ai/molecule-core#2218