@try-works/dsh-memory 0.1.15 → 0.1.16

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@try-works/dsh-memory",
3
- "version": "0.1.15",
3
+ "version": "0.1.16",
4
4
  "description": "Git-backed, workspace-scoped memory for the DeepSeek Harness (global layer + per-workspace layers)",
5
5
  "type": "module",
6
6
  "main": "src/index.js",
@@ -254,6 +254,45 @@ Sync failures are never swallowed: a failed pull or push is logged, recorded in
254
254
  surfaced by `status()`, reported by `memory_sync`, and leaves a `state/CONFLICT.md` marker that
255
255
  the next clean sync clears.
256
256
 
257
+ ## 9b. The scheduled tasks layer
258
+
259
+ `global/tasks/` is not a memory layer and holds no memories. It is a portable backup of the DSH
260
+ scheduled tasks on this machine, and it exists because the schedule store is the only copy of them:
261
+ it is in no git repository, and the host DELETES a task when the session that owns it stops. A task
262
+ can therefore vanish with nothing to observe.
263
+
264
+ One JSON file per task, plus a regenerated `index.md`. A file holds the task's record - id, kind,
265
+ title, prompt, and the selector that says when it runs - and its lifecycle state. The owning session
266
+ and the delivery history are deliberately NOT stored: they are machine-local, and carrying a session
267
+ id to another machine would make a restored task fail, because the session it names does not exist
268
+ there.
269
+
270
+ Because the task files live in this store and are not gitignored, a push carries them to your other
271
+ machines, where they are re-armed on boot.
272
+
273
+ The states, and what each one means:
274
+
275
+ | state | meaning |
276
+ | --- | --- |
277
+ | `active` | armed in the live store, waiting for its next occurrence |
278
+ | `pending` | in the backup, not in the live store; a restore re-arms it |
279
+ | `paused` | held back on purpose. Every automatic pass leaves it alone |
280
+ | `stopped` | was armed, and its owning session stopped, so the host deleted it |
281
+ | `failed` | was due and has still not delivered. The host records no failure of its own, so this is what is observable |
282
+ | `orphaned` | armed, but the session that owns it no longer exists, so it can never fire |
283
+ | `skipped` | captured, but its kind is not one we can re-arm, so a restore refuses it |
284
+ | `done` | delivered, or its recurrence is exhausted |
285
+
286
+ Two cadences, both off the write path. The **backup** runs with the sync cadence and is additive:
287
+ it never deletes, so a stale backup cannot wipe a schedule. The **restore** runs once per process at
288
+ the first real session, because a task needs a live session to own it, and it binds each restored
289
+ task to that session - you are never asked which one. It matches tasks by CONTENT, not by id, since
290
+ the schedule service mints a fresh id on every create.
291
+
292
+ `memory_tasks` reports the whole picture and can `backup`, `restore`, `pause` or `resume` on
293
+ demand. Holding a task back is a decision, and it outranks every automatic pass: a `paused` task is
294
+ never silently re-armed.
295
+
257
296
  ## 10. Current state of this store
258
297
 
259
298
  {{storeState}}