@workglow/task-graph 0.2.37 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +174 -46
- package/dist/browser.js +639 -368
- package/dist/browser.js.map +19 -15
- package/dist/bun.js +639 -368
- package/dist/bun.js.map +19 -15
- package/dist/cache/CacheJanitor.d.ts +27 -0
- package/dist/cache/CacheJanitor.d.ts.map +1 -0
- package/dist/cache/CachePolicy.d.ts +16 -0
- package/dist/cache/CachePolicy.d.ts.map +1 -0
- package/dist/cache/CacheRegistry.d.ts +30 -0
- package/dist/cache/CacheRegistry.d.ts.map +1 -0
- package/dist/cache/RunPrivateCacheRepo.d.ts +56 -0
- package/dist/cache/RunPrivateCacheRepo.d.ts.map +1 -0
- package/dist/cache/index.d.ts +10 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/common.d.ts +1 -0
- package/dist/common.d.ts.map +1 -1
- package/dist/node.js +639 -368
- package/dist/node.js.map +19 -15
- package/dist/storage/TaskOutputRepository.d.ts +40 -4
- package/dist/storage/TaskOutputRepository.d.ts.map +1 -1
- package/dist/storage/TaskOutputTabularRepository.d.ts +27 -0
- package/dist/storage/TaskOutputTabularRepository.d.ts.map +1 -1
- package/dist/task/CacheCoordinator.d.ts +17 -0
- package/dist/task/CacheCoordinator.d.ts.map +1 -1
- package/dist/task/FallbackTask.d.ts +0 -1
- package/dist/task/FallbackTask.d.ts.map +1 -1
- package/dist/task/FallbackTaskRunner.d.ts +8 -0
- package/dist/task/FallbackTaskRunner.d.ts.map +1 -1
- package/dist/task/ITask.d.ts +21 -1
- package/dist/task/ITask.d.ts.map +1 -1
- package/dist/task/Task.d.ts +50 -0
- package/dist/task/Task.d.ts.map +1 -1
- package/dist/task/TaskJSON.d.ts +0 -13
- package/dist/task/TaskJSON.d.ts.map +1 -1
- package/dist/task/TaskRunner.d.ts +28 -0
- package/dist/task/TaskRunner.d.ts.map +1 -1
- package/dist/task-graph/Conversions.d.ts.map +1 -1
- package/dist/task-graph/StreamPump.d.ts +8 -0
- package/dist/task-graph/StreamPump.d.ts.map +1 -1
- package/dist/task-graph/TaskGraph.d.ts +7 -0
- package/dist/task-graph/TaskGraph.d.ts.map +1 -1
- package/dist/task-graph/TaskGraphRunner.d.ts +45 -0
- package/dist/task-graph/TaskGraphRunner.d.ts.map +1 -1
- package/package.json +7 -7
- package/src/EXECUTION_MODEL.md +91 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TaskGraph.d.ts","sourceRoot":"","sources":["../../src/task-graph/TaskGraph.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,eAAe,EAAS,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC1F,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACvF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAEL,mBAAmB,EACnB,uBAAuB,EACvB,sBAAsB,EACtB,eAAe,EACf,8BAA8B,EAC9B,qBAAqB,EACrB,wBAAwB,EACzB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAExF;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,uDAAuD;IACvD,WAAW,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC;IAC7C,wEAAwE;IACxE,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,8CAA8C;IAC9C,YAAY,CAAC,EAAE,WAAW,CAAC;IAC3B,uGAAuG;IACvG,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B;;;;;OAKG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B;;;;;;;;;;;OAWG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC;IAE9B,+CAA+C;IAC/C,eAAe,CAAC,EAAE,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"TaskGraph.d.ts","sourceRoot":"","sources":["../../src/task-graph/TaskGraph.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
import { ConvertAllToOptionalArray, ResourceScope, ServiceRegistry } from "@workglow/util";
|
|
7
|
+
import { RunPrivateCacheRepo } from "../cache";
|
|
7
8
|
import { TaskOutputRepository } from "../storage/TaskOutputRepository";
|
|
8
9
|
import { ITask } from "../task/ITask";
|
|
9
10
|
import { TaskError } from "../task/TaskError";
|
|
@@ -73,6 +74,13 @@ export declare class TaskGraphRunner {
|
|
|
73
74
|
* Output cache repository
|
|
74
75
|
*/
|
|
75
76
|
protected outputCache?: TaskOutputRepository;
|
|
77
|
+
/**
|
|
78
|
+
* True when the caller explicitly passed `outputCache: false` in the run
|
|
79
|
+
* config, meaning all caching (including CACHE_REGISTRY-based routing) should
|
|
80
|
+
* be suppressed. Distinct from `this.outputCache === undefined`, which just
|
|
81
|
+
* means no legacy repo was configured (CACHE_REGISTRY may still apply).
|
|
82
|
+
*/
|
|
83
|
+
protected legacyCacheExplicitlyDisabled: boolean;
|
|
76
84
|
/**
|
|
77
85
|
* Whether leaf tasks (no outgoing edges) should accumulate their streaming
|
|
78
86
|
* output. True by default so workflow return values are complete.
|
|
@@ -93,6 +101,19 @@ export declare class TaskGraphRunner {
|
|
|
93
101
|
* and disable() methods (which take no arguments) have something to act on.
|
|
94
102
|
*/
|
|
95
103
|
protected currentCtx?: RunContext;
|
|
104
|
+
/**
|
|
105
|
+
* Stable identifier for the current graph run. Threaded from
|
|
106
|
+
* {@link TaskGraphRunConfig.runId} through handleStart so that each
|
|
107
|
+
* per-task run call carries the same identifier.
|
|
108
|
+
*/
|
|
109
|
+
protected runId?: string;
|
|
110
|
+
/**
|
|
111
|
+
* Run-private cache wrapper for the current run. Set by handleStart when a
|
|
112
|
+
* runId and private cache slot are both present; cleared at the end of each
|
|
113
|
+
* run. Used to fire-and-forget clearRun() after a successful run.
|
|
114
|
+
*/
|
|
115
|
+
protected currentRunPrivate?: RunPrivateCacheRepo;
|
|
116
|
+
protected baseRegistryForRun?: ServiceRegistry;
|
|
96
117
|
/**
|
|
97
118
|
* Edge materializer — owns dataflow read/write, transforms, and error-port routing.
|
|
98
119
|
*/
|
|
@@ -162,6 +183,30 @@ export declare class TaskGraphRunner {
|
|
|
162
183
|
* @param graph The task graph to reset
|
|
163
184
|
*/
|
|
164
185
|
resetGraph(graph: TaskGraph, runnerId: string): void;
|
|
186
|
+
/**
|
|
187
|
+
* Tracks private cache repos that have already received the durability warning,
|
|
188
|
+
* keyed by the repo instance. WeakSet so a freshly constructed repo that is no
|
|
189
|
+
* longer referenced is automatically eligible for re-warning if it shows up
|
|
190
|
+
* again later. Static because routing is repo-instance scoped, not runner
|
|
191
|
+
* scoped — a process can have one durable repo and many `TaskGraphRunner`s.
|
|
192
|
+
*/
|
|
193
|
+
private static __durabilityWarnedRepos;
|
|
194
|
+
/**
|
|
195
|
+
* Conservative two-tier detector that decides whether a graph may route any
|
|
196
|
+
* task to the `private` cache slot. Used by both the durability warning and
|
|
197
|
+
* the `runId`-required guard in {@link handleStart}.
|
|
198
|
+
*
|
|
199
|
+
* 1. Read the static `cachePolicy` off the task's constructor. If `kind` is
|
|
200
|
+
* "private", the task is definitely private.
|
|
201
|
+
* 2. Otherwise, if the task overrides `getCachePolicy` (i.e. its prototype's
|
|
202
|
+
* method is not `Task.prototype.getCachePolicy`), conservatively treat it
|
|
203
|
+
* as potentially private — the override may decide based on inputs that
|
|
204
|
+
* are not available at graph-start time.
|
|
205
|
+
*
|
|
206
|
+
* Note: probing `getCachePolicy({} as any)` is unsafe because input-dependent
|
|
207
|
+
* overrides can throw or return the wrong branch when given empty inputs.
|
|
208
|
+
*/
|
|
209
|
+
static graphUsesPrivatePolicy(graph: TaskGraph): boolean;
|
|
165
210
|
/**
|
|
166
211
|
* Handles the start of task graph execution
|
|
167
212
|
* @param parentSignal Optional abort signal from parent
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TaskGraphRunner.d.ts","sourceRoot":"","sources":["../../src/task-graph/TaskGraphRunner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAEL,yBAAyB,EAIzB,aAAa,EACb,eAAe,EAGhB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAA0B,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAE/F,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAGtC,OAAO,EAIL,SAAS,EACV,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,SAAS,EAAE,UAAU,EAAc,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AACvF,OAAO,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEtF;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,KAAK,GAAG,OAAO,CAQ/D;AAED,MAAM,MAAM,qBAAqB,CAAC,CAAC,IAAI;IACrC,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,CAAC,CAAC;CACT,CAAC;AACF,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC;AAClE,MAAM,MAAM,wBAAwB,CAAC,CAAC,IAAI,yBAAyB,CAAC,CAAC,CAAC,CAAC;AACvE,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI,wBAAwB,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;AAElF,eAAO,MAAM,cAAc,EAAG,gBAAyB,CAAC;AACxD,eAAO,MAAM,kBAAkB,EAAG,oBAA6B,CAAC;AAEhE,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI;IAE9B,CAAC,kBAAkB,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAE1C,CAAC,cAAc,CAAC,EAAE,wBAAwB,CAAC,CAAC,CAAC,CAAC;CAC/C,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG,OAAO,cAAc,GAAG,OAAO,kBAAkB,CAAC;AAEtF,MAAM,MAAM,WAAW,CACrB,MAAM,EACN,KAAK,SAAS,qBAAqB,IACjC,cAAc,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC;AAElC;;;GAGG;AACH,qBAAa,eAAe;
|
|
1
|
+
{"version":3,"file":"TaskGraphRunner.d.ts","sourceRoot":"","sources":["../../src/task-graph/TaskGraphRunner.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@workglow/task-graph",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.3.1",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
7
7
|
"url": "https://github.com/workglow-dev/libs.git",
|
|
@@ -50,9 +50,9 @@
|
|
|
50
50
|
"access": "public"
|
|
51
51
|
},
|
|
52
52
|
"peerDependencies": {
|
|
53
|
-
"@workglow/job-queue": "0.
|
|
54
|
-
"@workglow/storage": "0.
|
|
55
|
-
"@workglow/util": "0.
|
|
53
|
+
"@workglow/job-queue": "0.3.1",
|
|
54
|
+
"@workglow/storage": "0.3.1",
|
|
55
|
+
"@workglow/util": "0.3.1"
|
|
56
56
|
},
|
|
57
57
|
"peerDependenciesMeta": {
|
|
58
58
|
"@workglow/job-queue": {
|
|
@@ -66,8 +66,8 @@
|
|
|
66
66
|
}
|
|
67
67
|
},
|
|
68
68
|
"devDependencies": {
|
|
69
|
-
"@workglow/job-queue": "0.
|
|
70
|
-
"@workglow/storage": "0.
|
|
71
|
-
"@workglow/util": "0.
|
|
69
|
+
"@workglow/job-queue": "0.3.1",
|
|
70
|
+
"@workglow/storage": "0.3.1",
|
|
71
|
+
"@workglow/util": "0.3.1"
|
|
72
72
|
}
|
|
73
73
|
}
|
package/src/EXECUTION_MODEL.md
CHANGED
|
@@ -8,6 +8,7 @@ This document explains the internal execution model of the task graph system. It
|
|
|
8
8
|
- [Task Lifecycle](#task-lifecycle)
|
|
9
9
|
- [Normal Execution (run)](#normal-execution-run)
|
|
10
10
|
- [Preview Execution (runPreview)](#preview-execution-runpreview)
|
|
11
|
+
- [Cache, Run Identity, and Durable Execution](#cache-run-identity-and-durable-execution)
|
|
11
12
|
- [Dataflow and Input Propagation](#dataflow-and-input-propagation)
|
|
12
13
|
- [GraphAsTask (Subgraphs)](#graphastask-subgraphs)
|
|
13
14
|
- [Key Invariants](#key-invariants)
|
|
@@ -78,9 +79,10 @@ TaskRunner.run(overrides)
|
|
|
78
79
|
2. setInput(overrides) # Merge overrides into runInputData
|
|
79
80
|
3. resolveSchemaInputs() # Resolve model/repository strings to instances
|
|
80
81
|
4. validateInput() # Validate against input schema
|
|
81
|
-
5. Check cache #
|
|
82
|
+
5. Check cache # Per task's CachePolicy + CacheRegistry slot;
|
|
83
|
+
# cache hit returns verbatim, no preview overlay
|
|
82
84
|
6. executeTask() # Call task.execute(input, context) only
|
|
83
|
-
7. Store in cache # If
|
|
85
|
+
7. Store in cache # If policy ≠ "none" and slot present, persist the result
|
|
84
86
|
8. handleComplete() # Set status = COMPLETED
|
|
85
87
|
↓
|
|
86
88
|
Return runOutputData (locked)
|
|
@@ -216,6 +218,93 @@ If a preview needs the prior output, it can read `this.runOutputData` directly.
|
|
|
216
218
|
|
|
217
219
|
---
|
|
218
220
|
|
|
221
|
+
## Cache, Run Identity, and Durable Execution
|
|
222
|
+
|
|
223
|
+
### Cache policy
|
|
224
|
+
|
|
225
|
+
Every task declares a `CachePolicy` — a property of the task type, not of the deployment:
|
|
226
|
+
|
|
227
|
+
| Kind | Meaning | Cache slot used |
|
|
228
|
+
| --------------- | ---------------------------------------------------------------------------------------- | ------------------- |
|
|
229
|
+
| `deterministic` | Same inputs → same outputs. Safe to share across runs (and, in apps, across projects). | `deterministic` |
|
|
230
|
+
| `private` | Non-deterministic but worth caching for the lifetime of one run (e.g., seedless images). | `private` (per-run) |
|
|
231
|
+
| `none` | Do not cache. Side-effecting tasks (writes to external systems, sends, mutations). | _none_ |
|
|
232
|
+
|
|
233
|
+
The default is `{ kind: "deterministic" }`. Policy can be made input-dependent by overriding `getCachePolicy(inputs)` — e.g., an image task that returns `deterministic` when a seed is provided and `private` when it isn't.
|
|
234
|
+
|
|
235
|
+
### CacheRegistry
|
|
236
|
+
|
|
237
|
+
A two-slot service registered under `CACHE_REGISTRY`:
|
|
238
|
+
|
|
239
|
+
```ts
|
|
240
|
+
interface CacheRegistry {
|
|
241
|
+
deterministic?: TaskOutputRepository;
|
|
242
|
+
private?: TaskOutputRepository;
|
|
243
|
+
}
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
`TaskGraphRunner` resolves the registry from the per-run `ServiceRegistry` and dispatches each task's read/write to the slot named by its policy. Both slots are independently optional. A missing slot is a silent no-op: the task runs uncached, no error.
|
|
247
|
+
|
|
248
|
+
For the `private` slot, the runner constructs a per-run `RunPrivateCacheRepo` wrapper that prefixes every key with `__run:${runId}::`. Two runs with different `runId`s never see each other's rows; the same `runId` (a restart) does.
|
|
249
|
+
|
|
250
|
+
### Run identity (`runId`)
|
|
251
|
+
|
|
252
|
+
`runId` is an opaque string passed in `TaskGraphRunConfig`. `TaskGraph.run` takes `(input, config)` — `runId` lives in the config (second argument), not the input:
|
|
253
|
+
|
|
254
|
+
```ts
|
|
255
|
+
graph.run({}, { runId, registry, ... });
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
The caller owns generation. The contract:
|
|
259
|
+
|
|
260
|
+
- A user-triggered run gets a fresh `runId` (UUID typical).
|
|
261
|
+
- A restart after a crash uses the **same** `runId` — that is how durable resume works.
|
|
262
|
+
- Concurrent runs of the same workflow get **different** `runId`s.
|
|
263
|
+
|
|
264
|
+
`handleStart` rejects the run synchronously only when **all** of the following hold: a `CACHE_REGISTRY` is registered, its `private` slot is populated, and the graph contains at least one task whose policy may resolve to `kind: "private"` (a static `cachePolicy` of that kind, or a `getCachePolicy(inputs)` override that can return it). Graphs without a private slot — or without any private-policy task — can omit `runId`.
|
|
265
|
+
|
|
266
|
+
### Cache key
|
|
267
|
+
|
|
268
|
+
```
|
|
269
|
+
key = sha256(taskType + getCacheVersion() + fingerprint(inputs))
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
`fingerprint(inputs)` reuses the `PortCodec` normalization in `CacheCoordinator` — ports with `format` annotations hash by their canonical wire representation. Scope namespacing (the `runId` prefix for the private tier) is handled by the repo wrapper, not the key function.
|
|
273
|
+
|
|
274
|
+
`getCacheVersion()` walks the prototype chain and combines each ancestor's static `version` (default `1`). Bump `version` on a task when its semantics change — every prior cached entry becomes a miss.
|
|
275
|
+
|
|
276
|
+
### Lifecycle of cache rows
|
|
277
|
+
|
|
278
|
+
| Tier | Written | Read | Deleted |
|
|
279
|
+
| --------------- | -------------- | ------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- |
|
|
280
|
+
| `deterministic` | On task success | On task start | Never automatically. App owns invalidation (typically via `version` bumps). |
|
|
281
|
+
| `private` | On task success | On task start, filtered to current `runId` | **(a)** `privateRepo.clearRun()` on `succeeded` (the wrapper already knows its `runId`). **(b)** TTL sweep via `CacheJanitor.sweepStaleRunPrivate(olderThanMs)` for abandoned runs. |
|
|
282
|
+
|
|
283
|
+
Failed tasks are never cached — only `Ok` results reach `saveOutput`. `saveOutput` is upsert by primary key (last writer wins) — the underlying `TaskOutputTabularRepository` calls `put()` on its tabular storage, so a same-key write replaces the existing row.
|
|
284
|
+
|
|
285
|
+
### Durable execution model
|
|
286
|
+
|
|
287
|
+
A run is an atomic unit on a single worker. When the worker crashes:
|
|
288
|
+
|
|
289
|
+
1. Builder (or whatever scheduler dispatched the run) detects the crash via heartbeat / timeout.
|
|
290
|
+
2. The same job is re-dispatched **with the same `runId`** to a (possibly different) worker.
|
|
291
|
+
3. The new process constructs a fresh in-memory scheduler, but the durable `private` repo still holds every task output that completed before the crash.
|
|
292
|
+
4. The runner re-traverses the DAG from scratch; cache hits skip completed work, cache misses execute.
|
|
293
|
+
|
|
294
|
+
The runner emits a one-time startup warning if any task in the graph declares `kind: "private"` and the registered `private` repo reports `isDurable() === false`. The detection is a repo capability flag, not a registration check — in-memory backings, ephemeral wrappers, and test doubles all surface as non-durable.
|
|
295
|
+
|
|
296
|
+
#### What durable execution does **not** cover
|
|
297
|
+
|
|
298
|
+
- **Mid-graph checkpointing of in-flight scheduler state.** Crashed runs re-execute from scratch; the cache absorbs completed work. There is no resumption of a single in-flight task.
|
|
299
|
+
- **Streaming partial outputs.** A task that crashed mid-stream re-executes from scratch on restart; only fully completed tasks become cache hits.
|
|
300
|
+
- **Splitting one run across multiple workers.** A run is atomic on one worker.
|
|
301
|
+
|
|
302
|
+
### Re-dispatch correctness invariant
|
|
303
|
+
|
|
304
|
+
Re-execution must produce the same DAG traversal given the same inputs and cache state. Task ordering, parallelism limits, and scheduling decisions in `RunScheduler` must not depend on wall-clock time, machine identity, or worker-local random state. Today's scheduler satisfies this; the model treats it as a maintained invariant.
|
|
305
|
+
|
|
306
|
+
---
|
|
307
|
+
|
|
219
308
|
## Dataflow and Input Propagation
|
|
220
309
|
|
|
221
310
|
### How Data Flows Between Tasks
|