Tags give the ability to mark specific points in history as being important
-
v2.5.1
protectedRelease: synthesist v2.5.16027c5c9 · ·v2.5.1 -- ci: bump pipeline tool-rust to v4.1.10 The v4.1.10 release of the pipeline component fixes a registry-coherence gate bug where the runner's cached .git/ directory carried tags that had been deleted on origin, causing the gate to read a stale 'highest tag' and fail tag pipelines. v2.5.0's tag pipeline tripped this and never published. v2.5.1 is the first release of the shape-conformity pass with a working publish path. No code or behavior change beyond the CI reference.
-
v2.5.0
protected48107815 · ·v2.5.0 — shape conformity pass Per-session phase honesty, substrate-maintenance gate cleanup, papercut sweep. phase set / phase show now require an explicit session id; the estate-wide phase fallback is gone. status output drops the top-level phase field and embeds phase per session in sessions[]. claims compact, outcome list, and tree show run without --session and without a writeable phase. outcome add is exempt from phase enforcement. Closes #8 (jmeekhof). Requires nomograph-workflow 0.3.0. See CHANGELOG.md for the full list.
-
v2.4.0
protectedRelease: synthesist v2.4.099de580f · ·release v2.4.0 This release is a cohesive architectural pass driven by community feedback (issues #5, #6, #7 from [Josh Meekhof](https://gitlab.com/jmeekhof)). Rather than patch each issue at the symptom, v2.4.0 addresses the underlying classes: substrate type-agnosticism, single-source-of-truth schemas with structured validation errors, a real DAG primitive and unified task mutation surface, and operator-grade compaction tooling drawn from Josh's reference implementation in MR !8. `synthesist check` may surface schema errors against existing claims that v2.3 accepted via `--force` overrides. The most common case: spec claims with `status: "completed"`, `"abandoned"`, or `"deferred"` written before v2.4.0 (when the v2.3 CLI listed those values in `--help` despite the schema rejecting them). The data was always wrong per the schema; v2.4.0 just stops hiding it. Two ways to clean: 1. **Preferred** — record an `Outcome` claim that captures the real disposition, and rewrite the spec status to `done` or `superseded`: ```sh synthesist outcome add <tree>/<spec> --status completed --note "..." synthesist --force spec update <tree>/<spec> --status done ``` 2. **Quick** — run `synthesist --force spec update <tree>/<spec> --status superseded` to move the spec to a valid terminal state and accept the loss of disposition detail. `synthesist check` returns non-zero on schema errors but the estate is still usable — the errors are advisory until you choose to clean. - Bumps `nomograph-claim` to `0.2` and `nomograph-workflow` to `0.2`. Both crates dropped per-type validators from their public surface; validation responsibility now lives at the synthesist API boundary. The on-disk claim format is unchanged. Existing estates upgrade in place without migration. - **`synthesist outcome add` and `synthesist outcome list`** — first- class CLI surface for the Outcome claim type. Records "what happened to a spec" (`completed`, `abandoned`, `deferred`, `superseded_by`) as a separate timestamped, asserter-attributed claim, distinct from Spec status (which expresses "what state the spec is in"). Closes the discoverability gap behind issue #6: the workflow that previously required disassembling the binary (`strings synthesist`) to find the right enum is now `synthesist outcome add k/spec --status completed --note "..."`. - **`synthesist claims compact`** — physical compaction of the on- disk claim log. Re-encodes incremental `changes/*.amc` files into a single `snapshot.amc` under the substrate lock. Logical claim history is unchanged; the size benefit is the encoding difference (large estates have observed ~1300x working-tree shrink). Ships with `--dry-run` and `--yes` safety belts. Reference implementation and trial methodology by Josh Meekhof ([MR !8](https://gitlab.com/nomograph/synthesist/-/merge_requests/8), [issue #7](https://gitlab.com/nomograph/synthesist/-/issues/7)); re-implemented here against the cohesive architectural pass. - **`task update --depends-on`** — replace a task's dependency list with comma-separated IDs. Validates: no self-dependency, no cycles in the resulting DAG, every referenced ID exists in the same spec. New deps that are themselves in `cancelled` status surface as a JSON `warnings` field rather than blocking the update — the entire purpose of editing deps is to repair away from cancelled predecessors. Closes [issue #5](https://gitlab.com/nomograph/synthesist/-/issues/5). - **`synthesist::schema` module** — single source of truth for every claim type synthesist owns (Tree, Spec, Task, Discovery, Campaign, Session, Phase, Outcome). Each type's enum constants are `pub const` slices referenced by both the validator and clap's `PossibleValuesParser`, so CLI-accepts-iff-schema-accepts is structural — drift between CLI and validator is no longer possible because there is only one definition. - **`task_dag` module** — pure-function DAG operations (cycle detection, ready set, dependents-of, dep validation). Replaces the inline DFS walks that were scattered across command files. The same primitive serves `task ready`, `task update --depends-on`, and any future cross-task command (rename, split, reparent in v2.5). - **`task_mutate` module** — unified supersession helper for task state transitions. Future task commands compose mutation closures over this helper rather than re-implementing the load-mutate- append pattern. - **JSON `warnings: []` output convention** — soft warnings (e.g. depending on a cancelled task) surface as a structured field in the JSON output rather than going to stderr. Aligns with the documented all-output-is-JSON contract. - **`scripts/check-symlinks.sh` + CI gate** — fails any commit that introduces an absolute-path symlink. Backstop against the `.agent/skills` recurrence class. - **Agent-shape CI gate** via the new `agent-shape` component in `nomograph/pipeline@v2.6.0`. Every push runs `jig check --binary` to cross-reference `agent-shape.toml` against the built binary's `--help` surface, catching CLI drift between documented commands and what's actually shipped. Same drift class as the schema-CLI parity rule applied at the top-level command surface. `nomograph-jig` is now baked into the rust-cli image so consumers don't repeat the install on every run. - **`CONTRIBUTING.md` back-compat policy** — three-layer policy (claim format strict, CLI additive within a major, library semver) committed to the repo. - Validator errors now reach the user with structured detail (claim type, field name, actual value, expected enum set) instead of the opaque `validate claim before append`. The error chain in `synthesist`'s top-level handler walks every `source()` so the full diagnosis surfaces. The reporter on issue #6 had to run `strings` on the v2.1.1 binary to find the schema enums; that diagnostic cost should never have been necessary, and now isn't. See `nomograph_claim::SchemaError` for the structured variants; see `synthesist::schema` for how the consumer-side validator composes them. - `spec update --status` rejects out-of-enum values at clap-parse time with a message naming the four schema-permitted values (`draft`, `active`, `done`, `superseded`). Issue #6's specific symptom (`completed` accepted by CLI, rejected by validator) is now a structural impossibility — both reference the same const. - `.agent/skills` symlink is no longer git-tracked. The `make agent-skills-symlink` build step regenerates the relative form (`../.claude/skills`) on every build/install, so external tools that rewrite symlinks cannot commit a broken absolute target. The CI symlink gate enforces the rule. - `.claude/skills/` is no longer git-tracked either, for the same drift class. Skills are materialized by `rune sync` from `nomograph/runes` (the source of truth); tracking the synced copy created a "rune sync" commit-class where the committed copy could drift between syncs. `.claude/rune.lock` (which pins versions) stays tracked. Aligns with the pattern rune itself uses. - The substrate crates (`nomograph-claim`, `nomograph-workflow`) are now type-agnostic for validation. Domain schemas live with their owners; substrate stores any well-formed claim regardless of `claim_type`. This unlocks future consumers (lattice when patent hold lifts; possibly others) defining their own claim types without coordinated substrate releases. - `synthesist::SynthStore` now wraps `nomograph_workflow::Store` with a synthesist-side validating `append`. Existing call sites that did `store.append(...)` continue to work unchanged through inherent method resolution; read-only operations transparently delegate via `Deref`. The pre-flight validation runs on every append, with structured `SchemaError` propagating up the anyhow chain to the operator. The performance analysis (`docs/perf-{baseline, hot-paths, options-matrix, recommendation}.md`) and the compaction reference implementation that drove this release came from Josh Meekhof. The `claims compact` operator surface, the trial-on-a-copy methodology that proved compaction safety, and the architectural framing that distinguishes physical compaction from semantic GC are his work. The deeper substrate-side performance items in his ranked recommendation (instrumentation in `nomograph_claim::Store::open` and `View::rebuild`; batched-write API at the workflow layer; incremental view materialization with the correctness proof he flagged as load-bearing) are designed and shipped together with him in the v2.5 cycle. -
v2.3.0
protectedRelease: synthesist v2.3.09855d8b0 · ·release v2.3.0 - `synthesist serve` polish for the standalone-viewer use case: humans landing on the dashboard cold (without an LLM session) can now see what's in flight at a glance. - "in flight" band at the top of the trees view lists the most-recently-active sessions with their tree/spec scope, the last claim's relative timestamp, claim type, and one-line summary. Sessions without any claims yet are excluded so the band only shows sessions that are actually doing something. - Tree summary rows roll up task status across all specs in the tree as colored pills (`done`, `in-flight`, `ready`, `gated`, `blocked`, `other`), so progress is visible without expanding. Spec summary rows show the same breakdown for that spec. `gated` distinguishes pending-but-human-gated tasks from pending-and-ready tasks -- both look like "pending" in raw status but only one is actionable for an agent. - Recent-activity rows now carry a tree tag inline next to the claim type, so cross-tree action is scannable without expanding the trees section. - Header mark renders the three dashed scales legibly. At the prior 22px display size with stroke-width 2.5 in a 64-unit viewBox, the dashed strokes rendered sub-pixel and only the curve was visible. Bumped display to 30px and stroke-width to 3.5 with adjusted dasharrays so the full mark survives at small sizes in both light and dark themes. -
v2.2.0
protectedRelease: synthesist v2.2.0a8995c23 · ·release v2.2.0 - `synthesist serve` -- local HTTP dashboard for browsing the claim graph in a browser. Server-rendered HTML built on axum + tokio, with push-based refresh via Server-Sent Events: a filesystem watcher on `claims/changes/` ticks the SSE stream and the page swaps in fresh state without reload, no timed polling. Dashboard exposes a network view (combined network/tree, d3-force layout) alongside the trees view, with a recent activity section that shows relative timestamps and a session claims drill-down. Persistent `<details>` open state survives refreshes. Design pass v1 lands the nomograph palette, DM Mono / DM Sans typography, the callout pattern, and the full nomograph mark in the header. Default bind is `127.0.0.1:5179`; `--bind-all` opens it for cross-machine review. Routes: `/`, `/api/state`, `/api/graph`, `/events`. - `tree close <name>` closes a tree by appending a superseding claim with `closed: true`. Closed trees disappear from default `tree list` output. - `tree list --include-closed` reveals closed trees alongside open ones, with their `closed: true` status. - `tree close --start-id <hash>` and `session close --start-id <hash>` for disambiguation when multiple trees or sessions share the same name. The `start-id` is the opener claim's content-addressed hash; `tree list` and `session list` print it. - Treatment v0 surface improvements driven by the jig agent-shape battery. `tree show <name>` prints a single tree's status, description, and counts. `phase get` is an alias of `phase show`. `spec list --tree <name>` accepts the flag form alongside the positional form; both shapes appeared frequently in agent invocations. - `agent-shape.toml` declares `[commands].top_level` so the jig cross-validates the documented command surface against the binary's actual top-level subcommand list. - `hero.svg` refreshed to v2 surface: the OV-1 now describes the claim substrate without `lattice` references that no longer apply to the synthesist scope. - `avatar.svg` lightly updated to render in IBM Plex Mono. - Test helpers strip `SYNTHESIST_DIR` and `SYNTHESIST_SESSION` from the inherited environment before invoking the binary, so running the test suite from inside an active session no longer pollutes the caller's estate or causes spurious test failures. - `deny.toml` allow list now includes `CC0-1.0` so cargo-deny accepts the `notify` crate that powers the serve dashboard's filesystem watcher. Without this, the audit step rejected a valid public-domain dedication. - `.agent/skills` symlink rewritten as relative (`../.claude/skills`) so it resolves correctly when the repo is cloned to any path. The prior absolute target broke the cargo publish step in CI.
-
v2.1.1
protectedRelease: synthesist v2.1.1398902cc · ·v2.1.1 Fixed: - --data-dir and SYNTHESIST_DIR are now honored. A regression left both silently ignored: the CLI wired --data-dir to the env var but workflow's Store::discover only consulted cwd. From a directory with no claim ancestry, discover auto-init'd a fresh empty store at cwd/claims/, making every invocation look like an empty estate. Worktrees were the primary casualty. - Explicit overrides that don't resolve to an existing store now fail loudly. Missing path, not-a-directory, or no genesis.amc each produce a prescriptive error naming the corrective action. Dependencies: - nomograph-workflow bumped to 0.1.1 for the discover fix.
-
v2.1.0
protectedRelease: synthesist v2.1.0bf368b0e · ·v2.1.0 Added: - `synthesist conflicts` lists diamond conflicts in the claim log (prior claims superseded by more than one live successor). Resolve by appending a claim that supersedes the contested pair. Changed: - Stakeholder / disposition / signal / stance commands now always reach the "moved to lattice" pointer, regardless of args. - Moved-to-lattice message reflects lattice being a private repo pending origination review. Fixed: - Skill, README, MIGRATION show `migrate v1-to-v2 --from ... --to ...` with required flags. - Removed references to a standalone migrate-v1-to-v2 binary. - Skill conflicts entry describes actual diamond-conflict semantics. - Landscape-moved integration tests updated to match the new message.
-
v2.0.0
protectedRelease: synthesist v2.0.05591e858 · ·Release v2.0.0 Big-bang migration to claim substrate.
-
v1.2.1
protectedRelease: synthesist v1.2.1e31795b0 · ·fix: add --version / -V flag to CLI Clap was not configured with a version string, causing --version to return exit code 2. Breaks automated verification scripts.
-
v1.2.0
protectedRelease: synthesist v1.2.0df55b2ce · ·First crates.io release as nomograph-synthesist
-
v1.1.0
protectedRelease: synthesist v1.1.031661e28 · ·synthesist v1.1.0 Schema migration framework via rusqlite_migration. Uses SQLite's user_version pragma. Migrations are SQL files embedded at compile time. synthesist migrate command reports schema status. Adds docs/proposals/ directory for tracking architecture proposals. First proposal: holdout scenarios via session separation (draft).
-
v1.0.0
protectedRelease: synthesist v1.0.0d026003c · ·synthesist v1.0.0 Specification graph manager for AI-augmented collaborative development. Rewrite from Go+Dolt to Rust+SQLite. Single static binary with embedded SQLite via rusqlite. No runtime dependencies. Core capabilities: - Task DAGs with dependency resolution and atomic claiming - Disposition graphs: temporal stakeholder preference modeling with confidence tiers, supersession chains, and bi-temporal signals - 7-phase workflow state machine with algorithmic enforcement - Session isolation via per-file database copies with three-way merge - Institutional memory via append-only discoveries 16 tables. ~40 commands. Schema stabilized with a literature-informed cutline (docs/architecture-v1.md). Data directory: synthesist/ (visible, not hidden). Skill file: synthesist skill (execution-system agnostic).