SynlynkDaemon โ subclass of WatchDaemon + two threads
Every 3s: check mtime on project-docs/, regenerate context.md on change, run _reconcile_jobs(), dispatch queued + ready jobs
http.server on localhost:27471 โ serves context, job queue, stories, capability, sentinel over REST. Runs serve_forever() in a daemon thread.
.synlynk/daemon.pid ยท Log: .synlynk/daemon.log
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
macOS: launchd plist โ ~/Library/LaunchAgents/com.synlynk.daemon.plist
Linux: systemd user unit โ ~/.config/systemd/user/synlynk-daemon.service
Fallback: @reboot crontab entry
start ยท stop ยท status ยท restart
--install-service ยท --uninstall-service
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