v0.9.3 Daemon Architecture

SynlynkDaemon โ€” subclass of WatchDaemon + two threads

SynlynkDaemon (subclasses WatchDaemon)

Inherited from WatchDaemon

๐Ÿ”ต Poll Thread

Every 3s: check mtime on project-docs/, regenerate context.md on change, run _reconcile_jobs(), dispatch queued + ready jobs

New in SynlynkDaemon

๐ŸŸฃ HTTP Thread

http.server on localhost:27471 โ€” serves context, job queue, stories, capability, sentinel over REST. Runs serve_forever() in a daemon thread.

Pidfile: .synlynk/daemon.pid  ยท  Log: .synlynk/daemon.log

Job Queue in state.db

New daemon_jobs table โ€” survives restarts. Fields: job_id, agent, task, story_id, status, priority, depends_on, pid, enqueued_at, started_at, completed_at, exit_code

--install-service

macOS: launchd plist โ†’ ~/Library/LaunchAgents/com.synlynk.daemon.plist
Linux: systemd user unit โ†’ ~/.config/systemd/user/synlynk-daemon.service
Fallback: @reboot crontab entry

GET /context
Current context.md (plain text or JSON)
GET /status
Daemon health, queue depth, uptime
GET /jobs
All jobs โ€” queued, running, done
GET /jobs/:id
Single job + log tail
POST /dispatch
Enqueue job โ€” agent, task, priority, depends_on
GET /stories
Story list from state.db
GET /stories/:id
Single story detail
GET /capability
Capability ratings by agent ร— domain
GET /sentinel
Active sentinel alerts
POST /checkpoint
Trigger context regeneration on demand

synlynk daemon <action>

start ยท stop ยท status ยท restart
--install-service ยท --uninstall-service

Dispatch logic (poll thread)

Concurrency cap: max_parallel in config (default 4)
Priority: integer 1โ€“10, lower = higher priority
Dependencies: depends_on = JSON array of job_ids; job stays queued until all deps are done