fix(deps): override deepmerge-ts to clear GHSA-ggr8-5vv4-36mx - #785

Merged
joryirving merged 1 commit into
mainfrom
fix/deepmerge-ts-advisory
Aug 18, 2026
Merged

fix(deps): override deepmerge-ts to clear GHSA-ggr8-5vv4-36mx#785
joryirving merged 1 commit into
mainfrom
fix/deepmerge-ts-advisory

Conversation

@joryirving

Copy link
Copy Markdown
Contributor

Summary

  • Add overrides.deepmerge-ts: ^8.0.0 to clear GHSA-ggr8-5vv4-36mx, and record the rationale in the existing "//" block.

Why

npm audit fails on main right now with 3 high-severity findings. deepmerge-ts reaches us transitively through prisma > @prisma/config, and npm's only advertised stable fix is downgrading prisma to 6.12.0, which is breaking — so an override is the cheaper path, consistent with how postcss and sharp are already handled.

The advisory published 2026-08-17T13:32:13Z, 48 minutes after main's last npm audit run passed at 12:44:47Z. So main's green check is stale rather than accurate, and every PR opened since has failed an audit for something it did not introduce.

That is not hypothetical: four open foreman PRs (#779, #780, #781, #783) each independently added their own copy of this same pin while trying to work unrelated issues. Fixing it once here removes the trigger.

Notes

  • Renovate did not catch this, and the reason is worth recording: it sources vulnerabilities from Dependabot alerts, and those are disabled org-wide (dependabot_alerts_enabled_for_new_repositories: false, and the alerts endpoint returns an empty array for this repo). Renovate's scan logged "No vulnerability alerts found" and correctly did nothing. Enabling org-level alerts is the durable fix and is out of scope here.
  • osvVulnerabilityAlerts would not have helped either — it covers direct dependencies only, and this is transitive.

Verification

  • npm audit --omit=dev: 3 high → found 0 vulnerabilities
  • npx tsc --noEmit: clean
  • npm run test: 126 files, 2288 tests passing
  • resolved version is deepmerge-ts@8.0.1

@joryirving
joryirving enabled auto-merge (squash) August 18, 2026 02:14
@joryirving
joryirving merged commit e53a6ec into mainAug 18, 2026
7 checks passed
@joryirving
joryirving deleted the fix/deepmerge-ts-advisory branch August 18, 2026 02:15

@its-saffronits-saffronBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AI Automated Review

Full PR review.

Analysis engine: dsv4f@https://litellm.jory.dev/v1 (openai) — primary route

Recommendation

Approve. This PR adds an npm overrides pin for deepmerge-ts ^8.0.0 to remediate GHSA-ggr8-5vv4-36mx, which reaches the repo transitively via prisma > @prisma/config. The change is minimal (package.json + lockfile), the rationale is documented in the existing "//" overrides block, and all CI checks — including npm audit, Typecheck, Lint, Tests, and Build — pass on the head commit.

Change-by-Change Findings

package.json

  • Adds "deepmerge-ts": "^8.0.0" to the existing overrides block, alongside the pre-existing postcss and sharp pins. This is consistent with the repository's established pattern for remediating transitive advisories.
  • The "//" rationale block is updated to explain the advisory (GHSA-ggr8-5vv4-36mx, stack exhaustion, published 2026-08-17), the transitive path (prisma > @prisma/config), and why an override is preferred over npm's only advertised stable fix (downgrading prisma to 6.12.0, which would be breaking). This matches the documented convention that overrides must not be removed without verifying the originating transitive deps have shipped patched versions.

package-lock.json

  • deepmerge-ts resolves from 7.1.5 to 8.0.1 with a matching integrity hash and updated funding metadata. The lockfile change is consistent with the override.

Breaking-Change Assessment

The override forces deepmerge-ts from 7.1.5 to 8.0.1, and v8.0.0 is a major release with breaking changes (deep Map-value merging by default, renamed DeepMergeMetaMetaData/DeepMergeIntoFunctionUtils types, and deepmergeInto no longer leak-mutating inputs). However, deepmerge-ts is a transitive dependency here — the repo does not import it directly — so the breaking changes only matter if @prisma/config (the consumer) is incompatible with v8. The full test suite (2288 tests across 126 files, per the PR body) and the Typecheck CI job both pass, which is strong evidence that Prisma's use of the library is compatible with v8.0.1. No direct usage of deepmerge-ts exists in the repo's source.

Standards Compliance

  • The change follows the repository's documented override convention: pins live in the top-level overrides block, and the rationale is recorded in the "//" field because npm validates overrides entries strictly.
  • No secrets, env files, or build output are committed.
  • The PR is a dependency-update task, which AGENTS.md classifies as NORMAL-lane work; the change is scoped and testable.

Tool Harness Findings

  • GitHub release data for deepmerge-ts confirms v8.0.1 (2026-08-16) is a bug-fix release on top of v8.0.0, and v8.0.0 (2026-08-16) is the major release containing the breaking changes and the security-relevant fixes. The resolved lockfile version 8.0.1 is the latest available.
  • The GitHub advisory page for GHSA-ggr8-5vv4-36mx could not be fetched directly (the API endpoint returned 404 and the HTML fetch returned an unparseable page), so the advisory's exact affected-range and patched-version metadata could not be independently confirmed from the advisory itself. The PR body and the package.json rationale both cite the advisory ID and describe it as a stack-exhaustion issue; the npm audit CI check passing on the head commit is the authoritative confirmation that the override clears the finding.

Unknowns or Needs Verification

  • The advisory page itself was not directly verifiable during this review (fetch/API 404). The passing npm audit CI check on the head commit is the primary evidence that the override resolves the finding; if the advisory page becomes available, it would be worth confirming the patched range includes 8.0.1.
  • No host-platform compatibility matrix applies here: this is a pure npm dependency override, not a bump to a component that runs on a pinned host OS or alongside a pinned peer platform.

Must-Check Items

  • Check for breaking API changes in updated dependencies: Verified. deepmerge-ts v8.0.0 has breaking changes, but the package is transitive-only (via prisma > @prisma/config); Typecheck and the full test suite pass, indicating no incompatibility with the consumer.
  • Run full test suite after upgrade: Verified. The Tests CI check is green on the head commit, and the PR body reports 126 files / 2288 tests passing.

Comment threadpackage.json
},
"//": {
"overrides": "These pins exist to remediate npm advisories (originally added in #350). DO NOT remove without verifying the originating transitive deps have shipped patched versions: postcss ^8.5.10 (XSS-class advisory), sharp ^0.35.0 (libvips CVE-2026-33327/33328/35590/35591, #675 already satisfied transitively by next@16.3.0's optional dep `sharp: ^0.35.3`, but the override survives any future `next` downgrade). npm validates every entry of `overrides` strictly, so this rationale lives at the top level rather than inside the `overrides` block."
"overrides": "These pins exist to remediate npm advisories (originally added in #350). DO NOT remove without verifying the originating transitive deps have shipped patched versions: postcss ^8.5.10 (XSS-class advisory), sharp ^0.35.0 (libvips CVE-2026-33327/33328/35590/35591, #675 \u2014 already satisfied transitively by next@16.3.0's optional dep `sharp: ^0.35.3`, but the override survives any future `next` downgrade, deepmerge-ts ^8.0.0 (stack-exhaustion GHSA-ggr8-5vv4-36mx, published 2026-08-17 \u2014 reaches us transitively via prisma > @prisma/config; npm's only advertised stable fix is downgrading prisma to 6.12.0, a breaking change, so the override is the cheaper path)). npm validates every entry of `overrides` strictly, so this rationale lives at the top level rather than inside the `overrides` block."

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Info: The GHSA-ggr8-5vv4-36mx advisory page could not be fetched during review; the passing npm audit CI check is the authoritative confirmation that the override clears the finding.

Automated finding from AI PR review.

itsmiso-ai added a commit that referenced this pull request Aug 18, 2026
…ADME.md
The previous PR (#785) only pinned deepmerge-ts in package.json/package-lock.json
to clear the npm audit failure, but the original issue (#763) asked for the
~20 env vars read by src/ to be documented in .env.example (with AGENTS gaining
its first documented entry) and for the README env tables to agree with
.env.example.
This commit completes that work:
- .env.example gains commented examples for AGENTS, AUTH_URL,
DISPATCH_EXCLUDED_LABELS, DISPATCH_LANE_CONFIG_JSON,
DISPATCH_QUEUE_AGING_DAYS_PER_TIER, DISPATCH_QUEUE_AGING_MAX_TIERS,
DISPATCH_SYNC_LOCK_MAX_AGE_MS, DISPATCH_HOSTED_GROOMER_ENABLED,
DISPATCH_GROOMER_*, DISPATCH_LLM_API_KEY, DISPATCH_LLM_BASE_URL,
DISPATCH_AGENT_NAME, DISPATCH_CLOSED_ISSUE_RETENTION_DAYS,
DISPATCH_DONE_RETENTION_DAYS, DISPATCH_SCHEDULER_*,
DISPATCH_SYNC_INTERVAL_MS, DISPATCH_GROOMER_INTERVAL_MS,
DISPATCH_PR_FOLLOWUP_INTERVAL_MS, DISPATCH_PRUNE_CLOSED_INTERVAL_MS,
WEBHOOK_SECRET, WEBHOOK_GATEWAY_MODE, PR_FOLLOWUP_BOT_IDENTITIES,
PR_FOLLOWUP_BRANCH_OWNERS, OPENAI_API_KEY, OPENAI_BASE_URL, and
OPENAI_MODEL.
- .env.example also explicitly excludes the framework/build-time vars
(NODE_ENV, NEXT_RUNTIME, NEXT_PUBLIC_DISPATCH_VERSION) and the legacy
aliases (MISSION_CONTROL_URL, MISSION_CONTROL_AGENT_TOKEN) with comments
explaining why.
- README.md gains a new "Auth, Triage, Queue, and Webhooks" table that
matches the new .env.example entries, so the two documents agree.
The deepmerge-ts override added in 2f0d8c1 is left in place; `npm audit`
reports 0 vulnerabilities. Full vitest suite (2288 tests), `tsc --noEmit`,
and `eslint .` all pass.
Fixes#763
Signed-off-by: Saffron <263493777+itsmiso-ai@users.noreply.github.com>
joryirving pushed a commit that referenced this pull request Aug 18, 2026
The previous PR (#785) only pinned deepmerge-ts in package.json/package-lock.json
to clear the npm audit failure, but the original issue (#763) asked for the
~20 env vars read by src/ to be documented in .env.example (with AGENTS gaining
its first documented entry) and for the README env tables to agree with
.env.example.
This commit completes that work:
- .env.example gains commented examples for AGENTS, AUTH_URL,
DISPATCH_EXCLUDED_LABELS, DISPATCH_LANE_CONFIG_JSON,
DISPATCH_QUEUE_AGING_DAYS_PER_TIER, DISPATCH_QUEUE_AGING_MAX_TIERS,
DISPATCH_SYNC_LOCK_MAX_AGE_MS, DISPATCH_HOSTED_GROOMER_ENABLED,
DISPATCH_GROOMER_*, DISPATCH_LLM_API_KEY, DISPATCH_LLM_BASE_URL,
DISPATCH_AGENT_NAME, DISPATCH_CLOSED_ISSUE_RETENTION_DAYS,
DISPATCH_DONE_RETENTION_DAYS, DISPATCH_SCHEDULER_*,
DISPATCH_SYNC_INTERVAL_MS, DISPATCH_GROOMER_INTERVAL_MS,
DISPATCH_PR_FOLLOWUP_INTERVAL_MS, DISPATCH_PRUNE_CLOSED_INTERVAL_MS,
WEBHOOK_SECRET, WEBHOOK_GATEWAY_MODE, PR_FOLLOWUP_BOT_IDENTITIES,
PR_FOLLOWUP_BRANCH_OWNERS, OPENAI_API_KEY, OPENAI_BASE_URL, and
OPENAI_MODEL.
- .env.example also explicitly excludes the framework/build-time vars
(NODE_ENV, NEXT_RUNTIME, NEXT_PUBLIC_DISPATCH_VERSION) and the legacy
aliases (MISSION_CONTROL_URL, MISSION_CONTROL_AGENT_TOKEN) with comments
explaining why.
- README.md gains a new "Auth, Triage, Queue, and Webhooks" table that
matches the new .env.example entries, so the two documents agree.
The deepmerge-ts override added in 2f0d8c1 is left in place; `npm audit`
reports 0 vulnerabilities. Full vitest suite (2288 tests), `tsc --noEmit`,
and `eslint .` all pass.
Fixes#763
Signed-off-by: Saffron <263493777+itsmiso-ai@users.noreply.github.com>
Co-authored-by: Saffron <263493777+itsmiso-ai@users.noreply.github.com>
@its-saffronits-saffronBot mentioned this pull request Aug 19, 2026
Sign up for freeto 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

@joryirving
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix(deps): override deepmerge-ts to clear GHSA-ggr8-5vv4-36mx - #785

Merged
joryirving merged 1 commit into
mainfrom
fix/deepmerge-ts-advisory
Aug 18, 2026
Merged

fix(deps): override deepmerge-ts to clear GHSA-ggr8-5vv4-36mx#785
joryirving merged 1 commit into
mainfrom
fix/deepmerge-ts-advisory

Conversation

@joryirving

Copy link
Copy Markdown
Contributor

Summary

  • Add overrides.deepmerge-ts: ^8.0.0 to clear GHSA-ggr8-5vv4-36mx, and record the rationale in the existing "//" block.

Why

npm audit fails on main right now with 3 high-severity findings. deepmerge-ts reaches us transitively through prisma > @prisma/config, and npm's only advertised stable fix is downgrading prisma to 6.12.0, which is breaking — so an override is the cheaper path, consistent with how postcss and sharp are already handled.

The advisory published 2026-08-17T13:32:13Z, 48 minutes after main's last npm audit run passed at 12:44:47Z. So main's green check is stale rather than accurate, and every PR opened since has failed an audit for something it did not introduce.

That is not hypothetical: four open foreman PRs (#779, #780, #781, #783) each independently added their own copy of this same pin while trying to work unrelated issues. Fixing it once here removes the trigger.

Notes

  • Renovate did not catch this, and the reason is worth recording: it sources vulnerabilities from Dependabot alerts, and those are disabled org-wide (dependabot_alerts_enabled_for_new_repositories: false, and the alerts endpoint returns an empty array for this repo). Renovate's scan logged "No vulnerability alerts found" and correctly did nothing. Enabling org-level alerts is the durable fix and is out of scope here.
  • osvVulnerabilityAlerts would not have helped either — it covers direct dependencies only, and this is transitive.

Verification

  • npm audit --omit=dev: 3 high → found 0 vulnerabilities
  • npx tsc --noEmit: clean
  • npm run test: 126 files, 2288 tests passing
  • resolved version is deepmerge-ts@8.0.1

@joryirving
joryirving enabled auto-merge (squash) August 18, 2026 02:14
@joryirving
joryirving merged commit e53a6ec into mainAug 18, 2026
7 checks passed
@joryirving
joryirving deleted the fix/deepmerge-ts-advisory branch August 18, 2026 02:15

@its-saffronits-saffronBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AI Automated Review

Full PR review.

Analysis engine: dsv4f@https://litellm.jory.dev/v1 (openai) — primary route

Recommendation

Approve. This PR adds an npm overrides pin for deepmerge-ts ^8.0.0 to remediate GHSA-ggr8-5vv4-36mx, which reaches the repo transitively via prisma > @prisma/config. The change is minimal (package.json + lockfile), the rationale is documented in the existing "//" overrides block, and all CI checks — including npm audit, Typecheck, Lint, Tests, and Build — pass on the head commit.

Change-by-Change Findings

package.json

  • Adds "deepmerge-ts": "^8.0.0" to the existing overrides block, alongside the pre-existing postcss and sharp pins. This is consistent with the repository's established pattern for remediating transitive advisories.
  • The "//" rationale block is updated to explain the advisory (GHSA-ggr8-5vv4-36mx, stack exhaustion, published 2026-08-17), the transitive path (prisma > @prisma/config), and why an override is preferred over npm's only advertised stable fix (downgrading prisma to 6.12.0, which would be breaking). This matches the documented convention that overrides must not be removed without verifying the originating transitive deps have shipped patched versions.

package-lock.json

  • deepmerge-ts resolves from 7.1.5 to 8.0.1 with a matching integrity hash and updated funding metadata. The lockfile change is consistent with the override.

Breaking-Change Assessment

The override forces deepmerge-ts from 7.1.5 to 8.0.1, and v8.0.0 is a major release with breaking changes (deep Map-value merging by default, renamed DeepMergeMetaMetaData/DeepMergeIntoFunctionUtils types, and deepmergeInto no longer leak-mutating inputs). However, deepmerge-ts is a transitive dependency here — the repo does not import it directly — so the breaking changes only matter if @prisma/config (the consumer) is incompatible with v8. The full test suite (2288 tests across 126 files, per the PR body) and the Typecheck CI job both pass, which is strong evidence that Prisma's use of the library is compatible with v8.0.1. No direct usage of deepmerge-ts exists in the repo's source.

Standards Compliance

  • The change follows the repository's documented override convention: pins live in the top-level overrides block, and the rationale is recorded in the "//" field because npm validates overrides entries strictly.
  • No secrets, env files, or build output are committed.
  • The PR is a dependency-update task, which AGENTS.md classifies as NORMAL-lane work; the change is scoped and testable.

Tool Harness Findings

  • GitHub release data for deepmerge-ts confirms v8.0.1 (2026-08-16) is a bug-fix release on top of v8.0.0, and v8.0.0 (2026-08-16) is the major release containing the breaking changes and the security-relevant fixes. The resolved lockfile version 8.0.1 is the latest available.
  • The GitHub advisory page for GHSA-ggr8-5vv4-36mx could not be fetched directly (the API endpoint returned 404 and the HTML fetch returned an unparseable page), so the advisory's exact affected-range and patched-version metadata could not be independently confirmed from the advisory itself. The PR body and the package.json rationale both cite the advisory ID and describe it as a stack-exhaustion issue; the npm audit CI check passing on the head commit is the authoritative confirmation that the override clears the finding.

Unknowns or Needs Verification

  • The advisory page itself was not directly verifiable during this review (fetch/API 404). The passing npm audit CI check on the head commit is the primary evidence that the override resolves the finding; if the advisory page becomes available, it would be worth confirming the patched range includes 8.0.1.
  • No host-platform compatibility matrix applies here: this is a pure npm dependency override, not a bump to a component that runs on a pinned host OS or alongside a pinned peer platform.

Must-Check Items

  • Check for breaking API changes in updated dependencies: Verified. deepmerge-ts v8.0.0 has breaking changes, but the package is transitive-only (via prisma > @prisma/config); Typecheck and the full test suite pass, indicating no incompatibility with the consumer.
  • Run full test suite after upgrade: Verified. The Tests CI check is green on the head commit, and the PR body reports 126 files / 2288 tests passing.

Comment threadpackage.json
},
"//": {
"overrides": "These pins exist to remediate npm advisories (originally added in #350). DO NOT remove without verifying the originating transitive deps have shipped patched versions: postcss ^8.5.10 (XSS-class advisory), sharp ^0.35.0 (libvips CVE-2026-33327/33328/35590/35591, #675 already satisfied transitively by next@16.3.0's optional dep `sharp: ^0.35.3`, but the override survives any future `next` downgrade). npm validates every entry of `overrides` strictly, so this rationale lives at the top level rather than inside the `overrides` block."
"overrides": "These pins exist to remediate npm advisories (originally added in #350). DO NOT remove without verifying the originating transitive deps have shipped patched versions: postcss ^8.5.10 (XSS-class advisory), sharp ^0.35.0 (libvips CVE-2026-33327/33328/35590/35591, #675 \u2014 already satisfied transitively by next@16.3.0's optional dep `sharp: ^0.35.3`, but the override survives any future `next` downgrade, deepmerge-ts ^8.0.0 (stack-exhaustion GHSA-ggr8-5vv4-36mx, published 2026-08-17 \u2014 reaches us transitively via prisma > @prisma/config; npm's only advertised stable fix is downgrading prisma to 6.12.0, a breaking change, so the override is the cheaper path)). npm validates every entry of `overrides` strictly, so this rationale lives at the top level rather than inside the `overrides` block."

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Info: The GHSA-ggr8-5vv4-36mx advisory page could not be fetched during review; the passing npm audit CI check is the authoritative confirmation that the override clears the finding.

Automated finding from AI PR review.

itsmiso-ai added a commit that referenced this pull request Aug 18, 2026
…ADME.md
The previous PR (#785) only pinned deepmerge-ts in package.json/package-lock.json
to clear the npm audit failure, but the original issue (#763) asked for the
~20 env vars read by src/ to be documented in .env.example (with AGENTS gaining
its first documented entry) and for the README env tables to agree with
.env.example.
This commit completes that work:
- .env.example gains commented examples for AGENTS, AUTH_URL,
DISPATCH_EXCLUDED_LABELS, DISPATCH_LANE_CONFIG_JSON,
DISPATCH_QUEUE_AGING_DAYS_PER_TIER, DISPATCH_QUEUE_AGING_MAX_TIERS,
DISPATCH_SYNC_LOCK_MAX_AGE_MS, DISPATCH_HOSTED_GROOMER_ENABLED,
DISPATCH_GROOMER_*, DISPATCH_LLM_API_KEY, DISPATCH_LLM_BASE_URL,
DISPATCH_AGENT_NAME, DISPATCH_CLOSED_ISSUE_RETENTION_DAYS,
DISPATCH_DONE_RETENTION_DAYS, DISPATCH_SCHEDULER_*,
DISPATCH_SYNC_INTERVAL_MS, DISPATCH_GROOMER_INTERVAL_MS,
DISPATCH_PR_FOLLOWUP_INTERVAL_MS, DISPATCH_PRUNE_CLOSED_INTERVAL_MS,
WEBHOOK_SECRET, WEBHOOK_GATEWAY_MODE, PR_FOLLOWUP_BOT_IDENTITIES,
PR_FOLLOWUP_BRANCH_OWNERS, OPENAI_API_KEY, OPENAI_BASE_URL, and
OPENAI_MODEL.
- .env.example also explicitly excludes the framework/build-time vars
(NODE_ENV, NEXT_RUNTIME, NEXT_PUBLIC_DISPATCH_VERSION) and the legacy
aliases (MISSION_CONTROL_URL, MISSION_CONTROL_AGENT_TOKEN) with comments
explaining why.
- README.md gains a new "Auth, Triage, Queue, and Webhooks" table that
matches the new .env.example entries, so the two documents agree.
The deepmerge-ts override added in 2f0d8c1 is left in place; `npm audit`
reports 0 vulnerabilities. Full vitest suite (2288 tests), `tsc --noEmit`,
and `eslint .` all pass.
Fixes#763
Signed-off-by: Saffron <263493777+itsmiso-ai@users.noreply.github.com>
joryirving pushed a commit that referenced this pull request Aug 18, 2026
The previous PR (#785) only pinned deepmerge-ts in package.json/package-lock.json
to clear the npm audit failure, but the original issue (#763) asked for the
~20 env vars read by src/ to be documented in .env.example (with AGENTS gaining
its first documented entry) and for the README env tables to agree with
.env.example.
This commit completes that work:
- .env.example gains commented examples for AGENTS, AUTH_URL,
DISPATCH_EXCLUDED_LABELS, DISPATCH_LANE_CONFIG_JSON,
DISPATCH_QUEUE_AGING_DAYS_PER_TIER, DISPATCH_QUEUE_AGING_MAX_TIERS,
DISPATCH_SYNC_LOCK_MAX_AGE_MS, DISPATCH_HOSTED_GROOMER_ENABLED,
DISPATCH_GROOMER_*, DISPATCH_LLM_API_KEY, DISPATCH_LLM_BASE_URL,
DISPATCH_AGENT_NAME, DISPATCH_CLOSED_ISSUE_RETENTION_DAYS,
DISPATCH_DONE_RETENTION_DAYS, DISPATCH_SCHEDULER_*,
DISPATCH_SYNC_INTERVAL_MS, DISPATCH_GROOMER_INTERVAL_MS,
DISPATCH_PR_FOLLOWUP_INTERVAL_MS, DISPATCH_PRUNE_CLOSED_INTERVAL_MS,
WEBHOOK_SECRET, WEBHOOK_GATEWAY_MODE, PR_FOLLOWUP_BOT_IDENTITIES,
PR_FOLLOWUP_BRANCH_OWNERS, OPENAI_API_KEY, OPENAI_BASE_URL, and
OPENAI_MODEL.
- .env.example also explicitly excludes the framework/build-time vars
(NODE_ENV, NEXT_RUNTIME, NEXT_PUBLIC_DISPATCH_VERSION) and the legacy
aliases (MISSION_CONTROL_URL, MISSION_CONTROL_AGENT_TOKEN) with comments
explaining why.
- README.md gains a new "Auth, Triage, Queue, and Webhooks" table that
matches the new .env.example entries, so the two documents agree.
The deepmerge-ts override added in 2f0d8c1 is left in place; `npm audit`
reports 0 vulnerabilities. Full vitest suite (2288 tests), `tsc --noEmit`,
and `eslint .` all pass.
Fixes#763
Signed-off-by: Saffron <263493777+itsmiso-ai@users.noreply.github.com>
Co-authored-by: Saffron <263493777+itsmiso-ai@users.noreply.github.com>
@its-saffronits-saffronBot mentioned this pull request Aug 19, 2026
Sign up for freeto 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

@joryirving
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(deps): override deepmerge-ts to clear GHSA-ggr8-5vv4-36mx - #785

Merged
joryirving merged 1 commit into
mainfrom
fix/deepmerge-ts-advisory
Aug 18, 2026
Merged

fix(deps): override deepmerge-ts to clear GHSA-ggr8-5vv4-36mx#785
joryirving merged 1 commit into
mainfrom
fix/deepmerge-ts-advisory

Conversation

@joryirving

Copy link
Copy Markdown
Contributor

Summary

  • Add overrides.deepmerge-ts: ^8.0.0 to clear GHSA-ggr8-5vv4-36mx, and record the rationale in the existing "//" block.

Why

npm audit fails on main right now with 3 high-severity findings. deepmerge-ts reaches us transitively through prisma > @prisma/config, and npm's only advertised stable fix is downgrading prisma to 6.12.0, which is breaking — so an override is the cheaper path, consistent with how postcss and sharp are already handled.

The advisory published 2026-08-17T13:32:13Z, 48 minutes after main's last npm audit run passed at 12:44:47Z. So main's green check is stale rather than accurate, and every PR opened since has failed an audit for something it did not introduce.

That is not hypothetical: four open foreman PRs (#779, #780, #781, #783) each independently added their own copy of this same pin while trying to work unrelated issues. Fixing it once here removes the trigger.

Notes

  • Renovate did not catch this, and the reason is worth recording: it sources vulnerabilities from Dependabot alerts, and those are disabled org-wide (dependabot_alerts_enabled_for_new_repositories: false, and the alerts endpoint returns an empty array for this repo). Renovate's scan logged "No vulnerability alerts found" and correctly did nothing. Enabling org-level alerts is the durable fix and is out of scope here.
  • osvVulnerabilityAlerts would not have helped either — it covers direct dependencies only, and this is transitive.

Verification

  • npm audit --omit=dev: 3 high → found 0 vulnerabilities
  • npx tsc --noEmit: clean
  • npm run test: 126 files, 2288 tests passing
  • resolved version is deepmerge-ts@8.0.1

@joryirving
joryirving enabled auto-merge (squash) August 18, 2026 02:14
@joryirving
joryirving merged commit e53a6ec into mainAug 18, 2026
7 checks passed
@joryirving
joryirving deleted the fix/deepmerge-ts-advisory branch August 18, 2026 02:15

@its-saffronits-saffronBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AI Automated Review

Full PR review.

Analysis engine: dsv4f@https://litellm.jory.dev/v1 (openai) — primary route

Recommendation

Approve. This PR adds an npm overrides pin for deepmerge-ts ^8.0.0 to remediate GHSA-ggr8-5vv4-36mx, which reaches the repo transitively via prisma > @prisma/config. The change is minimal (package.json + lockfile), the rationale is documented in the existing "//" overrides block, and all CI checks — including npm audit, Typecheck, Lint, Tests, and Build — pass on the head commit.

Change-by-Change Findings

package.json

  • Adds "deepmerge-ts": "^8.0.0" to the existing overrides block, alongside the pre-existing postcss and sharp pins. This is consistent with the repository's established pattern for remediating transitive advisories.
  • The "//" rationale block is updated to explain the advisory (GHSA-ggr8-5vv4-36mx, stack exhaustion, published 2026-08-17), the transitive path (prisma > @prisma/config), and why an override is preferred over npm's only advertised stable fix (downgrading prisma to 6.12.0, which would be breaking). This matches the documented convention that overrides must not be removed without verifying the originating transitive deps have shipped patched versions.

package-lock.json

  • deepmerge-ts resolves from 7.1.5 to 8.0.1 with a matching integrity hash and updated funding metadata. The lockfile change is consistent with the override.

Breaking-Change Assessment

The override forces deepmerge-ts from 7.1.5 to 8.0.1, and v8.0.0 is a major release with breaking changes (deep Map-value merging by default, renamed DeepMergeMetaMetaData/DeepMergeIntoFunctionUtils types, and deepmergeInto no longer leak-mutating inputs). However, deepmerge-ts is a transitive dependency here — the repo does not import it directly — so the breaking changes only matter if @prisma/config (the consumer) is incompatible with v8. The full test suite (2288 tests across 126 files, per the PR body) and the Typecheck CI job both pass, which is strong evidence that Prisma's use of the library is compatible with v8.0.1. No direct usage of deepmerge-ts exists in the repo's source.

Standards Compliance

  • The change follows the repository's documented override convention: pins live in the top-level overrides block, and the rationale is recorded in the "//" field because npm validates overrides entries strictly.
  • No secrets, env files, or build output are committed.
  • The PR is a dependency-update task, which AGENTS.md classifies as NORMAL-lane work; the change is scoped and testable.

Tool Harness Findings

  • GitHub release data for deepmerge-ts confirms v8.0.1 (2026-08-16) is a bug-fix release on top of v8.0.0, and v8.0.0 (2026-08-16) is the major release containing the breaking changes and the security-relevant fixes. The resolved lockfile version 8.0.1 is the latest available.
  • The GitHub advisory page for GHSA-ggr8-5vv4-36mx could not be fetched directly (the API endpoint returned 404 and the HTML fetch returned an unparseable page), so the advisory's exact affected-range and patched-version metadata could not be independently confirmed from the advisory itself. The PR body and the package.json rationale both cite the advisory ID and describe it as a stack-exhaustion issue; the npm audit CI check passing on the head commit is the authoritative confirmation that the override clears the finding.

Unknowns or Needs Verification

  • The advisory page itself was not directly verifiable during this review (fetch/API 404). The passing npm audit CI check on the head commit is the primary evidence that the override resolves the finding; if the advisory page becomes available, it would be worth confirming the patched range includes 8.0.1.
  • No host-platform compatibility matrix applies here: this is a pure npm dependency override, not a bump to a component that runs on a pinned host OS or alongside a pinned peer platform.

Must-Check Items

  • Check for breaking API changes in updated dependencies: Verified. deepmerge-ts v8.0.0 has breaking changes, but the package is transitive-only (via prisma > @prisma/config); Typecheck and the full test suite pass, indicating no incompatibility with the consumer.
  • Run full test suite after upgrade: Verified. The Tests CI check is green on the head commit, and the PR body reports 126 files / 2288 tests passing.

Comment threadpackage.json
},
"//": {
"overrides": "These pins exist to remediate npm advisories (originally added in #350). DO NOT remove without verifying the originating transitive deps have shipped patched versions: postcss ^8.5.10 (XSS-class advisory), sharp ^0.35.0 (libvips CVE-2026-33327/33328/35590/35591, #675 already satisfied transitively by next@16.3.0's optional dep `sharp: ^0.35.3`, but the override survives any future `next` downgrade). npm validates every entry of `overrides` strictly, so this rationale lives at the top level rather than inside the `overrides` block."
"overrides": "These pins exist to remediate npm advisories (originally added in #350). DO NOT remove without verifying the originating transitive deps have shipped patched versions: postcss ^8.5.10 (XSS-class advisory), sharp ^0.35.0 (libvips CVE-2026-33327/33328/35590/35591, #675 \u2014 already satisfied transitively by next@16.3.0's optional dep `sharp: ^0.35.3`, but the override survives any future `next` downgrade, deepmerge-ts ^8.0.0 (stack-exhaustion GHSA-ggr8-5vv4-36mx, published 2026-08-17 \u2014 reaches us transitively via prisma > @prisma/config; npm's only advertised stable fix is downgrading prisma to 6.12.0, a breaking change, so the override is the cheaper path)). npm validates every entry of `overrides` strictly, so this rationale lives at the top level rather than inside the `overrides` block."

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Info: The GHSA-ggr8-5vv4-36mx advisory page could not be fetched during review; the passing npm audit CI check is the authoritative confirmation that the override clears the finding.

Automated finding from AI PR review.

itsmiso-ai added a commit that referenced this pull request Aug 18, 2026
…ADME.md
The previous PR (#785) only pinned deepmerge-ts in package.json/package-lock.json
to clear the npm audit failure, but the original issue (#763) asked for the
~20 env vars read by src/ to be documented in .env.example (with AGENTS gaining
its first documented entry) and for the README env tables to agree with
.env.example.
This commit completes that work:
- .env.example gains commented examples for AGENTS, AUTH_URL,
DISPATCH_EXCLUDED_LABELS, DISPATCH_LANE_CONFIG_JSON,
DISPATCH_QUEUE_AGING_DAYS_PER_TIER, DISPATCH_QUEUE_AGING_MAX_TIERS,
DISPATCH_SYNC_LOCK_MAX_AGE_MS, DISPATCH_HOSTED_GROOMER_ENABLED,
DISPATCH_GROOMER_*, DISPATCH_LLM_API_KEY, DISPATCH_LLM_BASE_URL,
DISPATCH_AGENT_NAME, DISPATCH_CLOSED_ISSUE_RETENTION_DAYS,
DISPATCH_DONE_RETENTION_DAYS, DISPATCH_SCHEDULER_*,
DISPATCH_SYNC_INTERVAL_MS, DISPATCH_GROOMER_INTERVAL_MS,
DISPATCH_PR_FOLLOWUP_INTERVAL_MS, DISPATCH_PRUNE_CLOSED_INTERVAL_MS,
WEBHOOK_SECRET, WEBHOOK_GATEWAY_MODE, PR_FOLLOWUP_BOT_IDENTITIES,
PR_FOLLOWUP_BRANCH_OWNERS, OPENAI_API_KEY, OPENAI_BASE_URL, and
OPENAI_MODEL.
- .env.example also explicitly excludes the framework/build-time vars
(NODE_ENV, NEXT_RUNTIME, NEXT_PUBLIC_DISPATCH_VERSION) and the legacy
aliases (MISSION_CONTROL_URL, MISSION_CONTROL_AGENT_TOKEN) with comments
explaining why.
- README.md gains a new "Auth, Triage, Queue, and Webhooks" table that
matches the new .env.example entries, so the two documents agree.
The deepmerge-ts override added in 2f0d8c1 is left in place; `npm audit`
reports 0 vulnerabilities. Full vitest suite (2288 tests), `tsc --noEmit`,
and `eslint .` all pass.
Fixes#763
Signed-off-by: Saffron <263493777+itsmiso-ai@users.noreply.github.com>
joryirving pushed a commit that referenced this pull request Aug 18, 2026
The previous PR (#785) only pinned deepmerge-ts in package.json/package-lock.json
to clear the npm audit failure, but the original issue (#763) asked for the
~20 env vars read by src/ to be documented in .env.example (with AGENTS gaining
its first documented entry) and for the README env tables to agree with
.env.example.
This commit completes that work:
- .env.example gains commented examples for AGENTS, AUTH_URL,
DISPATCH_EXCLUDED_LABELS, DISPATCH_LANE_CONFIG_JSON,
DISPATCH_QUEUE_AGING_DAYS_PER_TIER, DISPATCH_QUEUE_AGING_MAX_TIERS,
DISPATCH_SYNC_LOCK_MAX_AGE_MS, DISPATCH_HOSTED_GROOMER_ENABLED,
DISPATCH_GROOMER_*, DISPATCH_LLM_API_KEY, DISPATCH_LLM_BASE_URL,
DISPATCH_AGENT_NAME, DISPATCH_CLOSED_ISSUE_RETENTION_DAYS,
DISPATCH_DONE_RETENTION_DAYS, DISPATCH_SCHEDULER_*,
DISPATCH_SYNC_INTERVAL_MS, DISPATCH_GROOMER_INTERVAL_MS,
DISPATCH_PR_FOLLOWUP_INTERVAL_MS, DISPATCH_PRUNE_CLOSED_INTERVAL_MS,
WEBHOOK_SECRET, WEBHOOK_GATEWAY_MODE, PR_FOLLOWUP_BOT_IDENTITIES,
PR_FOLLOWUP_BRANCH_OWNERS, OPENAI_API_KEY, OPENAI_BASE_URL, and
OPENAI_MODEL.
- .env.example also explicitly excludes the framework/build-time vars
(NODE_ENV, NEXT_RUNTIME, NEXT_PUBLIC_DISPATCH_VERSION) and the legacy
aliases (MISSION_CONTROL_URL, MISSION_CONTROL_AGENT_TOKEN) with comments
explaining why.
- README.md gains a new "Auth, Triage, Queue, and Webhooks" table that
matches the new .env.example entries, so the two documents agree.
The deepmerge-ts override added in 2f0d8c1 is left in place; `npm audit`
reports 0 vulnerabilities. Full vitest suite (2288 tests), `tsc --noEmit`,
and `eslint .` all pass.
Fixes#763
Signed-off-by: Saffron <263493777+itsmiso-ai@users.noreply.github.com>
Co-authored-by: Saffron <263493777+itsmiso-ai@users.noreply.github.com>
@its-saffronits-saffronBot mentioned this pull request Aug 19, 2026
Sign up for freeto 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

@joryirving
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(deps): override deepmerge-ts to clear GHSA-ggr8-5vv4-36mx - #785

Merged
joryirving merged 1 commit into
mainfrom
fix/deepmerge-ts-advisory
Aug 18, 2026
Merged

fix(deps): override deepmerge-ts to clear GHSA-ggr8-5vv4-36mx#785
joryirving merged 1 commit into
mainfrom
fix/deepmerge-ts-advisory

Conversation

@joryirving

Copy link
Copy Markdown
Contributor

Summary

  • Add overrides.deepmerge-ts: ^8.0.0 to clear GHSA-ggr8-5vv4-36mx, and record the rationale in the existing "//" block.

Why

npm audit fails on main right now with 3 high-severity findings. deepmerge-ts reaches us transitively through prisma > @prisma/config, and npm's only advertised stable fix is downgrading prisma to 6.12.0, which is breaking — so an override is the cheaper path, consistent with how postcss and sharp are already handled.

The advisory published 2026-08-17T13:32:13Z, 48 minutes after main's last npm audit run passed at 12:44:47Z. So main's green check is stale rather than accurate, and every PR opened since has failed an audit for something it did not introduce.

That is not hypothetical: four open foreman PRs (#779, #780, #781, #783) each independently added their own copy of this same pin while trying to work unrelated issues. Fixing it once here removes the trigger.

Notes

  • Renovate did not catch this, and the reason is worth recording: it sources vulnerabilities from Dependabot alerts, and those are disabled org-wide (dependabot_alerts_enabled_for_new_repositories: false, and the alerts endpoint returns an empty array for this repo). Renovate's scan logged "No vulnerability alerts found" and correctly did nothing. Enabling org-level alerts is the durable fix and is out of scope here.
  • osvVulnerabilityAlerts would not have helped either — it covers direct dependencies only, and this is transitive.

Verification

  • npm audit --omit=dev: 3 high → found 0 vulnerabilities
  • npx tsc --noEmit: clean
  • npm run test: 126 files, 2288 tests passing
  • resolved version is deepmerge-ts@8.0.1

@joryirving
joryirving enabled auto-merge (squash) August 18, 2026 02:14
@joryirving
joryirving merged commit e53a6ec into mainAug 18, 2026
7 checks passed
@joryirving
joryirving deleted the fix/deepmerge-ts-advisory branch August 18, 2026 02:15

@its-saffronits-saffronBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AI Automated Review

Full PR review.

Analysis engine: dsv4f@https://litellm.jory.dev/v1 (openai) — primary route

Recommendation

Approve. This PR adds an npm overrides pin for deepmerge-ts ^8.0.0 to remediate GHSA-ggr8-5vv4-36mx, which reaches the repo transitively via prisma > @prisma/config. The change is minimal (package.json + lockfile), the rationale is documented in the existing "//" overrides block, and all CI checks — including npm audit, Typecheck, Lint, Tests, and Build — pass on the head commit.

Change-by-Change Findings

package.json

  • Adds "deepmerge-ts": "^8.0.0" to the existing overrides block, alongside the pre-existing postcss and sharp pins. This is consistent with the repository's established pattern for remediating transitive advisories.
  • The "//" rationale block is updated to explain the advisory (GHSA-ggr8-5vv4-36mx, stack exhaustion, published 2026-08-17), the transitive path (prisma > @prisma/config), and why an override is preferred over npm's only advertised stable fix (downgrading prisma to 6.12.0, which would be breaking). This matches the documented convention that overrides must not be removed without verifying the originating transitive deps have shipped patched versions.

package-lock.json

  • deepmerge-ts resolves from 7.1.5 to 8.0.1 with a matching integrity hash and updated funding metadata. The lockfile change is consistent with the override.

Breaking-Change Assessment

The override forces deepmerge-ts from 7.1.5 to 8.0.1, and v8.0.0 is a major release with breaking changes (deep Map-value merging by default, renamed DeepMergeMetaMetaData/DeepMergeIntoFunctionUtils types, and deepmergeInto no longer leak-mutating inputs). However, deepmerge-ts is a transitive dependency here — the repo does not import it directly — so the breaking changes only matter if @prisma/config (the consumer) is incompatible with v8. The full test suite (2288 tests across 126 files, per the PR body) and the Typecheck CI job both pass, which is strong evidence that Prisma's use of the library is compatible with v8.0.1. No direct usage of deepmerge-ts exists in the repo's source.

Standards Compliance

  • The change follows the repository's documented override convention: pins live in the top-level overrides block, and the rationale is recorded in the "//" field because npm validates overrides entries strictly.
  • No secrets, env files, or build output are committed.
  • The PR is a dependency-update task, which AGENTS.md classifies as NORMAL-lane work; the change is scoped and testable.

Tool Harness Findings

  • GitHub release data for deepmerge-ts confirms v8.0.1 (2026-08-16) is a bug-fix release on top of v8.0.0, and v8.0.0 (2026-08-16) is the major release containing the breaking changes and the security-relevant fixes. The resolved lockfile version 8.0.1 is the latest available.
  • The GitHub advisory page for GHSA-ggr8-5vv4-36mx could not be fetched directly (the API endpoint returned 404 and the HTML fetch returned an unparseable page), so the advisory's exact affected-range and patched-version metadata could not be independently confirmed from the advisory itself. The PR body and the package.json rationale both cite the advisory ID and describe it as a stack-exhaustion issue; the npm audit CI check passing on the head commit is the authoritative confirmation that the override clears the finding.

Unknowns or Needs Verification

  • The advisory page itself was not directly verifiable during this review (fetch/API 404). The passing npm audit CI check on the head commit is the primary evidence that the override resolves the finding; if the advisory page becomes available, it would be worth confirming the patched range includes 8.0.1.
  • No host-platform compatibility matrix applies here: this is a pure npm dependency override, not a bump to a component that runs on a pinned host OS or alongside a pinned peer platform.

Must-Check Items

  • Check for breaking API changes in updated dependencies: Verified. deepmerge-ts v8.0.0 has breaking changes, but the package is transitive-only (via prisma > @prisma/config); Typecheck and the full test suite pass, indicating no incompatibility with the consumer.
  • Run full test suite after upgrade: Verified. The Tests CI check is green on the head commit, and the PR body reports 126 files / 2288 tests passing.

Comment threadpackage.json
},
"//": {
"overrides": "These pins exist to remediate npm advisories (originally added in #350). DO NOT remove without verifying the originating transitive deps have shipped patched versions: postcss ^8.5.10 (XSS-class advisory), sharp ^0.35.0 (libvips CVE-2026-33327/33328/35590/35591, #675 already satisfied transitively by next@16.3.0's optional dep `sharp: ^0.35.3`, but the override survives any future `next` downgrade). npm validates every entry of `overrides` strictly, so this rationale lives at the top level rather than inside the `overrides` block."
"overrides": "These pins exist to remediate npm advisories (originally added in #350). DO NOT remove without verifying the originating transitive deps have shipped patched versions: postcss ^8.5.10 (XSS-class advisory), sharp ^0.35.0 (libvips CVE-2026-33327/33328/35590/35591, #675 \u2014 already satisfied transitively by next@16.3.0's optional dep `sharp: ^0.35.3`, but the override survives any future `next` downgrade, deepmerge-ts ^8.0.0 (stack-exhaustion GHSA-ggr8-5vv4-36mx, published 2026-08-17 \u2014 reaches us transitively via prisma > @prisma/config; npm's only advertised stable fix is downgrading prisma to 6.12.0, a breaking change, so the override is the cheaper path)). npm validates every entry of `overrides` strictly, so this rationale lives at the top level rather than inside the `overrides` block."

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Info: The GHSA-ggr8-5vv4-36mx advisory page could not be fetched during review; the passing npm audit CI check is the authoritative confirmation that the override clears the finding.

Automated finding from AI PR review.

itsmiso-ai added a commit that referenced this pull request Aug 18, 2026
…ADME.md
The previous PR (#785) only pinned deepmerge-ts in package.json/package-lock.json
to clear the npm audit failure, but the original issue (#763) asked for the
~20 env vars read by src/ to be documented in .env.example (with AGENTS gaining
its first documented entry) and for the README env tables to agree with
.env.example.
This commit completes that work:
- .env.example gains commented examples for AGENTS, AUTH_URL,
DISPATCH_EXCLUDED_LABELS, DISPATCH_LANE_CONFIG_JSON,
DISPATCH_QUEUE_AGING_DAYS_PER_TIER, DISPATCH_QUEUE_AGING_MAX_TIERS,
DISPATCH_SYNC_LOCK_MAX_AGE_MS, DISPATCH_HOSTED_GROOMER_ENABLED,
DISPATCH_GROOMER_*, DISPATCH_LLM_API_KEY, DISPATCH_LLM_BASE_URL,
DISPATCH_AGENT_NAME, DISPATCH_CLOSED_ISSUE_RETENTION_DAYS,
DISPATCH_DONE_RETENTION_DAYS, DISPATCH_SCHEDULER_*,
DISPATCH_SYNC_INTERVAL_MS, DISPATCH_GROOMER_INTERVAL_MS,
DISPATCH_PR_FOLLOWUP_INTERVAL_MS, DISPATCH_PRUNE_CLOSED_INTERVAL_MS,
WEBHOOK_SECRET, WEBHOOK_GATEWAY_MODE, PR_FOLLOWUP_BOT_IDENTITIES,
PR_FOLLOWUP_BRANCH_OWNERS, OPENAI_API_KEY, OPENAI_BASE_URL, and
OPENAI_MODEL.
- .env.example also explicitly excludes the framework/build-time vars
(NODE_ENV, NEXT_RUNTIME, NEXT_PUBLIC_DISPATCH_VERSION) and the legacy
aliases (MISSION_CONTROL_URL, MISSION_CONTROL_AGENT_TOKEN) with comments
explaining why.
- README.md gains a new "Auth, Triage, Queue, and Webhooks" table that
matches the new .env.example entries, so the two documents agree.
The deepmerge-ts override added in 2f0d8c1 is left in place; `npm audit`
reports 0 vulnerabilities. Full vitest suite (2288 tests), `tsc --noEmit`,
and `eslint .` all pass.
Fixes#763
Signed-off-by: Saffron <263493777+itsmiso-ai@users.noreply.github.com>
joryirving pushed a commit that referenced this pull request Aug 18, 2026
The previous PR (#785) only pinned deepmerge-ts in package.json/package-lock.json
to clear the npm audit failure, but the original issue (#763) asked for the
~20 env vars read by src/ to be documented in .env.example (with AGENTS gaining
its first documented entry) and for the README env tables to agree with
.env.example.
This commit completes that work:
- .env.example gains commented examples for AGENTS, AUTH_URL,
DISPATCH_EXCLUDED_LABELS, DISPATCH_LANE_CONFIG_JSON,
DISPATCH_QUEUE_AGING_DAYS_PER_TIER, DISPATCH_QUEUE_AGING_MAX_TIERS,
DISPATCH_SYNC_LOCK_MAX_AGE_MS, DISPATCH_HOSTED_GROOMER_ENABLED,
DISPATCH_GROOMER_*, DISPATCH_LLM_API_KEY, DISPATCH_LLM_BASE_URL,
DISPATCH_AGENT_NAME, DISPATCH_CLOSED_ISSUE_RETENTION_DAYS,
DISPATCH_DONE_RETENTION_DAYS, DISPATCH_SCHEDULER_*,
DISPATCH_SYNC_INTERVAL_MS, DISPATCH_GROOMER_INTERVAL_MS,
DISPATCH_PR_FOLLOWUP_INTERVAL_MS, DISPATCH_PRUNE_CLOSED_INTERVAL_MS,
WEBHOOK_SECRET, WEBHOOK_GATEWAY_MODE, PR_FOLLOWUP_BOT_IDENTITIES,
PR_FOLLOWUP_BRANCH_OWNERS, OPENAI_API_KEY, OPENAI_BASE_URL, and
OPENAI_MODEL.
- .env.example also explicitly excludes the framework/build-time vars
(NODE_ENV, NEXT_RUNTIME, NEXT_PUBLIC_DISPATCH_VERSION) and the legacy
aliases (MISSION_CONTROL_URL, MISSION_CONTROL_AGENT_TOKEN) with comments
explaining why.
- README.md gains a new "Auth, Triage, Queue, and Webhooks" table that
matches the new .env.example entries, so the two documents agree.
The deepmerge-ts override added in 2f0d8c1 is left in place; `npm audit`
reports 0 vulnerabilities. Full vitest suite (2288 tests), `tsc --noEmit`,
and `eslint .` all pass.
Fixes#763
Signed-off-by: Saffron <263493777+itsmiso-ai@users.noreply.github.com>
Co-authored-by: Saffron <263493777+itsmiso-ai@users.noreply.github.com>
@its-saffronits-saffronBot mentioned this pull request Aug 19, 2026
Sign up for freeto 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

@joryirving
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix(deps): override deepmerge-ts to clear GHSA-ggr8-5vv4-36mx - #785

Merged
joryirving merged 1 commit into
mainfrom
fix/deepmerge-ts-advisory
Aug 18, 2026
Merged

fix(deps): override deepmerge-ts to clear GHSA-ggr8-5vv4-36mx#785
joryirving merged 1 commit into
mainfrom
fix/deepmerge-ts-advisory

Conversation

@joryirving

Copy link
Copy Markdown
Contributor

Summary

  • Add overrides.deepmerge-ts: ^8.0.0 to clear GHSA-ggr8-5vv4-36mx, and record the rationale in the existing "//" block.

Why

npm audit fails on main right now with 3 high-severity findings. deepmerge-ts reaches us transitively through prisma > @prisma/config, and npm's only advertised stable fix is downgrading prisma to 6.12.0, which is breaking — so an override is the cheaper path, consistent with how postcss and sharp are already handled.

The advisory published 2026-08-17T13:32:13Z, 48 minutes after main's last npm audit run passed at 12:44:47Z. So main's green check is stale rather than accurate, and every PR opened since has failed an audit for something it did not introduce.

That is not hypothetical: four open foreman PRs (#779, #780, #781, #783) each independently added their own copy of this same pin while trying to work unrelated issues. Fixing it once here removes the trigger.

Notes

  • Renovate did not catch this, and the reason is worth recording: it sources vulnerabilities from Dependabot alerts, and those are disabled org-wide (dependabot_alerts_enabled_for_new_repositories: false, and the alerts endpoint returns an empty array for this repo). Renovate's scan logged "No vulnerability alerts found" and correctly did nothing. Enabling org-level alerts is the durable fix and is out of scope here.
  • osvVulnerabilityAlerts would not have helped either — it covers direct dependencies only, and this is transitive.

Verification

  • npm audit --omit=dev: 3 high → found 0 vulnerabilities
  • npx tsc --noEmit: clean
  • npm run test: 126 files, 2288 tests passing
  • resolved version is deepmerge-ts@8.0.1

@joryirving
joryirving enabled auto-merge (squash) August 18, 2026 02:14
@joryirving
joryirving merged commit e53a6ec into mainAug 18, 2026
7 checks passed
@joryirving
joryirving deleted the fix/deepmerge-ts-advisory branch August 18, 2026 02:15

@its-saffronits-saffronBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AI Automated Review

Full PR review.

Analysis engine: dsv4f@https://litellm.jory.dev/v1 (openai) — primary route

Recommendation

Approve. This PR adds an npm overrides pin for deepmerge-ts ^8.0.0 to remediate GHSA-ggr8-5vv4-36mx, which reaches the repo transitively via prisma > @prisma/config. The change is minimal (package.json + lockfile), the rationale is documented in the existing "//" overrides block, and all CI checks — including npm audit, Typecheck, Lint, Tests, and Build — pass on the head commit.

Change-by-Change Findings

package.json

  • Adds "deepmerge-ts": "^8.0.0" to the existing overrides block, alongside the pre-existing postcss and sharp pins. This is consistent with the repository's established pattern for remediating transitive advisories.
  • The "//" rationale block is updated to explain the advisory (GHSA-ggr8-5vv4-36mx, stack exhaustion, published 2026-08-17), the transitive path (prisma > @prisma/config), and why an override is preferred over npm's only advertised stable fix (downgrading prisma to 6.12.0, which would be breaking). This matches the documented convention that overrides must not be removed without verifying the originating transitive deps have shipped patched versions.

package-lock.json

  • deepmerge-ts resolves from 7.1.5 to 8.0.1 with a matching integrity hash and updated funding metadata. The lockfile change is consistent with the override.

Breaking-Change Assessment

The override forces deepmerge-ts from 7.1.5 to 8.0.1, and v8.0.0 is a major release with breaking changes (deep Map-value merging by default, renamed DeepMergeMetaMetaData/DeepMergeIntoFunctionUtils types, and deepmergeInto no longer leak-mutating inputs). However, deepmerge-ts is a transitive dependency here — the repo does not import it directly — so the breaking changes only matter if @prisma/config (the consumer) is incompatible with v8. The full test suite (2288 tests across 126 files, per the PR body) and the Typecheck CI job both pass, which is strong evidence that Prisma's use of the library is compatible with v8.0.1. No direct usage of deepmerge-ts exists in the repo's source.

Standards Compliance

  • The change follows the repository's documented override convention: pins live in the top-level overrides block, and the rationale is recorded in the "//" field because npm validates overrides entries strictly.
  • No secrets, env files, or build output are committed.
  • The PR is a dependency-update task, which AGENTS.md classifies as NORMAL-lane work; the change is scoped and testable.

Tool Harness Findings

  • GitHub release data for deepmerge-ts confirms v8.0.1 (2026-08-16) is a bug-fix release on top of v8.0.0, and v8.0.0 (2026-08-16) is the major release containing the breaking changes and the security-relevant fixes. The resolved lockfile version 8.0.1 is the latest available.
  • The GitHub advisory page for GHSA-ggr8-5vv4-36mx could not be fetched directly (the API endpoint returned 404 and the HTML fetch returned an unparseable page), so the advisory's exact affected-range and patched-version metadata could not be independently confirmed from the advisory itself. The PR body and the package.json rationale both cite the advisory ID and describe it as a stack-exhaustion issue; the npm audit CI check passing on the head commit is the authoritative confirmation that the override clears the finding.

Unknowns or Needs Verification

  • The advisory page itself was not directly verifiable during this review (fetch/API 404). The passing npm audit CI check on the head commit is the primary evidence that the override resolves the finding; if the advisory page becomes available, it would be worth confirming the patched range includes 8.0.1.
  • No host-platform compatibility matrix applies here: this is a pure npm dependency override, not a bump to a component that runs on a pinned host OS or alongside a pinned peer platform.

Must-Check Items

  • Check for breaking API changes in updated dependencies: Verified. deepmerge-ts v8.0.0 has breaking changes, but the package is transitive-only (via prisma > @prisma/config); Typecheck and the full test suite pass, indicating no incompatibility with the consumer.
  • Run full test suite after upgrade: Verified. The Tests CI check is green on the head commit, and the PR body reports 126 files / 2288 tests passing.

Comment threadpackage.json
},
"//": {
"overrides": "These pins exist to remediate npm advisories (originally added in #350). DO NOT remove without verifying the originating transitive deps have shipped patched versions: postcss ^8.5.10 (XSS-class advisory), sharp ^0.35.0 (libvips CVE-2026-33327/33328/35590/35591, #675 already satisfied transitively by next@16.3.0's optional dep `sharp: ^0.35.3`, but the override survives any future `next` downgrade). npm validates every entry of `overrides` strictly, so this rationale lives at the top level rather than inside the `overrides` block."
"overrides": "These pins exist to remediate npm advisories (originally added in #350). DO NOT remove without verifying the originating transitive deps have shipped patched versions: postcss ^8.5.10 (XSS-class advisory), sharp ^0.35.0 (libvips CVE-2026-33327/33328/35590/35591, #675 \u2014 already satisfied transitively by next@16.3.0's optional dep `sharp: ^0.35.3`, but the override survives any future `next` downgrade, deepmerge-ts ^8.0.0 (stack-exhaustion GHSA-ggr8-5vv4-36mx, published 2026-08-17 \u2014 reaches us transitively via prisma > @prisma/config; npm's only advertised stable fix is downgrading prisma to 6.12.0, a breaking change, so the override is the cheaper path)). npm validates every entry of `overrides` strictly, so this rationale lives at the top level rather than inside the `overrides` block."

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Info: The GHSA-ggr8-5vv4-36mx advisory page could not be fetched during review; the passing npm audit CI check is the authoritative confirmation that the override clears the finding.

Automated finding from AI PR review.

itsmiso-ai added a commit that referenced this pull request Aug 18, 2026
…ADME.md
The previous PR (#785) only pinned deepmerge-ts in package.json/package-lock.json
to clear the npm audit failure, but the original issue (#763) asked for the
~20 env vars read by src/ to be documented in .env.example (with AGENTS gaining
its first documented entry) and for the README env tables to agree with
.env.example.
This commit completes that work:
- .env.example gains commented examples for AGENTS, AUTH_URL,
DISPATCH_EXCLUDED_LABELS, DISPATCH_LANE_CONFIG_JSON,
DISPATCH_QUEUE_AGING_DAYS_PER_TIER, DISPATCH_QUEUE_AGING_MAX_TIERS,
DISPATCH_SYNC_LOCK_MAX_AGE_MS, DISPATCH_HOSTED_GROOMER_ENABLED,
DISPATCH_GROOMER_*, DISPATCH_LLM_API_KEY, DISPATCH_LLM_BASE_URL,
DISPATCH_AGENT_NAME, DISPATCH_CLOSED_ISSUE_RETENTION_DAYS,
DISPATCH_DONE_RETENTION_DAYS, DISPATCH_SCHEDULER_*,
DISPATCH_SYNC_INTERVAL_MS, DISPATCH_GROOMER_INTERVAL_MS,
DISPATCH_PR_FOLLOWUP_INTERVAL_MS, DISPATCH_PRUNE_CLOSED_INTERVAL_MS,
WEBHOOK_SECRET, WEBHOOK_GATEWAY_MODE, PR_FOLLOWUP_BOT_IDENTITIES,
PR_FOLLOWUP_BRANCH_OWNERS, OPENAI_API_KEY, OPENAI_BASE_URL, and
OPENAI_MODEL.
- .env.example also explicitly excludes the framework/build-time vars
(NODE_ENV, NEXT_RUNTIME, NEXT_PUBLIC_DISPATCH_VERSION) and the legacy
aliases (MISSION_CONTROL_URL, MISSION_CONTROL_AGENT_TOKEN) with comments
explaining why.
- README.md gains a new "Auth, Triage, Queue, and Webhooks" table that
matches the new .env.example entries, so the two documents agree.
The deepmerge-ts override added in 2f0d8c1 is left in place; `npm audit`
reports 0 vulnerabilities. Full vitest suite (2288 tests), `tsc --noEmit`,
and `eslint .` all pass.
Fixes#763
Signed-off-by: Saffron <263493777+itsmiso-ai@users.noreply.github.com>
joryirving pushed a commit that referenced this pull request Aug 18, 2026
The previous PR (#785) only pinned deepmerge-ts in package.json/package-lock.json
to clear the npm audit failure, but the original issue (#763) asked for the
~20 env vars read by src/ to be documented in .env.example (with AGENTS gaining
its first documented entry) and for the README env tables to agree with
.env.example.
This commit completes that work:
- .env.example gains commented examples for AGENTS, AUTH_URL,
DISPATCH_EXCLUDED_LABELS, DISPATCH_LANE_CONFIG_JSON,
DISPATCH_QUEUE_AGING_DAYS_PER_TIER, DISPATCH_QUEUE_AGING_MAX_TIERS,
DISPATCH_SYNC_LOCK_MAX_AGE_MS, DISPATCH_HOSTED_GROOMER_ENABLED,
DISPATCH_GROOMER_*, DISPATCH_LLM_API_KEY, DISPATCH_LLM_BASE_URL,
DISPATCH_AGENT_NAME, DISPATCH_CLOSED_ISSUE_RETENTION_DAYS,
DISPATCH_DONE_RETENTION_DAYS, DISPATCH_SCHEDULER_*,
DISPATCH_SYNC_INTERVAL_MS, DISPATCH_GROOMER_INTERVAL_MS,
DISPATCH_PR_FOLLOWUP_INTERVAL_MS, DISPATCH_PRUNE_CLOSED_INTERVAL_MS,
WEBHOOK_SECRET, WEBHOOK_GATEWAY_MODE, PR_FOLLOWUP_BOT_IDENTITIES,
PR_FOLLOWUP_BRANCH_OWNERS, OPENAI_API_KEY, OPENAI_BASE_URL, and
OPENAI_MODEL.
- .env.example also explicitly excludes the framework/build-time vars
(NODE_ENV, NEXT_RUNTIME, NEXT_PUBLIC_DISPATCH_VERSION) and the legacy
aliases (MISSION_CONTROL_URL, MISSION_CONTROL_AGENT_TOKEN) with comments
explaining why.
- README.md gains a new "Auth, Triage, Queue, and Webhooks" table that
matches the new .env.example entries, so the two documents agree.
The deepmerge-ts override added in 2f0d8c1 is left in place; `npm audit`
reports 0 vulnerabilities. Full vitest suite (2288 tests), `tsc --noEmit`,
and `eslint .` all pass.
Fixes#763
Signed-off-by: Saffron <263493777+itsmiso-ai@users.noreply.github.com>
Co-authored-by: Saffron <263493777+itsmiso-ai@users.noreply.github.com>
@its-saffronits-saffronBot mentioned this pull request Aug 19, 2026
Sign up for freeto 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

@joryirving
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(deps): override deepmerge-ts to clear GHSA-ggr8-5vv4-36mx - #785

Merged
joryirving merged 1 commit into
mainfrom
fix/deepmerge-ts-advisory
Aug 18, 2026
Merged

fix(deps): override deepmerge-ts to clear GHSA-ggr8-5vv4-36mx#785
joryirving merged 1 commit into
mainfrom
fix/deepmerge-ts-advisory

Conversation

@joryirving

Copy link
Copy Markdown
Contributor

Summary

  • Add overrides.deepmerge-ts: ^8.0.0 to clear GHSA-ggr8-5vv4-36mx, and record the rationale in the existing "//" block.

Why

npm audit fails on main right now with 3 high-severity findings. deepmerge-ts reaches us transitively through prisma > @prisma/config, and npm's only advertised stable fix is downgrading prisma to 6.12.0, which is breaking — so an override is the cheaper path, consistent with how postcss and sharp are already handled.

The advisory published 2026-08-17T13:32:13Z, 48 minutes after main's last npm audit run passed at 12:44:47Z. So main's green check is stale rather than accurate, and every PR opened since has failed an audit for something it did not introduce.

That is not hypothetical: four open foreman PRs (#779, #780, #781, #783) each independently added their own copy of this same pin while trying to work unrelated issues. Fixing it once here removes the trigger.

Notes

  • Renovate did not catch this, and the reason is worth recording: it sources vulnerabilities from Dependabot alerts, and those are disabled org-wide (dependabot_alerts_enabled_for_new_repositories: false, and the alerts endpoint returns an empty array for this repo). Renovate's scan logged "No vulnerability alerts found" and correctly did nothing. Enabling org-level alerts is the durable fix and is out of scope here.
  • osvVulnerabilityAlerts would not have helped either — it covers direct dependencies only, and this is transitive.

Verification

  • npm audit --omit=dev: 3 high → found 0 vulnerabilities
  • npx tsc --noEmit: clean
  • npm run test: 126 files, 2288 tests passing
  • resolved version is deepmerge-ts@8.0.1

@joryirving
joryirving enabled auto-merge (squash) August 18, 2026 02:14
@joryirving
joryirving merged commit e53a6ec into mainAug 18, 2026
7 checks passed
@joryirving
joryirving deleted the fix/deepmerge-ts-advisory branch August 18, 2026 02:15

@its-saffronits-saffronBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AI Automated Review

Full PR review.

Analysis engine: dsv4f@https://litellm.jory.dev/v1 (openai) — primary route

Recommendation

Approve. This PR adds an npm overrides pin for deepmerge-ts ^8.0.0 to remediate GHSA-ggr8-5vv4-36mx, which reaches the repo transitively via prisma > @prisma/config. The change is minimal (package.json + lockfile), the rationale is documented in the existing "//" overrides block, and all CI checks — including npm audit, Typecheck, Lint, Tests, and Build — pass on the head commit.

Change-by-Change Findings

package.json

  • Adds "deepmerge-ts": "^8.0.0" to the existing overrides block, alongside the pre-existing postcss and sharp pins. This is consistent with the repository's established pattern for remediating transitive advisories.
  • The "//" rationale block is updated to explain the advisory (GHSA-ggr8-5vv4-36mx, stack exhaustion, published 2026-08-17), the transitive path (prisma > @prisma/config), and why an override is preferred over npm's only advertised stable fix (downgrading prisma to 6.12.0, which would be breaking). This matches the documented convention that overrides must not be removed without verifying the originating transitive deps have shipped patched versions.

package-lock.json

  • deepmerge-ts resolves from 7.1.5 to 8.0.1 with a matching integrity hash and updated funding metadata. The lockfile change is consistent with the override.

Breaking-Change Assessment

The override forces deepmerge-ts from 7.1.5 to 8.0.1, and v8.0.0 is a major release with breaking changes (deep Map-value merging by default, renamed DeepMergeMetaMetaData/DeepMergeIntoFunctionUtils types, and deepmergeInto no longer leak-mutating inputs). However, deepmerge-ts is a transitive dependency here — the repo does not import it directly — so the breaking changes only matter if @prisma/config (the consumer) is incompatible with v8. The full test suite (2288 tests across 126 files, per the PR body) and the Typecheck CI job both pass, which is strong evidence that Prisma's use of the library is compatible with v8.0.1. No direct usage of deepmerge-ts exists in the repo's source.

Standards Compliance

  • The change follows the repository's documented override convention: pins live in the top-level overrides block, and the rationale is recorded in the "//" field because npm validates overrides entries strictly.
  • No secrets, env files, or build output are committed.
  • The PR is a dependency-update task, which AGENTS.md classifies as NORMAL-lane work; the change is scoped and testable.

Tool Harness Findings

  • GitHub release data for deepmerge-ts confirms v8.0.1 (2026-08-16) is a bug-fix release on top of v8.0.0, and v8.0.0 (2026-08-16) is the major release containing the breaking changes and the security-relevant fixes. The resolved lockfile version 8.0.1 is the latest available.
  • The GitHub advisory page for GHSA-ggr8-5vv4-36mx could not be fetched directly (the API endpoint returned 404 and the HTML fetch returned an unparseable page), so the advisory's exact affected-range and patched-version metadata could not be independently confirmed from the advisory itself. The PR body and the package.json rationale both cite the advisory ID and describe it as a stack-exhaustion issue; the npm audit CI check passing on the head commit is the authoritative confirmation that the override clears the finding.

Unknowns or Needs Verification

  • The advisory page itself was not directly verifiable during this review (fetch/API 404). The passing npm audit CI check on the head commit is the primary evidence that the override resolves the finding; if the advisory page becomes available, it would be worth confirming the patched range includes 8.0.1.
  • No host-platform compatibility matrix applies here: this is a pure npm dependency override, not a bump to a component that runs on a pinned host OS or alongside a pinned peer platform.

Must-Check Items

  • Check for breaking API changes in updated dependencies: Verified. deepmerge-ts v8.0.0 has breaking changes, but the package is transitive-only (via prisma > @prisma/config); Typecheck and the full test suite pass, indicating no incompatibility with the consumer.
  • Run full test suite after upgrade: Verified. The Tests CI check is green on the head commit, and the PR body reports 126 files / 2288 tests passing.

Comment threadpackage.json
},
"//": {
"overrides": "These pins exist to remediate npm advisories (originally added in #350). DO NOT remove without verifying the originating transitive deps have shipped patched versions: postcss ^8.5.10 (XSS-class advisory), sharp ^0.35.0 (libvips CVE-2026-33327/33328/35590/35591, #675 already satisfied transitively by next@16.3.0's optional dep `sharp: ^0.35.3`, but the override survives any future `next` downgrade). npm validates every entry of `overrides` strictly, so this rationale lives at the top level rather than inside the `overrides` block."
"overrides": "These pins exist to remediate npm advisories (originally added in #350). DO NOT remove without verifying the originating transitive deps have shipped patched versions: postcss ^8.5.10 (XSS-class advisory), sharp ^0.35.0 (libvips CVE-2026-33327/33328/35590/35591, #675 \u2014 already satisfied transitively by next@16.3.0's optional dep `sharp: ^0.35.3`, but the override survives any future `next` downgrade, deepmerge-ts ^8.0.0 (stack-exhaustion GHSA-ggr8-5vv4-36mx, published 2026-08-17 \u2014 reaches us transitively via prisma > @prisma/config; npm's only advertised stable fix is downgrading prisma to 6.12.0, a breaking change, so the override is the cheaper path)). npm validates every entry of `overrides` strictly, so this rationale lives at the top level rather than inside the `overrides` block."

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Info: The GHSA-ggr8-5vv4-36mx advisory page could not be fetched during review; the passing npm audit CI check is the authoritative confirmation that the override clears the finding.

Automated finding from AI PR review.

itsmiso-ai added a commit that referenced this pull request Aug 18, 2026
…ADME.md
The previous PR (#785) only pinned deepmerge-ts in package.json/package-lock.json
to clear the npm audit failure, but the original issue (#763) asked for the
~20 env vars read by src/ to be documented in .env.example (with AGENTS gaining
its first documented entry) and for the README env tables to agree with
.env.example.
This commit completes that work:
- .env.example gains commented examples for AGENTS, AUTH_URL,
DISPATCH_EXCLUDED_LABELS, DISPATCH_LANE_CONFIG_JSON,
DISPATCH_QUEUE_AGING_DAYS_PER_TIER, DISPATCH_QUEUE_AGING_MAX_TIERS,
DISPATCH_SYNC_LOCK_MAX_AGE_MS, DISPATCH_HOSTED_GROOMER_ENABLED,
DISPATCH_GROOMER_*, DISPATCH_LLM_API_KEY, DISPATCH_LLM_BASE_URL,
DISPATCH_AGENT_NAME, DISPATCH_CLOSED_ISSUE_RETENTION_DAYS,
DISPATCH_DONE_RETENTION_DAYS, DISPATCH_SCHEDULER_*,
DISPATCH_SYNC_INTERVAL_MS, DISPATCH_GROOMER_INTERVAL_MS,
DISPATCH_PR_FOLLOWUP_INTERVAL_MS, DISPATCH_PRUNE_CLOSED_INTERVAL_MS,
WEBHOOK_SECRET, WEBHOOK_GATEWAY_MODE, PR_FOLLOWUP_BOT_IDENTITIES,
PR_FOLLOWUP_BRANCH_OWNERS, OPENAI_API_KEY, OPENAI_BASE_URL, and
OPENAI_MODEL.
- .env.example also explicitly excludes the framework/build-time vars
(NODE_ENV, NEXT_RUNTIME, NEXT_PUBLIC_DISPATCH_VERSION) and the legacy
aliases (MISSION_CONTROL_URL, MISSION_CONTROL_AGENT_TOKEN) with comments
explaining why.
- README.md gains a new "Auth, Triage, Queue, and Webhooks" table that
matches the new .env.example entries, so the two documents agree.
The deepmerge-ts override added in 2f0d8c1 is left in place; `npm audit`
reports 0 vulnerabilities. Full vitest suite (2288 tests), `tsc --noEmit`,
and `eslint .` all pass.
Fixes#763
Signed-off-by: Saffron <263493777+itsmiso-ai@users.noreply.github.com>
joryirving pushed a commit that referenced this pull request Aug 18, 2026
The previous PR (#785) only pinned deepmerge-ts in package.json/package-lock.json
to clear the npm audit failure, but the original issue (#763) asked for the
~20 env vars read by src/ to be documented in .env.example (with AGENTS gaining
its first documented entry) and for the README env tables to agree with
.env.example.
This commit completes that work:
- .env.example gains commented examples for AGENTS, AUTH_URL,
DISPATCH_EXCLUDED_LABELS, DISPATCH_LANE_CONFIG_JSON,
DISPATCH_QUEUE_AGING_DAYS_PER_TIER, DISPATCH_QUEUE_AGING_MAX_TIERS,
DISPATCH_SYNC_LOCK_MAX_AGE_MS, DISPATCH_HOSTED_GROOMER_ENABLED,
DISPATCH_GROOMER_*, DISPATCH_LLM_API_KEY, DISPATCH_LLM_BASE_URL,
DISPATCH_AGENT_NAME, DISPATCH_CLOSED_ISSUE_RETENTION_DAYS,
DISPATCH_DONE_RETENTION_DAYS, DISPATCH_SCHEDULER_*,
DISPATCH_SYNC_INTERVAL_MS, DISPATCH_GROOMER_INTERVAL_MS,
DISPATCH_PR_FOLLOWUP_INTERVAL_MS, DISPATCH_PRUNE_CLOSED_INTERVAL_MS,
WEBHOOK_SECRET, WEBHOOK_GATEWAY_MODE, PR_FOLLOWUP_BOT_IDENTITIES,
PR_FOLLOWUP_BRANCH_OWNERS, OPENAI_API_KEY, OPENAI_BASE_URL, and
OPENAI_MODEL.
- .env.example also explicitly excludes the framework/build-time vars
(NODE_ENV, NEXT_RUNTIME, NEXT_PUBLIC_DISPATCH_VERSION) and the legacy
aliases (MISSION_CONTROL_URL, MISSION_CONTROL_AGENT_TOKEN) with comments
explaining why.
- README.md gains a new "Auth, Triage, Queue, and Webhooks" table that
matches the new .env.example entries, so the two documents agree.
The deepmerge-ts override added in 2f0d8c1 is left in place; `npm audit`
reports 0 vulnerabilities. Full vitest suite (2288 tests), `tsc --noEmit`,
and `eslint .` all pass.
Fixes#763
Signed-off-by: Saffron <263493777+itsmiso-ai@users.noreply.github.com>
Co-authored-by: Saffron <263493777+itsmiso-ai@users.noreply.github.com>
@its-saffronits-saffronBot mentioned this pull request Aug 19, 2026
Sign up for freeto 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

@joryirving
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(deps): override deepmerge-ts to clear GHSA-ggr8-5vv4-36mx - #785

Merged
joryirving merged 1 commit into
mainfrom
fix/deepmerge-ts-advisory
Aug 18, 2026
Merged

fix(deps): override deepmerge-ts to clear GHSA-ggr8-5vv4-36mx#785
joryirving merged 1 commit into
mainfrom
fix/deepmerge-ts-advisory

Conversation

@joryirving

Copy link
Copy Markdown
Contributor

Summary

  • Add overrides.deepmerge-ts: ^8.0.0 to clear GHSA-ggr8-5vv4-36mx, and record the rationale in the existing "//" block.

Why

npm audit fails on main right now with 3 high-severity findings. deepmerge-ts reaches us transitively through prisma > @prisma/config, and npm's only advertised stable fix is downgrading prisma to 6.12.0, which is breaking — so an override is the cheaper path, consistent with how postcss and sharp are already handled.

The advisory published 2026-08-17T13:32:13Z, 48 minutes after main's last npm audit run passed at 12:44:47Z. So main's green check is stale rather than accurate, and every PR opened since has failed an audit for something it did not introduce.

That is not hypothetical: four open foreman PRs (#779, #780, #781, #783) each independently added their own copy of this same pin while trying to work unrelated issues. Fixing it once here removes the trigger.

Notes

  • Renovate did not catch this, and the reason is worth recording: it sources vulnerabilities from Dependabot alerts, and those are disabled org-wide (dependabot_alerts_enabled_for_new_repositories: false, and the alerts endpoint returns an empty array for this repo). Renovate's scan logged "No vulnerability alerts found" and correctly did nothing. Enabling org-level alerts is the durable fix and is out of scope here.
  • osvVulnerabilityAlerts would not have helped either — it covers direct dependencies only, and this is transitive.

Verification

  • npm audit --omit=dev: 3 high → found 0 vulnerabilities
  • npx tsc --noEmit: clean
  • npm run test: 126 files, 2288 tests passing
  • resolved version is deepmerge-ts@8.0.1

@joryirving
joryirving enabled auto-merge (squash) August 18, 2026 02:14
@joryirving
joryirving merged commit e53a6ec into mainAug 18, 2026
7 checks passed
@joryirving
joryirving deleted the fix/deepmerge-ts-advisory branch August 18, 2026 02:15

@its-saffronits-saffronBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AI Automated Review

Full PR review.

Analysis engine: dsv4f@https://litellm.jory.dev/v1 (openai) — primary route

Recommendation

Approve. This PR adds an npm overrides pin for deepmerge-ts ^8.0.0 to remediate GHSA-ggr8-5vv4-36mx, which reaches the repo transitively via prisma > @prisma/config. The change is minimal (package.json + lockfile), the rationale is documented in the existing "//" overrides block, and all CI checks — including npm audit, Typecheck, Lint, Tests, and Build — pass on the head commit.

Change-by-Change Findings

package.json

  • Adds "deepmerge-ts": "^8.0.0" to the existing overrides block, alongside the pre-existing postcss and sharp pins. This is consistent with the repository's established pattern for remediating transitive advisories.
  • The "//" rationale block is updated to explain the advisory (GHSA-ggr8-5vv4-36mx, stack exhaustion, published 2026-08-17), the transitive path (prisma > @prisma/config), and why an override is preferred over npm's only advertised stable fix (downgrading prisma to 6.12.0, which would be breaking). This matches the documented convention that overrides must not be removed without verifying the originating transitive deps have shipped patched versions.

package-lock.json

  • deepmerge-ts resolves from 7.1.5 to 8.0.1 with a matching integrity hash and updated funding metadata. The lockfile change is consistent with the override.

Breaking-Change Assessment

The override forces deepmerge-ts from 7.1.5 to 8.0.1, and v8.0.0 is a major release with breaking changes (deep Map-value merging by default, renamed DeepMergeMetaMetaData/DeepMergeIntoFunctionUtils types, and deepmergeInto no longer leak-mutating inputs). However, deepmerge-ts is a transitive dependency here — the repo does not import it directly — so the breaking changes only matter if @prisma/config (the consumer) is incompatible with v8. The full test suite (2288 tests across 126 files, per the PR body) and the Typecheck CI job both pass, which is strong evidence that Prisma's use of the library is compatible with v8.0.1. No direct usage of deepmerge-ts exists in the repo's source.

Standards Compliance

  • The change follows the repository's documented override convention: pins live in the top-level overrides block, and the rationale is recorded in the "//" field because npm validates overrides entries strictly.
  • No secrets, env files, or build output are committed.
  • The PR is a dependency-update task, which AGENTS.md classifies as NORMAL-lane work; the change is scoped and testable.

Tool Harness Findings

  • GitHub release data for deepmerge-ts confirms v8.0.1 (2026-08-16) is a bug-fix release on top of v8.0.0, and v8.0.0 (2026-08-16) is the major release containing the breaking changes and the security-relevant fixes. The resolved lockfile version 8.0.1 is the latest available.
  • The GitHub advisory page for GHSA-ggr8-5vv4-36mx could not be fetched directly (the API endpoint returned 404 and the HTML fetch returned an unparseable page), so the advisory's exact affected-range and patched-version metadata could not be independently confirmed from the advisory itself. The PR body and the package.json rationale both cite the advisory ID and describe it as a stack-exhaustion issue; the npm audit CI check passing on the head commit is the authoritative confirmation that the override clears the finding.

Unknowns or Needs Verification

  • The advisory page itself was not directly verifiable during this review (fetch/API 404). The passing npm audit CI check on the head commit is the primary evidence that the override resolves the finding; if the advisory page becomes available, it would be worth confirming the patched range includes 8.0.1.
  • No host-platform compatibility matrix applies here: this is a pure npm dependency override, not a bump to a component that runs on a pinned host OS or alongside a pinned peer platform.

Must-Check Items

  • Check for breaking API changes in updated dependencies: Verified. deepmerge-ts v8.0.0 has breaking changes, but the package is transitive-only (via prisma > @prisma/config); Typecheck and the full test suite pass, indicating no incompatibility with the consumer.
  • Run full test suite after upgrade: Verified. The Tests CI check is green on the head commit, and the PR body reports 126 files / 2288 tests passing.

Comment threadpackage.json
},
"//": {
"overrides": "These pins exist to remediate npm advisories (originally added in #350). DO NOT remove without verifying the originating transitive deps have shipped patched versions: postcss ^8.5.10 (XSS-class advisory), sharp ^0.35.0 (libvips CVE-2026-33327/33328/35590/35591, #675 already satisfied transitively by next@16.3.0's optional dep `sharp: ^0.35.3`, but the override survives any future `next` downgrade). npm validates every entry of `overrides` strictly, so this rationale lives at the top level rather than inside the `overrides` block."
"overrides": "These pins exist to remediate npm advisories (originally added in #350). DO NOT remove without verifying the originating transitive deps have shipped patched versions: postcss ^8.5.10 (XSS-class advisory), sharp ^0.35.0 (libvips CVE-2026-33327/33328/35590/35591, #675 \u2014 already satisfied transitively by next@16.3.0's optional dep `sharp: ^0.35.3`, but the override survives any future `next` downgrade, deepmerge-ts ^8.0.0 (stack-exhaustion GHSA-ggr8-5vv4-36mx, published 2026-08-17 \u2014 reaches us transitively via prisma > @prisma/config; npm's only advertised stable fix is downgrading prisma to 6.12.0, a breaking change, so the override is the cheaper path)). npm validates every entry of `overrides` strictly, so this rationale lives at the top level rather than inside the `overrides` block."

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Info: The GHSA-ggr8-5vv4-36mx advisory page could not be fetched during review; the passing npm audit CI check is the authoritative confirmation that the override clears the finding.

Automated finding from AI PR review.

itsmiso-ai added a commit that referenced this pull request Aug 18, 2026
…ADME.md
The previous PR (#785) only pinned deepmerge-ts in package.json/package-lock.json
to clear the npm audit failure, but the original issue (#763) asked for the
~20 env vars read by src/ to be documented in .env.example (with AGENTS gaining
its first documented entry) and for the README env tables to agree with
.env.example.
This commit completes that work:
- .env.example gains commented examples for AGENTS, AUTH_URL,
DISPATCH_EXCLUDED_LABELS, DISPATCH_LANE_CONFIG_JSON,
DISPATCH_QUEUE_AGING_DAYS_PER_TIER, DISPATCH_QUEUE_AGING_MAX_TIERS,
DISPATCH_SYNC_LOCK_MAX_AGE_MS, DISPATCH_HOSTED_GROOMER_ENABLED,
DISPATCH_GROOMER_*, DISPATCH_LLM_API_KEY, DISPATCH_LLM_BASE_URL,
DISPATCH_AGENT_NAME, DISPATCH_CLOSED_ISSUE_RETENTION_DAYS,
DISPATCH_DONE_RETENTION_DAYS, DISPATCH_SCHEDULER_*,
DISPATCH_SYNC_INTERVAL_MS, DISPATCH_GROOMER_INTERVAL_MS,
DISPATCH_PR_FOLLOWUP_INTERVAL_MS, DISPATCH_PRUNE_CLOSED_INTERVAL_MS,
WEBHOOK_SECRET, WEBHOOK_GATEWAY_MODE, PR_FOLLOWUP_BOT_IDENTITIES,
PR_FOLLOWUP_BRANCH_OWNERS, OPENAI_API_KEY, OPENAI_BASE_URL, and
OPENAI_MODEL.
- .env.example also explicitly excludes the framework/build-time vars
(NODE_ENV, NEXT_RUNTIME, NEXT_PUBLIC_DISPATCH_VERSION) and the legacy
aliases (MISSION_CONTROL_URL, MISSION_CONTROL_AGENT_TOKEN) with comments
explaining why.
- README.md gains a new "Auth, Triage, Queue, and Webhooks" table that
matches the new .env.example entries, so the two documents agree.
The deepmerge-ts override added in 2f0d8c1 is left in place; `npm audit`
reports 0 vulnerabilities. Full vitest suite (2288 tests), `tsc --noEmit`,
and `eslint .` all pass.
Fixes#763
Signed-off-by: Saffron <263493777+itsmiso-ai@users.noreply.github.com>
joryirving pushed a commit that referenced this pull request Aug 18, 2026
The previous PR (#785) only pinned deepmerge-ts in package.json/package-lock.json
to clear the npm audit failure, but the original issue (#763) asked for the
~20 env vars read by src/ to be documented in .env.example (with AGENTS gaining
its first documented entry) and for the README env tables to agree with
.env.example.
This commit completes that work:
- .env.example gains commented examples for AGENTS, AUTH_URL,
DISPATCH_EXCLUDED_LABELS, DISPATCH_LANE_CONFIG_JSON,
DISPATCH_QUEUE_AGING_DAYS_PER_TIER, DISPATCH_QUEUE_AGING_MAX_TIERS,
DISPATCH_SYNC_LOCK_MAX_AGE_MS, DISPATCH_HOSTED_GROOMER_ENABLED,
DISPATCH_GROOMER_*, DISPATCH_LLM_API_KEY, DISPATCH_LLM_BASE_URL,
DISPATCH_AGENT_NAME, DISPATCH_CLOSED_ISSUE_RETENTION_DAYS,
DISPATCH_DONE_RETENTION_DAYS, DISPATCH_SCHEDULER_*,
DISPATCH_SYNC_INTERVAL_MS, DISPATCH_GROOMER_INTERVAL_MS,
DISPATCH_PR_FOLLOWUP_INTERVAL_MS, DISPATCH_PRUNE_CLOSED_INTERVAL_MS,
WEBHOOK_SECRET, WEBHOOK_GATEWAY_MODE, PR_FOLLOWUP_BOT_IDENTITIES,
PR_FOLLOWUP_BRANCH_OWNERS, OPENAI_API_KEY, OPENAI_BASE_URL, and
OPENAI_MODEL.
- .env.example also explicitly excludes the framework/build-time vars
(NODE_ENV, NEXT_RUNTIME, NEXT_PUBLIC_DISPATCH_VERSION) and the legacy
aliases (MISSION_CONTROL_URL, MISSION_CONTROL_AGENT_TOKEN) with comments
explaining why.
- README.md gains a new "Auth, Triage, Queue, and Webhooks" table that
matches the new .env.example entries, so the two documents agree.
The deepmerge-ts override added in 2f0d8c1 is left in place; `npm audit`
reports 0 vulnerabilities. Full vitest suite (2288 tests), `tsc --noEmit`,
and `eslint .` all pass.
Fixes#763
Signed-off-by: Saffron <263493777+itsmiso-ai@users.noreply.github.com>
Co-authored-by: Saffron <263493777+itsmiso-ai@users.noreply.github.com>
@its-saffronits-saffronBot mentioned this pull request Aug 19, 2026
Sign up for freeto 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

@joryirving
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix(deps): override deepmerge-ts to clear GHSA-ggr8-5vv4-36mx - #785

Merged
joryirving merged 1 commit into
mainfrom
fix/deepmerge-ts-advisory
Aug 18, 2026
Merged

fix(deps): override deepmerge-ts to clear GHSA-ggr8-5vv4-36mx#785
joryirving merged 1 commit into
mainfrom
fix/deepmerge-ts-advisory

Conversation

@joryirving

Copy link
Copy Markdown
Contributor

Summary

  • Add overrides.deepmerge-ts: ^8.0.0 to clear GHSA-ggr8-5vv4-36mx, and record the rationale in the existing "//" block.

Why

npm audit fails on main right now with 3 high-severity findings. deepmerge-ts reaches us transitively through prisma > @prisma/config, and npm's only advertised stable fix is downgrading prisma to 6.12.0, which is breaking — so an override is the cheaper path, consistent with how postcss and sharp are already handled.

The advisory published 2026-08-17T13:32:13Z, 48 minutes after main's last npm audit run passed at 12:44:47Z. So main's green check is stale rather than accurate, and every PR opened since has failed an audit for something it did not introduce.

That is not hypothetical: four open foreman PRs (#779, #780, #781, #783) each independently added their own copy of this same pin while trying to work unrelated issues. Fixing it once here removes the trigger.

Notes

  • Renovate did not catch this, and the reason is worth recording: it sources vulnerabilities from Dependabot alerts, and those are disabled org-wide (dependabot_alerts_enabled_for_new_repositories: false, and the alerts endpoint returns an empty array for this repo). Renovate's scan logged "No vulnerability alerts found" and correctly did nothing. Enabling org-level alerts is the durable fix and is out of scope here.
  • osvVulnerabilityAlerts would not have helped either — it covers direct dependencies only, and this is transitive.

Verification

  • npm audit --omit=dev: 3 high → found 0 vulnerabilities
  • npx tsc --noEmit: clean
  • npm run test: 126 files, 2288 tests passing
  • resolved version is deepmerge-ts@8.0.1

@joryirving
joryirving enabled auto-merge (squash) August 18, 2026 02:14
@joryirving
joryirving merged commit e53a6ec into mainAug 18, 2026
7 checks passed
@joryirving
joryirving deleted the fix/deepmerge-ts-advisory branch August 18, 2026 02:15

@its-saffronits-saffronBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AI Automated Review

Full PR review.

Analysis engine: dsv4f@https://litellm.jory.dev/v1 (openai) — primary route

Recommendation

Approve. This PR adds an npm overrides pin for deepmerge-ts ^8.0.0 to remediate GHSA-ggr8-5vv4-36mx, which reaches the repo transitively via prisma > @prisma/config. The change is minimal (package.json + lockfile), the rationale is documented in the existing "//" overrides block, and all CI checks — including npm audit, Typecheck, Lint, Tests, and Build — pass on the head commit.

Change-by-Change Findings

package.json

  • Adds "deepmerge-ts": "^8.0.0" to the existing overrides block, alongside the pre-existing postcss and sharp pins. This is consistent with the repository's established pattern for remediating transitive advisories.
  • The "//" rationale block is updated to explain the advisory (GHSA-ggr8-5vv4-36mx, stack exhaustion, published 2026-08-17), the transitive path (prisma > @prisma/config), and why an override is preferred over npm's only advertised stable fix (downgrading prisma to 6.12.0, which would be breaking). This matches the documented convention that overrides must not be removed without verifying the originating transitive deps have shipped patched versions.

package-lock.json

  • deepmerge-ts resolves from 7.1.5 to 8.0.1 with a matching integrity hash and updated funding metadata. The lockfile change is consistent with the override.

Breaking-Change Assessment

The override forces deepmerge-ts from 7.1.5 to 8.0.1, and v8.0.0 is a major release with breaking changes (deep Map-value merging by default, renamed DeepMergeMetaMetaData/DeepMergeIntoFunctionUtils types, and deepmergeInto no longer leak-mutating inputs). However, deepmerge-ts is a transitive dependency here — the repo does not import it directly — so the breaking changes only matter if @prisma/config (the consumer) is incompatible with v8. The full test suite (2288 tests across 126 files, per the PR body) and the Typecheck CI job both pass, which is strong evidence that Prisma's use of the library is compatible with v8.0.1. No direct usage of deepmerge-ts exists in the repo's source.

Standards Compliance

  • The change follows the repository's documented override convention: pins live in the top-level overrides block, and the rationale is recorded in the "//" field because npm validates overrides entries strictly.
  • No secrets, env files, or build output are committed.
  • The PR is a dependency-update task, which AGENTS.md classifies as NORMAL-lane work; the change is scoped and testable.

Tool Harness Findings

  • GitHub release data for deepmerge-ts confirms v8.0.1 (2026-08-16) is a bug-fix release on top of v8.0.0, and v8.0.0 (2026-08-16) is the major release containing the breaking changes and the security-relevant fixes. The resolved lockfile version 8.0.1 is the latest available.
  • The GitHub advisory page for GHSA-ggr8-5vv4-36mx could not be fetched directly (the API endpoint returned 404 and the HTML fetch returned an unparseable page), so the advisory's exact affected-range and patched-version metadata could not be independently confirmed from the advisory itself. The PR body and the package.json rationale both cite the advisory ID and describe it as a stack-exhaustion issue; the npm audit CI check passing on the head commit is the authoritative confirmation that the override clears the finding.

Unknowns or Needs Verification

  • The advisory page itself was not directly verifiable during this review (fetch/API 404). The passing npm audit CI check on the head commit is the primary evidence that the override resolves the finding; if the advisory page becomes available, it would be worth confirming the patched range includes 8.0.1.
  • No host-platform compatibility matrix applies here: this is a pure npm dependency override, not a bump to a component that runs on a pinned host OS or alongside a pinned peer platform.

Must-Check Items

  • Check for breaking API changes in updated dependencies: Verified. deepmerge-ts v8.0.0 has breaking changes, but the package is transitive-only (via prisma > @prisma/config); Typecheck and the full test suite pass, indicating no incompatibility with the consumer.
  • Run full test suite after upgrade: Verified. The Tests CI check is green on the head commit, and the PR body reports 126 files / 2288 tests passing.

Comment threadpackage.json
},
"//": {
"overrides": "These pins exist to remediate npm advisories (originally added in #350). DO NOT remove without verifying the originating transitive deps have shipped patched versions: postcss ^8.5.10 (XSS-class advisory), sharp ^0.35.0 (libvips CVE-2026-33327/33328/35590/35591, #675 already satisfied transitively by next@16.3.0's optional dep `sharp: ^0.35.3`, but the override survives any future `next` downgrade). npm validates every entry of `overrides` strictly, so this rationale lives at the top level rather than inside the `overrides` block."
"overrides": "These pins exist to remediate npm advisories (originally added in #350). DO NOT remove without verifying the originating transitive deps have shipped patched versions: postcss ^8.5.10 (XSS-class advisory), sharp ^0.35.0 (libvips CVE-2026-33327/33328/35590/35591, #675 \u2014 already satisfied transitively by next@16.3.0's optional dep `sharp: ^0.35.3`, but the override survives any future `next` downgrade, deepmerge-ts ^8.0.0 (stack-exhaustion GHSA-ggr8-5vv4-36mx, published 2026-08-17 \u2014 reaches us transitively via prisma > @prisma/config; npm's only advertised stable fix is downgrading prisma to 6.12.0, a breaking change, so the override is the cheaper path)). npm validates every entry of `overrides` strictly, so this rationale lives at the top level rather than inside the `overrides` block."

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Info: The GHSA-ggr8-5vv4-36mx advisory page could not be fetched during review; the passing npm audit CI check is the authoritative confirmation that the override clears the finding.

Automated finding from AI PR review.

itsmiso-ai added a commit that referenced this pull request Aug 18, 2026
…ADME.md
The previous PR (#785) only pinned deepmerge-ts in package.json/package-lock.json
to clear the npm audit failure, but the original issue (#763) asked for the
~20 env vars read by src/ to be documented in .env.example (with AGENTS gaining
its first documented entry) and for the README env tables to agree with
.env.example.
This commit completes that work:
- .env.example gains commented examples for AGENTS, AUTH_URL,
DISPATCH_EXCLUDED_LABELS, DISPATCH_LANE_CONFIG_JSON,
DISPATCH_QUEUE_AGING_DAYS_PER_TIER, DISPATCH_QUEUE_AGING_MAX_TIERS,
DISPATCH_SYNC_LOCK_MAX_AGE_MS, DISPATCH_HOSTED_GROOMER_ENABLED,
DISPATCH_GROOMER_*, DISPATCH_LLM_API_KEY, DISPATCH_LLM_BASE_URL,
DISPATCH_AGENT_NAME, DISPATCH_CLOSED_ISSUE_RETENTION_DAYS,
DISPATCH_DONE_RETENTION_DAYS, DISPATCH_SCHEDULER_*,
DISPATCH_SYNC_INTERVAL_MS, DISPATCH_GROOMER_INTERVAL_MS,
DISPATCH_PR_FOLLOWUP_INTERVAL_MS, DISPATCH_PRUNE_CLOSED_INTERVAL_MS,
WEBHOOK_SECRET, WEBHOOK_GATEWAY_MODE, PR_FOLLOWUP_BOT_IDENTITIES,
PR_FOLLOWUP_BRANCH_OWNERS, OPENAI_API_KEY, OPENAI_BASE_URL, and
OPENAI_MODEL.
- .env.example also explicitly excludes the framework/build-time vars
(NODE_ENV, NEXT_RUNTIME, NEXT_PUBLIC_DISPATCH_VERSION) and the legacy
aliases (MISSION_CONTROL_URL, MISSION_CONTROL_AGENT_TOKEN) with comments
explaining why.
- README.md gains a new "Auth, Triage, Queue, and Webhooks" table that
matches the new .env.example entries, so the two documents agree.
The deepmerge-ts override added in 2f0d8c1 is left in place; `npm audit`
reports 0 vulnerabilities. Full vitest suite (2288 tests), `tsc --noEmit`,
and `eslint .` all pass.
Fixes#763
Signed-off-by: Saffron <263493777+itsmiso-ai@users.noreply.github.com>
joryirving pushed a commit that referenced this pull request Aug 18, 2026
The previous PR (#785) only pinned deepmerge-ts in package.json/package-lock.json
to clear the npm audit failure, but the original issue (#763) asked for the
~20 env vars read by src/ to be documented in .env.example (with AGENTS gaining
its first documented entry) and for the README env tables to agree with
.env.example.
This commit completes that work:
- .env.example gains commented examples for AGENTS, AUTH_URL,
DISPATCH_EXCLUDED_LABELS, DISPATCH_LANE_CONFIG_JSON,
DISPATCH_QUEUE_AGING_DAYS_PER_TIER, DISPATCH_QUEUE_AGING_MAX_TIERS,
DISPATCH_SYNC_LOCK_MAX_AGE_MS, DISPATCH_HOSTED_GROOMER_ENABLED,
DISPATCH_GROOMER_*, DISPATCH_LLM_API_KEY, DISPATCH_LLM_BASE_URL,
DISPATCH_AGENT_NAME, DISPATCH_CLOSED_ISSUE_RETENTION_DAYS,
DISPATCH_DONE_RETENTION_DAYS, DISPATCH_SCHEDULER_*,
DISPATCH_SYNC_INTERVAL_MS, DISPATCH_GROOMER_INTERVAL_MS,
DISPATCH_PR_FOLLOWUP_INTERVAL_MS, DISPATCH_PRUNE_CLOSED_INTERVAL_MS,
WEBHOOK_SECRET, WEBHOOK_GATEWAY_MODE, PR_FOLLOWUP_BOT_IDENTITIES,
PR_FOLLOWUP_BRANCH_OWNERS, OPENAI_API_KEY, OPENAI_BASE_URL, and
OPENAI_MODEL.
- .env.example also explicitly excludes the framework/build-time vars
(NODE_ENV, NEXT_RUNTIME, NEXT_PUBLIC_DISPATCH_VERSION) and the legacy
aliases (MISSION_CONTROL_URL, MISSION_CONTROL_AGENT_TOKEN) with comments
explaining why.
- README.md gains a new "Auth, Triage, Queue, and Webhooks" table that
matches the new .env.example entries, so the two documents agree.
The deepmerge-ts override added in 2f0d8c1 is left in place; `npm audit`
reports 0 vulnerabilities. Full vitest suite (2288 tests), `tsc --noEmit`,
and `eslint .` all pass.
Fixes#763
Signed-off-by: Saffron <263493777+itsmiso-ai@users.noreply.github.com>
Co-authored-by: Saffron <263493777+itsmiso-ai@users.noreply.github.com>
@its-saffronits-saffronBot mentioned this pull request Aug 19, 2026
Sign up for freeto 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

@joryirving