Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
161 commits
Select commit Hold shift + click to select a range
ecd5cb6
[Chore] Pin Infinity image to immutable digest (#1756)
roomote-roomote[bot] Aug 27, 2026
32c9b14
[Docs] Show how to start from a new repository (#1751)
roomote-roomote[bot] Aug 27, 2026
b476e2b
[Fix] Suggested tasks do not appear in Teams and Telegram automation …
roomote-roomote[bot] Aug 27, 2026
926a737
[Fix] Session right rail stays open on mobile (#1758)
roomote-roomote[bot] Aug 28, 2026
c74776b
Disable Infinity anonymous telemetry in the compose bundle (#1762)
mrubens Aug 28, 2026
b39435a
[Chore] Disable Infinity anonymous telemetry (#1760)
roomote-roomote[bot] Aug 28, 2026
4371b29
Revert "Disable Infinity anonymous telemetry in the compose bundle (#…
mrubens Aug 28, 2026
5df5fa2
[Feat] Add public Discord context to Memory (#1761)
roomote-roomote[bot] Aug 28, 2026
d82bef8
Re-add DO_NOT_TRACK to the bundled Infinity service (#1764)
mrubens Aug 28, 2026
991fed0
feat: collect Linear issues into Brain (#1759)
roomote-roomote[bot] Aug 28, 2026
3dfd694
[Fix] PR remains blocked after Roomote findings are resolved (#1512)
roomote-roomote[bot] Aug 28, 2026
a59b564
Remove the Brain search reranker (#1768)
mrubens Aug 28, 2026
5e50b77
[Improve] Diagnose Fast inference retries precisely (#1770)
roomote-roomote[bot] Aug 28, 2026
86278c3
[Fix] Fast conversations lose context after cold starts (#1592)
roomote-roomote[bot] Aug 28, 2026
76c1102
Run Brain synthesis on the helper model; make Memory a settings toggl…
mrubens Aug 28, 2026
853fa95
[Feat] Let Fast attach Slack images to coding tasks (#1767)
roomote-roomote[bot] Aug 28, 2026
8ae821a
[Improve] Show Session orchestration in Costs by Type (#1775)
roomote-roomote[bot] Aug 28, 2026
044298f
[Fix] Gitea pull requests miss linked user assignments (#1507)
roomote-roomote[bot] Aug 28, 2026
fa988b5
[Feat] Make Sessions the primary workspace for Roomote work (#1708)
roomote-roomote[bot] Aug 28, 2026
281fc2a
[Feat] Start sessions from navigation (#1782)
roomote-roomote[bot] Aug 28, 2026
4900fcd
feat: show Memories in cost analytics (#1784)
roomote-roomote[bot] Aug 28, 2026
7f25be3
[Fix] Suggested tasks bypass the default session mode (#1778)
roomote-roomote[bot] Aug 28, 2026
2b6c9bb
[Fix] PR fixers no longer request duplicate reviews after pushes (#1780)
roomote-roomote[bot] Aug 28, 2026
5c381af
[Improve] Make Costs the default Analytics view (#1793)
roomote-roomote[bot] Aug 28, 2026
8a37700
[Fix] Task-only Sessions remain stuck on provisional titles (#1789)
roomote-roomote[bot] Aug 28, 2026
0089cd1
[Feat] Enable Memory by default for new hosted instances (#1786)
roomote-roomote[bot] Aug 28, 2026
956f597
[Improve] Link Fast sessions from coding pull requests (#1794)
roomote-roomote[bot] Aug 28, 2026
1c81ea9
[Feat] Forward Fast attachments to coding tasks (#1796)
roomote-roomote[bot] Aug 28, 2026
7ee65a1
[Improve] Give orchestrators complete coding task reports (#1791)
roomote-roomote[bot] Aug 28, 2026
9bd21fe
[Improve] Show recent sessions in the left rail (#1797)
roomote-roomote[bot] Aug 28, 2026
d8f9253
[Fix] Fast sessions no longer appear stuck on stale retry notices (#1…
roomote-roomote[bot] Aug 28, 2026
b1c2a60
[Refactor] Use one Fast attachment forwarding option (#1798)
roomote-roomote[bot] Aug 28, 2026
85c1afc
[Feat] Communicate with Fast sessions through Roomote MCP (#1790)
roomote-roomote[bot] Aug 28, 2026
88fa1d9
[Fix] Sessions show only Roomote in browser tabs (#1801)
roomote-roomote[bot] Aug 28, 2026
a07d441
fix: remove suggested task prompt prefix (#1803)
roomote-roomote[bot] Aug 28, 2026
7505951
[Fix] Code review check fails after a clean review (#1779)
roomote-roomote[bot] Aug 28, 2026
58aadfc
[Fix] User avatars show broken images in task views (#1800)
roomote-roomote[bot] Aug 28, 2026
32462dc
fix: show pull requests in Fast chat footers (#1809)
roomote-roomote[bot] Aug 28, 2026
283a154
[Fix] Fast session model selection reverts to default (#1806)
roomote-roomote[bot] Aug 28, 2026
555743f
[Feat] Complete Fast mode across chat providers (#1810)
roomote-roomote[bot] Aug 28, 2026
4bdb189
[Fix] Fast sessions omit pull request review actions (#1808)
roomote-roomote[bot] Aug 28, 2026
a3bc141
[Fix] Task startup times out when OpenCode server is healthy (#1769)
roomote-community[bot] Aug 28, 2026
95e0811
[Fix] Fast mode cannot explain GitHub Actions failures (#1438)
roomote-roomote[bot] Aug 28, 2026
58909c8
[Improve] Measure Fast first-response latency (#1799)
roomote-roomote[bot] Aug 28, 2026
d695335
[Fix] Fast replies to ambient participant conversations (#1459)
roomote-roomote[bot] Aug 28, 2026
bddd130
[Feat] Add live session links to Slack automation runs (#1812)
roomote-roomote[bot] Aug 28, 2026
ab1b4d3
[Fix] Review notifications omit response buttons in web tasks (#1443)
roomote-roomote[bot] Aug 28, 2026
9ee43ac
[Fix] Fast Slack kickoff keeps a stale Preparing workspace placeholde…
roomote-roomote[bot] Aug 29, 2026
a13f6cb
Make the Brain readiness gate provider-agnostic (#1815)
mrubens Aug 29, 2026
893effa
fix: hide internal ignore events from transcripts (#1819)
roomote-roomote[bot] Aug 29, 2026
8f0ddd8
[Improve] Start onboarding work in Sessions (#1817)
roomote-roomote[bot] Aug 29, 2026
bd52bfa
[Improve] Show artifact previews in Session execution details (#1821)
roomote-roomote[bot] Aug 29, 2026
3748f0d
fix: satisfy inference setup during local dev login (#1822)
roomote-roomote[bot] Aug 29, 2026
d55de21
[Fix] Discover pages inside shared Notion databases (#1825)
mrubens Aug 29, 2026
70199f6
[Fix] Recent session titles shift in the sidebar (#1818)
roomote-roomote[bot] Aug 29, 2026
f81894f
[Fix] Suggested automation tasks open sandbox cards instead of Fast S…
roomote-roomote[bot] Aug 29, 2026
c8c8332
fix(web): default mobile sessions to transcript (#1828)
roomote-roomote[bot] Aug 29, 2026
bd386a7
[Improve] Explain Roomote trial inference value (#1830)
roomote-roomote[bot] Aug 29, 2026
f05b9f1
[Feat] Let Fast respond to Slack reactions (#1831)
roomote-roomote[bot] Aug 29, 2026
94fb7f0
[Fix] Fast sessions show duplicate PR terminal notifications (#1832)
roomote-roomote[bot] Aug 29, 2026
a3d1124
feat: kick Brain ingestion jobs immediately when memory is enabled (#…
mrubens Aug 29, 2026
e6a46b8
[Feat] Let Fast respond to reactions across chat providers (#1834)
roomote-roomote[bot] Aug 29, 2026
66c60fd
fix: make fast-agent-title tests rerunnable against a persistent test…
mrubens Aug 29, 2026
3fc4501
feat: make a freshly enabled Memory usable within minutes (#1837)
mrubens Aug 29, 2026
f2052ec
[Feat] End setup in one Roomote session that launches the starter tas…
mrubens Aug 29, 2026
f89504f
[Improve] Find Sessions by conversation content (#1839)
roomote-roomote[bot] Aug 29, 2026
ee5cede
chore: record Roomote 0.45.1 on develop (#1841)
roomote-roomote[bot] Aug 29, 2026
18c15d9
[Refactor] Separate reusable task launching from Home (#1842)
roomote-roomote[bot] Aug 29, 2026
4526d35
[Docs] Add production hotfix path to release workflow (#1843)
roomote-roomote[bot] Aug 29, 2026
c36106a
fix: ride the helper model for Brain chat when no provider key exists…
mrubens Aug 29, 2026
e4e53ed
[Improve] Hide inline execution cards from Sessions (#1847)
roomote-roomote[bot] Aug 29, 2026
8dfd72a
[Fix] PR attribution follows the intended conversation participant (#…
roomote-roomote[bot] Aug 29, 2026
7dd7768
[Feat] Announce primary-branch pushes across source-control providers…
roomote-roomote[bot] Aug 29, 2026
cbdbe72
[Fix] Fast PR status reports the wrong destination branch (#1849)
roomote-roomote[bot] Aug 29, 2026
0920d1b
fix(web): keep session execution details closed by default (#1852)
roomote-roomote[bot] Aug 29, 2026
ad23aa8
[Feat] Render database property values into Notion Memory pages (#1848)
mrubens Aug 29, 2026
b29462a
[Improve] Show thinking state in Fast sessions (#1851)
roomote-roomote[bot] Aug 29, 2026
bb3d64a
[Improve] Match Session artifacts to the Task gallery (#1853)
roomote-roomote[bot] Aug 29, 2026
4a47a92
[Fix] Fast sessions ignore participants when someone else just spoke …
roomote-roomote[bot] Aug 29, 2026
725fdcc
[Fix] Stacked pending PR-review action cards in sessions (#1844)
mrubens Aug 29, 2026
4c11cb0
[Fix] Session sidebar closes when users open it from Slack links (#1854)
roomote-roomote[bot] Aug 29, 2026
1313764
[Improve] Simplify New Session launch surfaces (#1856)
roomote-roomote[bot] Aug 29, 2026
7900283
[Fix] Merge announcer destinations reset after saving (#1858)
roomote-roomote[bot] Aug 29, 2026
d022012
docs: sync public guides with shipped behavior (#1829)
roomote-community[bot] Aug 29, 2026
f05c17b
fix: bound Fast child reply relays (#1857)
roomote-roomote[bot] Aug 29, 2026
f93aef5
[Improve] Measure initial Fast session response latency (#1855)
roomote-roomote[bot] Aug 29, 2026
07f6225
fix: bind Slack Fast parent event replies (#1859)
roomote-roomote[bot] Aug 29, 2026
eb5812e
fix: format merge announcer Slack card (#1860)
roomote-roomote[bot] Aug 29, 2026
cf99334
[Improve] Summarize merged PR context in Merge Announcer (#1861)
roomote-roomote[bot] Aug 29, 2026
1fdf81d
[Improve] Make Merge Announcer entries concise and practical (#1864)
roomote-roomote[bot] Aug 30, 2026
17fc85c
[Improve] Include Linear issue metadata in Memory (#1865)
roomote-roomote[bot] Aug 30, 2026
75b369a
fix: link merge announcements to pull requests (#1866)
roomote-roomote[bot] Aug 30, 2026
596e5c7
docs: sync guides with recent shipped behavior (#1869)
roomote-community[bot] Aug 30, 2026
d54aa63
feat: show nested task startup progress (#1870)
roomote-roomote[bot] Aug 30, 2026
9d606d9
[Fix] Memory titles overflow the Explore memories card (#1766)
roomote-roomote[bot] Aug 30, 2026
ff680e1
feat: top up the cached corpus so fresh memories are visible instantl…
mrubens Aug 30, 2026
5f47aa3
fix: require direct proof-runner launch from the parent session (#1875)
mrubens Aug 30, 2026
1bec031
[Fix] Fast posts retry chatter and gives up on provider blips that co…
roomote-roomote[bot] Aug 30, 2026
4a9889a
[Fix] View changes falls back during GitHub merge state lag (#1876)
roomote-roomote[bot] Aug 30, 2026
5c91b58
[Fix] Child closeouts remain blocked after Fast parent timeout (#1868)
roomote-roomote[bot] Aug 30, 2026
75f25e6
[Fix] Parallel task launches from one Fast turn deadlock and block th…
mrubens Aug 30, 2026
57c1d73
[Fix] Queue Fast child events behind busy parents (#1879)
daniel-lxs Aug 30, 2026
e93c05a
fix: describe Fast widget chat preview (#1880)
roomote-roomote[bot] Aug 30, 2026
050cd1d
[Improve] Show Fast activity in Slack agent sessions (#1881)
roomote-roomote[bot] Aug 30, 2026
0a48451
fix: hide dismissed PR review action offers (#1878)
roomote-roomote[bot] Aug 30, 2026
e7b402a
[Feat] Render HTML artifacts in the viewer (#1883)
roomote-roomote[bot] Aug 30, 2026
82362e2
[Fix] Slack Fast sessions remain titled Thread (#1885)
roomote-roomote[bot] Aug 30, 2026
8ac6db9
[Refactor] Centralize Fast pending-response transitions (#1886)
roomote-roomote[bot] Aug 30, 2026
38f341e
fix: format Slack platform issue manager DMs (#1888)
roomote-roomote[bot] Aug 30, 2026
c3e8f56
fix: keep Fast widget session link in preview (#1891)
roomote-roomote[bot] Aug 30, 2026
e8843b9
fix: wrap YAML tool call details (#1894)
roomote-roomote[bot] Aug 30, 2026
ef8177c
fix: title Fast automation sessions from prompts (#1895)
roomote-roomote[bot] Aug 30, 2026
d17604d
fix: keep Session artifacts in execution details (#1896)
roomote-roomote[bot] Aug 30, 2026
85f3e60
[Improve] Browse previous Roomote releases in update dialog (#1893)
roomote-roomote[bot] Aug 30, 2026
4b1a8b5
[Fix] Merge announcements show inaccurate summaries and change links …
roomote-roomote[bot] Aug 30, 2026
6c59066
fix: restore standalone runtime dependencies (#1898)
roomote-roomote[bot] Aug 30, 2026
3dfe5ed
[Fix] Slack automation reports show awkward settings gear (#1900)
roomote-roomote[bot] Aug 31, 2026
25d9f47
[Improve] Hide empty artifact sections in Session execution details (…
roomote-roomote[bot] Aug 31, 2026
2df7b7a
[Fix] Session inference cost omits attached task usage (#1904)
roomote-roomote[bot] Aug 31, 2026
ab10e6d
[Improve] Open Roomote release history from About dialog (#1905)
roomote-roomote[bot] Aug 31, 2026
d899016
[Fix] Merge Announcer shows the wrong source-control icon (#1908)
roomote-roomote[bot] Aug 31, 2026
9526c3e
fix: stop retrying invalid Slack session titles (#1907)
roomote-roomote[bot] Aug 31, 2026
2c5e67d
[Fix] Fast automations post Slack placeholders on no-op runs (#1909)
roomote-roomote[bot] Aug 31, 2026
d1098dc
[Feat] Show live nested-task activity in sessions (#1910)
roomote-roomote[bot] Aug 31, 2026
ad7e8d6
[Feat] Add Session-level artifact gallery (#1912)
roomote-roomote[bot] Aug 31, 2026
f6c45d7
[Improve] Reorder session sidebar panels (#1914)
roomote-roomote[bot] Aug 31, 2026
a672880
[Fix] Running-task indicator appears while session responds (#1913)
roomote-roomote[bot] Aug 31, 2026
0c26b42
[Fix] Inline task links open outside the Session conversation (#1915)
roomote-roomote[bot] Aug 31, 2026
614cc12
[Fix] Fast ignores emoji answers to its questions (#1874)
roomote-roomote[bot] Aug 31, 2026
95ae085
improve(web): align Session task details panel (#1920)
roomote-roomote[bot] Aug 31, 2026
59137d0
[Fix] Silent custom automations fail before assessment (#1919)
roomote-roomote[bot] Aug 31, 2026
9393706
[Improve] Modernize Sessions filters and view controls (#1921)
roomote-roomote[bot] Aug 31, 2026
b6175d4
[Improve] Trust CI during code review (#1916)
roomote-roomote[bot] Aug 31, 2026
55d8bc5
Make Slack automation configuration less prominent (#1926)
mrubens Aug 31, 2026
2b806b4
[Fix] Slack task links show only Session task summaries (#1929)
roomote-roomote[bot] Aug 31, 2026
1768b25
Revert "Make Slack automation configuration less prominent" (#1931)
mrubens Aug 31, 2026
5310d3b
[Improve] Simplify Session status indicators (#1928)
roomote-roomote[bot] Aug 31, 2026
b799f6a
feat(web): open sole running task directly (#1932)
roomote-roomote[bot] Aug 31, 2026
e22ba2b
fix(web): use shared spinner for active tool calls (#1933)
roomote-roomote[bot] Aug 31, 2026
9108f6a
[Feat] Show accumulated pull requests in Sessions (#1930)
roomote-roomote[bot] Aug 31, 2026
a3cb700
[Feat] Let Fast load Settings skills (#1925)
roomote-roomote[bot] Aug 31, 2026
c4958d3
[Feat] Make MCP work session-first (#1927)
roomote-roomote[bot] Aug 31, 2026
00cd654
[Improve] Show representative PR screenshots in merge announcements (…
roomote-roomote[bot] Aug 31, 2026
682d42d
[Improve] Simplify Session row metadata (#1939)
roomote-roomote[bot] Aug 31, 2026
001c056
[Improve] Run Notion historical scans in the fast continuation loop (…
mrubens Aug 31, 2026
eb6fe05
fix: keep MCP task IDs task-specific (#1935)
roomote-roomote[bot] Aug 31, 2026
6968430
[Fix] Visual proof no longer blocks tasks beyond five minutes (#1940)
roomote-roomote[bot] Aug 31, 2026
fc6c06c
[Improve] Show task context in Session rows (#1945)
roomote-roomote[bot] Aug 31, 2026
9abaa6d
fix: include settings skills in Fast inventory (#1943)
roomote-roomote[bot] Aug 31, 2026
cba3825
[Fix] Running tasks disappear on direct Session loads (#1946)
roomote-roomote[bot] Aug 31, 2026
457a1af
[Improve] Fast sessions acknowledge users before substantive work (#1…
roomote-roomote[bot] Aug 31, 2026
a2db942
fix: restore Fast subagent MCP tools (#1948)
roomote-roomote[bot] Aug 31, 2026
347be0a
[Chore] Release Roomote 1.0.0 (#1887)
roomote-roomote[bot] Aug 31, 2026
8343cee
Merge remote-tracking branch 'origin/main' into release/v1.0.0
mrubens Aug 31, 2026
8308e21
[Fix] Promotion PR metadata can reference a stale candidate (#1951)
roomote-roomote[bot] Aug 31, 2026
6f40787
refactor: remove legacy Fast report compatibility (#1934)
roomote-roomote[bot] Aug 31, 2026
3a66c3e
[Fix] Fast replies disappear during API restarts (#1944)
roomote-roomote[bot] Aug 31, 2026
3ea6839
chore: amend v1.0.0 release notes with Fast restart fix (#1956)
mrubens Aug 31, 2026
a892b77
Merge origin/develop into release/v1.0.0
mrubens Aug 31, 2026
d385517
[Fix] API shutdown can hang before Fast answers start (#1958)
roomote-roomote[bot] Aug 31, 2026
c1c640e
Merge origin/develop into release/v1.0.0
mrubens Aug 31, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
185 changes: 179 additions & 6 deletions .agents/skills/changeset-release-pr/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,16 +1,17 @@
---
name: changeset-release-pr
description: 'Prepare the next Roomote release PR: review what merged to develop, fill missing release notes, ensure meaningful user-facing features are documented, confirm patch/minor/major when unspecified, run the product version script, and open the final release PR. Use when asked to prep, cut, or write notes for a release.'
description: 'Prepare Roomote releases: cut the normal release PR from develop, or ship an urgent patch directly from latest main and synchronize its version back to develop. Use when asked to prep, cut, hotfix, or write notes for a release.'
---

# Changeset Release PR

Use this skill to prepare the single release PR that cuts the next Roomote
version. The deliverable is a normal PR against `develop` containing the root
version bump, final `CHANGELOG.md` entry, any public documentation updates needed
for the release's meaningful user-facing features, and deletion of every
By default, use this skill to prepare the single release PR that cuts the next
Roomote version. The deliverable is a normal PR against `develop` containing the
root version bump, final `CHANGELOG.md` entry, any public documentation updates
needed for the release's meaningful user-facing features, and deletion of every
consumed pending changeset. Merging it makes CI open the frozen Promote PR to
`main`.
`main`. For an urgent patch that cannot wait for that path, use the clearly
separated direct-to-main hotfix workflow below.

## How releases work here

Expand Down Expand Up @@ -271,6 +272,178 @@ Commit the generated release artifacts on a feature branch and open a PR against
- a note that squash-merging the PR cuts the release and automatically opens
the frozen **Promote vX.Y.Z to production** PR against `main`

## Emergency direct-to-main hotfix path

Use this path only for an urgent production patch that cannot wait for the
normal `develop` release flow above. The normal workflow remains the default.
This exception produces two PRs:

1. a complete patch and generated release artifacts targeting `main`
2. a companion PR targeting `develop` that changes only root `package.json` and
`CHANGELOG.md`

The production PR must merge first. Do not merge the companion until the tag,
images, and GitHub Release have all shipped successfully.

### A. Establish the release state

Fetch both branches and tags, then branch from the exact latest `main` tip:

```bash
git fetch --tags origin \
refs/heads/main:refs/remotes/origin/main \
refs/heads/develop:refs/remotes/origin/develop
git switch --create hotfix/<concise-name> origin/main
git tag --sort=-version:refname | head -5
node -p "require('./package.json').version"
head -20 CHANGELOG.md
```

Before continuing, verify:

- `HEAD` is exactly `origin/main`.
- The newest shipped `vX.Y.Z` tag, root version, and top changelog section agree.
- `main` has no pending non-README changeset that `pnpm run version` would
accidentally consume with the hotfix.
- No newer unshipped Promote PR or release candidate conflicts with the patch
version. Resolve release ordering rather than guessing.
- The fix is a patch and every required prerequisite is already on `main` or is
explicitly included because it is safe to ship with the fix.
- The patch preserves the schema N-1 rollback guarantee and does not require an
incompatible migration, destructive schema change, or coordinated rollout
that makes direct release unsafe.

### B. Apply the complete fix

Identify the exact merged fix on `develop`, including tests, docs, and required
supporting changes. Read its source PR and compare its merge commit to `main`;
do not copy only the most obvious runtime file. Cherry-pick the smallest complete
commit set, usually the squash commit:

```bash
git cherry-pick <develop-fix-sha>
git diff --stat origin/main...HEAD
git diff --name-status origin/main...HEAD
git diff <develop-fix-sha>^..<develop-fix-sha> -- <expected-fix-paths>
git diff origin/main...HEAD -- <expected-fix-paths>
```

Account for every intentional difference caused by prerequisites or conflict
resolution. Exclude unrelated features, pending `develop` changesets, and
release artifacts from another version.

When the fix depends on an external service or production-like integration,
repeat the smallest safe live check that proves the original symptom is fixed.
Record the environment and observable result without exposing secrets or private
data. If a live check is irrelevant or unavailable, say why and rely on focused
deterministic tests.

### C. Generate and validate the patch release

Add one hotfix-specific patch changeset using the same format as step 8. Commit
the complete fix and changeset separately when useful for auditability, then
consume the changeset through the repository-owned command:

```bash
pnpm run version
```

Never run `changeset version`, and never hand-edit the generated version or
changelog heading. Polish the generated top changelog summary and highlights as
described in step 9, then commit root `package.json` and `CHANGELOG.md` as the
version commit.

Verify that:

- the root version is exactly one patch above the shipped `main` version
- the top `CHANGELOG.md` section contains the complete hotfix note
- the hotfix changeset was consumed and no non-README `.changeset/*.md` remains
- no workspace package version changed
- `origin/main...HEAD` contains only the complete fix plus root `package.json`
and `CHANGELOG.md`

Preserve the changeset commit in branch history even though the version commit
deletes its file. Run the release scripts, focused product tests and typechecks,
formatting check, and full pre-push gate:

```bash
pnpm test:release-scripts
pnpm exec oxfmt --check .
node scripts/pre-push-checks.mjs
```

Repeat any relevant live check after final conflict resolution or release edits.
Failed or unavailable checks are release blockers unless a maintainer explicitly
accepts and records the risk.

### D. Open the production hotfix PR

Open the hotfix PR against `main`. Include the source fix PR/commit and
prerequisites, previous and next versions, exact patch scope and intentional
differences, all validation and live-check results, rollback instructions, and a
link to the companion PR once available. Require a **merge commit**; never squash
or rebase this PR.

Rollback guidance must distinguish two states:

- Before the tag is consumed externally, revert the hotfix merge commit if that
is still operationally safe.
- After publication, redeploy the previous immutable `vX.Y.Z`; never move,
delete, or reuse a published tag. Describe data or schema cleanup separately
and preserve the N-1 rollback contract.

### E. Prepare the companion develop sync

After the production branch is final, create a branch from latest
`origin/develop` and bring over only the generated product version and changelog:

```bash
git switch --create chore/sync-<version>-on-develop origin/develop
git restore --source <hotfix-tip> -- package.json CHANGELOG.md
git diff --name-only origin/develop
git diff --exit-code <hotfix-tip> -- package.json CHANGELOG.md
git diff --exit-code origin/develop -- .changeset
```

Do not cherry-pick the runtime fix; it should already be on `develop`. Do not run
`pnpm run version` on this branch because that would consume unrelated pending
`develop` changesets. The first diff must list exactly `package.json` and
`CHANGELOG.md`; the other two must be empty. If `develop` independently changed
either release artifact, reconcile deliberately without touching pending
changesets and stop if the companion cannot remain a truthful two-file sync.

Open the companion PR against `develop`. It must be squash-merged only after all
production gates below succeed. Merging it early can make
`.github/workflows/release.yml` freeze the moving `develop` tip as
`release/vX.Y.Z` and open an incorrect Promote PR.

### F. Enforce merge and release order

Do not collapse or reorder these gates:

1. Merge the production hotfix PR into `main` with a merge commit.
2. Wait for **Tag Product Release** to succeed for that `main` merge.
3. Verify the remote annotated tag exists and resolves to the released tree with
`git ls-remote --tags origin refs/tags/vX.Y.Z` and, after fetching,
`git rev-parse 'vX.Y.Z^{}'`.
4. Wait for the tag-triggered **Publish GHCR Images** workflow to succeed,
including image publication and GitHub Release creation. Verify the GitHub
Release and immutable image tags; tag creation alone is not completion.
5. Only then squash-merge the companion PR into `develop`.

After the tag exists, the `develop` Release workflow sees an already shipped
version and exits without creating a candidate. If a production gate fails,
leave the companion open while the release is repaired or rolled back.

PRs [#1840](https://github.com/RooCodeInc/Roomote/pull/1840) and
[#1841](https://github.com/RooCodeInc/Roomote/pull/1841) demonstrate this
two-branch workflow. Their Notion-specific live checks are an optional example,
not a requirement for unrelated hotfixes.

End the hotfix path by reporting both PR URLs, released version, source fix and
prerequisite commits, exact file scope, live-check result or reason omitted,
validation results, current merge-order gate, and rollback risks.

## Guardrails

- Never edit `CHANGELOG.md` or the root version by hand; generate both with
Expand Down
1 change: 1 addition & 0 deletions .docker/app/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -113,16 +113,16 @@
ENV S3_ENDPOINT=http://minio:9000
ENV S3_PRESIGN_ENDPOINT=http://minio:9000
ENV S3_REGION=us-east-1
ENV S3_ACCESS_KEY_ID=roomote

Check warning on line 116 in .docker/app/Dockerfile

View workflow job for this annotation

GitHub Actions / Docker Build (app, amd64)

Sensitive data should not be used in the ARG or ENV commands

SecretsUsedInArgOrEnv: Do not use ARG or ENV instructions for sensitive data (ENV "S3_ACCESS_KEY_ID") More info: https://docs.docker.com/go/dockerfile/rule/secrets-used-in-arg-or-env/
ENV S3_SECRET_ACCESS_KEY=roomote-local-artifacts-password

Check warning on line 117 in .docker/app/Dockerfile

View workflow job for this annotation

GitHub Actions / Docker Build (app, amd64)

Sensitive data should not be used in the ARG or ENV commands

SecretsUsedInArgOrEnv: Do not use ARG or ENV instructions for sensitive data (ENV "S3_SECRET_ACCESS_KEY") More info: https://docs.docker.com/go/dockerfile/rule/secrets-used-in-arg-or-env/
ENV S3_BUCKET_ARTIFACTS=roomote-artifacts
ENV JOB_AUTH_PRIVATE_KEY=local-self-host-build-job-auth-private-key

Check warning on line 119 in .docker/app/Dockerfile

View workflow job for this annotation

GitHub Actions / Docker Build (app, amd64)

Sensitive data should not be used in the ARG or ENV commands

SecretsUsedInArgOrEnv: Do not use ARG or ENV instructions for sensitive data (ENV "JOB_AUTH_PRIVATE_KEY") More info: https://docs.docker.com/go/dockerfile/rule/secrets-used-in-arg-or-env/
ENV JOB_AUTH_PUBLIC_KEY=local-self-host-build-job-auth-public-key
ENV PREVIEW_AUTH_PRIVATE_KEY=local-self-host-build-preview-auth-private-key

Check warning on line 121 in .docker/app/Dockerfile

View workflow job for this annotation

GitHub Actions / Docker Build (app, amd64)

Sensitive data should not be used in the ARG or ENV commands

SecretsUsedInArgOrEnv: Do not use ARG or ENV instructions for sensitive data (ENV "PREVIEW_AUTH_PRIVATE_KEY") More info: https://docs.docker.com/go/dockerfile/rule/secrets-used-in-arg-or-env/
ENV PREVIEW_AUTH_PUBLIC_KEY=local-self-host-build-preview-auth-public-key
ENV DASHBOARD_PASSWORD=roomote-local-admin

Check warning on line 123 in .docker/app/Dockerfile

View workflow job for this annotation

GitHub Actions / Docker Build (app, amd64)

Sensitive data should not be used in the ARG or ENV commands

SecretsUsedInArgOrEnv: Do not use ARG or ENV instructions for sensitive data (ENV "DASHBOARD_PASSWORD") More info: https://docs.docker.com/go/dockerfile/rule/secrets-used-in-arg-or-env/
ENV ENCRYPTION_KEY=local-roomote-encryption-key-0001

Check warning on line 124 in .docker/app/Dockerfile

View workflow job for this annotation

GitHub Actions / Docker Build (app, amd64)

Sensitive data should not be used in the ARG or ENV commands

SecretsUsedInArgOrEnv: Do not use ARG or ENV instructions for sensitive data (ENV "ENCRYPTION_KEY") More info: https://docs.docker.com/go/dockerfile/rule/secrets-used-in-arg-or-env/
ENV ARTIFACT_SIGNING_KEY=local-roomote-artifact-signing-key-1

Check warning on line 125 in .docker/app/Dockerfile

View workflow job for this annotation

GitHub Actions / Docker Build (app, amd64)

Sensitive data should not be used in the ARG or ENV commands

SecretsUsedInArgOrEnv: Do not use ARG or ENV instructions for sensitive data (ENV "ARTIFACT_SIGNING_KEY") More info: https://docs.docker.com/go/dockerfile/rule/secrets-used-in-arg-or-env/
ENV PREVIEW_PROXY_BASE_URL=http://localhost:18081
ENV PREVIEW_DOMAINS=localhost,127.0.0.1,roomotepreview.localhost

Expand Down Expand Up @@ -378,6 +378,7 @@
COPY --chown=roomote-app:roomote-app --from=build-web /roomote/apps/web/.next/standalone ./
COPY --chown=roomote-app:roomote-app --from=build-web /roomote/apps/web/.next/static ./apps/web/.next/static/
COPY --chown=roomote-app:roomote-app --from=build-web /roomote/apps/web/public ./apps/web/public/
COPY --chown=roomote-app:roomote-app CHANGELOG.md ./CHANGELOG.md
# The web server (cwd /roomote/apps/web) reads setup-flow docs from
# ../docs at request time, so the MDX sources must ship in the image.
COPY --chown=roomote-app:roomote-app --from=build-web /roomote/apps/docs ./apps/docs/
Expand Down
52 changes: 22 additions & 30 deletions .docker/gbrain/entrypoint.sh
Original file line number Diff line number Diff line change
Expand Up @@ -175,13 +175,26 @@ elif [ -n "${OPENAI_API_KEY:-}" ]; then
DEFAULT_CHAT_MODEL="openai:gpt-5.6-luna"
else
# No credential: the server still boots and serves, it just cannot embed or
# synthesize. Roomote gates every Brain code path on the same keys, so it
# synthesize. Roomote gates every Brain code path on the same signal, so it
# will not talk to this container either.
BRAIN_PROVIDER="none"
DEFAULT_EMBEDDING_MODEL=""
DEFAULT_CHAT_MODEL=""
fi

# Gateway mode holds no real provider key, so chat defaults to the
# `roomote/helper` sentinel: the Roomote gateway answers it with the
# deployment's helper model instead of forwarding to a provider, which is what
# frees synthesis from needing a Brain provider key. Convergence rule: the
# chat model is a plain env export re-derived on every boot (env wins over
# anything the brain stored at init), so a brain that previously defaulted to
# gpt-5.6-luna picks this up on its next boot — while an operator's explicit
# GBRAIN_MODEL (below) or R_BRAIN_MODEL (applied by the gateway per request)
# still wins over the default.
if [ -n "${OPENAI_BASE_URL:-}" ] && [ "$BRAIN_PROVIDER" != "none" ]; then
DEFAULT_CHAT_MODEL="${BRAIN_PROVIDER}:roomote/helper"
fi

# An operator-chosen embedding model arrives as a bare id (text-embedding-3-large)
# because it is written once and must survive a provider switch; gbrain wants
# it provider-qualified. Qualify it with whichever provider this container
Expand Down Expand Up @@ -280,35 +293,14 @@ gbrain config set dream.synthesize.link_manifest true >/dev/null
gbrain config set agent.use_gateway_loop true >/dev/null
echo "[gbrain-entrypoint] corpus checkout: $BRAIN_DIR (filesystem + Postgres index)"

# Route gbrain's OpenRouter reranker through the same Roomote credential
# gateway as embeddings and chat. Do this after initialization so exposing an
# OpenRouter-compatible endpoint does not change which provider gbrain chooses
# when it creates the Brain. An empty forwarded setting restores the default,
# including after a deployment previously selected another reranker.
GBRAIN_RERANKER_MODEL="${GBRAIN_RERANKER_MODEL:-openrouter:voyageai/rerank-2.5-lite}"
case "$GBRAIN_RERANKER_MODEL" in
openrouter:*)
if [ -z "${OPENROUTER_BASE_URL:-}" ] && [ -n "${OPENAI_BASE_URL:-}" ]; then
OPENROUTER_BASE_URL="${OPENAI_BASE_URL%/}"
case "$OPENROUTER_BASE_URL" in
*/v1) ;;
*) OPENROUTER_BASE_URL="$OPENROUTER_BASE_URL/v1" ;;
esac
export OPENROUTER_BASE_URL
fi
if [ -z "${OPENROUTER_API_KEY:-}" ] && [ -n "${OPENAI_API_KEY:-}" ]; then
OPENROUTER_API_KEY="$OPENAI_API_KEY"
export OPENROUTER_API_KEY
fi
if [ -z "${OPENROUTER_BASE_URL:-}" ] || [ -z "${OPENROUTER_API_KEY:-}" ]; then
echo "[gbrain-entrypoint] WARNING: $GBRAIN_RERANKER_MODEL needs OPENROUTER_BASE_URL and OPENROUTER_API_KEY."
echo "[gbrain-entrypoint] WARNING: reranking will remain fail-open until the gateway is configured."
fi
;;
esac

gbrain config set search.reranker.model "$GBRAIN_RERANKER_MODEL" >/dev/null
echo "[gbrain-entrypoint] reranker: $GBRAIN_RERANKER_MODEL"
# The Brain does not use a reranker. gbrain's own init already writes
# `search.reranker.enabled false` for installs keyed the way ours are, but
# make the choice explicit so every brain — including ones created before
# this line and ones hit by upstream mode-bundle default flips — converges
# on the same shipped behavior. Retrieval is hybrid RRF; autocut no-ops
# without rerank scores by design.
gbrain config set search.reranker.enabled false >/dev/null
echo "[gbrain-entrypoint] reranker: disabled"

# Adding a key to a brain created without one is a first-class flow rather
# than an edge case: on hosts whose compose parser ignores `profiles` the
Expand Down
8 changes: 3 additions & 5 deletions .env.production.example
Original file line number Diff line number Diff line change
Expand Up @@ -142,21 +142,19 @@ DEFAULT_COMPUTE_PROVIDER=docker
# R_GITHUB_APP_SLUG=
# Optional comma-separated GitHub App slugs that are also trusted as Roomote-managed.
# R_GITHUB_ADDITIONAL_APP_SLUGS=
# Self-run Brain inference (embeddings/rerank stay on your hardware; chat
# Self-run Brain embeddings (embeddings stay on your hardware; chat
# synthesis keeps using the configured provider). With the bundled service,
# set COMPOSE_PROFILES=brain,local-inference and ALL of the settings below —
# the model names and dimensions must match what the inference server
# the model name and dimensions must match what the inference server
# serves, and the embedding pair is create-time: set everything BEFORE the
# Brain's first boot. gbrain's defaults (text-embedding-3-small, 1536) name
# models the bundled server does not serve, so the URLs alone are not a
# models the bundled server does not serve, so the URL alone is not a
# working configuration. Self-run model names pass through unchanged and
# must exactly match the ids served by the upstream.
# R_BRAIN_EMBEDDINGS_UPSTREAM_URL=http://infinity:7997
# R_BRAIN_RERANK_UPSTREAM_URL=http://infinity:7997
# R_BRAIN_INFERENCE_UPSTREAM_API_KEY=
# R_BRAIN_EMBEDDING_MODEL=BAAI/bge-m3
# R_BRAIN_EMBEDDING_DIMENSIONS=1024
# R_BRAIN_RERANKER_MODEL=BAAI/bge-reranker-v2-m3
# R_GITHUB_APP_ID=
# Raw GitHub App private-key PEM with newlines escaped as \n; do not base64 it.
# R_GITHUB_APP_PRIVATE_KEY=
Expand Down
28 changes: 27 additions & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,7 @@ jobs:
fi

release_sha="$(git rev-parse HEAD)"
shipping_guard_sha="$candidate_sha"
git push origin "${release_sha}:refs/heads/${release_branch}"
candidate_status="Candidate refreshed to \`${release_sha}\` from \`develop\`."
echo "Refreshed ${release_branch} to ${release_sha}"
Expand All @@ -129,15 +130,40 @@ jobs:
fi

release_sha="$bump_sha"
shipping_guard_sha="$release_sha"
candidate_status="Frozen at \`${release_sha}\` — the commit where \`${version}\` was versioned. Commits merged to \`develop\` afterward require an explicit candidate refresh or ship in the next release."
if git ls-remote --exit-code --heads origin "$release_branch" >/dev/null 2>&1; then
echo "Release branch ${release_branch} already exists; leaving it frozen."
remote_release_sha="$(git ls-remote --exit-code --heads origin "refs/heads/${release_branch}" | cut -f1)"
if [ "$remote_release_sha" != "$release_sha" ]; then
echo "Release branch ${release_branch} points to ${remote_release_sha}, expected ${release_sha}; refusing to write Promote PR metadata for a different candidate."
exit 1
fi
echo "Release branch ${release_branch} already exists at ${release_sha}; leaving it frozen."
else
git push origin "${release_sha}:refs/heads/${release_branch}"
echo "Cut ${release_branch} at ${release_sha}"
fi
fi

remote_release_sha="$(git ls-remote --exit-code --heads origin "refs/heads/${release_branch}" | cut -f1)"
if [ "$remote_release_sha" != "$release_sha" ]; then
echo "Release branch ${release_branch} moved to ${remote_release_sha}, expected ${release_sha}; refusing to update Promote PR metadata."
exit 1
fi

git fetch origin "refs/heads/main:refs/remotes/origin/main" --tags --quiet
if git rev-parse "$tag" >/dev/null 2>&1 || git merge-base --is-ancestor "$shipping_guard_sha" origin/main; then
echo "Cannot update Promote PR metadata for ${tag}: the candidate reached main while the branch was being prepared."
exit 1
fi
if [ "$EVENT_NAME" = "workflow_dispatch" ]; then
existing="$(gh pr list --base main --head "$release_branch" --state open --json url --jq '.[0].url // empty')"
if [ -z "$existing" ]; then
echo "Cannot refresh ${tag}: the Promote PR closed while the branch was being updated."
exit 1
fi
fi

notes="$(node scripts/release/extract-changelog-section.mjs "$version" || true)"
body_file="$(mktemp)"
{
Expand Down
Loading
Loading