Skip to content

chore: back-merge main into develop, and clear three high advisories reddening CI - #211

Merged
mahmutkaya merged 48 commits into
developfrom
chore/back-merge-main-into-develop
Sep 2, 2026
Merged

mahmutkaya merged 48 commits into
developfrom
chore/back-merge-main-into-develop

Conversation

@mahmutkaya

@mahmutkaya mahmutkaya commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Two commits, both required to unblock release #210.

1. Back-merge — ancestry only, zero content change

Release PR #210 is refused by the main-develop ruleset's strict up-to-date rule. That is a commit-graph fact, not a content one: every release merges develop → main as a merge commit, so develop is BEHIND the moment a release lands and stays there until back-merged.

"BEHIND" and "main holds something develop lacks" are different claims, so the content test ran first:

  • no main-only files — git diff --diff-filter=A --name-only origin/develop origin/main is empty
  • git merge-tree --write-tree origin/main origin/develop → CLEAN
  • the only lines the raw diff attributes to main are develop's own refactors: main calls buildTenantRegistryEntry(input) where develop calls buildTenantRegistryEntry({ ...input, partnerBrand }), a strict superset; and "domains" is present in all six locales on both sides

Asserted, not assumed: after the merge, git diff --stat origin/develop HEAD is empty. The control is git diff --stat origin/develop origin/main, which is not empty (25 files, 1730 deletions) — so the empty result means something.

2. Three high advisories that were already red on develop

develop has been failing CI at 48091a5 — the commit this branch was cut from — so these were not introduced here. Three jobs, one cause. Trivy is named "misconfig + secrets" but was reporting dependency CVEs, so it, OSV-Scanner and npm audit (high+) all named the same packages:

package was advisory needs
browserslist 4.28.4 CVE-2026-73088 / 73089 — prototype pollution, unbounded memory growth 4.28.7
mysql2 3.15.3 GHSA-3f6p-5ww8-9rcr — auth-plugin downgrade leaks plaintext credentials 3.22.0
fast-uri 3.1.5 4 advisories — SSRF, host confusion 3.1.6

fast-uri already had an override, at ^3.1.4, which resolved happily to the vulnerable 3.1.5. A pin that exists is not a pin that covers the advisory.

mysql2 arrives via prisma@7.8.0, whose CLI bundles a driver for every database it supports. Sofra is Postgres and never executes it — but the gate counts findings rather than judging them, and an unexecuted credential-leak path is still one if the graph shifts.

Fixed with overrides, not direct dependencies: none of the three is a direct dep, so declaring one would risk EOVERRIDE on any future spec mismatch. Resolved to browserslist 4.28.8, mysql2 3.24.3, fast-uri 3.1.7; npm audit reports 0 vulnerabilities.

Lockfile reconciled, not regenerated — npx npm@10 install --package-lock-only against the existing lock, so the linux-x64 optional binaries CI needs survive (58 before, 58 after; a from-scratch regen on macOS drops them). Verified with npx npm@10 ci --dry-run, the only local command that runs what CI runs.

Merge mode

Must land as a merge commit — a squash would drop the ancestry link and leave the next release to hit the same refusal. The merge gate detects this by asking whether base..head carries main's tip.

🤖 Generated with Claude Code

release(sofra): develop → main — onboard tenant picker (#49) + build-image CI (#48)
release: ADR-004 self-serve signup (sofra #59/#60/#61)
release(sofra): signup prefill + ADR-012 + OWNER role + provisioning trigger
release: fleet observability Phase 2 — /admin/fleet panel + ingest route (#69)
release: SofraPiwas branding + rename → sofrapiwas.com
release: advisory wave + module catalog + provisioning runbook in the PR
release: onboarding hardening + staging-box backend tag
release: admin sidebar nav + provisioning pickers
release: public signup configurator (#89)
release: O1 closing slices — provision prefill, slug checks, theme previews
release: O2 self-serve account + payment, and its unmocked E2E suite
release: correct the signup price hint (copy only)
release: payment-triggered provisioning + the owner dashboard (O3 + O4 part 1)
release: staging control plane, /api/health, and the backend_tag fix
release: online-payments in the module catalog (S10)
release: sell online-payments, with the provisioning landmine disarmed (#117 + #118)
release: billing identity, VAT treatment and invoicing (B1–B7, B9)
release: the imprint reads runtime config
release: invoice a buyer with no VAT number, and delete a test plan
release: a self-serve signup could no longer pay
release: no sandbox sender fallback
release: the three mails the funnel never sent (go-live, receipt, reply-to)
release: G5 — signup stops promising an email that was never sent
release: G16 — delivery outcome visible in /admin
release(sofra): unblock the Sonar gate + refuse an unknown tenant language on the provision form
release: sofra develop → main (Sonar gate cleared, deepmerge-ts CVE, CI batch)
release: sofra develop → main (Q3 billing policy in the FAQ)
release: O7 P3 + P4 — the founder sees the account, the buyer is told
release: the partner page becomes manageable (#163)
release: the free month becomes a policy instead of an accident (#165)
mahmutkaya and others added 18 commits August 20, 2026 01:36
release: tell the partner before the free month ends (#167)
release: a partner can bring their own domain (#169, #170)
release: the owner's window onto tenant backups (#172)
release: privacy notice states the 24-month backup archive (#174, #175)
release: backup alerting — a restaurant that is not protected now reaches a human
release: correct the backup alarm — both of its first-run alerts were structural false positives
release: one backup-agent credential per box
release: retire the shared backup-agent secret
release: ADR-014 D6 — why restore is not a button
release: the backups row in CLAUDE.md carries all five rules
release: /admin/backups agrees with its own alarm
release: the single-site signal is real, and re-armed
release: self-service invite re-send (G12)
release: docs — the five surfaces that must not have a guard
release: partner DNS panel (#198)
release: country codes that name a country, mail in the customer's language, and no addresses in the log
Release PR #210 is refused by the `main-develop` ruleset's strict up-to-date
rule: develop's tip does not contain main's tip. That is a commit-graph fact,
not a content one — every release merges develop→main as a merge commit, so
develop is BEHIND the moment a release lands and stays there until it is
back-merged.

Content-tested first, because "BEHIND" and "main holds something develop lacks"
are different claims:

  * no main-only files at all (`git diff --diff-filter=A` is empty)
  * `git merge-tree --write-tree` CLEAN
  * the only lines the diff attributes to main are develop's own refactors —
    main calls `buildTenantRegistryEntry(input)` where develop calls
    `buildTenantRegistryEntry({ ...input, partnerBrand })`, a strict superset,
    and the `"domains"` message key is present in all six locales on BOTH sides

So this merge exists to record ancestry and nothing else. The resulting tree is
identical to develop's, which is asserted below rather than assumed.

Merged as a real merge commit: a squash would keep the (empty) content change
and drop the ancestry link, leaving the next release to hit the same refusal.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
`develop` has been red at 48091a5 — the commit this branch was cut from — with
three jobs failing on one cause. Trivy is named "misconfig + secrets" but was
reporting dependency CVEs, so it, OSV-Scanner and `npm audit (high+)` were all
naming the same packages:

  browserslist  4.28.4  CVE-2026-73088/73089  prototype pollution + unbounded
                                              memory growth      -> 4.28.7
  mysql2        3.15.3  GHSA-3f6p-5ww8-9rcr   auth-plugin downgrade leaks
                                              plaintext credentials -> 3.22.0
  fast-uri      3.1.5   4 advisories          SSRF + host confusion -> 3.1.6

`fast-uri` already had an override, at `^3.1.4`, which happily resolved to the
vulnerable 3.1.5 — a pin that exists is not the same as a pin that covers the
advisory.

`mysql2` arrives through `prisma@7.8.0`, whose CLI bundles a driver for every
database it supports. Sofra is Postgres and never executes it, but the merge
gate counts findings rather than judging them, and an unexecuted credential-leak
path is still a credential-leak path if the dependency graph ever shifts.

Fixed with `overrides` rather than direct dependencies: none of the three is a
direct dep, so declaring one would risk EOVERRIDE on any future spec mismatch.
Resolved to browserslist 4.28.8, mysql2 3.24.3, fast-uri 3.1.7 — `npm audit`
now reports 0 vulnerabilities.

Lockfile reconciled with `npx npm@10 install --package-lock-only` against the
existing lock rather than regenerated from scratch, so the linux-x64 optional
binaries CI needs survive: 58 before, 58 after. Verified with
`npx npm@10 ci --dry-run`, the only local command that runs what CI runs.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@mahmutkaya mahmutkaya changed the title chore: back-merge main into develop (ancestry only, unblocks release #210) chore: back-merge main into develop, and clear three high advisories reddening CI Sep 2, 2026
@sonarqubecloud

sonarqubecloud Bot commented Sep 2, 2026

Copy link
Copy Markdown

@mahmutkaya
mahmutkaya merged commit c5b0201 into develop Sep 2, 2026
18 checks passed
@mahmutkaya
mahmutkaya deleted the chore/back-merge-main-into-develop branch September 2, 2026 17:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant