Pipeline Pause Control
Status: Complete (v2)
Spec metadata:
- ID:
pipeline-pause-control - Status:
complete - Hard depends on:
memory-pipeline-v2 - Registry:
docs/specs/INDEX.md
Related docs:
docs/research/technical/RESEARCH-PIPELINE-PAUSE-CONTROL.mdpackages/cli/src/commands/daemon.tspackages/cli/src/features/daemon.tspackages/daemon/src/daemon.tspackages/daemon/src/pipeline/index.tspackages/daemon/src/memory-config.tspackages/cli/src/features/pipeline-pause.tspackages/cli/src/features/pipeline-pause.test.tspackages/cli/dashboard/src/lib/api.tspackages/cli/dashboard/src/lib/api.pipeline.test.jspackages/cli/dashboard/src/lib/components/tabs/PipelineTab.svelte
1) Problem
Users sometimes need Signet to get out of the way for a while. Today the available switches are too blunt:
enabled = falsestops future enqueueingshadowMode = truestill burns extraction resourcesmutationsFrozen = truestill runs extraction
There is no operator control for “stop the workers now, keep the daemon alive, and let queued extraction catch up later.”
2) Goals
- Add a first-class paused state for the extraction pipeline.
- Expose it as an obvious CLI and dashboard operator control.
- Preserve queued work while paused.
- Surface paused status in daemon observability.
3) Delivered capability set
A) Persisted config flag
Signet now persists memory.pipelineV2.paused: boolean, default false.
B) Startup behavior
When enabled = true and paused = true:
- do not start extraction workers
- do not start synthesis, predictor, embedding-tracker, structural backfill, or procedural reconciler background work
- do keep retention-only startup behavior
- do report pipeline mode as
paused
C) CLI control
Add:
signet daemon pausesignet daemon resume- root aliases
signet pauseandsignet resume
The shipped implementation now prefers live daemon pause/resume endpoints so runtime state flips in-place without a daemon restart when the API is available. The CLI still falls back to the original config-write + restart path for older daemons or auth-protected setups it cannot control directly, and on pause still attempts to unload local Ollama models so VRAM is released promptly.
D) Dashboard control
The pipeline tab now exposes a pause/resume control that calls the live daemon API directly, disables itself while a transition is in flight, and refreshes status after each successful mutation.
E) Backlog contract
Pause is not disable. New memories still enqueue extraction work while the pipeline is paused, then drain after resume.
4) Non-goals
- no cron-based pause windows
- no per-agent partial pause
- no predictor-specific tuning work beyond what naturally follows from extraction workers being offline
- no remote-provider lifecycle control beyond local loopback Ollama unload
5) Integration contracts
Pause <-> Memory Pipeline v2
pausedis orthogonal toenabledenabled=falsestill wins and means fully disabled
Pause <-> CLI
- CLI prefers live daemon pause/resume when available
- CLI falls back to persisted flag write + daemon restart when live control is unavailable
- CLI reports whether local Ollama model unload succeeded
Pause <-> Dashboard
- the pipeline tab uses the live daemon pause/resume endpoints directly
- the control must guard against duplicate clicks while a transition is active
- successful mutations trigger a fresh status poll so the badge reflects the new mode immediately
Pause <-> Observability
/api/pipeline/statusreportsmode = "paused"when applicable/api/pipeline/pauseand/api/pipeline/resumeexpose live operator control with structured mutation responses
6) Validation and tests
- Config parsing preserves explicit
paused: true - CLI toggle writes
memory.pipelineV2.paused - Pause unloads local loopback Ollama models through the generate API with
keep_alive: 0 - Paused mode reports correctly in status/observability
- Resume clears the flag and restores normal startup path
- Dashboard pause/resume helpers surface structured success and error results