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.