Skip to content

fix(deps): port main's advisory fixes to the v0.0.105 patch line (#1232, #1239) - #1245

Merged
saurabhmaheshwari-obin merged 5 commits into
codefly-dev:release/v0.0.105-b2from
saurabhmaheshwari-obin:deps/advisories-v0.0.105
Oct 24, 2026
Merged

saurabhmaheshwari-obin merged 5 commits into
codefly-dev:release/v0.0.105-b2from
saurabhmaheshwari-obin:deps/advisories-v0.0.105

Conversation

@saurabhmaheshwari-obin

@saurabhmaheshwari-obin saurabhmaheshwari-obin commented Oct 24, 2026 •

Copy link
Copy Markdown
Contributor

What

This ports main's dependency advisory fixes onto the release/v0.0.105-b2 patch line. On v0.0.105 the "Codefly supply chain" gate (npm audit --omit=dev --audit-level=high on frontend and marketing) fails on advisories that were published after v0.0.105 was tagged, so every PR into this line and every tag cut from it is blocked. Nothing here is new work: it is main's resolution, carried back.

CI on this line

The base branch's ci.yml runs pull_request only for PRs into main, so this PR also carries the two CI commits reviewed in #1243 (5a2c45ffb, e8a8920cb):

  • release/** PRs run the full checks against their own base;
  • only tags on main announce;
  • the announce guard fails on git errors.

They are identical to #1243's. When #1243 is rebased on this PR, they drop out of #1243 and its diff stays the reviewed one.

The cherry-picked commits here are re-authored and carry no co-author trailer naming a person, because the naming gate refuses one in a commit record. Credit: #1232 and #1239 on main.

Checks (local)

  • npm audit --omit=dev --audit-level=high: frontend and marketing both exit 0. Two moderates remain, fast-uri via ajv, the same as on main.
  • Typecheck: frontend and marketing pass.
  • Tests:
    • saas-ui vitest: 347/347;
    • marketing: 22/22;
    • published plugin contract tests: pass;
    • scripts/ci/*.test.mjs: 193/193.
  • Gates: kit-version against v0.0.105 passes, and module-verify.mjs is OK.
  • Frontend vitest, pure project: 3 failures in boundaries.test.ts under local Node 20 ("module.register is not a function"). The same 3 fail on the untouched v0.0.105. CI runs Node 24.

Review

  • Codex (high, read-only, on e8a8920cb): no actionable defects. Its findings:
    • Zod 4 port: datasource validation, resolver field errors, team defaults and marketing URL validation all behave as before, and the other usages are clean against the Zod 4 migration guide.
    • Lockfiles: they equal main's f3fee4c06, and Zod 4.6.7 and react-hook-form 7.87.0 satisfy the declared ranges.
    • Kit trees: they equal main's 0.13.0.
    • CI commits: the release PR triggers, the authorization base selection, the protobuf baseline selection and the announce guard all check out.
  • code-reviewer: proceed (details below). Its one cheap fix, main's lockfiles to keep libc, is taken.

Code-reviewer detail:

  • Matches main: outside the lockfiles, every package.json, kit package, Zod call site, next.config and Sentry file equals main's f3fee4c06. Main's CI was green on that commit.
  • Run in a scratch copy:
    • tsc passes;
    • 272 Zod and form tests pass;
    • test-registry-ui passes.
  • All 16 Zod importers swept: no Zod 3 API remains.
  • Lockfiles: regenerating them with an older npm dropped every libc field. The fix was to take main's lockfiles, which are otherwise identical (76edb5d12).
  • Notes, not regressions:
    • Zod 4 rejects datetimes without seconds and non-RFC UUIDs. Everything checked in passes.
    • The marketing environment check throws a raw TypeError on an invalid URL, the same as on Zod 3.

No security review beyond the audit going clean: these are main's fixes.

Order

Merge this first. Then #1243 (the workload operation arm) is rebased on it, so its supply-chain gate goes green with its reviewed diff unchanged.

Second consumer

None: this only keeps the patch line releasable. main already has these fixes.

🤖 Generated with Claude Code

…codefly-dev#1232)

The frontend and marketing services pinned the nextjs agent at 0.0.163. That
agent pins the framework EXACTLY in `base/code` and `templates/factory/code`,
and its `framework_version_test.go` holds the lockfile's resolved version equal
to the declared one, so no service it builds can resolve past the agent's pin.
Through 0.0.166 that pin was next 16.3.6, which carries three criticals:

  - unauthenticated RCE in the Image Optimization API when SVG files are used
    (GHSA-2464-fhr4-w9xw)
  - DoS in App Router using Server Actions (GHSA-p3m5-59mp-jv5r)
  - RCE in `use cache` functions returning typed arrays (GHSA-673q-mjm6-r5xr)

0.0.167 ships next 16.4.1 (service-nextjs#177), and with it Go 1.27.3 for
GO-2026-6809 (codefly-dev#178) and typescript back to ^5 — the only major
typescript-eslint@8 admits, so the scaffold's own lint runs again (codefly-dev#179).

Verified against the release rather than the release notes: v0.0.167 is a
published, non-draft GitHub Release with 9 assets (`agent.version` resolves a
Release, not a tag — a tag-only version 404s and takes every integration suite
with it), and the tag itself carries next 16.4.1, typescript ^5 and go 1.27.3.

This is the durable half of the Next.js remediation. The application-side
lockfiles were already patched on main by codefly-dev#1027; this moves the agent that
builds them, so a future service scaffolded here does not start vulnerable.

Classification: fix, at the place that owns the framework version.

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
(cherry picked from commit 7ed5ded)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…v#1239)

Ported to the v0.0.105 line. Beyond codefly-dev#1239, this also takes main's exact pins
from codefly-dev#1027 that the first-party audit gate needs on this line: next and
eslint-config-next 16.4.1 (frontend and marketing; GHSA-2464-fhr4-w9xw,
GHSA-p3m5-59mp-jv5r, GHSA-673q-mjm6-r5xr) and @sentry/nextjs 10.75.2
(GHSA-mchm-gjx6-7h55), and refreshes dompurify to 3.4.17 within its range
(GHSA-cg2g-xh64-v4q7). Lockfiles regenerated with npm install
--package-lock-only. The kit packages are byte-identical to main's 0.13.0.

(cherry picked from commit f3fee4c)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…libc

Regenerating the lockfiles with an older npm dropped every libc field, so npm ci
on glibc would also install the musl binaries. Apart from those fields the files
equal main's at f3fee4c.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A patch line cut from a deploy-counter tag lives on a release/** branch, and a
pull request into it ran no checks because pull_request was scoped to main.
release/** now gets the same checks. merge_group carries no branch filter and
is unchanged.

handbook-surface-bump makes the tagged interface current downstream. A tag push
names a commit, not a branch, so the branch a tag was cut from is not in the
event and github.ref cannot tell a main tag from a patch-line tag. The job now
fetches main and dispatches only when the tagged commit is an ancestor of it
(git merge-base --is-ancestor). A tag cut from a release/** branch still runs
every release gate and publishes its artifacts; it is just not announced as
current, since it lacks whatever main released after its base. main's next tag
carries the announcement. A tag moved onto main later is announced by its next
run, so the guard can only delay an announcement, never make a wrong one.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…guard on git errors

Three review fixes to the release/** patch-line support:

- The authorization no-broadening gate diffed every pull request against
  main. A pull request into a release/** line now diffs against the branch it
  merges into (github.event.pull_request.base.ref); a pull request into main
  fetches and diffs main exactly as before.
- The announce guard read every non-zero exit of git merge-base --is-ancestor
  as "not on main". Exit 1 still means that; any other exit (a missing object,
  a failed fetch) now fails the step instead of skipping the announcement.
- The protobuf breaking-change gate on a tag compared against main as it
  stands. A tag whose commit is not on main now compares against
  git merge-base HEAD origin/main. That merge base is where the line forked,
  which is the release the line patches: comparing against main would report
  every message main gained since as a deletion, and comparing against the
  previous tag on the line would depend on tag naming and still reach the
  fork point for the line's first tag. It needs only the history the job
  already fetches. A tag on main, a merge ref and every other event keep their
  baseline, and the ancestry check fails the step on a git error, as above.

RELEASE_GATES.md says so: a paragraph on patch lines in the cadence section
(pull requests into release/** are checked, tags on a line pass every gate and
publish, only tags on main announce, baseline gates compare against the line's
base) and one in the surface-bump section on the announce guard.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@saurabhmaheshwari-obin
saurabhmaheshwari-obin merged commit 66e9737 into codefly-dev:release/v0.0.105-b2 Oct 24, 2026
23 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant