Skip to content

v0.4.0

Choose a tag to compare

@wind-publish wind-publish released this 04 Oct 13:19
Immutable release. Only release title and notes can be modified.

Wind v0.4.0 — wind down is easy by default: it drafts the retrospective from your own work, shows what it verified, and records only when you say down.

Install

This repository is private during pipeline bring-up; install via gh:

# pick your build: wind-darwin-arm64 / wind-darwin-x64 / wind-linux-x64 / wind-windows-x64.exe
gh release download v0.4.0 --repo windstreamai/wind-cli -p 'wind-darwin-arm64' -p SHA256SUMS
shasum -a 256 -c <(grep darwin-arm64 SHA256SUMS)
chmod +x wind-darwin-arm64 && sudo install wind-darwin-arm64 /usr/local/bin/wind
wind setup

What's new

wind down writes the first draft

Finishing a piece of work used to end with an interview. Now wind down reads what this seat actually did, its own pull requests and the agent sessions bound to the worktree, and hands you a retrospective to approve:

wind down

Under the draft it shows what it checked and what it could not, in lines like these:

wind checked:
verified: 2 PRs — 1 merged, 1 open
transcript: 1 agent session read

Then it asks anything to add? with three choices: Down (record), Add something, Cancel. Each addition is folded into the draft and shown again. Nothing is recorded until you say down.

Two things to know. Cancel records no retrospective, but the draft exchange stays on the session as context. And the interview is still there when you want it:

wind down --interview

Upgrade note: a bare wind down used to open the interview and now opens the draft. --easy still works and does nothing, so existing scripts keep running, and --yes and --message no longer need it.

Inside a coding agent, you approve in the conversation

When a coding agent runs wind down there is no menu for anyone to answer, so wind records nothing and gives the agent a brief instead: the shape to write to, the facts it verified, and the command to record with. The agent shows you the whole draft and asks anything to add? You say down, and only then does it record, exactly what you approved:

wind down --message-file <path>

The approved text travels as a file, so nothing in it is expanded or mangled by a shell on the way. The file must be a regular file of at most 1 MiB. /windstream-feature-wrapup runs this loop for you. Anything other than down ("looks good", "ship it") is treated as an addition or a question, never as approval.

The exit code says whether your words arrived

A retrospective that could not be delivered is saved and sent later. Until now you had to read the closing lines to know which happened. Now the exit code tells you:

Exit Meaning
0 Delivered to Wind Stream
2 Saved on this machine, not yet sent. It syncs at a later session start
1 Nothing saved

On a 2 the receipt names the entry, so you can send it yourself:

offline — saved, will sync on a later session start (session-…)
1 turn pending — will sync on a later session start
`wind sync session-abc123-2026-10-04T11-51-07-964Z-97088-0000` delivers it now

Upgrade note: before 0.4.0 a saved-but-unsent retrospective exited 0. A script that treats any non-zero exit from wind down as failure should treat 2 as safe and pending. Do not run the command again on a 2: that records the retrospective twice.

wind knows when an agent is calling

A terminal opened inside a coding agent is the agent's terminal, and a question asked there never gets an answer. wind now works out once per run who is calling (you at a terminal, a coding agent with you in the loop, or nobody) and behaves accordingly: full-screen views for you, plain text for an agent or a script, and no prompt that would hang. Force it either way from any position with --tui or --no-tui.

Every command also says what it does to the world. wind --help carries a read or write beside each command, and each command's page states its effect, so an agent can tell which commands leave nothing behind before it picks one. And the two status reads answer in JSON:

wind status --json        # tool readiness, upload-queue counts, how wind saw this run
wind sync status --json   # every queue entry with its state, reason, and next action

The upload queue, live

wind sync in a terminal now opens a view of everything waiting to upload, with the worktree each entry came from and what to do about it. Select with the arrows, then s syncs all, r retries one, b points an entry at a different session, h moves an entry to the host you are configured for, and d discards one. Host changes and discards ask first.

wind sync            # the live view, and it starts uploading
wind sync status     # the same view without sending anything
wind sync --plain    # line-by-line receipts, as before

One broken entry no longer blocks the rest. Previously a missing payload stopped the whole pass and left every later upload untried.

The software factory, in the binary

A Wind Stream brief becomes a gated, evidenced pull request handed to a reviewer. The lane that does this for Wind Stream's own repositories now ships inside wind, so any repository can run it:

wind factory install     # write the workflows, hooks, and agent definitions into this repository
wind factory selftest    # run the lane's eleven self-tests
wind factory health      # check both credentials and say which one is wrong

A person writes the brief and a person merges. The setup has real steps (a bot account, three secrets, a protected factory-build branch), and the guide walks through them: see docs/factory.md. The verbs need bash and python3, and use gh, curl, and jq. On Windows they run under WSL, and install from PowerShell is untested. On macOS, intake and sweep need Homebrew bash 4 or later and GNU coreutils.

Two supported coding agents

wind now supports Claude Code and Codex, and Antigravity support is removed. If Antigravity was your default, wind tells you so instead of failing later. Pick one and set it up:

wind agent claude    # or: wind agent codex
wind setup

wind next is removed

wind next, introduced in 0.3.9, is gone. Repository state alone could not say what the right next action was, and the command saw no real use. Nothing replaces it in this release.

Security fixes worth upgrading for

wind down cannot record a draft you have not seen. If you typed down while a draft was still being generated, wind took it as approval of text that had not reached the screen yet. Anything typed before a draft is shown is now ignored.

wind down --yes no longer records your transcript when it cannot draft. Offline or with an expired token, the unattended fallback used to include what you had typed to your coding agent. It now records the reason and the verified facts only.

A repository cannot point wind down at another worktree's sessions. wind reads the agent sessions of the directory its manifest is actually in, not the directory the manifest claims.

No more keychain prompts under a different home directory. Run inside a sandbox, a container, or a test harness that sets HOME, wind on macOS could trigger a system dialog offering to reset your keychain. It now leaves the keychain alone unless HOME is your account's own home.

A queue file in a repository can no longer reach outside it. wind reads its upload queue from your home directory and also from the repository you run it in. A repository carrying a crafted queue file could make wind write a file outside its own folder, or upload a local file the queue entry pointed at, the next time you ran wind status or started a session there. Both are closed: wind refuses the entry and lists it as unreadable. Earlier versions are affected too, so this one is worth upgrading for.

If you have not met wind proxy yet

wind proxy arrived in 0.3.10 without an introduction on this page. Here is the one it should have had.

You have two versions of a service: the one you run today and the one that should replace it. Point your application at wind proxy instead. It answers every request from one of them (the serve upstream), quietly asks the other (the shadow upstream) the same question, and counts where they differ. Wind Stream scores the window on /evals as <service>-window-parity: how many calls diverged, how much of the traffic was actually compared, and whether enough calls were seen to mean anything.

One command, one file.

wind proxy init id3 --serve http://localhost:7001 --shadow http://localhost:7002 --route "GET /tags/:id"
wind proxy run

init registers the service with your organization and writes wind-proxy.json. run serves on http://localhost:8787 (change port in the file). Point your app there.

Custody policy — your choice.

When two answers differ, the proxy keeps a divergence fixture. Where it goes is your organization's custody policy:

Mode Where the fixture goes
windstream Your Wind Stream organization, as an asset you can attach to the Outcome that closes the divergence
local A directory on the machine running the proxy (./wind-proxy-divergences unless the policy names one)
none Nowhere; only the field names and counts are kept

The proxy never loosens the policy on its own. If the policy says windstream and the platform is unreachable, the fixture is not written to disk as a fallback; the divergence still counts.

Record the truth, replay it against the candidate. A parity window needs the same questions asked twice. wind proxy record captures a service's answers as a set — <slug>-set/ with manifest.json, inputs/, and expected/ — over http (a paths file) or exec (a command run once per input file). wind proxy replay issues the set against the candidate and compares where the set carries expectations, counting exactly as the live proxy does; the platform sees one kind of window. Differences are printed side by side after redaction and written to <slug>-divergences-set/, and replaying that set reproduces them. In the none custody mode, replay --divergence <id> reproduces a divergence straight from the running proxy's memory.

Docs

Provenance

Built and published by the wind publish pipeline from windstreamai/wind
tag v0.4.0, commit 380a2fcea35c1e2d7c5a26cc83b406d5b61eba04. Assets are
checksum-verified before this release is published (see SHA256SUMS).

License

Proprietary — see EULA.md, governed by the
Wind Stream Terms of Service.
Third-party notices: THIRD_PARTY_NOTICES.md.