fix(ci): repin actions/setup-node to verified v4.0.2 SHA (#1432) #1433

Open
hongming wants to merge 1 commits from fix/setup-node-pin-corrupt-1432 into staging
Owner

Summary

Repins actions/setup-node in .gitea/workflows/e2e-chat.yml from a corrupted (typo'd) commit SHA to the verified v4.0.2 SHA.

Refs: molecule-core #1432

Root cause

Root-cause not symptom: The pin actions/setup-node@60edb5dd545a775178f52524783378180af0d6f5 is a one-character corruption (last hex ...af0d6f5) of the real v4.0.2 commit ...af0d1f8. This Gitea has DEFAULT_ACTIONS_URL = self, so the action resolves from the in-Gitea mirror actions/setup-node on git.moleculesai.app. The corrupted SHA was never synced there and returns HTTP 404, so the Setup Node step fails and E2E Chat / E2E Chat on base staging has been dead since commit 843092db (2026-05-14, ~3 days). This is the resolution-failure root cause, not a symptom — fixing the pin restores action resolution. (E2E Chat is not a required-status context; this PR does not certify the rest of the E2E suite, only fixes the corrupted pin.)

Verified-correct SHA + verification

  • Intended version per the uses: annotation + issue #1432: v4.0.2.
  • Queried the actual mirror GET /api/v1/repos/actions/setup-node/tags: v4.0.2 → 60edb5dd545a775178f52524783378180af0d1f8.
  • GET /api/v1/repos/actions/setup-node/git/commits/60edb5dd545a775178f52524783378180af0d1f8 → 200, commit "Add support for arm64 Windows (#927)".
  • GET .../git/commits/60edb5dd545a775178f52524783378180af0d6f5 (the corrupted SHA) → 404, confirming root cause.
  • Pin comment tightened # v4# v4.0.2 to document the exact pinned ref (the loose # v4 annotation was part of why the typo went unnoticed).

Scope

Single line in .gitea/workflows/e2e-chat.yml (line 100). grep -rn of the corrupted SHA across .gitea/workflows/ showed exactly one occurrence; post-fix grep is empty. No other action pins, workflows, or lines were touched.

SOP checklist

  • Comprehensive testing performed: N/A for runtime behavior — this is a CI workflow pin correction with no product code path. Verification was done against the live action mirror API (correct SHA resolves 200 / corrupted SHA 404, both shown above). The E2E Chat job itself is non-gating and explicitly out of scope per #1432.
  • Local-postgres E2E run: N/A — pure CI-config change, no application/DB code modified; no local-postgres surface.
  • Staging-smoke verified or pending: N/A — change only affects the (non-required) E2E Chat workflow's action resolution; no deploy/runtime artifact produced. Effect is observable when E2E Chat next runs on staging post-merge.
  • Root-cause not symptom: Typo'd action SHA → 404 in the self-hosted action mirror → setup-node step fails → E2E Chat dead since 843092db. Fixing the pin to the verified v4.0.2 SHA addresses the resolution failure at its source. (See Root cause section.)
  • Five-Axis review walked: Correctness — SHA verified against mirror tag + commit GET. Readability — comment tightened to exact version. Architecture — no structural change. Security — repins to the legitimate upstream-mirrored v4.0.2 commit (not a floating tag); SHA pinning preserved. Performance — none.
  • No backwards-compat shim / dead code added: No. One token replaced in place; no shim, no dead code, no compat layer.
  • Memory/saved-feedback consulted: feedback_chained_defects_in_never_tested_workflows (verified the single corrupted-SHA defect, did not chase unrelated pins), feedback_path_filtered_workflow_cant_be_required / feedback_gitea_gate_check_required_list_not_combined_status (confirmed E2E Chat is non-gating; scoped the fix accordingly), feedback_verify_enum_by_source_not_inference (verified the correct SHA from the live mirror, not the reported hex).

🤖 Generated with Claude Code

## Summary Repins `actions/setup-node` in `.gitea/workflows/e2e-chat.yml` from a corrupted (typo'd) commit SHA to the verified `v4.0.2` SHA. Refs: molecule-core #1432 ## Root cause `Root-cause not symptom`: The pin `actions/setup-node@60edb5dd545a775178f52524783378180af0d6f5` is a one-character corruption (last hex `...af0d6f5`) of the real `v4.0.2` commit `...af0d1f8`. This Gitea has `DEFAULT_ACTIONS_URL = self`, so the action resolves from the in-Gitea mirror `actions/setup-node` on git.moleculesai.app. The corrupted SHA was never synced there and returns HTTP 404, so the `Setup Node` step fails and `E2E Chat / E2E Chat` on base `staging` has been dead since commit `843092db` (2026-05-14, ~3 days). This is the resolution-failure root cause, not a symptom — fixing the pin restores action resolution. (E2E Chat is not a required-status context; this PR does not certify the rest of the E2E suite, only fixes the corrupted pin.) ## Verified-correct SHA + verification - Intended version per the `uses:` annotation + issue #1432: `v4.0.2`. - Queried the actual mirror `GET /api/v1/repos/actions/setup-node/tags`: `v4.0.2 → 60edb5dd545a775178f52524783378180af0d1f8`. - `GET /api/v1/repos/actions/setup-node/git/commits/60edb5dd545a775178f52524783378180af0d1f8` → 200, commit "Add support for arm64 Windows (#927)". - `GET .../git/commits/60edb5dd545a775178f52524783378180af0d6f5` (the corrupted SHA) → 404, confirming root cause. - Pin comment tightened `# v4` → `# v4.0.2` to document the exact pinned ref (the loose `# v4` annotation was part of why the typo went unnoticed). ## Scope Single line in `.gitea/workflows/e2e-chat.yml` (line 100). `grep -rn` of the corrupted SHA across `.gitea/workflows/` showed exactly one occurrence; post-fix grep is empty. No other action pins, workflows, or lines were touched. ## SOP checklist - **Comprehensive testing performed**: N/A for runtime behavior — this is a CI workflow pin correction with no product code path. Verification was done against the live action mirror API (correct SHA resolves 200 / corrupted SHA 404, both shown above). The E2E Chat job itself is non-gating and explicitly out of scope per #1432. - **Local-postgres E2E run**: N/A — pure CI-config change, no application/DB code modified; no local-postgres surface. - **Staging-smoke verified or pending**: N/A — change only affects the (non-required) E2E Chat workflow's action resolution; no deploy/runtime artifact produced. Effect is observable when E2E Chat next runs on staging post-merge. - **Root-cause not symptom**: Typo'd action SHA → 404 in the self-hosted action mirror → setup-node step fails → E2E Chat dead since 843092db. Fixing the pin to the verified v4.0.2 SHA addresses the resolution failure at its source. (See Root cause section.) - **Five-Axis review walked**: Correctness — SHA verified against mirror tag + commit GET. Readability — comment tightened to exact version. Architecture — no structural change. Security — repins to the legitimate upstream-mirrored v4.0.2 commit (not a floating tag); SHA pinning preserved. Performance — none. - **No backwards-compat shim / dead code added**: No. One token replaced in place; no shim, no dead code, no compat layer. - **Memory/saved-feedback consulted**: `feedback_chained_defects_in_never_tested_workflows` (verified the single corrupted-SHA defect, did not chase unrelated pins), `feedback_path_filtered_workflow_cant_be_required` / `feedback_gitea_gate_check_required_list_not_combined_status` (confirmed E2E Chat is non-gating; scoped the fix accordingly), `feedback_verify_enum_by_source_not_inference` (verified the correct SHA from the live mirror, not the reported hex). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
hongming added 1 commit 2026-05-17 17:20:56 +00:00
fix(ci): repin actions/setup-node to verified v4.0.2 SHA (#1432)
sop-tier-check / tier-check (pull_request) Waiting to run
Block internal-flavored paths / Block forbidden paths (pull_request) Successful in 4s
CI / Detect changes (pull_request) Successful in 8s
E2E API Smoke Test / detect-changes (pull_request) Successful in 9s
E2E Chat / detect-changes (pull_request) Successful in 8s
Handlers Postgres Integration / detect-changes (pull_request) Successful in 13s
Lint curl status-code capture / Scan workflows for curl status-capture pollution (pull_request) Successful in 8s
lint-continue-on-error-tracking / lint-continue-on-error-tracking (pull_request) Successful in 1m23s
Lint pre-flip continue-on-error / Verify continue-on-error flips have run-log proof (pull_request) Successful in 1m12s
lint-required-context-exists-in-bp / lint-required-context-exists-in-bp (pull_request) Successful in 1m18s
Runtime PR-Built Compatibility / detect-changes (pull_request) Successful in 12s
Secret scan / Scan diff for credential-shaped strings (pull_request) Successful in 9s
gate-check-v3 / gate-check (pull_request) Successful in 8s
qa-review / approved (pull_request) Successful in 6s
security-review / approved (pull_request) Successful in 5s
lint-required-no-paths / lint-required-no-paths (pull_request) Successful in 1m14s
Lint workflow YAML (Gitea-1.22.6-hostile shapes) / Lint workflow YAML for Gitea-1.22.6-hostile shapes (pull_request) Successful in 1m24s
CI / Platform (Go) (pull_request) Successful in 7m3s
CI / Canvas (Next.js) (pull_request) Successful in 8m37s
sop-checklist / all-items-acked (pull_request) [info tier:low] acked: 7/7
sop-checklist / na-declarations (pull_request) N/A: (none)
CI / Shellcheck (E2E scripts) (pull_request) Successful in 2s
CI / Python Lint & Test (pull_request) Successful in 2s
E2E API Smoke Test / E2E API Smoke Test (pull_request) Successful in 4s
Handlers Postgres Integration / Handlers Postgres Integration (pull_request) Successful in 3s
Runtime PR-Built Compatibility / PR-built wheel + import smoke (pull_request) Successful in 4s
E2E Chat / E2E Chat (pull_request) Failing after 5m7s
CI / Canvas Deploy Reminder (pull_request) Has been skipped
CI / all-required (pull_request) Successful in 1s
fbfbe18da9
The setup-node pin in .gitea/workflows/e2e-chat.yml was a typo'd
SHA (60edb5dd...af0d6f5) that 404s in the self-hosted action
mirror (DEFAULT_ACTIONS_URL=self → git.moleculesai.app/actions/
setup-node). It is a 1-char corruption of the real v4.0.2 SHA
(...af0d1f8). Introduced in 843092db (2026-05-14), it has broken
E2E Chat / E2E Chat on base staging for ~3 days.

Repinned to the mirror-verified v4.0.2 commit
60edb5dd545a775178f52524783378180af0d1f8 (the exact SHA the
v4.0.2 tag resolves to in actions/setup-node on git.moleculesai.app;
GET on the commit returns 200; corrupted SHA GET returns 404).
Comment tightened # v4 → # v4.0.2 to document the exact pinned ref.

Scope: single line, this one corrupted SHA only. No other action
pins, workflows, or lines touched.

Refs: molecule-core #1432

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
hongming added the tier:low label 2026-05-17 17:21:22 +00:00
Owner

This fix is already on main via commit b5c8b235 (fullstack-engineer, 2026-05-15). The SHA was corrected from 60edb5dd...d6f5 (invalid) to 48b55a01...4041e (v6.4.0), which also upgrades from v4 to v6.4.0 (already verified in ci.yml and e2e-staging-canvas.yml). Issue #1432 has been closed. Recommend closing this PR as duplicate — or if staging needs this fix separately, rebase onto main instead of the non-existent staging branch.

This fix is already on `main` via commit [b5c8b235](https://git.moleculesai.app/molecule-ai/molecule-core/commit/b5c8b235) (fullstack-engineer, 2026-05-15). The SHA was corrected from `60edb5dd...d6f5` (invalid) to `48b55a01...4041e` (v6.4.0), which also upgrades from v4 to v6.4.0 (already verified in ci.yml and e2e-staging-canvas.yml). Issue #1432 has been closed. Recommend closing this PR as duplicate — or if staging needs this fix separately, rebase onto main instead of the non-existent `staging` branch.
infra-sre approved these changes 2026-05-17 17:25:36 +00:00
infra-sre left a comment
Member

Five-Axis review (infra-sre, non-author — author is core-devops, API-author hongming; I am neither and not uid 74).

Independently verified:

  • Correctness: actions/setup-node mirror (DEFAULT_ACTIONS_URL=selfgit.moleculesai.app/actions/setup-node). git/refs/tags/v4.0.260edb5dd545a775178f52524783378180af0d1f8 (type=commit), exactly the new pinned SHA. The old pin ...af0d6f5 GETs 404 — confirmed root cause of the setup-node step failing and E2E Chat being dead on staging since 843092db.
  • Readability: comment tightened # v4# v4.0.2; now self-documents the exact pinned ref.
  • Architecture: no structural change; SHA-pin discipline preserved (pinned to a commit, not a moving tag).
  • Security: repins to the legitimate upstream-mirrored v4.0.2 commit; no supply-chain widening; no floating ref introduced.
  • Performance: none.
  • Scope: git diff staging..HEAD = 1 file / 1 line; corrupted SHA grep across .gitea/ returns nothing post-fix. No unrelated pins touched. Clean.

APPROVE.

**Five-Axis review (infra-sre, non-author — author is core-devops, API-author hongming; I am neither and not uid 74).** Independently verified: - **Correctness**: `actions/setup-node` mirror (`DEFAULT_ACTIONS_URL=self` → `git.moleculesai.app/actions/setup-node`). `git/refs/tags/v4.0.2` → `60edb5dd545a775178f52524783378180af0d1f8` (type=commit), exactly the new pinned SHA. The old pin `...af0d6f5` GETs 404 — confirmed root cause of the setup-node step failing and E2E Chat being dead on staging since 843092db. - **Readability**: comment tightened `# v4` → `# v4.0.2`; now self-documents the exact pinned ref. - **Architecture**: no structural change; SHA-pin discipline preserved (pinned to a commit, not a moving tag). - **Security**: repins to the legitimate upstream-mirrored v4.0.2 commit; no supply-chain widening; no floating ref introduced. - **Performance**: none. - **Scope**: `git diff staging..HEAD` = 1 file / 1 line; corrupted SHA grep across `.gitea/` returns nothing post-fix. No unrelated pins touched. Clean. APPROVE.
Member

/sop-ack local-postgres-e2e infra-sre: pure CI-config change, no application/DB code — N/A is truthful; verified diff touches only the e2e-chat.yml pin line.

/sop-ack local-postgres-e2e infra-sre: pure CI-config change, no application/DB code — N/A is truthful; verified diff touches only the e2e-chat.yml pin line.
Member

/sop-ack staging-smoke infra-sre: change only affects the non-required E2E Chat workflow's action resolution; observable when E2E Chat next runs on staging post-merge. N/A-pending is accurate.

/sop-ack staging-smoke infra-sre: change only affects the non-required E2E Chat workflow's action resolution; observable when E2E Chat next runs on staging post-merge. N/A-pending is accurate.
Member

/sop-ack memory-consulted infra-sre: verified the cited memories apply (single-defect scoping per feedback_chained_defects_in_never_tested_workflows; verify-from-source per feedback_verify_enum_by_source_not_inference; non-gating confirmed).

/sop-ack memory-consulted infra-sre: verified the cited memories apply (single-defect scoping per feedback_chained_defects_in_never_tested_workflows; verify-from-source per feedback_verify_enum_by_source_not_inference; non-gating confirmed).
core-security approved these changes 2026-05-17 17:25:56 +00:00
core-security left a comment
Member

Five-Axis review (core-security, non-author — distinct from infra-sre, from author core-devops, from API-author hongming, and from uid 74).

Independent re-verification with a security/supply-chain lens:

  • Correctness: confirmed v4.0.2 tag in the self-hosted actions/setup-node mirror resolves to 60edb5dd545a775178f52524783378180af0d1f8 — byte-identical to the new pin. Old ...af0d6f5 → 404.
  • Security (primary lens): this is a supply-chain-adjacent surface. The new value is the legitimate v4.0.2 commit from the org-controlled action mirror, pinned by full 40-hex commit SHA (not a tag/branch). No third-party or floating ref introduced; no token/secret surface in the diff. The corrupted pin was a typo, not a malicious substitution — the fix restores the intended trusted commit.
  • Readability / Architecture / Performance: comment now states the exact version; no structural or perf change.
  • Scope: verified 1 line in .gitea/workflows/e2e-chat.yml only; no other pins or workflows altered.

APPROVE.

**Five-Axis review (core-security, non-author — distinct from infra-sre, from author core-devops, from API-author hongming, and from uid 74).** Independent re-verification with a security/supply-chain lens: - **Correctness**: confirmed `v4.0.2` tag in the self-hosted `actions/setup-node` mirror resolves to `60edb5dd545a775178f52524783378180af0d1f8` — byte-identical to the new pin. Old `...af0d6f5` → 404. - **Security (primary lens)**: this is a supply-chain-adjacent surface. The new value is the legitimate v4.0.2 commit from the org-controlled action mirror, pinned by full 40-hex commit SHA (not a tag/branch). No third-party or floating ref introduced; no token/secret surface in the diff. The corrupted pin was a typo, not a malicious substitution — the fix restores the intended trusted commit. - **Readability / Architecture / Performance**: comment now states the exact version; no structural or perf change. - **Scope**: verified 1 line in `.gitea/workflows/e2e-chat.yml` only; no other pins or workflows altered. APPROVE.
Member

/sop-ack comprehensive-testing core-security: verification was done against the live action mirror API (v4.0.2 tag→SHA match, corrupted SHA 404). No product runtime path; the non-gating E2E Chat job is explicitly out of scope per #1432. Testing-claim is truthful.

/sop-ack comprehensive-testing core-security: verification was done against the live action mirror API (v4.0.2 tag→SHA match, corrupted SHA 404). No product runtime path; the non-gating E2E Chat job is explicitly out of scope per #1432. Testing-claim is truthful.
Member

/sop-ack five-axis-review core-security: walked all five axes independently (see review); correctness + security verified against the mirror, scope confirmed single-line.

/sop-ack five-axis-review core-security: walked all five axes independently (see review); correctness + security verified against the mirror, scope confirmed single-line.
Member

/sop-ack root-cause dev-lead: senior judgment — this is genuinely root-cause, not symptom. The typo'd 40-hex SHA fails to resolve in the self-hosted action mirror (404), which is the direct cause of the setup-node step failing. Repinning to the verified v4.0.2 commit fixes resolution at the source. Not papering over a downstream symptom.

/sop-ack root-cause dev-lead: senior judgment — this is genuinely root-cause, not symptom. The typo'd 40-hex SHA fails to resolve in the self-hosted action mirror (404), which is the direct cause of the setup-node step failing. Repinning to the verified v4.0.2 commit fixes resolution at the source. Not papering over a downstream symptom.
Member

/sop-ack no-backwards-compat dev-lead: confirmed — one token replaced in place, no shim, no compat layer, no dead code. Diff is a single-line substitution. Justification holds.

/sop-ack no-backwards-compat dev-lead: confirmed — one token replaced in place, no shim, no compat layer, no dead code. Diff is a single-line substitution. Justification holds.
Member

[core-security-agent] N/A — non-security-touching (CI workflow dependency pin only; actions/setup-node SHA repin, no production code)

[core-security-agent] N/A — non-security-touching (CI workflow dependency pin only; actions/setup-node SHA repin, no production code)
core-devops reviewed 2026-05-17 22:53:05 +00:00
core-devops left a comment
Member

LGTM — one-line SHA pin correction, correct and minimal.

  • af0d6f5af0d1f8 is the verified v4.0.2 tag SHA (confirmed against actions/setup-node releases)
  • Fixes the class of Gitea mirror corruption where a single hex digit flip makes the action unreproducible
  • .github/workflows/ is covered by CI detect-changes → lint jobs will catch future typos

Note for future: Consider pinning to the tag (@v4.0.2) instead of the raw SHA — tags are easier to audit manually and still deterministic. SHA pins are correct but harder to verify without a local checkout of the upstream repo.

**LGTM** — one-line SHA pin correction, correct and minimal. - `af0d6f5` → `af0d1f8` is the verified v4.0.2 tag SHA (confirmed against `actions/setup-node` releases) - Fixes the class of Gitea mirror corruption where a single hex digit flip makes the action unreproducible - `.github/workflows/` is covered by CI `detect-changes` → lint jobs will catch future typos **Note for future:** Consider pinning to the tag (`@v4.0.2`) instead of the raw SHA — tags are easier to audit manually and still deterministic. SHA pins are correct but harder to verify without a local checkout of the upstream repo.
Member

[core-devops] Quick review: actions/setup-node repinned to SHA a309ff8b426b58ec0e2a45f0f869d46889d02405 (= v4.0.2). This fixes the known corrupted runner image that was returning an invalid semver string. CI / all-required = success . Approve.

[core-devops] Quick review: `actions/setup-node` repinned to SHA `a309ff8b426b58ec0e2a45f0f869d46889d02405` (= v4.0.2). This fixes the known corrupted runner image that was returning an invalid semver string. `CI / all-required = success` ✅. Approve.
Member

[core-qa-agent] N/A — docs/lint only (CI action SHA repin, no test surface)

[core-qa-agent] N/A — docs/lint only (CI action SHA repin, no test surface)
Some optional checks failed
sop-tier-check / tier-check (pull_request) Waiting to run
Block internal-flavored paths / Block forbidden paths (pull_request) Successful in 4s
CI / Detect changes (pull_request) Successful in 8s
E2E API Smoke Test / detect-changes (pull_request) Successful in 9s
E2E Chat / detect-changes (pull_request) Successful in 8s
Handlers Postgres Integration / detect-changes (pull_request) Successful in 13s
Lint curl status-code capture / Scan workflows for curl status-capture pollution (pull_request) Successful in 8s
lint-continue-on-error-tracking / lint-continue-on-error-tracking (pull_request) Successful in 1m23s
Lint pre-flip continue-on-error / Verify continue-on-error flips have run-log proof (pull_request) Successful in 1m12s
lint-required-context-exists-in-bp / lint-required-context-exists-in-bp (pull_request) Successful in 1m18s
Runtime PR-Built Compatibility / detect-changes (pull_request) Successful in 12s
Secret scan / Scan diff for credential-shaped strings (pull_request) Successful in 9s
gate-check-v3 / gate-check (pull_request) Successful in 8s
qa-review / approved (pull_request) Successful in 6s
security-review / approved (pull_request) Successful in 5s
lint-required-no-paths / lint-required-no-paths (pull_request) Successful in 1m14s
Lint workflow YAML (Gitea-1.22.6-hostile shapes) / Lint workflow YAML for Gitea-1.22.6-hostile shapes (pull_request) Successful in 1m24s
CI / Platform (Go) (pull_request) Successful in 7m3s
CI / Canvas (Next.js) (pull_request) Successful in 8m37s
sop-checklist / all-items-acked (pull_request) [info tier:low] acked: 7/7
Required
Details
sop-checklist / na-declarations (pull_request) N/A: (none)
CI / Shellcheck (E2E scripts) (pull_request) Successful in 2s
CI / Python Lint & Test (pull_request) Successful in 2s
E2E API Smoke Test / E2E API Smoke Test (pull_request) Successful in 4s
Handlers Postgres Integration / Handlers Postgres Integration (pull_request) Successful in 3s
Runtime PR-Built Compatibility / PR-built wheel + import smoke (pull_request) Successful in 4s
E2E Chat / E2E Chat (pull_request) Failing after 5m7s
CI / Canvas Deploy Reminder (pull_request) Has been skipped
CI / all-required (pull_request) Successful in 1s
Required
Details
This pull request has changes conflicting with the target branch.
  • .gitea/workflows/e2e-chat.yml
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin fix/setup-node-pin-corrupt-1432:fix/setup-node-pin-corrupt-1432
git checkout fix/setup-node-pin-corrupt-1432
Sign in to join this conversation.
7 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: molecule-ai/molecule-core#1433