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
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 45 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,49 @@ New entries are written as one fragment file per change in [changelog.d/](change

## [Unreleased]

## [0.2.27] - 2026-11-09

### Fixed

- A trace rotation whose flush is refused no longer prunes the oldest segment, so the last durable trace file stays on disk instead of being deleted while the newer records exist only in memory ([#2624](https://github.com/ThinkFlowLab/FlyBot/issues/2624)).
- A timeline trace whose open is refused — a directory that cannot be listed, one removed underneath, or an I/O error — now gives its writer lock back instead of keeping it for the life of the process, so the next open in the same process and every later process succeeds once the problem is gone, and one transient read failure no longer leaves the on-disk trace switched off until a restart ([#2629](https://github.com/ThinkFlowLab/FlyBot/issues/2629)).
- A Bot Social credentials, backup or settings file that exists but no longer parses is now refused with a message naming it instead of being read as "not configured", so a torn file no longer makes a restart register a new home identity and overwrite the old one. Writes land through a temp file and a rename, so a failed write leaves the previous file whole ([#2631](https://github.com/ThinkFlowLab/FlyBot/issues/2631)).
- A grant or profile change that falls back to Bot Social's REST routes now gives up at the client's deadline instead of waiting forever, so a Bot Social server that accepts the connection and never answers shows a timeout error rather than a hung action ([#2633](https://github.com/ThinkFlowLab/FlyBot/issues/2633)).
- An external participant whose room turn times out is now stopped instead of being left running, so a late answer to the timed-out turn can no longer become the next turn's answer — a slow process no longer replies one turn behind ([#2634](https://github.com/ThinkFlowLab/FlyBot/issues/2634)).
- The group board (`track_tasks`) now matches a Bot name and a group name the way every other door does — trimmed, case-insensitive, a leading `@` dropped from a Bot name and surrounding quotes from a group name — so `assignee: "dev"` and `group: "delivery group"` resolve the Bot and the room they name instead of being refused while the same state resolves them everywhere else. A name that matches no member or more than one still gets the same refusal ([#2637](https://github.com/ThinkFlowLab/FlyBot/issues/2637)).
- A Project name, repository, default branch, owner id, working folder or status that ends in an emoji at its length bound is now cut on a character boundary, so `state.json` stores a whole character instead of half a surrogate pair that every UTF-8 write showed as a replacement character ([#2638](https://github.com/ThinkFlowLab/FlyBot/issues/2638)).
- A person's own line in a face-to-face room is now capped at 18 000 code points instead of UTF-16 units, so an emoji at the bound is kept whole rather than stored as half a surrogate pair that every later UTF-8 write shows as a replacement character ([#2641](https://github.com/ThinkFlowLab/FlyBot/issues/2641)).
- The `social`, `timeline` and `workflow` plugins now resolve `$DSH_HOME` the way the core does — a blank or whitespace value counts as unset, `~` expands, and the root is always absolute — so `bot/flybot-social.json`, `bot/flybot-timeline` and `bot/flybot-workflow` no longer move with the process's working directory ([#2643](https://github.com/ThinkFlowLab/FlyBot/issues/2643)).
- A copied line no longer loses the front of a word that only starts with a Bot's name: `Development plan is ready`, `Devices are offline`, `Released v0.2.26`, `Reviewers disagree` and `Chief concern about the tip` copy exactly as the preview reads them, while a real `Dev → Reviewer` delegation trace is still removed ([#2645](https://github.com/ThinkFlowLab/FlyBot/issues/2645)).
- A friend's Bot can no longer put its own CSS on your page: the image URL in its published look is checked where it enters and again in the page-wide mention stylesheet, so a value carrying a quote, a parenthesis, a backslash or a control character is dropped and the Bot is drawn with its colour and mask instead of its photo ([#2646](https://github.com/ThinkFlowLab/FlyBot/issues/2646)).
- A Bot's stored GIF avatar now reaches friends as the picture itself instead of a generated shape, and a look Bot Social refuses is no longer recorded as synced: saving the same picture again retries it instead of being silently skipped ([#2649](https://github.com/ThinkFlowLab/FlyBot/issues/2649)).
- The Project board reads every page of its GitHub pull-request and issue lists instead of the first hundred rows, so its seven-day merge and close medians and its day counts now cover the whole window rather than roughly the newest three days ([#2650](https://github.com/ThinkFlowLab/FlyBot/issues/2650)).
- A `define_workflow` call that replaces a saved graph now stores its `stepTimeoutMinutes` instead of returning success while keeping the old value, and refuses a value outside 1..120 the way the create branch does; the `workflow/graph` save applies the same rule, while a save that omits the field still keeps what is stored ([#2654](https://github.com/ThinkFlowLab/FlyBot/issues/2654)).
- The Inbox lists failed workflow runs again: the shell now reads the workflow pack through the plugin's `flybot/workflow/state` endpoint instead of the bare `workflow/state` the host refuses, so a failed run reaches the Needs list and its badge ([#2656](https://github.com/ThinkFlowLab/FlyBot/issues/2656)).
- An issue fast-line run no longer ends `failed` after its pull request was already opened: a Triage step that prints its delivery as its own `OUTPUT pr: 2657 (verified)` — or as `OUTPUT merged: <40-character sha>` — now counts as work done, so the run continues to `gate`/`enqueue`/`attest` and its record keeps the pull request number instead of dying on a missing `state` line ([#2658](https://github.com/ThinkFlowLab/FlyBot/issues/2658)).
- Two `run_workflow` calls that land in the same millisecond now start two runs instead of sharing a generated task id, so the second call is no longer silently dropped and no longer overwrites the first run's brief; a repeated dispatch that passes the same `task` explicitly is still de-duplicated ([#2662](https://github.com/ThinkFlowLab/FlyBot/issues/2662)).
- Adding three or more Bots to one Parallel step in the New workflow dialog no longer gives two of them the same node id, so Create succeeds instead of failing with `Node n2 is listed twice` ([#2663](https://github.com/ThinkFlowLab/FlyBot/issues/2663)).
- A card that has already finished — `accepted`, `cancelled` or `failed` — now refuses a late `handoff` with `A finished task cannot be handed on` instead of reopening itself as `open`, `not-started` and 0% under the next role, so a card that shows 100% can no longer slide back to the start of the board; the refusal is written the way the same card's "waiting on a question" write already is, and the refused write lands nothing at all, with `claimedBy` and the card's terminal state kept. A `result-ready` card still hands on, because that column is allowed to go back to working ([#2667](https://github.com/ThinkFlowLab/FlyBot/issues/2667)).
- A workflow node is now told which `OUTPUT` lines it owes from its own declared outputs **and** from the outputs its outgoing edges read, with the accepted values spelled out (`OUTPUT state: <one of: ready, blocked>`), so a node that declares no outputs no longer runs every step into `Missing OUTPUT state` and fails ([#2669](https://github.com/ThinkFlowLab/FlyBot/issues/2669)).
- A second, read-only DSH window on the same home no longer reaps or disposes the writer's live workflow: loading the plugin and closing that window both leave the run, its step Bots and the stored progress alone, and the writing host's own load-time reap decides ([#2673](https://github.com/ThinkFlowLab/FlyBot/issues/2673)).
- A second, read-only DSH window on the same home no longer onboards a Bot Social home or writes the shared credentials file: it starts the social layer from the credentials the writable window already saved, so friends and messages stay visible, while the window that holds the team is the only one that can create a home or change that file ([#2675](https://github.com/ThinkFlowLab/FlyBot/issues/2675)).
- A workflow step no longer fails because its own answer quotes `could not answer your message` while auditing that sentence: the host marks its real failure notice structurally, and an old host without the marker is read only from the notice shape at the start of the reply ([#2677](https://github.com/ThinkFlowLab/FlyBot/issues/2677)).
- A turn that DSH ended at the model's output limit is no longer reported as a normal finish or as a member that chose silence: the activity feed marks `turn.end` with `limited: true`, the ended-turn view keeps the turn (with `silent` and the streak when it wrote nothing, and its own sentence in the chat instead of "could not run"), and a group member cut off before it answered is recorded as "no answer" instead of a pass ([#2679](https://github.com/ThinkFlowLab/FlyBot/issues/2679)).
- A workflow file written by a newer FlyBot is no longer rewritten by an older one: the workspace store refuses to save over a definition whose `version` is higher than the one it writes and leaves it byte-identical, and lists it as a newer file instead of showing a definition that has lost fields it could not read. The workflow plugin does the same for `workflows.json` — `workflow/state` now answers `store-newer-version` with the version that wrote it, and every write is refused, so the owner's workflows, runs, claims and `seq` can no longer be replaced by the factory fixture ([#2681](https://github.com/ThinkFlowLab/FlyBot/issues/2681)).
- A declared `pr`/`pull` OUTPUT now counts as delivery evidence only when its value is the pull number itself — a positive integer, an optional leading `#`, an optional trailing parenthetical such as `2657 (verified)` — so a step that says it has no pull request is no longer read as one, and a loop's `until` output reaches the step body the same way a `when` condition does, so a looping node is told the line it must print instead of failing for silence ([#2685](https://github.com/ThinkFlowLab/FlyBot/issues/2685)).
- The timeline's OTLP exporter no longer follows a redirect from the collector: a `307` reply that points at another origin is an export failure (warned, not counted as delivered, retried on the next flush) instead of a replay of `otlpHeaders` and the span payload at a host the operator never named. A normal `200` still counts as delivered ([#2687](https://github.com/ThinkFlowLab/FlyBot/issues/2687)).
- An external room participant whose answer line grows past the 4 KB stdout buffer is now reported to the room as `answer exceeded 4096 bytes` and keeps its process for later turns, instead of the answer being dropped as if the process had never spoken ([#2689](https://github.com/ThinkFlowLab/FlyBot/issues/2689)).
- A Bot or group-chat name written in either Unicode canonical form, or carrying an invisible format character such as a zero-width space, is now one identity: the duplicate guard refuses the twin, `@Name` and every lookup reach the same record, and a stored name keeps only the characters that show on screen ([#2691](https://github.com/ThinkFlowLab/FlyBot/issues/2691)).
- A sibling Bot name, a member's role label and a memory topic written in either Unicode canonical form are now one identity each: `create_child_bot` refuses a child whose name only spells the sibling's name the other way, a queued task card reaches the member whose role label is the same role, and one topic is one file — a file written under an older spelling is still the topic's file, so nothing already saved is lost ([#2692](https://github.com/ThinkFlowLab/FlyBot/issues/2692)).
- A friend's Bot or owner display name is now cut on code points at its 60-character bound, so a name whose bound falls inside an emoji keeps the emoji whole instead of being stored as half a surrogate pair that every later UTF-8 write shows as a replacement character; the file names, outbound drafts and error lines the plugin also caps follow the same rule. A name already stored with a lone surrogate keeps that value: this change fixes new values and does not rewrite stored ones ([#2693](https://github.com/ThinkFlowLab/FlyBot/issues/2693)).
- The host now creates its own files private: a Bot's memory and its snapshot, `state.json`, the chat index, the decision log, the OCR cache and `inflight.json` are `0600` in a `0700` folder whatever `umask` the process inherited, and a rewrite keeps the mode the file already has, so a `chmod 0600` the owner made by hand is no longer undone by the next `remember` ([#2697](https://github.com/ThinkFlowLab/FlyBot/issues/2697)).
- A room line no longer tells the other homes in the room about this machine: a picture that could not be read is named by its file name and size instead of its absolute path (a Bot's own chat still names the path for itself), and a crashed external Bot's line reports only how it ended (`exit 1`, `signal SIGKILL`) while the child's last `stderr` words stay in this host's log. Every stored room line also passes this host's secret redaction before it is kept or sent, so a pasted key cannot ride a line to a friend's Bot ([#2699](https://github.com/ThinkFlowLab/FlyBot/issues/2699)).
- A Feishu webhook message whose answer was lost is no longer posted a second time: a timed-out or aborted send gets one attempt and says the message may already be in the chat, instead of claiming Feishu refused it ([#2660](https://github.com/ThinkFlowLab/FlyBot/issues/2660)).

### Security

- A room request naming one room in `id` and another in `roomId` no longer mints, reads or withdraws the other member's link, nor returns another member's live round: on the invite and round-read endpoints the permission gate and the handler resolve the room the same way, and such a request is refused ([#2652](https://github.com/ThinkFlowLab/FlyBot/issues/2652)).

## [0.2.26] - 2026-11-08

### Added
Expand Down Expand Up @@ -1289,7 +1332,8 @@ If you used the legacy `dsh-bot` package, remove it before you install `ds-bot`.
- Only one DSH can change a team at a time; a second DSH on the same DSH home opens it read-only ([Data and backups](ds-bot/README.md#data-and-backups)).
- Group chats use many tokens: each member reads the group and answers in turn.

[Unreleased]: https://github.com/ThinkFlowLab/FlyBot/compare/v0.2.26...HEAD
[Unreleased]: https://github.com/ThinkFlowLab/FlyBot/compare/v0.2.27...HEAD
[0.2.27]: https://github.com/ThinkFlowLab/FlyBot/compare/v0.2.26...v0.2.27
[0.2.26]: https://github.com/ThinkFlowLab/FlyBot/compare/v0.2.25...v0.2.26
[0.2.25]: https://github.com/ThinkFlowLab/FlyBot/compare/v0.2.24...v0.2.25
[0.2.24]: https://github.com/ThinkFlowLab/FlyBot/compare/v0.2.23...v0.2.24
Expand Down
1 change: 0 additions & 1 deletion changelog.d/2624.fixed.md

This file was deleted.

1 change: 0 additions & 1 deletion changelog.d/2629.fixed.md

This file was deleted.

1 change: 0 additions & 1 deletion changelog.d/2631.fixed.md

This file was deleted.

1 change: 0 additions & 1 deletion changelog.d/2633.fixed.md

This file was deleted.

1 change: 0 additions & 1 deletion changelog.d/2634.fixed.md

This file was deleted.

1 change: 0 additions & 1 deletion changelog.d/2637.fixed.md

This file was deleted.

1 change: 0 additions & 1 deletion changelog.d/2638.fixed.md

This file was deleted.

1 change: 0 additions & 1 deletion changelog.d/2641.fixed.md

This file was deleted.

1 change: 0 additions & 1 deletion changelog.d/2643.fixed.md

This file was deleted.

1 change: 0 additions & 1 deletion changelog.d/2645.fixed.md

This file was deleted.

1 change: 0 additions & 1 deletion changelog.d/2646.fixed.md

This file was deleted.

1 change: 0 additions & 1 deletion changelog.d/2649.fixed.md

This file was deleted.

1 change: 0 additions & 1 deletion changelog.d/2650.fixed.md

This file was deleted.

1 change: 0 additions & 1 deletion changelog.d/2652.security.md

This file was deleted.

Loading
Loading