This repo squash-merges, and the squash commit subject is the PR title
(GitHub setting: "Pull request title and description"). release-please then
parses that subject as a Conventional Commit
to build CHANGELOG.md and pick the next version. A non-conventional PR
title is silently dropped from the changelog - it does not fail the release,
it just vanishes from the notes (this is exactly what happened to #37, whose
title was Comprehensive UI/UX overhaul ...).
So whenever you open or rename a PR, the title MUST be:
type(optional-scope): short imperative summary
- Allowed types:
feat,fix,perf,refactor,docs,test,build,ci,chore,style,revert. - Version impact (post-1.0):
feat-> minor (x.Y.0),fix/perf-> patch. A breaking change uses a!(feat!:/fix(core)!:) or aBREAKING CHANGE:footer in the PR body and bumps the major (X.0.0). (bump-minor-pre-majoris still set inrelease-please-config.jsonbut is inert now that the version is >= 1.0.0.) - Changelog-visible by default:
feat(Features),fix(Bug Fixes),perf,revert, anddeps(Dependencies). The rest -docs,chore,ci,build,refactor,style,test- are valid but hidden: a PR titled with one of those passes the title gate yet produces no changelog entry and no version bump. So pick the accurate type - do NOT downgrade a real feature/fix tochore:/docs:just to clear the red X, or the change silently vanishes from the release notes (the same failure that hit #37, only self-inflicted). - Scope is optional. Common scopes here:
core,cli,ui,updater,telemetry,ci,landing,capstone. - Subject after the colon may use any case (so
OAuth,CLI,macOSare fine); just keep it short and imperative, no trailing period.
Good: feat(ui): redesign the setup wizard,
fix(updater): floor the dev channel to stable,
ci: enforce conventional PR titles.
Bad: Comprehensive UI/UX overhaul, Update stuff, WIP.
Individual commits on a feature branch do not need to be conventional -
they are squashed away (squash is the only merge method enabled on this repo),
so only the PR title reaches main. Don't waste effort rewriting branch commit
messages.
.github/workflows/pr-title.yml (amannn/action-semantic-pull-request)
validates the title on every PR and is a required status check in the
main protection ruleset, so a bad title blocks the merge. If a title is
fixed after the fact, editing it re-runs the check automatically. The repo
owner has ruleset bypass, so this is block-by-default, overridable in a pinch -
prefer fixing the title over bypassing.
- Every push to
mainupdates the openchore(main): release X.Y.ZPR with the accumulated changelog + version bumps (Cargo.tomlworkspace version,src-tauri/tauri.conf.json,ui/package.json- seerelease-please-config.json). - Merging that release PR creates the
vX.Y.Ztag, which firesrelease.yml(the build/sign/publish pipeline). Don't tag by hand. - If a change already landed on
mainwith a non-conventional subject and is missing from the release PR, backfill it with an empty conventional commit:git commit --allow-empty -m "feat: <restated summary> (#NN)"then push. release-please will parse it and add the entry (it even linkifies(#NN)). A revert is not the fix - it would undo the change onmain.
Before hand-testing anything or asking the owner to QA, read the repo skill
.claude/skills/driven-agent-qa/SKILL.md. It documents the four-layer test
stack and the agent-facing entry points:
just e2e- containerized app-level e2e: the REAL Linux desktop app driven over WebDriver (wizard, backup -> restore round trips, fault scenarios). Real destinations are sidecar subprocesses inside that image, not a compose stack: MinIO + toxiproxy (crates/driven-e2e/src/scenarios/s3.rs) and an OpenSSH server (.../scenarios/sftp.rs, key auth against an unprivileged sshd). Copy one of those two stacks when adding a backend.just e2e-hold- boot the container and drive the app interactively (WebDriver on :4444, IPC viawindow.__TAURI_INTERNALS__.invoke, faults via toxiproxy/iptables, screenshots for vision review).- Seams:
DRIVEN_DATA_DIR(isolated instances),DRIVEN_TEST_FAULT_PLAN(fault-inject a running app's fake remote),DRIVEN_E2E_HOOKS=1(headless dialog-token minting). pnpm -C ui run test:visual- Playwright visual regression against committed linux baselines (just visual-updateregenerates via Docker).- CI:
.github/workflows/e2e.ymlgates releases (tag -> e2e + visual -> build). Deliberately NOT per-PR; manual runs via workflow_dispatch.
Whenever you open a PR, check README.md before creating it, and update it in
the SAME PR when either applies:
- Out-of-date claims: anything the PR makes stale - feature lists, backend or destination lists, settings locations (pages move), keychain service names, comparison-table cells and their numbered notes, CLI flags, version references, caveats that no longer hold.
- Missing / omitted information: a user-visible feature, destination, setting, or caveat the PR adds that the README does not mention.
The README is the public front door of a public repo; a shipped feature that is not in it effectively does not exist, and a stale claim is worse than no claim. Doc-only follow-ups get forgotten - that is why this rides in the same PR. Pure-internal PRs (CI, tests, refactors with no user-visible change) can state "README checked, no changes needed" in the PR body and move on.