Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
7a73e9e
test(ci): require Node 24 setup-node for fuzz workflow
seonghobae Aug 17, 2026
a92efde
fix(ci): run property fuzz setup action on Node 24
seonghobae Aug 17, 2026
323cf37
test(ci): require exact-head property fuzz checkout
seonghobae Aug 17, 2026
b779d7c
fix(ci): attest exact-head property fuzz checkout
seonghobae Aug 17, 2026
d2546ca
test(ci): require exact-head OSV evidence
seonghobae Aug 17, 2026
5ab1ad8
fix(ci): bind OSV scans to live base and exact head
seonghobae Aug 17, 2026
4d16ac8
docs(ci): record exact-head OSV evidence boundary
seonghobae Aug 17, 2026
4a9fd92
docs(ci): record exact-head OSV scan evidence
seonghobae Aug 17, 2026
ea7d747
fix(docs): preserve published 1.0.1 release note
seonghobae Aug 17, 2026
9ecccb0
test(ci): require exact-head CodeQL checkout
seonghobae Aug 17, 2026
e9385e4
fix(ci): attest exact-head CodeQL checkout
seonghobae Aug 17, 2026
124ba2d
docs(ci): record exact-head CodeQL evidence boundary
seonghobae Aug 17, 2026
5f3cfe8
docs(ci): record exact-head CodeQL analysis
seonghobae Aug 17, 2026
77e1997
chore(ci): keep OSV exact-head work on canonical PR 523
seonghobae Aug 17, 2026
7318c52
chore(ci): keep CodeQL exact-head work on canonical PR 523
seonghobae Aug 17, 2026
88f3c00
chore(ci): keep shared exact-head contracts on canonical PR 523
seonghobae Aug 17, 2026
19ff9ed
chore(ci): defer OSV doctoring to canonical PR 523
seonghobae Aug 17, 2026
5d0a7b1
chore(ci): defer CodeQL doctoring to canonical PR 523
seonghobae Aug 17, 2026
75b4d86
chore(ci): keep shared exact-head changelog on PR 523
seonghobae Aug 17, 2026
a3c6d21
merge(develop): reconcile fuzz runtime with OpenCode config
seonghobae Aug 17, 2026
8644756
merge(develop): reconcile fuzz runtime with protected orchestrator ch…
seonghobae Aug 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 12 additions & 1 deletion .github/workflows/fuzz.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,21 @@ jobs:
- name: Checkout repository
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
ref: ${{ github.event.pull_request.head.sha || github.sha }}
persist-credentials: false

- name: Verify exact checkout
env:
EXPECTED_SHA: ${{ github.event.pull_request.head.sha || github.sha }}
run: |
actual_sha="$(git rev-parse HEAD)"
if [ "$actual_sha" != "$EXPECTED_SHA" ]; then
echo "::error::Fuzz checked out $actual_sha, expected $EXPECTED_SHA"
exit 1
fi

- name: Set up Node.js
uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
node-version: '22.13.0'
cache: 'npm'
Expand Down
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Switched the repository-local OpenCode development configuration from GitHub
Models to an NVIDIA NIM-only candidate set while preserving organization-level
review-workflow ownership in `ContextualWisdomLab/.github`.
- Moved the repository-owned property-fuzz setup action to immutable
`actions/setup-node` v7.0.0 so its JavaScript action runtime declares Node.js
24 instead of relying on GitHub's compatibility override for deprecated
Node.js 20, while retaining Node.js 22.13.0 for ScopeWeave itself.
- Production planning-analysis requests now combine tenant-bound, server-derived
contextual-orchestrator cost attribution with explicit `auto` orchestration
mode, delegating provider/model/topology policy to the shared service without
Expand Down
45 changes: 45 additions & 0 deletions docs/doctoring/fuzz-setup-node-runtime.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# Fuzz workflow Node.js action runtime

## Status

Implemented on active PR only until the change reaches protected `develop`.

## Problem

The repository-owned `Fuzz` workflow pinned `actions/setup-node` v4.1.0 at commit `39370e3970a6d050c480ffad4ff0ed4d3fdee5af`. Current GitHub-hosted runs warn that the action targets deprecated Node.js 20 and is being forced to run on Node.js 24. That compatibility override is runner behavior, not ScopeWeave-controlled evidence, and retaining the old action runtime creates avoidable future CI breakage risk.

This is separate from the Node.js version used to execute ScopeWeave. The workflow continues to request Node.js `22.13.0` for the project-under-test; only the JavaScript runtime bundled by `actions/setup-node` changes.

## Decision

Pin the official `actions/setup-node` v7.0.0 release by immutable commit SHA `820762786026740c76f36085b0efc47a31fe5020` in `.github/workflows/fuzz.yml`.

The official v7.0.0 `action.yml` declares `runs.using: node24`. The immutable pin preserves supply-chain provenance and avoids relying on mutable major-version tags.

## Test-first evidence

Test-only commit `7a73e9e22d42d391c8d7a823bdf47ad2221cebc2` added an executable workflow contract requiring the v7.0.0 immutable pin while production still used v4.1.0. Hosted Server Tests run `32019187595`, job `95355055643`, then failed at `tests/unit/coverage-script-contract.test.mjs:52` with the expected assertion that property fuzz must use the Node.js 24 setup-node runtime.

The production repair changes only the setup-node action pin. It does not alter workflow permissions, the project Node version, npm install behavior, fuzz iteration budgets, or the fuzz command.

## Verification contract

The repaired exact PR head must prove all of the following before integration:

- `unit-and-api` passes the workflow contract;
- `property fuzz` executes with the new immutable action pin and no Node.js 20 action-runtime deprecation warning attributable to `actions/setup-node`;
- the workflow still installs Node.js `22.13.0` for ScopeWeave;
- repository and organization-required security/review gates are evaluated on the same exact head; and
- any unrelated GitHub cache-service warning remains classified as infrastructure evidence rather than a source defect.

## Rollback

Reverting to the v4.1.0 pin would intentionally restore the deprecated action runtime and must not be used merely to silence an unrelated CI failure. If v7.0.0 exposes a verified compatibility defect, select a supported immutable setup-node revision that declares a current runner-supported JavaScript runtime and update this contract and evidence together.

## References

GitHub. (2025, September 19). *Deprecation of Node 20 on GitHub Actions runners*. GitHub Changelog. https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/

GitHub. (2026, July 14). *v7.0.0* [Software release]. GitHub, `actions/setup-node`. https://github.com/actions/setup-node/releases/tag/v7.0.0

GitHub. (2026). *actions/setup-node action metadata, v7.0.0 (`820762786026740c76f36085b0efc47a31fe5020`)* [Source code]. GitHub. https://github.com/actions/setup-node/blob/820762786026740c76f36085b0efc47a31fe5020/action.yml
30 changes: 29 additions & 1 deletion tests/unit/coverage-script-contract.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@ const packageJson = JSON.parse(
readFileSync(new URL('../../package.json', import.meta.url), 'utf8'),
);
const scripts = packageJson.scripts;
const fuzzWorkflow = readFileSync(
new URL('../../.github/workflows/fuzz.yml', import.meta.url),
'utf8',
);

assert.equal(
scripts.coverage,
Expand Down Expand Up @@ -45,4 +49,28 @@ assert.doesNotMatch(
'coverage cases never recursively invoke a coverage wrapper',
);

console.log('✓ coverage script contract tests passed');
assert.match(
fuzzWorkflow,
/actions\/setup-node@820762786026740c76f36085b0efc47a31fe5020\s+# v7\.0\.0/,
'property fuzz uses the immutable setup-node v7 runtime that declares node24',
);
assert.doesNotMatch(
fuzzWorkflow,
/actions\/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af/,
'property fuzz no longer relies on the deprecated Node.js 20 setup-node runtime',
);
assert.ok(
fuzzWorkflow.includes('ref: ${{ github.event.pull_request.head.sha || github.sha }}'),
'property fuzz checks out the exact contributor head rather than the synthetic pull-request merge',
);
assert.ok(
fuzzWorkflow.includes('EXPECTED_SHA: ${{ github.event.pull_request.head.sha || github.sha }}'),
'property fuzz records the exact expected contributor SHA for checkout attestation',
);
assert.match(
fuzzWorkflow,
/git rev-parse HEAD[\s\S]*\$EXPECTED_SHA/,
'property fuzz fails closed unless the checked-out commit matches the exact expected contributor SHA',
);

console.log('✓ coverage script contract tests passed');
Loading