Tags

Tags give the ability to mark specific points in history as being important
  • v2.5.1

    protected Release: synthesist v2.5.1
    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

    protected
    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

    protected
    99de580f · release: v2.4.0 ·
    Release: synthesist v2.4.0
    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

    protected
    9855d8b0 · release: v2.3.0 ·
    Release: synthesist v2.3.0
    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

    protected
    a8995c23 · release: v2.2.0 ·
    Release: synthesist v2.2.0
    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

    protected Release: synthesist v2.1.1
    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

    protected Release: synthesist v2.1.0
    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

    protected Release: synthesist v2.0.0
    Release v2.0.0
    
    Big-bang migration to claim substrate.
  • v1.2.1

    protected Release: synthesist v1.2.1
    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

    protected Release: synthesist v1.2.0
    First crates.io release as nomograph-synthesist
  • v1.1.0

    protected Release: synthesist v1.1.0
    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

    protected Release: synthesist v1.0.0
    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).