You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: CHANGELOG.md
+11Lines changed: 11 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -6,6 +6,17 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
6
6
7
7
## [Unreleased]
8
8
9
+
## [1.126.1] - 2026-08-03
10
+
11
+
### Changed
12
+
-**Bundled KV guidance now documents concurrency-safe state layouts** (#1068) — `kv_set` is an unconditional overwrite without compare-and-swap, so the guide recommends per-writer keys, assemble-on-read fan-in, and concurrent testing.
13
+
-**Worker harness pins now track Pi 0.83.0 and OpenCode 1.18.11** (#1071) — the worker image and runtime dependencies move to the latest compatible weekly releases.
14
+
15
+
### Fixed
16
+
-**Durable script-workflow agent steps cannot resolve an unrelated same-context task** (#1072) — replay lookup only accepts `script-run-step` tasks and polling stays pinned to the selected task ID.
17
+
-**Slack v2 task trees and outcome cards no longer create permalink unfurls** (#1070) — cross-message links were removed while task links and compact agent/task provenance remain available.
18
+
-**Script-workflow label linting follows TypeScript syntax scope** (#1073) — repeated literal labels are rejected inside real loops and iteration callbacks without false positives from nearby or text-like loop syntax.
Copy file name to clipboardExpand all lines: MCP.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1515,7 +1515,7 @@ Read a key from the swarm KV store. Returns the entry or null if missing/expired
1515
1515
1516
1516
**KV Set**
1517
1517
1518
-
Write a key in the swarm KV store. Upserts atomically. Namespace defaults to your current context. Use `expiresInSec` for opt-in TTL (default: never expires). 2 MiB body cap.
1518
+
Write a key in the swarm KV store. Each replacement is atomic but unconditional: there is no compare-and-swap, so concurrent read-modify-write callers can lose updates. Namespace defaults to your current context. Use `expiresInSec` for opt-in TTL (default: never expires). 2 MiB body cap.
`ctx.step.agentTask(label, config)` dispatches a swarm task and **blocks until it reaches a terminal status**, journaling its real output as the step result. This is the natural semantic for a durable step — a sequential `plan → review → implement` chain will not fan out or pass a placeholder downstream.
356
356
357
-
Dispatch and wait are journal-separable: the server looks up an existing task by a `(runId, label)` context key before creating one, so if the harness process restarts mid-wait (crash, supervisor reconciliation, `SCRIPT_RUN_MAX_WALL_MS` eviction), replay resumes polling the same task instead of dispatching a duplicate. The step is only journaled once the task reaches a terminal status.
357
+
Dispatch and wait are journal-separable: the server looks up an existing `script-run-step`task by a `(runId, label)` context key before creating one. Once selected, the wait stays pinned to that task ID, so an unrelated task that later reuses the same context key cannot hijack the result. If the harness process restarts mid-wait (crash, supervisor reconciliation, `SCRIPT_RUN_MAX_WALL_MS` eviction), replay resumes polling the same task instead of dispatching a duplicate. The step is only journaled once the task reaches a terminal status.
358
358
359
359
Config options beyond the task-dispatch fields (`template`/`task`/`agentId`/`tags`/…):
360
360
@@ -436,7 +436,7 @@ Persisted statuses:
436
436
437
437
Terminal statuses are `completed`, `failed`, `cancelled`, and `aborted_limit`.
438
438
439
-
`label_lint_violation` is not a persisted run status. It is a launch-time rejection from `POST /api/script-runs` when the source contains an obvious repeated literal step label inside a loop.
439
+
`label_lint_violation` is not a persisted run status. It is a launch-time rejection from `POST /api/script-runs` when the TypeScript syntax tree places a repeated literal step label inside a loop or an iteration callback such as `map`, `forEach`, or `reduce`. Similar-looking text in comments, strings, or unrelated code does not trigger the lint.
The tree is rendered as footer-weight context blocks and contains status, elapsed time, hierarchy, task links, the latest bounded progress for active tasks, links to completed results, and `↵` permalinks for messages that directly triggered a task. It does not repeat worker output. Updates are debounced, link/media unfurls are disabled, and rate-limit retries honor Slack backoff.
115
+
The tree is rendered as footer-weight context blocks and contains status, elapsed time, hierarchy, task links, and the latest bounded progress for active tasks. It does not repeat worker output or cross-link Slack messages: keeping message permalinks out of the tree prevents Slack from producing noisy link previews. Updates are debounced, link/media unfurls are disabled, and rate-limit retries honor Slack backoff.
116
116
117
117
### Outcome Cards and Message Provenance
118
118
119
-
Each completed Slack ask gets one outcome card containing the full multi-paragraph Markdown result, bounded only by Slack's presentation limit with a link to the full task when truncation is required. The renderer writes it once with `chat.startStream`, about three `chat.appendStream` calls, and `chat.stopStream`; it is never passed to `chat.update`, so Slack does not stamp it as edited. The card links back to the tree, and the tree links to the card.
119
+
Each completed Slack ask gets one outcome card containing the full multi-paragraph Markdown result, bounded only by Slack's presentation limit with a link to the full task when truncation is required. The renderer writes it once with `chat.startStream`, about three `chat.appendStream` calls, and `chat.stopStream`; it is never passed to `chat.update`, so Slack does not stamp it as edited. Outcome cards do not link back to the tree, which avoids an otherwise redundant Slack permalink unfurl.
120
120
121
-
Raw worker output is not automatically relayed into Slack. Additional messages only appear when an agent explicitly calls `slack-reply`, `slack-post`, or `slack-start-thread`. Those tools accept optional Block Kit `blocks`; when omitted they generate a mrkdwn section. Their compact context footer contains only useful provenance: agent, task, and a link back to the tree when available.
121
+
Raw worker output is not automatically relayed into Slack. Additional messages only appear when an agent explicitly calls `slack-reply`, `slack-post`, or `slack-start-thread`. Those tools accept optional Block Kit `blocks`; when omitted they generate a mrkdwn section. Their compact context footer contains the originating agent and task without a Slack-message permalink.
122
122
123
-
Tree, outcome, and explicit agent message timestamps are persisted in `slack_messages`, so the renderer can reuse and cross-link messages after a restart.
123
+
Tree, outcome, and explicit agent message timestamps are persisted in `slack_messages`, so the renderer can reuse messages after a restart.
Copy file name to clipboardExpand all lines: docs-site/content/docs/(documentation)/reference/mcp-tools.mdx
+3-1Lines changed: 3 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -247,6 +247,8 @@ Manage the prompt-template registry (system-prompt and task-prompt sections) at
247
247
248
248
## Slack Tools
249
249
250
+
When the v2 Slack renderer adds provenance to explicit `slack-reply`, `slack-post`, or `slack-start-thread` messages, it keeps the footer to agent and task identity. It deliberately omits links between Slack messages so provenance does not create link-preview unfurls.
251
+
250
252
### slack-reply
251
253
252
254
Reply to a Slack thread associated with a task.
@@ -707,7 +709,7 @@ Read a key. Returns the entry or `null` if missing/expired. Namespace defaults t
707
709
708
710
### kv-set
709
711
710
-
Write a key. Upserts atomically. 2 MiB body cap.
712
+
Write a key. Each replacement is atomic but unconditional: there is no compare-and-swap, so concurrent read-modify-write callers can lose updates. Use per-writer keys and assemble on read for fan-in workloads. 2 MiB body cap.
0 commit comments