Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
139 commits
Select commit Hold shift + click to select a range
ccd1f85
Give each connection its own page and list connections as cards
leoisadev1 Oct 9, 2026
b5ffc28
Fill app logo tiles edge to edge
leoisadev1 Oct 9, 2026
1d77e42
fix(self-host): stop tracing idle scheduler and provisioning polls
ntindle Oct 10, 2026
1af069e
fix(self-host): stop tracing idle event delivery polls
ntindle Oct 10, 2026
59c5fbc
fix(cloud): let the schedule coordinator hibernate between passes
daviesayo Oct 16, 2026
ffb55ee
Keep MCP tools listed when a server refuses the optional event stream
Abhishek-B-R Oct 17, 2026
6d05df3
fix(self-host): add Connect SSO button on Security page
The-AarushiSingh Oct 20, 2026
6e21918
Export 50ee24e
RhysSullivan Oct 23, 2026
1b67b8a
Export 833987e
RhysSullivan Oct 23, 2026
f06f5c1
Export 541119c
RhysSullivan Oct 23, 2026
40afc60
Export 42602cc
RhysSullivan Oct 23, 2026
f69c667
Export d89244c
RhysSullivan Oct 23, 2026
fe1afa8
Reject control characters and invisible-only app names
The-AarushiSingh Oct 23, 2026
5baa59d
Export 0a0c0510
RhysSullivan Oct 23, 2026
e2dcb61
Export 2c930372
RhysSullivan Oct 23, 2026
5beb4dd
Export 07c90955
RhysSullivan Oct 24, 2026
2070e93
Export 18be383e
RhysSullivan Oct 24, 2026
d42a326
Export 7a7b3731
RhysSullivan Oct 24, 2026
b630c1e
Export 8d7675c1
RhysSullivan Oct 24, 2026
c221d23
Export 21d0f628
RhysSullivan Oct 24, 2026
1732e66
Export f18fca16
RhysSullivan Oct 24, 2026
bfd38c3
Export 5a39b78c
RhysSullivan Oct 24, 2026
441663c
Export 6b5abfcb
RhysSullivan Oct 24, 2026
4a06c86
Export fba59aba
RhysSullivan Oct 24, 2026
ad511b5
Export b87df447
RhysSullivan Oct 24, 2026
c14fbef
Export 6152588b
RhysSullivan Oct 24, 2026
fa09ffc
Export 65b16867
devin-ai-integration[bot] Oct 24, 2026
820b168
Export 644d1b2a
devin-ai-integration[bot] Oct 24, 2026
4752bda
Export 513055d4
devin-ai-integration[bot] Oct 24, 2026
13e6c32
Export 3539eb14
RhysSullivan Oct 24, 2026
2aebd0c
Export 2c4f2057
RhysSullivan Oct 24, 2026
21f7905
Export c9b1d1ae
RhysSullivan Oct 24, 2026
8983c2e
Export 0009ad95
RhysSullivan Oct 24, 2026
4cec765
Export d46fb239
RhysSullivan Oct 24, 2026
7b658b6
Export 6e961c83
RhysSullivan Oct 24, 2026
a9d6255
Export bd37247c
RhysSullivan Oct 25, 2026
1546293
Export 915c9702
RhysSullivan Oct 25, 2026
72d4391
Export 31d9e52c
RhysSullivan Oct 25, 2026
5dc9db4
Export 564e7466
RhysSullivan Oct 25, 2026
0e8a57d
fix: retain OAuth redirect URI on refresh
JustYannicc Oct 25, 2026
2ffb3f8
Export bd819854
RhysSullivan Oct 25, 2026
8b7e92f
Export 5e2eeeb7
RhysSullivan Oct 25, 2026
e015f3d
Export 534a3e41
RhysSullivan Oct 25, 2026
fbf2f0b
Export 9458d001
RhysSullivan Oct 25, 2026
88ee88b
Export c1d18210
RhysSullivan Oct 25, 2026
52841db
Export 19982028
RhysSullivan Oct 25, 2026
1600682
Export 682783eb
RhysSullivan Oct 25, 2026
26747ad
Export 0cdbd73d
RhysSullivan Oct 25, 2026
b2f81da
Export 0fa99d08
RhysSullivan Oct 25, 2026
9546051
Export e9864bc5
RhysSullivan Oct 25, 2026
6ffe661
Export 7b9c3ee7
RhysSullivan Oct 25, 2026
f2c622e
Export 2c726997
RhysSullivan Oct 25, 2026
9e3c612
Export a712da86
RhysSullivan Oct 25, 2026
331a391
Export 3a19c1d3
RhysSullivan Oct 25, 2026
ab67d6d
Export abb9fac6
RhysSullivan Oct 25, 2026
0cb7156
Export 9c4d30ff
RhysSullivan Oct 25, 2026
79f8777
Export aaf02635
RhysSullivan Oct 25, 2026
efefff7
Export cf31d62f
RhysSullivan Oct 25, 2026
1396477
Export 26934a53
RhysSullivan Oct 25, 2026
8fffed2
Export a2d221e1
RhysSullivan Oct 25, 2026
0805428
Export 09fb4241
RhysSullivan Oct 25, 2026
a221c0d
Export a1fb8df3
RhysSullivan Oct 25, 2026
9043ec3
Export 82eb7165
RhysSullivan Oct 25, 2026
511be5f
Export 314ce8ff
RhysSullivan Oct 25, 2026
f08d8cc
Export 60519863
RhysSullivan Oct 25, 2026
1a9d1b9
Export e842ffe9
RhysSullivan Oct 25, 2026
cdf2b45
Export b6ec8fba
RhysSullivan Oct 25, 2026
8529324
Export dd71cd4a
RhysSullivan Oct 25, 2026
288e371
Export 701d4e42
RhysSullivan Oct 25, 2026
d8519f3
Export 7bf483b0
RhysSullivan Oct 25, 2026
3959601
Export f3b094b5
RhysSullivan Oct 25, 2026
1f80d15
Export aac79089
RhysSullivan Oct 25, 2026
ceb4ed1
Export ac6b4756
RhysSullivan Oct 25, 2026
85ad58a
Export 96f73c71
RhysSullivan Oct 25, 2026
5ae1d54
Export 789f1afa
RhysSullivan Oct 25, 2026
d90c8b1
Export e3165058
RhysSullivan Oct 26, 2026
8f0e4c5
Export 413986b8
RhysSullivan Oct 26, 2026
57e9204
Export 78f6d8e6
RhysSullivan Oct 26, 2026
7630e01
Export e5841ac3
RhysSullivan Oct 26, 2026
4c5c2f1
Export 0e22128c
RhysSullivan Oct 26, 2026
71e75a8
Export b5bb6b70
RhysSullivan Oct 26, 2026
036596d
Export 34dfd534
RhysSullivan Oct 26, 2026
45f5719
Export 9b9c2371
RhysSullivan Oct 26, 2026
c20b147
Export 9ad7f846
RhysSullivan Oct 26, 2026
b605e8a
Export 2542316f
RhysSullivan Oct 26, 2026
783ca87
Export cf7beaed
RhysSullivan Oct 26, 2026
3ca18b3
Export 2b75a923
RhysSullivan Oct 26, 2026
639505b
Export 6afe1884
RhysSullivan Oct 26, 2026
d4394bb
Export 96ebfeb8
RhysSullivan Oct 26, 2026
aaec4e3
Export 3ff783b1
RhysSullivan Oct 26, 2026
70a8588
Export b6048f67
RhysSullivan Oct 26, 2026
f26ec29
Export bf523c1f
RhysSullivan Oct 26, 2026
e4bde92
Export 64f0bb40
RhysSullivan Oct 26, 2026
6219572
Export 31b9f903
RhysSullivan Oct 27, 2026
70c863d
Export 5522f8e2
RhysSullivan Oct 27, 2026
1bf23bc
Export 57da18ab
RhysSullivan Oct 27, 2026
178b74f
Export 3e344759
RhysSullivan Oct 27, 2026
2ed766b
Export 4205294b
RhysSullivan Oct 27, 2026
5efc767
Export 61fff8f7
RhysSullivan Oct 27, 2026
bf7ba0a
Export 07652f88
RhysSullivan Oct 27, 2026
f12fdb4
Export 782f9a30
RhysSullivan Oct 27, 2026
f6c6961
Export 340ea8f0
RhysSullivan Oct 27, 2026
0deb94b
Export 5bec1005
RhysSullivan Oct 27, 2026
a8db11e
Export 8985757d
RhysSullivan Oct 27, 2026
74cc715
Export 0ab87098
RhysSullivan Oct 27, 2026
4d650ce
Export ad4a658d
RhysSullivan Oct 27, 2026
ee75000
Export c52dd4da
RhysSullivan Oct 27, 2026
80387a3
Export e5f0b6e7
RhysSullivan Oct 27, 2026
980fad6
Export 5e0ed612
RhysSullivan Oct 27, 2026
5a1aba9
Export 53bf4ede
RhysSullivan Oct 27, 2026
ae2832a
Export 6ccb0042
RhysSullivan Oct 27, 2026
9edd4a5
Export 3a543d08
RhysSullivan Oct 27, 2026
fb49ec6
Keep an OpenAPI tool name when a refined sibling lands on it
Abhishek-B-R Oct 28, 2026
9e86ebd
Export 7513b85b
RhysSullivan Oct 28, 2026
535f11f
perf(hosted): share identity checks within dashboard batches
JustYannicc Oct 29, 2026
4cfe919
test(hosted): correlate authentication spans for each batch read
JustYannicc Oct 29, 2026
225d9b8
Export dc02462b
RhysSullivan Oct 29, 2026
287b280
test(hosted): decode each batch answer line explicitly
JustYannicc Oct 29, 2026
c089e1d
fix(cloud): redact query strings in every Worker's native logs
JustYannicc Oct 29, 2026
680f503
perf(cloud): keep verification cleanup off app query reads
JustYannicc Oct 29, 2026
ef529d8
test(cloud): isolate the app query parent session
JustYannicc Oct 29, 2026
007a59c
Export 34102d10
RhysSullivan Oct 29, 2026
a6f9b43
fix(storage): retain safe migration failure diagnostics
JustYannicc Oct 30, 2026
ecbdcd6
Export d2fc29df
RhysSullivan Oct 30, 2026
30c03cd
Export 8a4cf3ab
RhysSullivan Oct 30, 2026
75dd83e
perf(app-ui): serve app files before page work and inline the version…
JustYannicc Oct 30, 2026
c714352
Export c4f9ff56
RhysSullivan Oct 31, 2026
6a17a38
Export e50d677b
RhysSullivan Oct 31, 2026
3033bbd
Export 324dac71
RhysSullivan Oct 31, 2026
5b0ce47
Export 8c69aad0
RhysSullivan Oct 31, 2026
e2802c7
Export 2df1522b
RhysSullivan Nov 2, 2026
69dac86
Export 7e85b534
RhysSullivan Nov 2, 2026
6058f6a
Export f5becfdb
RhysSullivan Nov 2, 2026
5a38ab0
Export db2a92f8
RhysSullivan Nov 2, 2026
5f76798
Export 58624f9b
RhysSullivan Nov 3, 2026
88dfdf9
Export 0279ea34
RhysSullivan Nov 3, 2026
cd6048d
Export 5dc66bf7
RhysSullivan Nov 3, 2026
a84cf12
Merge upstream/v2 (cd6048d26) into the fork
shuv1337 Nov 3, 2026
534821d
Version apps 0.0.1-beta.119.shuv.1 on the upstream beta.119 base
shuv1337 Nov 3, 2026
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
  •  
  •  
  •  
8 changes: 8 additions & 0 deletions .changeset/app-files-before-page-work.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
"apps": patch
---

`apps/ui/serving` exports `appFile`, which answers a version's own file, or a 404 for a missing
dotted path, and returns `None` for the page itself, so hosts can serve files before page work.
`appDocument` renders only the document and inlines the version watcher; `appWatchScript` is
removed, along with the hosts' `/_executor/watch.js` routes.
20 changes: 20 additions & 0 deletions .changeset/background-service.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
---
"@executor-js/local-server": minor
"@executor-js/app-management": patch
"@executor-js/desktop": minor
"@executor-js/app-templates": patch
---

`executor` now starts one background Executor per data directory, shared by the command line,
`executor apps` and the desktop app, and exits once the dashboard opens; the background Executor
runs until `executor service stop`. `executor service` starts, stops and configures it, and
`executor upgrade` stops it and starts it again on the new version. `executor apps` commands
without `--host` or `EXECUTOR_HOST` use it and need no API key, as the app-authoring skill now says.
Executor 1's `executor service install` and `executor service uninstall` name what to run instead.

Executor desktop no longer runs its own server: it starts or joins the same background Executor and
uses the command line's data directory, `~/.executor/v2/cli`. Its first launch moves the data of an
earlier desktop release there, once. Command-line data already in that directory, with its apps and
accounts, moves to `~/.executor/v2/backups/cli-data-<time>`, which the desktop names; nothing is
merged or deleted. The command line's settings carry over, except its port and the `env` variables
that belong to the replaced data, and the desktop says which changed.
12 changes: 12 additions & 0 deletions .changeset/confirmed-read-retries.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
"@executor-js/sdk": patch
---

A failed call to a tool that only its MCP server labels read-only (`readOnlyHint`) is no
longer offered as a retry. Executor keeps a read's retry advice, and repeats a refused call
with renewed credentials, only for a query the app confirms: a declared operation, a `kinds`
entry, an OpenAPI read method or a GraphQL query (`kindConfirmed`). Other queries fail like
mutations, with `mayHaveWritten` and `retryable: false`. The confirmation comes only from a
listing already kept for the app, so a failed call never evaluates the app again; a query whose
app's tools nobody listed is unconfirmed. Apps built before `kindConfirmed` existed get this for
every query until they are rebuilt.
10 changes: 10 additions & 0 deletions .changeset/confirmed-tool-kinds.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
---
"apps": patch
---

Tool listings mark a kind that the app's code or the tool's protocol decides
with `kindConfirmed`: declared operations, `kinds` entries, OpenAPI HTTP methods
and GraphQL operation types. A kind that comes only from an MCP server's
`readOnlyHint` is not marked, so Executor does not offer a failed call to such a
tool as a read's retry. A `dynamicRouter` can set `kindConfirmed` on the tools
it lists.
16 changes: 16 additions & 0 deletions .changeset/execute-results-whole.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
---
"@executor-js/mcp": patch
"@executor-js/sdk": patch
"@executor-js/app-templates": patch
---

`execute` and `call` no longer limit the size of a result. A value over
100,000 bytes used to come back from `execute` as a success with its JSON cut
into a string that could not be parsed, and `call` refused it; both now return
the whole value, and logs come back whole. Approval requests and an app's own
questions are no longer refused for their size either. A failure that matches
the runtime's 32 MiB limit on one value crossing Workers RPC now names that limit
as the likely cause and says to ask for less if the result could be that large;
the app's Worker can produce the same text, so a read stays retryable once. On
local and self-host the runtime's reason for a failed call now reaches the host.
The code-mode skill states this.
7 changes: 7 additions & 0 deletions .changeset/failed-poll-statement.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"@executor-js/sdk": patch
"@executor-js/telemetry": patch
---

A failed poll's root span now names the statement that failed: its operation,
its table and the database's kind of failure, never its SQL or values.
10 changes: 10 additions & 0 deletions .changeset/failed-poll-traces.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
---
"@executor-js/sdk": patch
"@executor-js/hosted-server": patch
"@executor-js/telemetry": patch
---

A check for due runs, queued provisioning jobs or event deliveries that fails is
traced again, though a check that finds nothing is not. Each failure is
exported as its own root span with the error it recorded, as are a failed
claim of a due event delivery and failed event retention.
11 changes: 11 additions & 0 deletions .changeset/graphql-stated-errors.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
---
"apps": patch
---

A `graphqlRouter` failure now quotes the errors the GraphQL server stated in its response's
`errors` list: each message, its response path and the scalar `extensions` entries, such as
`code`, bounded and with account secrets replaced. A client error status, such as HTTP 400 for a
request that fails validation, reads its GraphQL errors too, from a JSON body of at most 64 KiB
that arrives within 2 seconds; past either, the failure keeps the status and says the body was not
read. Before, every such failure reached the caller as "GraphqlError was thrown without a
message" with only its phase, reason and status.
22 changes: 22 additions & 0 deletions .changeset/host-api-cache.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
---
"@executor-js/sdk": patch
"apps": patch
---

A host can pass `hostApi` to `createExecutor`: the SHA-256 of the API document
it serves, the URLs it serves it at, and which app versions read it. Those
versions' app cache and kept tool listings are keyed by the revision too, so
after the host's API changes they read the new API on their next call instead
of listing its removed tools until their cached document expires. That holds for
a version that owns a database as well. Invocations carry the revision to the
runner, whose outbound network, the data facet's included, refuses a document
from those URLs with a different SHA-256, so a caller and an API deployed at
different moments never keep one revision's API under the other's name. The
app's `fetch` then rejects with the code `EXECUTOR_API_CHANGING`, and the agent
is told that Executor's API is changing and to retry shortly; a tool call that
may have written is told the API is changing but not to repeat it. A caller refuses
the result of a remote runner that does not confirm the check.

An app failure's `code` is the thrown error's own, or else the code of the
error it wraps, such as the platform rejection inside the `HttpClientError`
that `ctx.fetch` rejects with.
9 changes: 9 additions & 0 deletions .changeset/mcp-optional-event-stream.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
"apps": patch
---

`mcpRouter` no longer fails discovery when a Streamable HTTP server refuses the
optional GET event stream, for example with a 401, while answering every POST.
The client carries on without the stream, as the MCP SDK does. A refused POST
still reports rejected credentials, and the legacy SSE transport's GET, which is
its session, still fails as before.
12 changes: 12 additions & 0 deletions .changeset/mcp-reported-tool-errors.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
"@executor-js/mcp": patch
"@executor-js/app-templates": patch
---

A remote MCP tool result with `isError: true` is now listed as a `failure` in the `toolCalls` of
`execute`, `call` and `resume`, and is no longer counted in `executor.tool_call.succeeded`. It
was listed as a `success`, though Executor already recorded the call as failed in its traces and
analytics. The call still returns the whole result instead of throwing, so programs that read
`isError` keep working. Fields an app defines, such as `ok: false`, are not interpreted. The
code-mode skill and the MCP docs say to check `isError`, that a failed call may still have had
effects, and that `success` only means no tool error was reported, not that the action happened.
13 changes: 13 additions & 0 deletions .changeset/motel-store-low-water.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
---
"@executor-js/telemetry": patch
"@executor-js/hosted-self-host": patch
---

The bundled Motel collector no longer churns once its store is full. It used to
evict back to exactly its 1 GiB bound, so the next export crossed it again, and
every export, about one a second on an idle server, paid for an eviction pass
that scanned the whole store. A full store now evicts down to 90% of its bound
and then stores exports without evicting until it fills again. On a full 1 GiB
store with an idle server's exports, the collector's CPU fell from about 9% of a
core to under 1%, its reads from about 30 MiB/s to about 1 MiB/s, and each
export's time from about 120 ms to about 20 ms.
5 changes: 5 additions & 0 deletions .changeset/oauth-refresh-redirect-uri.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@executor-js/sdk": patch
---

Preserve the original authorization redirect URI on OAuth authorization-code grants and reuse it when refreshing their tokens.
5 changes: 5 additions & 0 deletions .changeset/oauth-resource-indicator.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"apps": patch
---

The blocked-app notice for a `credentials_rejected` account reads "credentials not working at last check" instead of "sign-in rejected", because the reason also covers a sign-in that expired before any request.
10 changes: 10 additions & 0 deletions .changeset/openapi-declared-server-errors.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
---
"apps": patch
---

An OpenAPI operation that declares an error response for a 5xx, 401 or 429 status
now quotes that response's declared code and message on the provider failure, as
the service's stated error. Before, the status alone decided the failure and the
body was not read, so an API that explains its server errors, such as Executor's
own API through the Executor app, read as a bare "server error". The failure keeps
its reason, status, account recovery and retry policy.
12 changes: 12 additions & 0 deletions .changeset/openapi-held-names.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
"apps": patch
---

An OpenAPI operation keeps its tool name when a later sibling's refined name
would land on it. The sibling is refined further instead, so a name an agent or
an approval policy already uses keeps calling the same operation. A document
that already declares both operations names them the same way, so an app that
upgrades to this release sees those two names change once: in a document with
`GET /forks` and `GET /stars` (both `operationId: list`) and `GET /starred`
(`operationId: listStars`), `repos.listStars` calls `/starred` again and `/stars`
becomes `repos.listGet`.
8 changes: 8 additions & 0 deletions .changeset/openapi-parameter-descriptions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
"apps": patch
---

OpenAPI tools keep each parameter's `description` and `deprecated` in their
input schema, so `describe` shows agents a path, query, header or cookie
parameter's documentation beside it, as it already does for body properties and
MCP tool properties. Search's one-line input types are unchanged.
16 changes: 16 additions & 0 deletions .changeset/openapi-v1-documents.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
---
"apps": patch
---

`liveOpenapiRouter` imports the OpenAPI documents Executor v1 imported. A schema
reference may reach any schema in the document: a component whose name is not
URI-encoded, a property inside a component, or a schema under `paths` or another
component. An operation that answers with an event stream or another type, such
as JSON, is a tool that asks for the other type. A path may carry a fixed query,
sent before the operation's own parameters, or a fragment, which is not sent; it
does not change the tool's name. An empty field such as `operationId:` counts as
absent, a parameter in a location OpenAPI 3 does not have is not an input, and a
request body without media types sends no body.

`openapiOperationNames` lists every operation a document declares with the name
the router gives it, reading the document as the router does.
6 changes: 6 additions & 0 deletions .changeset/queue-read-indexes.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"@executor-js/sdk": patch
---

Webhook source ticks and account check reads use indexes instead of reading
every row of their tables. Storage version 4.0.16 adds the indexes.
14 changes: 14 additions & 0 deletions .changeset/request-rejections-declared.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
---
"@executor-js/sdk": patch
"@executor-js/app-management": patch
"@executor-js/hosted-server": patch
"@executor-js/hosted-cloud": patch
"@executor-js/hosted-self-host": patch
"@executor-js/local-server": patch
---

A request that does not match its operation's schema now gets a `400 RequestInvalid` that every
operation in the Cloud, self-host and local management documents declares. It names the rejected
part and each path with what the schema expects there, never the submitted value. Agents calling
Executor through the Executor app see that cause instead of an HTTP 400 the document does not
declare. App ID parameters say they take the app's `id`, not its slug.
10 changes: 10 additions & 0 deletions .changeset/skills-input-schema.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
---
"@executor-js/mcp": patch
"@executor-js/app-templates": patch
---

The MCP `skills` tool advertises the input it accepts: every input except `{}`
needs `app`, stated as `dependentRequired` in its input schema, which is
generated from the schema the tool decodes with. The `execute` descriptions and
the Executor app's entry skill give the exact call,
`skills({app: "executor", name: "executor"})`.
6 changes: 6 additions & 0 deletions .changeset/storage-migration-diagnostics.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"@executor-js/sdk": patch
"@executor-js/hosted-server": patch
---

Report the storage version, SQLSTATE and error classes of a failed storage upgrade at startup, without its SQL, parameters or driver message.
8 changes: 8 additions & 0 deletions .changeset/untraced-event-poll.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
"@executor-js/sdk": patch
---

Self-host and local check for due event deliveries every two seconds. That
check no longer records traces when it finds nothing to deliver; each delivery
attempt and each subscription it expires is still traced. An idle self-host
instance no longer fills the bundled Motel store with polling spans.
11 changes: 11 additions & 0 deletions .changeset/untraced-idle-polls.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
---
"@executor-js/sdk": patch
"@executor-js/hosted-server": patch
---

The scheduler's check for due runs, every second on self-host and local, and
self-host's check for queued provisioning jobs, every second, no longer record
traces when they find nothing to do. Each scheduled operation a check finds is
still traced, in its own `schedule.dispatch` trace, and so is each provisioning
job. An idle self-host instance no longer fills the bundled Motel store with
polling spans.
7 changes: 7 additions & 0 deletions .changeset/upgrade-follow-redirects.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"executor": patch
---

`executor upgrade` on an install from the install script downloads the release again. It checked
the status of GitHub's redirect to each release file instead of following it, so every upgrade
failed with "could not download SHA256SUMS" and changed nothing.
23 changes: 23 additions & 0 deletions .changeset/workflow-control-failures.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
---
"apps": patch
"@executor-js/sdk": patch
"@executor-js/app-templates": patch
---

`ctx.workflows.start`, `get`, `list` and `terminate` work again in apps built on `apps`
0.0.1-beta.91 or earlier. Since the rename of deployments to versions the host sent runs
without their former `deployment` field, so those apps could not read any answer and every
call failed as a retryable `engine` failure, even when the run had started. The host now sends
runs in their encoded form, with both names.

A control call the host refuses, such as a `key` over 128 characters, fails with reason `input`,
not retryable, and a message naming the field and the rule it broke; no run is started. A start
whose run was saved, including one whose storage failed right after the save, fails as `engine`,
not retryable, with the run's ID. A start whose commit failed or timed out answers with its run
when Executor can read it back. A start whose save may have committed, and a `start` or
`terminate` that Executor did not answer or whose answer the app could not read, are not
retryable either, and their message says the run may have started or stopped and how to check. A
start without a key is never told to start again, since that would create another run.
Executor's own errors keep their tag and message through workflow controls.

The app-authoring skill lists the workflow limits and what each control failure means.
30 changes: 22 additions & 8 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -135,9 +135,9 @@ a `workflow_call` workflow, so another repository can call the same jobs.
### Choosing a PR's E2E scenarios

A pull request runs only the E2E scenarios it selects. Pushes to `main` run the
full suite. The static checks (`check`, `apps-version`, `self-host-native`) always
run, except in a skipped stack layer. Put exactly one fenced `e2e` block in the PR
description, listing spec files from `e2e/tests/`:
full suite. The static checks (`check` and the jobs it gates, `apps-version`,
`self-host-native`) always run, except in a skipped stack layer. Put exactly one
fenced `e2e` block in the PR description, listing spec files from `e2e/tests/`:

````md
```e2e
Expand Down Expand Up @@ -242,14 +242,19 @@ Do not run CI checks on macOS runners. They cost 5-20x as much per minute as Lin
runners and were most of the CI bill, and no check needs macOS. Fix slow or flaky
scenarios on Linux instead of moving them to a Mac.

- `check` runs `bun run check`: the format check, `oxlint`, the typecheck, the
- `check` passes when `select` and each static check job passed. The static checks run as
parallel jobs, so a pull request waits for the slowest, about a minute and a half, not their
sum. `static` runs `bun run check`: the format check, `oxlint`, the typecheck, the
no-tests-outside-`e2e/` check and the e2e boundary check.
It also builds the public site and runs `bun run site:links`, which fails when
`site` builds the public site and runs `bun run site:links`, which fails when
any marketing or docs page links to a path that would 404. Then
`bun run hosted:cloud:worker-sizes` builds each Cloud Worker as the deploy does,
for production and for the pull request's preview, and fails when one exceeds
its upload budget; the job summary shows each Worker's size, its change from
`main` and the packages and files that grew.
`main` and the packages and files that grew. `apps-package` checks the apps npm
tarball, and `tooling` checks the dependency patches and the scripts that run CI,
releases, the public export and deploys. Put a new static check in the job it fits, or
in a new job that `check` needs.
- `select` runs [`e2e/ci-selection.ts`](e2e/ci-selection.ts) and gives each e2e job
its `--test-name` pattern, or skips the job when none of its scenarios is selected.
Its job patterns hold the exclusions and splits below.
Expand Down Expand Up @@ -278,8 +283,9 @@ scenarios on Linux instead of moving them to a Mac.
per-address limit off, as deployed test stages do; the scenario that proves the limit gets
its own local Cloud with it on (`e2e:cloud --auth-rate-limit`).
Each of these local Clouds is a Cloud job in `e2e/ci-selection.ts`, and its `runner`
there puts it on one of three `e2e-cloud` runners that run at once, about four minutes each
on a full run. Each runner builds the apps package and Motel once before its runs; runs only
there puts it on one of four `e2e-cloud` runners that run at once. On a full run
`cloud-product` has a runner to itself, about eleven minutes, and the others take about six or
seven each. Each runner builds the apps package and Motel once before its runs; runs only
serve that Motel bundle, because every target in a run shares it.
- `e2e` passes when `select` succeeded, every E2E job it chose passed and every other one was
skipped; it runs even after a cancellation, which fails it. The matrix runners' check
Expand All @@ -294,6 +300,14 @@ Release PRs build and test the Linux and Windows targets only. The macOS targets
on manual dispatch, where they are built, signed, notarized and tested. macOS runners
cost 5-20x as much as Linux runners, so keep them off pull requests.

A pull request that changes the release paths (the `paths` in
`.github/workflows/release-artifacts.yml`) also runs "Executor releases". Gate its
merge on that workflow as on CI: wait for both
(`ci-wait --workflow CI --workflow "Executor releases"`) and do not merge while
either fails. Its packaging jobs fail when a native archive exceeds the npm budget
(`npmArchiveBudgetBytes` in `scripts/releases/config.ts`); an archive over it cannot be
published, so that failure blocks every later release until it is fixed.

A failed e2e job uploads raw reports and server logs. Product database files,
runtime dependencies and private `actors.json` sessions are excluded.
Reports use Vitest's final result, including setup and cleanup failures.
Expand Down
Loading
Loading