Skip to content

Rebuild the 0.3.0 changelog from the code, and fix what blocks the release on main - #1001

Merged
davidmckayv merged 17 commits into
mainfrom
david/release-0.3.0
Nov 5, 2026
Merged

davidmckayv merged 17 commits into
mainfrom
david/release-0.3.0

Conversation

@davidmckayv

@davidmckayv davidmckayv commented Nov 5, 2026 •

Copy link
Copy Markdown
Contributor

What has to be on main before 0.3.0 is cut with the normal release flow (docs/releasing.md, Cutting one). No version bumps: Create release PR writes package.json, the changelog heading, the chart's appVersion, the desktop Cargo files and the policy's version itself.

What's in it

  • CHANGELOG.md: ## Unreleased rebuilt from the code. Every commit since v0.2.0 (up to 8e4ef7b) was checked in its diff and in the code on main; existing entries were kept, rewritten or dropped on that evidence, and changes no entry described were added. The ledger of dropped and rewritten entries is in the comments below. The section is about 102,500 characters (GitHub refuses a release body over 125,000; it was heading past that). The redaction entry that merged after v0.2.0 but sat under ## 0.2.0 moved here, and the 0.1.0 Before upgrading count, changed to "Eight" by a merge, is "Six" again.
  • release-policy.json: compatibility.database.to is now 0077_channel_opening, the last migration. It named 0074_single_user_identity, so the publish workflow's release-manifest.ts --validate-policy would refuse the release. Create release PR only moves the policy's version, so this has to be right on main.
  • docs/releasing.md: the rule "Rebuild the changelog from the code", as step 1 of Cutting one, its own subsection, and in Release candidates and betas before a first candidate.
  • tests/release-policy.test.ts: its fixture had the policy's old last migration written out, so updating the policy failed five unrelated tests. It now uses the migrations the committed policy names.
  • server/tests/recorder-config.test.ts: it read only ## Unreleased, which is empty on the release commit after Create release PR promotes it, so the checks that gate the publish would fail. It also required "1.79.1", which main never pinned (1.77.0 went to 1.83.0). It now reads the notes from ## Unreleased to ## 0.2.0 and requires the runtime version server/package.json pins. Checked against a promoted changelog too.

Cutting 0.3.0 from main (stable)

  1. Merge this PR. Anything merged to main after it needs its changelog entry checked from its diff first.
  2. Actions → Create release PR → Use workflow from main: bump = minor, kind = stable, from empty. dry_run = true first shows the version and notes without opening anything.
  3. Review the PR it opens from release/publish/v0.3.0 (label release): package.json 0.3.0, ## Unreleased promoted to ## 0.3.0, chart appVersion, desktop Cargo files. It arrives without checks by design.
  4. Run the smoke journey on a machine with real Intelligence credentials and paste the result on that PR: bash scripts/start.sh, export OPENBOT_SMOKE_COOKIE='better-auth.session_token=...', bun run test:smoke.
  5. Merge it. publish-release.yml checks the version, the ## 0.3.0 section and the policy, decides the release will become Latest, runs the full CI suite on the commit, builds and attests the openbot image and every component image (amd64 and arm64), creates the v0.3.0 tag and a GitHub Release that is not yet Latest, with container-images.json, the chart, the source archive, release-manifest.json, provenance, and the unsigned installers (ad-hoc Mac arm64 .dmg, unsigned Windows x64 -setup.exe) under their versioned names.
  6. Mac: it dispatches Desktop macOS signing on the tag (developer-id, release-tag: v0.3.0, make-latest). A macos-signing reviewer approves; it signs, notarizes and staples Apple silicon and Intel, and attaches the .dmg files under their versioned and fixed names (OpenBot-mac-arm64.dmg, OpenBot-mac-x64.dmg), the updater archives with .sig, and latest.json.
  7. Windows: it dispatches Desktop Windows signing on the tag (keyvault, release-tag: v0.3.0, make-latest). A windows-signing reviewer approves; it signs with the Key Vault certificate, and a separate job attaches OpenBot_0.3.0_x64-setup.exe (replacing the unsigned one) and OpenBot-windows-x64-setup.exe.
  8. Latest: whichever attach finishes second marks v0.3.0 Latest (scripts/release-make-latest.sh), which starts Downloads sync for downloads.copilotkit.ai and checks the update feed. If either signing run is not approved or fails, the release stays not Latest: sign again from the tag with make-latest, or mark it Latest by hand.

Worth deciding before the cut

  • The Helm chart installs Intelligence by default at 0.16.0-rc.5, a release candidate, and Desktop bundles the CLI preview copilotkit 4.33.1-pre.256cc68, which installs the same release (Bundle Intelligence 0.16.0-rc.5 in the chart and the desktop #1034). A stable 0.3.0 ships both.
  • The chart's Ingress and LoadBalancer Service carry an AWS Partner Revenue Measurement tag with no setting to turn it off (Tag the chart's AWS load balancers for Partner Revenue Measurement #1030). The notes say so.
  • Helm config.memory.researchDefaults cannot turn check-ins on (true writes nothing, false writes the default); its values comment and README still say "on by default".
  • Windows signing on a release tag has not run yet. Mac signing has (dry run 41951377173, both architectures notarized), but its attach-to-release step runs for the first time at the cut.

Checks

bun run lint, format:check and typecheck pass locally on the merged tree; release-manifest.ts --validate-policy passes for v0.3.0 on this branch; CI below.

…_check_ins

The policy was written before the personal edition added 0075_individual_check_ins, so the
publish workflow's --validate-policy step would refuse the release before building anything.
Entries added to Unreleased since the last release are claims. The release procedure now starts by
checking every change since the last tag in its diff and writing the notes from what the code
shows.
Every change merged since v0.2.0, #998 included, was checked in its diff and in the code as it
stands, and Unreleased is written from that rather than from the entries added along the way.
Entries the code does not support are dropped, ones it contradicts are rewritten, fixes to things
that never shipped are folded into the feature they fixed, and changes nobody described now have
entries. The section is about 89,000 characters, well under GitHub's 125,000-character limit for a
release body, which the previous section would have crossed.

The redaction entry that merged after v0.2.0 but sat under the 0.2.0 heading moves to 0.3.0, and
the 0.1.0 Before upgrading count, changed to Eight by a merge, is Six again, matching its list.
@davidmckayv

Copy link
Copy Markdown
Contributor Author

Unreleased entries dropped or rewritten in the 0.3.0 rebuild

Each was checked against its commit's diff and the code on main. Kept entries are not listed.

Dropped

  • "The CopilotKit runtime moves to 1.79.1" and its duplicate gateway bullet: 1.79.1 never landed on main (1.77.0 went straight to 1.83.0); one gateway entry remains.
  • "A built-in Bot behind an OpenAI proxy answers again": fixed a break introduced after v0.2.0; its end state is in the CopilotKit 1.83 entry.
  • "When OpenBot is open in Chrome or Edge, the Browser button uses that browser": Teach a Bot: record a task in three steps, and stop from the browser #989 removed that button and its popover.
  • "Your own everyday Chrome or Edge, with the Recorder in it": the store ids are empty, so Desktop registers nothing; one sentence says so.
  • "A new desktop install of v0.2.0 gets past Install again": fixed a build of main after the toolkit move, never a release.
  • "setup-learning.ts runs on Windows": the failing spawn came from a change after v0.2.0; one clause remains.
  • "recorded with Intelligence as stopped" and "each run tells Intelligence ... analytics context": the pinned @copilotkit/runtime 1.83.0 drops both.
  • "An unreconciled app authorization always reaches the audit trail": the table and outcome arrived with Arcade after v0.2.0.
  • "On Arcade, a Bot's call now needs the person's connection recorded" (Before upgrading): Arcade is new; folded into the Arcade entry.
  • "Allowing a Gmail send always no longer allows it to anybody": Gmail send did not exist at v0.2.0, and Personal edition defaults: web search on, and only risky actions ask #998 now asks on every send.
  • "A new Bot is made from a sheet that asks where it runs first": feat(ux): simplify bot creation and personalize first-run experience #861 turned the sheet round.
  • "Onboarding says which pictures are pictures": First run in three clicks: one animated Welcome with permissions, Book a call for local users, then the name #963 replaced those slides.
  • "Suggested next steps no longer pile up": replaced by check-ins.
  • "A run of tool calls folds into one line" (New Bot sheet, folded tool calls, and onboarding for local evaluators #812 version): one fold covers both at release; merged.
  • "starts signing with Web Bot Auth" (Before upgrading): signing is off unless WEB_BOT_AUTH=on.
  • The second CORS bullet: a stale duplicate a merge re-added.
  • "The personal edition no longer turns Ask before making changes on" (Personal edition defaults: web search on, and only risky actions ask #998): the personal edition is new in 0.3.0; its final default is in its section.

Rewritten

  • "Memory sources and background research are on by default" and its 0055 bullet: background research is off by default at release; memory sources only.
  • "Bots tell you when something needs you" and the check-in bullets: check-ins are offered and accepted, not switched on; buttons are Work on it and Dismiss.
  • "Automatic Learning assigns / creates its container" and the auto-assign bullet: merged; start.sh only tries to create it; checks every 10 minutes; refuses a lone service token or project id.
  • "OpenBot can record scoped run outcomes" and the runtime-events bullet: states the Desktop default; the runtime's events gained app_id, the deployment ID only with telemetry on.
  • "Teach a Bot ... the OpenBot Recorder", "Your own browser, opened from OpenBot", "A recording follows every tab you use": one story at release state; the Browser button is Teach a Bot; added recorder.sign_out_failed, migration 0068 and the https-or-loopback rule; dropped build and capture-pass internals.
  • "Record a task in a Bot's own browser": split; Clear browser data deletes the profile, and nothing clears screenshots.
  • "A personal edition for one person on one computer": exact start requirements, what is fixed off, the 404 routes, and Personal edition defaults: web search on, and only risky actions ask #998's defaults.
  • "Every settings screen is the same, slightly wider column": 768px at release, not 720px.
  • "An app a Bot could not use asks to be connected once": the bug was every LangGraph tool call kept twice and resent to the model.
  • The 18-component A2UI section and "CopilotKit 1.83": superseded by the 65-component catalog; Responses-only models stay on Responses; "Intelligence needs nothing changed" was unprovable.
  • "A failed shared-app approval can be tried again": owner-grant race removed (owner grants are new); merged with the audience fix.
  • "A Bot can hold hundreds of tools": built-in Bots only; the 128 limit applies on Chat Completions or with search on.
  • "Fewer Verify you are human pages": EGRESS_PROXY_DEFAULT existed at v0.2.0; only Helm computers.egressProxy is new.
  • "The computer image is about a fifth smaller": the Dockerfile's own estimate replaces measured figures.
  • "The server image starts again": it was broken at v0.2.0 too, but only used for migrations; no "again".
  • "Bots can install packages on their computers": understated; merged with the openbot-apt change.
  • CORS bullet: written once, with the configured-host port and container IP rules; the upgrade note is its own bullet.
  • "An app you have not connected is offered where you are reading" and "asks once per turn": superseded by the app card; one sentence remains.
  • Code and markdown in a Bot's interface: those components arrived with A2UI 1.0 in this release, so "plain monospace before" was not a change; folded into the A2UI entry.
  • The Computer panel Activity bullet: v0.2.0 baseline, Say a declined step is declined in Activity, not that it ran #986's Declined label; "empty after approval" was unprovable.
  • "A credential written as the word after a flag is redacted": filed under 0.2.0 by mistake; the mysql -p <space> line was no change.
  • "A Bot's browser step is no longer refused while it is being saved": the code shows no double approval; it waits up to five seconds.
  • "A Bot carries on after a browser step fails": understated; covers commands and file writes too.
  • "A Bot made with Run it here ...": the app has no "Run it here" label.
  • "Bot turns hold their conversation more carefully": v0.2.0 stopped every headless turn on a failed renewal, not only routines.
  • Before upgrading 0061/0062: the table is action_policy; the "next research run replaces them" claim is gone.
  • "Screens share one spacing ...", "Adding a credential and a boundary rule ...", "A Bot's page is shorter": pixel values changed, rule testing existed at v0.2.0, suggestions live only in skins.
  • Per-Bot files bullet and section: the folder is computers/<person id>~<Bot id>.
  • "A Bot searches with its search tool, never its browser": it is told to.
  • "A Bot's owner can give it their own apps": the migrations are 0064 and 0065, not 0063 and 0064.
  • "The default look ...": the font is Inter, not Atkinson Hyperlegible; no "Waiting for you" label or cycling example jobs exist.
  • "Deleting, sending ... always ask first" (Personal edition defaults: web search on, and only risky actions ask #998): "as card payments already were" understated the v0.2.0 hand-off; "never by what it writes" holds only for the four; added what is not caught.
  • "The personal edition turns on Parallel Search" (Personal edition defaults: web search on, and only risky actions ask #998): folded into its section; no released install has the personal edition to upgrade.

…igrations

The fixture's last migration was written out as 0074_single_user_identity, the value the policy
held when the test was added, so moving the policy to 0075_individual_check_ins failed five tests
that check something else. The fixture now uses the migrations the committed policy names.
The test read only ## Unreleased, which is empty on the release commit once the release workflow
promotes it, so the checks that gate the publish would have failed. It also required 1.79.1,
which main never pinned: the runtime went from 1.77.0 to 1.83.0. It now reads the notes from
## Unreleased to ## 0.2.0 and requires the runtime version server/package.json pins.
…he 0.3.0 release prep

# Conflicts:
#	CHANGELOG.md
… diffs

Claude Agent SDK, Agno, Google ADK, LangGraph and Mastra Bots now answer from the whole
conversation in their role. Checked against v0.2.0 and the code on main: the Antigravity fix is
folded into its entry because that harness is new in this release, the components entry no longer
says the Claude Agent SDK harness drops the standing role, and the macOS signing fixes change only
CI, so they have no entry.
@davidmckayv

Copy link
Copy Markdown
Contributor Author

Addendum: changes merged to main during the prep (#1002 to #1012)

… desktop (#832), into the 0.3.0 changelog rebuild

# Conflicts:
#	CHANGELOG.md
#	docs/releasing.md
…ening

Main added 0076_model_selection and 0077_channel_opening. Create release PR moves only the
policy's version within a release, so the database transition has to be right on main before the
first candidate is cut, or publishing refuses it.
… diffs

The standalone Desktop with local Intelligence, signed installers at fixed links, Intelligence in
the Helm chart, the model picker, the always-ask refinements, the question drawer and Strands are
checked against v0.2.0 and the code on main. Sections they change are rewritten in place, and
links to Admin → Enterprise controls point at the pages that replaced it.
@davidmckayv davidmckayv changed the title Prepare the 0.3.0 release: changelog rebuilt from the code, release policy fixed Rebuild the 0.3.0 changelog from the code, and fix what blocks the release on main Nov 5, 2026
@davidmckayv
davidmckayv marked this pull request as ready for review November 5, 2026 22:02
@davidmckayv

Copy link
Copy Markdown
Contributor Author

Addendum: changes merged to main since #1012 (#832, #980, #999, #1009, #1015 to #1030)

#1033 moved the chart's Intelligence dependency from 0.16.0-rc.3 to 0.16.0-rc.4 (Chart.yaml and
Chart.lock); the changelog names it once.
#1034 moved the chart's Intelligence dependency to 0.16.0-rc.5 and pinned Desktop's CLI to the
copilotkit preview built from Intelligence commit 256cc68, whose default local release is
0.16.0-rc.5 (checked in the published package). The Desktop entry no longer says the installer
carries whatever CLI was current.
@davidmckayv
davidmckayv merged commit 1bc2ce1 into main Nov 5, 2026
23 checks passed
@davidmckayv
davidmckayv deleted the david/release-0.3.0 branch November 5, 2026 23:14
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