chore: back-merge main into develop, and clear three high advisories reddening CI - #211
Merged
Merged
Conversation
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: 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)
release: tell the partner before the free month ends (#167)
release: the owner's window onto tenant backups (#172)
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>
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.



Two commits, both required to unblock release #210.
1. Back-merge — ancestry only, zero content change
Release PR #210 is refused by the
main-developruleset's strict up-to-date rule. That is a commit-graph fact, not a content one: every release mergesdevelop → mainas a merge commit, sodevelopis 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:
git diff --diff-filter=A --name-only origin/develop origin/mainis emptygit merge-tree --write-tree origin/main origin/develop→ CLEANbuildTenantRegistryEntry(input)where develop callsbuildTenantRegistryEntry({ ...input, partnerBrand }), a strict superset; and"domains"is present in all six locales on both sidesAsserted, not assumed: after the merge,
git diff --stat origin/develop HEADis empty. The control isgit 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
develophas been failing CI at48091a5— 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 andnpm audit (high+)all named the same packages:browserslistmysql2fast-urifast-urialready 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.mysql2arrives viaprisma@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 riskEOVERRIDEon any future spec mismatch. Resolved to browserslist 4.28.8, mysql2 3.24.3, fast-uri 3.1.7;npm auditreports 0 vulnerabilities.Lockfile reconciled, not regenerated —
npx npm@10 install --package-lock-onlyagainst 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 withnpx 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..headcarries main's tip.🤖 Generated with Claude Code