Releases: nikhilsoman/synlynk
Release list
v0.12.0 — Measurement & Reliability
One sentence: the operational backbone gets provably reliable and provably accounted for — dispatched jobs finish their own git steps, a 5th zero-cost local agent joins the fleet, story routing gets real capability+quota+cost scoring with a fleet batch scheduler, and every dollar synlynk reports is now either structurally sourced or visibly flagged as an estimate.
Milestones
- Job Lifecycle Ground-Truth Verification (#126–#129) — dispatch worktree isolation, git-state-verified reconciliation, real
files_touched, fail-loud migration. - Dispatch git-finalization reliability chain (#182–#199) — synlynk finishes agents' git steps for them.
- Capability Matrix Hardening + Fleet Scheduler (epic #137) — 3-stage routing (capability → quota gate → cost tie-break) + unattended batch scheduler.
- Local Agent — a 5th dispatch agent running Aider over on-device oMLX inference, $0 per token.
- Measurement Ledger Hardening (epic #210) — every cost figure synlynk shows is now structurally sourced or visibly flagged as an estimate.
71 PRs merged since v0.11.0 (2026-07-05). Full details: CHANGELOG.md · Release blog post
🤖 Generated with Claude Code
v0.11.0 — The Agent Ecosystem Operational Layer
Release pitch: synlynk v0.11.0 is the Agent Ecosystem Operational Layer — every dispatch now carries permissions and recovery paths, your terminal shows a live fleet of agents in real time, and the full workflow discipline is baked into every agent directive file at init.
What's in v0.11.0
Agent Autonomy Bridge (BS-12, PR #119)
synlynk dispatch --grant <perm> --revoke <perm>— per-task permission overrides with role defaults for 12 role typessynlynk configure agent <name>— per-project harness overrides in.agents/<agent>.jsonsynlynk jobs --stalled— list jobs with HANDOFF_PENDING sentinelsynlynk jobs handoff <job_id> [--to <agent>]— transfer stalled jobs to a new agent with full context preservationsynlynk doctorTC-5 — SOP presence check with interactive fix wizard and "I'm stuck" Claude escalationsynlynk sync --repair-sops— re-inject missing SOP sections without touching existing harness content- 6 SOP blocks baked into all directive files at init: PR Review Discipline · Brainstorm-First · Design→Plan→Build · Capability Allocation · Cost Visibility · Repo Hygiene
Live Job Observatory (BS-13, PR #117)
synlynk watch --live— fullscreen live terminal job board, auto-refreshes every 3s- Vizor Observatory tab — real-time fleet view in the browser dashboard
Vizor Efficiency Enrichment (BS-22, PRs #113, #118)
- R/W/T budget bars per agent card
- 6×4 Cycle × Agent capability matrix with full/partial/none badges
- Per-agent radar hexagon SVGs (6-axis, 80×80px)
Ecosystem Status + Capacity (BS-16, PR #110)
synlynk status/synlynk status --json— terminal + machine-readable ecosystem snapshot- Three dispatch modes:
eco/daily-grind/perf - Three new
_preflight_dispatch()budget gates
Modularisation
synlynk/__init__.pysplit from 11,268L into 5 focused modules:probe.py,sentinel.py,upgrade.py,dispatch.py,_constants.py
Fixes
- TC-2 false-positive fix arc (PRs #114–#116) — eliminated blocking of all Agy dispatches in probed repos
Test count
868 tests (up from 616 at v0.10.0)
Full release notes
v0.10.0 — Developer Preview
synlynk v0.10.0 is the Developer Preview — install via pipx, set up your workspace in 60 seconds with the terminal wizard, and get a live browser dashboard showing what your agent team is doing.
Install
pipx install git+https://github.com/nikhilsoman/synlynkWhat's in v0.10.0
FTUE + Onboarding
synlynk init --wizard— 6-screen terminal wizard: harness detection, workspace topology, skills scan, agent fleet, role assignment, launch cheat sheetsynlynk scan— re-runnable repo analysis with 14-heuristic stack fingerprinting and deep 6-stage pipeline (BS-20)synlynk launch— FTUE task picker with 6-cycle SDLC view and 12 scan-triggered templates (BS-19)synlynk roles— print agent role table;initanddoctornow write per-agent role blocks into CLAUDE.md / GEMINI.md / AGENTS.md (BS-12a)
State + Migration
synlynk migrate— one-shot atomic import ofproject-docs/markdown intostate.dbwith write-through backup and DR syncsynlynk memory add/synlynk devlog append— write to state.db with immediate flat-file write-through- 5 new state.db tables:
memory_entries,roadmap_arcs,roadmap_phases,cost_entries,devlog_entries
Daily-Driver Commands
synlynk jobs --summary <id>— structured job completion summary: files touched, cost, tokens, durationsynlynk release— Ship cycle stub: VERSION bump + CHANGELOG entry + blog post stubsynlynk status --platform— infrastructure health: harness compliance, agent availability, budget pulse
Browser Dashboard
synlynk viz— 5-view local dashboard athttp://localhost:8721: Gantt, User Journeys, Architect Map (tube map), Effort & Cost, Efficiency report cards. Sticky note system feeds notes back intogenerate_context(). Zero new deps. (BS-21)
Packaging
pyproject.tomlwith[project.scripts]entry point — install viapipx install git+<url>synlynk upgraderoutes topipx upgrade synlynkwhen installed via pipx- Python requirement raised to 3.9+
Tests: 747 passing (up from 503 at v0.9.9)
Full CHANGELOG: https://github.com/nikhilsoman/synlynk/blob/main/CHANGELOG.md
v0.9.7 — Grok Agent Support
What's new in v0.9.7
Grok is now a first-class fourth agent peer alongside claude, agy, and codex.
Added
- Grok agent registration —
AGENT_CAPABILITY_BASELINES["grok"], discovery path~/.grok, version probe viagrok -v - GROK.md instruction file — managed by synlynk with
synlynk:start/endmarkers;Co-Authored-By: Grok <noreply@x.ai>; injected via--rulesat exec time - Init wizard —
synlynk init --agents claude,agy,codex,grokcreates GROK.md; grok now in the default agent set - Exec context injection —
synlynk exec grokprepends--rules GROK.md; headless (-p) mode also injects--rules .synlynk/context.md - Dispatch —
--always-approvefor non-interactive dispatch;--permission-mode bypassPermissionsfallback via agent profile;--output-format jsonfor token extraction - Token extraction — nested
usage.input_tokens/output_tokensJSON pattern for Grok structured output - Model version extraction — tier-2 path reads
.agents/grok.json→"model"field
Fixed
- Stale time-sensitive fixture in
test_collect_capability_drop_returns_finding
Tests
488 passing (15 new tests for Grok support)
Delivered by Agy (Tasks 1–3), Codex (Tasks 4–6), Claude (Task 7 + spec + plan + review).
v0.9.4 — Context, Dispatch, and Relay
What's new in v0.9.4
SQLite-primary task state
stories.statuscolumn — SQLite is now the single source of truth for task state_generate_todo_md()writesproject-docs/todo.mdas a generated view_import_todo_to_stories()syncs hand-written- [ ]items into the DB (idempotent, title-dedup)synlynk story createauto-regeneratestodo.md
Per-agent context profiles
.agents/<agent>.jsonoverridescontext_modeandcontext_max_bytesper agentsynlynk agent configure <name>— interactive profile writer- Explicit
--context-modeCLI flag always beats the profile default
synlynk jobs — SQLite read
- Reads live
daemon_jobstable (not JSON file) --allincludes done/failed rows;--watchrefreshes every 2s- Pre-flight gate (
_preflight_dispatch) checks agent CLI is on PATH before every dispatch synlynk dispatchgains--context-mode none|task|full
HTTP SSE relay broker
synlynk relay start [--port N]— stateless fan-out broker (default port 27472)GET /events(SSE stream),POST /publish(JSON fan-out),GET /healthsynlynk relay broadcast <body> [--kind motd|wellness|message|joke|custom]- 7 typed relay events:
story_updated,job_dispatched,job_completed,alert_raised,context_checkpoint,table_changed,broadcast
VERIFY_SKIP sentinel
- Fires informational alert when a job exits 0 but output shows no test/verify evidence
- Builds compliance dataset for the Agent Behaviour (AB) epic
Dispatch fixes
subprocess.Popennow setscwd=os.getcwd()— Agy no longer drifts to its scratch spacedispatch_flagskey inAGENT_CAPABILITY_BASELINES—--dangerously-skip-permissionsnow scoped to background dispatch only, not all Claude subprocesses- Agy prompt includes explicit
## Working Directoryheader
472 tests (+33 since v0.9.3)
Install / upgrade
curl -sSL https://raw.githubusercontent.com/nikhilsoman/synlynk/main/install.sh | bashWhat's next
- BS-2: Onboarding + Mode Taxonomy (
synlynk doctor, agent state machine, progressive init) - BS-3: Agent Behaviour (instruction compliance measurement, per-agent variance dataset)
- BS-4: Command Audit (OTel tracer,
synlynk telemetry, hook wiring)
v0.9.3 — Async Daemon
What's new in v0.9.3
synlynk is now always-on. Agents can pull context without invoking the CLI each time.
synlynk daemon
synlynk daemon start # fork-daemonize, write .synlynk/daemon.pid
synlynk daemon stop
synlynk daemon status # running/stopped + queue depth + HTTP URL
synlynk daemon restart
synlynk daemon --install-service # register with launchd / systemd / crontab
synlynk daemon --uninstall-service
HTTP API — localhost:27471
| Method | Path | Description |
|---|---|---|
| GET | /context |
Current context.md |
| GET | /status |
Uptime, queue depth, pid |
| GET | /jobs |
All jobs (filter with ?status=) |
| GET | /jobs/<id> |
Single job + log tail |
| POST | /dispatch |
Enqueue a job |
| GET | /stories |
Story list |
| GET | /stories/<id> |
Single story |
| GET | /capability |
Capability ratings |
| GET | /sentinel |
Active sentinel alerts |
| POST | /checkpoint |
Force context regeneration |
Persistent job queue
daemon_jobstable instate.db— survives restarts- Priority 1–10, dependency chains via
depends_onJSON array - Zombie-safe process reaping via
os.waitpid(WNOHANG) - Per-job commit — crash mid-dispatch never produces duplicate runs
Service installation
- macOS: launchd plist →
~/Library/LaunchAgents/com.synlynk.daemon.plist - Linux: systemd user unit →
~/.config/systemd/user/synlynk-daemon.service - Fallback:
@rebootcrontab entry
432 tests passing. Full changelog: CHANGELOG.md
synlynk v0.9.2 — Team Onboarding + Consensus
What's new
synlynk join— new member onboarding: seeds devlog stub, regenerates AI context files (CLAUDE.md, GEMINI.md, AGENTS.md) with joining member's identity, prints team digestsynlynk team status— team digest view: all members, story assignments, token budget consumption, last-active timestampssynlynk decide <topic> --panel <agents>— multi-agent consensus panel: dispatches panel agents, collects responses, synthesizes a unified decision via the first panel member;--recordwrites signed Decision record toproject-docs/decisions/--tokens <N>flag onsynlynk story create— set estimated token budget on a story- Pull-before-write arbitration —
_check_upstream_divergence()warns before any write toproject-docs/if the local branch is behind remote
Fixes
- None (feature-only release)
Upgrade
curl -sSL https://raw.githubusercontent.com/nikhilsoman/synlynk/main/install.sh | bashFull changelog
See CHANGELOG.md and blog post #21.
v0.9.1 — Install + Init Hardening
What's fixed
synlynk init in any repo now works correctly
Three production gaps found when first using synlynk in an external repo (rxcc):
Install broken after package split
The v0.9.0 package split turned bin/synlynk.py into a 5-line shim, but install.sh still only copied the shim — leaving the synlynk/ package absent from ~/.synlynk/. Result: ModuleNotFoundError: No module named 'synlynk' on any machine that installed before this patch.
Fix: install.sh now copies synlynk/ to ~/.synlynk/lib/synlynk/. Curl installs download synlynk/__init__.py directly. The shim's sys.path is patched at install time to point at ~/.synlynk/lib/.
synlynk init generated blank skeletons over existing project docs
Running synlynk init in a mature repo with existing roadmap.md, todo.md, memory.md (at root or under project-docs/) always wrote blank git-history templates, losing real project content. Agents saw two conflicting doc sets.
Fix: synlynk init now searches for existing docs before generating anything — root level, project-docs/, project-prefixed variants (rxcc_memory.md), uppercase names. First match with >200 bytes is migrated verbatim. Blank skeletons from git history are last resort only.
Output now shows what happened:
✓ ./roadmap.md (migrated from project-docs/roadmap.md)
✓ ./memory.md (generated from git history)
Repos with root-level docs conflicted with project-docs/ convention
Repos that keep docs at the root (not under project-docs/) had no way to tell synlynk where to look. All ~35 hardcoded "project-docs/" strings are now configurable.
Fix: synlynk init --docs-dir <path> writes project_docs_dir to .synlynk/config.json. All downstream commands (generate_context, checkpoint, update_costs, synlynk scan --deep) respect it.
synlynk init --docs-dir . # docs at repo root
synlynk init --docs-dir docs/ # docs under docs/VERSION string corrected
synlynk --version was reporting 0.7.0 since the package split. Fixed to 0.9.0 → 0.9.1.
Upgrading
curl -sSL https://raw.githubusercontent.com/nikhilsoman/synlynk/main/install.sh | bashExisting installs need to re-run the installer — the shim at ~/.synlynk/bin/synlynk needs to be updated and the package needs to be placed at ~/.synlynk/lib/synlynk/.
v0.9.0 — Kernel Fixes + Package Split
What's new
Dispatch quality
- Scoped context —
generate_context(scope="task:<id>")writes a minimal snapshot (story metadata, active tasks, up to 20 domain-filtered source files) instead of the full 7-day devlog dump - Relevant Files injection —
## Relevant Filessection added to every dispatch prompt from the source-map scan cache - Verify contract —
## How to Verify: pytest tests/test_<story>.pyinjected per dispatch when atests/directory exists - Per-agent framing — Codex gets
## Task Criteriabullets; AGY getsTask:prefix + 2000-char context; Claude gets full narrative
Ed25519 identity signing
_ensure_identity_key()creates~/.synlynk/identity.keyon first use_sign_capability_rating()signs every capability score write;capability_ratings.ed25519_signow populatedsynlynk identity initCLI subcommand
Anti-gaming quality cap
quality_autocapped at 5.0 whentest_pass_rate == 1.0andtest_count < 3- A 1-test suite that always passes no longer scores identically to a 100-test suite
Package split
- All application code moved to
synlynk/__init__.py bin/synlynk.pyis now a 5-line shim — CLI entry point unchanged- Python 3.8 compatible (
Optional[str]instead ofstr | None)
Tests
365 passing (up from 316 at v0.7.0)
Built with
Hybrid dispatch — Claude subagents (Tasks 1–4), AGY (Task 5), Codex (Task 7). First release where synlynk dispatched to itself to build itself.
v0.8.0 — Support Engineer Agent
What's new
Support Engineer Agent (synlynk agent run support)
synlynk now watches itself. On every push to main (and on a 6-hour schedule), the Support Engineer collects health signals across 5 dimensions, deduplicates against a 7/30-day history, dispatches Claude to investigate new findings, files GitHub issues with results, and opens draft fix PRs when the investigation produces a passing diff.
New commands:
synlynk agent run <name>— run a named agent (support, or any.agents/*.jsonconfig)synlynk agent list— list configured agents and their last run timesynlynk agent run support --dry-run— print findings without filing issues or writing DB
Signal collectors:
- Test suite health (pass rate trends)
- Sentinel alerts (FLATLINE, SUCCESS_LOOP, QUOTA_EXHAUSTED)
- Telemetry anomalies (duration spikes, error rate)
- Capability score drops (agent routing degradation)
- GitHub issues (open bug reports)
Deduplication: 7-day window for ephemeral signals, 30-day for structural findings. New autopilot_runs SQLite table tracks run history.
Agent config: .agents/support.json (stdlib JSON). Add more agents by dropping a new JSON file — the engine picks them up automatically.
GitHub Actions: .github/workflows/support-engineer.yml fires on push to main and on 0 */6 * * *. Requires ANTHROPIC_API_KEY secret.
Tests
342 passing (up from 318 in v0.7.0). 24 new tests cover all collectors, dedup windows, issue filing, fix attempt, dry-run no-side-effects, and cron idempotency.