Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
  •  
  •  
  •  
10 changes: 10 additions & 0 deletions .agents/skills/releasing/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,16 @@ into `main` through a PR, and the merge is what publishes.
to the stores. The `extension versions bumped` CI check refuses a
PR that forgot; `scripts/check-extension-bump.sh origin/main` is the
same check locally.
In the same PR, write what changed into `CHANGELOG.md`, for the
people who update their weft: what they will notice, what they have
to do (a `./setup.sh` that asks, a command to run again, a setting
that moved), and anything breaking first. Each release gets its own
section, newest first, headed with its date and its version, the VS
Code extension's version the PR bumped to (`## 2026-10-09 (0.2.267)`);
a release that bumps no extension names its merge's short commit
instead. Work not merged yet stays under `## Unreleased`, and the PR
that ships it renames that heading. Write it plainly, for a person
reading it before they run `./setup.sh`, never as a list of commits.
2. `gh pr create --base main --head <branch>`.
3. Never `--auto`. Wait for every check to finish (`gh pr checks <n>
--watch`), then read what the PR collected besides the checks before
Expand Down
10 changes: 10 additions & 0 deletions .claude/skills/releasing/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,16 @@ into `main` through a PR, and the merge is what publishes.
to the stores. The `extension versions bumped` CI check refuses a
PR that forgot; `scripts/check-extension-bump.sh origin/main` is the
same check locally.
In the same PR, write what changed into `CHANGELOG.md`, for the
people who update their weft: what they will notice, what they have
to do (a `./setup.sh` that asks, a command to run again, a setting
that moved), and anything breaking first. Each release gets its own
section, newest first, headed with its date and its version, the VS
Code extension's version the PR bumped to (`## 2026-10-09 (0.2.267)`);
a release that bumps no extension names its merge's short commit
instead. Work not merged yet stays under `## Unreleased`, and the PR
that ships it renames that heading. Write it plainly, for a person
reading it before they run `./setup.sh`, never as a list of commits.
2. `gh pr create --base main --head <branch>`.
3. Never `--auto`. Wait for every check to finish (`gh pr checks <n>
--watch`), then read what the PR collected besides the checks before
Expand Down
10 changes: 10 additions & 0 deletions .kilo/skills/releasing/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,16 @@ into `main` through a PR, and the merge is what publishes.
to the stores. The `extension versions bumped` CI check refuses a
PR that forgot; `scripts/check-extension-bump.sh origin/main` is the
same check locally.
In the same PR, write what changed into `CHANGELOG.md`, for the
people who update their weft: what they will notice, what they have
to do (a `./setup.sh` that asks, a command to run again, a setting
that moved), and anything breaking first. Each release gets its own
section, newest first, headed with its date and its version, the VS
Code extension's version the PR bumped to (`## 2026-10-09 (0.2.267)`);
a release that bumps no extension names its merge's short commit
instead. Work not merged yet stays under `## Unreleased`, and the PR
that ships it renames that heading. Write it plainly, for a person
reading it before they run `./setup.sh`, never as a list of commits.
2. `gh pr create --base main --head <branch>`.
3. Never `--auto`. Wait for every check to finish (`gh pr checks <n>
--watch`), then read what the PR collected besides the checks before
Expand Down
90 changes: 89 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,95 @@
What changed between versions of weft that you need to know about when you
update. To update, pull and run `./setup.sh` again.

## Unreleased: weft no longer needs Kubernetes
## 2026-10-11 (0.2.267)

**On Google Cloud, a run waiting on a person lets the database sleep.**

A run that cannot pause (a route still answering its caller, a trigger with
`recorded: false`, a live stream between steps) keeps its question in its
worker while it waits. Until now that kept the database awake for the whole
wait. Now nothing touches the database until the answer or a cancel arrives:
the answer reaches the worker through a news topic weft creates in your
Google project. Upgrade as usual (merge upstream into your fork and run the
install workflow again): it creates the topic and the rights that go with it.

A worker on Google Cloud can keep one connection to weft for at most an
hour. If every run on it is still waiting at that point, the worker stops:
runs that can pause carry on elsewhere, and a run that cannot pause ends,
saying which limit ended it. To wait longer, make the run one that can pause.

**Five instance nodes lost "Instance" from their names.**

`StartInstanceInfra`, `StopInstanceInfra`, `TerminateInstanceInfra`,
`ActivateInstanceTriggers` and `DeactivateInstanceTriggers` are now
`StartInfra`, `StopInfra`, `TerminateInfra`, `ActivateTriggers` and
`DeactivateTriggers`. Rename them in your `.weft` files. Their `instance`
input is now optional: if you leave it unwired, the node acts on the
program's own copies, the ones every instance shares.

**GmailSend can send from another address.**

The new optional `from` input sends from one of the account's "Send mail as"
addresses set up in Gmail; any other address fails naming the ones that work.
To read that list, the Google connection needs "Read mail" or "Organize mail"
ticked. Replies are unchanged: they need one of those two or "Read mail
headers".

**A program built before this version needs one rebuild.**

How a waiting step receives its answer changed, so a worker built before this
version fails when a waiting step gets its answer. Resync each program once:
`weft resync` if its triggers are on, `weft build` otherwise. Either one
builds the worker again on this version of weft and moves the program to it.

**Skipping a question ends the step that asked it.**

When a person skips a waiting question (Skip in the browser extension, or
`POST /signal/{token}/skip`), the step that asked now ends skipped: its
outputs close and the steps reading them skip too. It used to answer the
question with null, so if your program reads a null answer as "skipped", it
now sees the step skipped instead. Skipping a trigger is refused with a `409`;
it used to fire the trigger.

**A Google connection can hold Gmail alone.**

The connect check now asks Google who the account is, through two permissions
every connection asks for ("Know who you are" and "See your email address"),
instead of reading Drive. So a connection with only Gmail, or only Calendar,
ticked now passes. If you run your own shared Google app, its `covers` does
not need to list those two.

**Node authors: inputs can be required only when wired.**

`requiredWhenWired: true` on an input means: left unwired, the node runs
without it; wired, a wire that delivers nothing skips the node. It is for an
input whose absence means something, like the instance nodes' `instance`.

**Builds no longer hold one request open.**

`weft build`, `run`, `activate`, `resync` and `infra start` used to keep one
request open to the install for the whole build. The install now answers as
soon as the builds start, and the CLI follows each one to its end. If a cloud
install does not answer, the error names that install instead of telling you
to start the local daemon. Update the VS Code extension too: it needs this
version.

**A route's limits can overshoot briefly after a quiet spell.**

When a worker copy wakes after a quiet spell, its first calls are decided on
what it heard before it went quiet, until weft's broker answers it: under a
second normally, a few seconds when the broker was asleep too. During that
window, copies waking at the same moment can each let in up to the full
`callsAtOnce`. We chose this so the first call after a pause never waits for
the broker to start.

**The editor's activate button names the triggers that are off.**

When some triggers are off while the others run, the second button now says
which ones ("Reactivate a, b" or "Reactivate a, b and 3 more") instead of
"Reactivate the rest".

## 2026-10-09 (extension 0.2.266): weft no longer needs Kubernetes

**Breaking: your run history does not come along.**

Expand Down
Loading
Loading