Skip to content

chore(release): merge main into develop - #579

Merged
github-actions[bot] merged 15 commits into
developfrom
chore/backmerge-main-ancestry
Aug 22, 2026
Merged

chore(release): merge main into develop#579
github-actions[bot] merged 15 commits into
developfrom
chore/backmerge-main-ancestry

Conversation

@tomymaritano

Copy link
Copy Markdown
Collaborator

Establishes main as an ancestor of develop so the promotion PR #571 can satisfy main's up-to-date requirement.

This must be merged with a merge commit, not squashed. #578 squashed the same content and that is exactly why it did not work: a squash replays the changes as a new commit, so main's commits never become ancestors of develop and #571 stayed BEHIND. git merge-base --is-ancestor origin/main origin/develop still failed after it.

git diff origin/develop on this branch is empty#578 already brought the content across. This PR carries ancestry only.

🤖 Generated with Claude Code

tomymaritano and others added 15 commits June 9, 2026 11:13
## Release v0.15.1 — Phase 0 DevOps stabilization

Brings the 7-PR DevOps cleanup chain to main and cuts a clean release.
This is the verification gate for the whole Phase 0 effort — if anything
breaks at tag, build, or publish, Phase 0 isn't done.

### What landed since v0.15.0

| PR | Phase | Summary |
|----|-------|---------|
| #290 | **A1** | \`fix(desktop)\`: pin Electron to ^41.7.1 so
better-sqlite3 prebuilts apply (closes the v0.15.0 V8 ABI failure on all
3 build platforms) |
| #291 | **A2** | \`fix(release)\`: restore version bumping via
\`scripts/bump-version.mjs\` + \`@semantic-release/exec\` (closes the
"tag at 0.14.0" trap) |
| #292 | **B** | \`chore(ci)\`: workflow surface cleanup — actions
@v4@v5 sweep, \`windows-latest\` → \`windows-2025-vs2026\` pin, drop
\`FORCE_JAVASCRIPT_ACTIONS_TO_NODE24\`, \`if-no-files-found: error\`,
\`permissions:\` blocks, HUSKY: '0' removal |
| #293 | **A4** | \`chore(ci)\`: \`release.yml\` pre-flight dry-run gate
+ post-flight version assertion (closes the "silent no-release" trap) |
| #294 | **C1** | \`ci\`: PR-title commitlint as a standalone workflow →
required check on develop + main |
| #295 | | \`fix(lint)\`: develop lint baseline (preserve-caught-error ×
4 in encryptionService + mcp-server tsconfig split for ESLint
projectService) |
| #296 | | \`chore(ci)\`: unblock CI on develop — ignore CHANGELOG.md in
Prettier (semantic-release writes it), \`pnpm install --ignore-scripts\`
in setup job (same shape as release.yml + deploy-api.yml) |

### C2 — branch protection updates (already applied via gh api)

Both \`develop\` and \`main\`:
- **Required status checks**: \`lint\`, \`test\`, \`typecheck\`,
\`CodeRabbit\`, \`commitlint\`
- Force-pushes blocked
- \`strict: true\` (PRs must be up to date)

### Release pipeline guardrails now in place

- **Pre-merge**: PR-title commitlint blocks \`release:\`-style
non-conventional squash titles upstream.
- **Mid-release**: \`release.yml\` dry-run check fails loud if no
release would be cut. \`scripts/bump-version.mjs\` mutates both
\`package.json\` files. Post-flight assertion verifies both match the
dry-run-announced version.
- **Post-release**: \`build.yml\` artifact upload uses
\`if-no-files-found: error\` (silent zero-asset releases die at upload).
- **Native deps**: \`apps/desktop\` pinned to Electron 41.7.1 with
prebuilt better-sqlite3. CI \`setup\` skips postinstall so workflow-side
install never rebuilds native modules.

### Expected behavior of the Release pipeline after merge

1. Merge this PR → main tip advances.
2. Manually dispatch the **Release** workflow.
3. \`release.yml\` runs:
- \`pnpm install --ignore-scripts\` (no native rebuild needed for
semantic-release).
- **Pre-flight dry-run** → "next release version is 0.15.1" (single
\`fix(release):\` commit since v0.15.0).
   - \`npx semantic-release\`:
- \`@semantic-release/exec\` runs \`node scripts/bump-version.mjs
0.15.1\` → both package.json files updated.
     - \`@semantic-release/git\` commits + pushes tag \`v0.15.1\`.
     - \`@semantic-release/github\` creates draft Release.
   - **Post-flight assertion** → both package.jsons read \`0.15.1\`.
4. Tag push triggers \`build.yml\` on macOS-14, windows-2025-vs2026,
ubuntu-latest.
5. All 3 platforms succeed → publish job un-drafts the GitHub Release.
6. Auto-sync PR opens to merge main → develop.

### What still needs verification (post-release)

- [ ] Tag push actually triggers Build (needs GH_TOKEN with workflow
scope — A3 deferred, may need PAT regen)
- [ ] Build completes on all 3 platforms with prebuilt better-sqlite3
(smoke-test desktop bundle after publish)
- [ ] Auto-sync PR back to develop is created

🤖 This is the Phase 0 verification gate. Mobile + Plugin Marketplace UI
remain deferred.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **New Features**
* Added PR title validation workflow for automated commit message
compliance checks.

* **Bug Fixes**
  * Enhanced error diagnostics in encryption operations.
* Added pre-flight checks to release process to prevent failed
deployments.
  * Stricter artifact validation in builds.

* **Chores**
  * Updated GitHub Actions to latest stable versions.
  * Improved code formatting configuration and build scripts.
  * Adjusted Electron dependency version.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
## Why

v0.15.1 Build (run 27212685957) failed on linux because electron-builder
rejected the AppImage build: \`executableName contains invalid chars:
@readieddesktop\`. publish job (\`needs: build\`) was skipped, no
binaries reached the GitHub Release, v0.15.1 has been marked draft.

This brings the linux fix from #298 (already on develop) into main as a
cherry-pick so semantic-release can cut v0.15.2.

## Why not the original develop → main PR (#299)

I created a sync PR (#300) earlier to bring main's release-cycle commits
(CHANGELOG + version bump) back to develop. Squash-merging that sync PR
collapsed the merge ancestry — develop has main's content but not main's
commit history, so #299 stayed permanently BEHIND.

Cherry-picking the linux fix straight to main sidesteps that. After this
lands and Release cuts v0.15.2, the auto sync-develop job in build.yml
will bring the v0.15.2 release commits back to develop with proper
ancestry.

## Diff

\`apps/desktop/package.json\`: \`"executableName": "readied"\` added to
\`build.linux\`. Single line. mac+win already build cleanly because they
use \`productName\` ("Readied") and \`appId\` (\`app.readied.desktop\`)
respectively.

## Expected Build flow

semantic-release reads main's commit log since v0.15.1:
- \`fix(desktop): set linux.executableName for AppImage build (#298)\` →
patch bump

→ v0.15.2 cut as draft → Build runs on mac/win/linux → all 3 publish to
draft → \`publish\` job undrafts → \`sync-develop\` PRs main → develop.
## Summary

Release PR: `develop` → `main`. Contains one user-facing fix since
v0.15.2:

- **fix(desktop): prevent 'Object has been destroyed' and 'db not open'
crashes** (#303) — guards window and database lifecycle so IPC handlers
don't touch a destroyed `BrowserWindow` or a closed SQLite handle during
shutdown/reload.

semantic-release should cut **v0.15.3** (patch bump from the `fix:`
commit).

## Release checklist (after merge)

1. Merge this PR into `main`
2. Click **Run workflow** on the **Release** action
(`workflow_dispatch`)
3. semantic-release bumps version, tags, creates draft GitHub Release
4. Tag push triggers Build workflow (mac/win/linux)
5. All builds green → release undrafted → electron-updater picks it up
6. Auto-PR syncs `main` back to `develop`

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Keep develop for product and CI. Take main's CHANGELOG so 0.15.3 is
not dropped. This branch is the promotion head — merge to main with
a merge commit, never squash.
Release runs on every push to `main`. No PAT, no **Run workflow**.

`feat` / `fix` since `v0.15.3` will cut **0.16.0**. Build starts from
`workflow_run` (must already be on develop — merge that PR first).

**Do not squash the previous promotion.** This PR is a `ci:` fix and can
squash.

See `docs/RELEASE.md`.
The repo is \`dripnex/app\`. semantic-release compared that to
\`dripnex/readide\` in package.json and aborted. This is why the first
automatic Release failed even though the bot can push.

Merging this to main retriggers Release and should cut 0.16.0.
Dry-run already announced 0.16.0, then our grep matched the same phrase
inside generated notes and skipped the actual release. Tightened the
match.
main is protected (PR + status checks). The git plugin tried to push the
version bump and got GH013. Tags only; binaries get the version in the
Build job.
Resolve conflicts so develop (#567 Settings plugin install) can land on
main with the existing semantic-release pipeline. Keep main's tag-without
bump-commit behavior and dripnex/app repo name.

Co-authored-by:  Tomás Maritano <tomymaritano@gmail.com>
Includes #567 Settings plugin install plus main's release-pipeline fixes (#537/#539/#540). Do not squash.
@github-actions
github-actions Bot enabled auto-merge (squash) August 22, 2026 21:53
@github-actions
github-actions Bot merged commit 00ac6d5 into develop Aug 22, 2026
16 checks passed
github-actions Bot pushed a commit that referenced this pull request Aug 22, 2026
## Problem

#566 made every non-draft PR into `develop` squash auto-merge. That
breaks the release flow, and I found it by hitting it twice.

A back-merge exists for its **topology**, not its content. Squashing one
replays `main`'s changes as a fresh commit, so `main` never becomes an
ancestor of `develop`. `main`'s ruleset has
`strict_required_status_checks_policy: true`, so the promotion PR #571
stays `BEHIND` forever.

Both #578 and #579 hit it. On #579 I explicitly ran `gh pr merge --auto
--merge`, and the workflow re-armed auto-merge with `--squash` and
overrode it. The resulting commit `00ac6d5` has a single parent, and
`git merge-base --is-ancestor origin/main origin/develop` still fails.

## Fix

Skip PRs whose head branch starts with `chore/backmerge-`. Those get
merged by hand with a merge commit.

Also documents the back-merge recipe in `docs/RELEASE.md` next to the
promotion steps, since the failure mode is silent — the PR just sits at
BEHIND with every check green and no explanation.

## Not changed

The auto-merge policy itself, permissions, and the
concurrency/live-recheck hardening from earlier in #566 all stay as they
are. This is one `if:` clause plus docs.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

🎉 This PR is included in version 0.17.0 🎉

The release is available on GitHub release

Your semantic-release bot 📦🚀

tomymaritano added a commit that referenced this pull request Aug 23, 2026
…585)

## Context

I enabled **Allow GitHub Actions to create and approve pull requests**
at the org and repo level, which unblocked `sync-develop` — it had been
failing with `GitHub Actions is not permitted to create or approve pull
requests` since forever. Re-running it against the v0.17.0 build now
succeeds.

But it immediately produced #584, which **cannot merge**.

## The problem

`sync-develop` opened a `develop ← main` PR. That shape deadlocks:
`develop` requires the head branch to be up to date, and `main` falls
behind `develop` the moment anything lands after the release — #582 and
#583 did exactly that. #584 has been sitting at `BEHIND` since it was
created. I hit the same wall by hand earlier tonight with #577.

Even if it could merge, the squash auto-merge would replay the content
as a fresh commit and **not** establish ancestry, which is the entire
point of a back-merge. That is what went wrong in #578 and #579.

## The fix

Push a branch descended from `develop` with `main` merged into it, then
open that against `develop`. Same thing that finally worked manually in
#581.

- Named `chore/backmerge-main-<tag>`, which matches the exclusion added
in #580 so `automerge.yml` leaves it alone.
- The job arms auto-merge itself with `--merge`, so it lands as a merge
commit.
- Exits early when `main` is already an ancestor, or when the branch
already exists, so re-runs are safe.

## Follow-up

#584 should be closed — this replaces it. The next release will exercise
this path for real.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants