Skip to content

Releases: networkteam/sdd

v0.11.0

14 Jun 09:08

Choose a tag to compare

Highlights

  • Multi-agent skill rendering — Codex support — SDD now renders its skills and instructions from a single agent-neutral template source to multiple agent harnesses, with Claude Code becoming one render target among several and OpenAI Codex the first non-Claude target. A committed supported_agents list in .sdd/config.yaml records which agents a project renders; sdd init offers a multi-select on a fresh project, re-renders every listed agent idempotently on each run, and writes per-agent skill dirs (.claude/skills/, .agents/skills/). Codex skills conform to the open Agent Skills standard — SDD stamps under metadata:, runtime under compatibility:. Instructions bridge through a canonical AGENTS.md that CLAUDE.md imports via @AGENTS.md; sdd init scaffolds the bridge on a fresh project when a non-Claude agent is selected, never overwriting files you already have. Per-agent deviations (Claude's Skill-tool sub-skills and dynamic injection vs. Codex's instructed $skill invocation and explicit run sdd … steps) are template conditionals from the one source — no duplicated definitions. Skill text generation moved to Go text/template underneath, and the Claude render is verified byte-equivalent to the previous bundle, so nothing changes for current Claude Code users.

  • surfaced-by — ninth ref-kind — A new surfaced-by ref-kind records, on an entry, that an earlier entry's work raised or produced it — the backward-class inverse of surfaces. This makes the surfaces pair order-independent (the way depends-on/required-by already is) and fills the case where the producing entry is a terminal done signal, where addresses is mechanically blocked and authors previously had to re-anchor onto a convenient live decision. The closed ref-kind set is now nine; CLI help, the MCP tool schema, the pre-flight rubric, and the skill/CLI references all enumerate it, and an eval case pins the surfaced-by-vs-grounded-in boundary so it does not regress.

Known limitations

Codex support is new — treat it as experimental:

  • sdd init --agents doesn't persist on an existing project. Adding an agent to an already-initialized repo requires editing supported_agents in .sdd/config.yaml by hand for now (a fresh sdd init persists the selection correctly).
  • Codex sandbox approvals. Codex prompts for approval on the network- and LLM-backed commands SDD runs (search, capture) the first time it hits them — approve them so the first capture completes.
  • OpenAI gpt-5-class models aren't usable as the LLM provider yet. They reject the max_tokens parameter SDD sends (they require max_completion_tokens), breaking summary and pre-flight calls; the fix is pending in the networkteam/gollm fork. Use a gpt-4o model, or another provider, for now.
  • Behavioral parity is early. A first smoke run with gpt-5.5 held the full discipline loop through the thin port, but coverage is still limited.

Full Changelog: v0.10.0...v0.11.0

v0.10.0

11 Jun 12:20

Choose a tag to compare

Highlights

  • Pre-flight ref-kind reliability rework — Ref-kind applicability decisions moved out of the LLM into a Go-declared matrix with deterministic mechanical enforcement, and the finding schema now emits its reasoning before the severity verdict — removing the severity-before-reasoning mechanism that drove cross-run oscillation (the same finding flipping high / absent / medium on identical input). The calibration eval gained six pinned leak cases with N-run pass-rate assertions and now stands at 29/29 clean. The rework also establishes an evidence-gated medium calibration as a standing directive: a ref-kind sharpness finding only rises above informational when the body itself supplies the contradicting evidence.

Other changes

  • Default LLM model for fresh and unconfigured installs changed from Haiku to claude-sonnet-4-6, so pre-flight runs on the same model class the calibration eval measures. Configured graphs are unaffected.

  • Experimental: new sdd serve workflow MCP server, exposing a session-based dialogue loop over stdio and HTTP. Early preview — the tool surface will change and is not yet stable.

Full Changelog: v0.9.0...v0.10.0

v0.9.0

09 Jun 14:18

Choose a tag to compare

Highlights

  • sdd stats — LLM & embedding usage analytics — A net-new command reading the per-call stats sink at .sdd/stats/llm.jsonl. It rolls up usage by model/provider over a selectable range (all-time / 30d / 7d) — call count, tokens in/out, cache read/create, total duration — plus per-op throughput for preflight, summarize, and embedding ops (tokens/s, ms/call, items/s). A styled lipgloss table renders for terminals; non-TTY consumers and agents get the same aggregates as structured JSON on stdout. An absent or empty sink yields a clean "no stats yet" result rather than an error.

  • sdd show restructure — The bespoke padded-label / arrow block is gone. Each entry now renders as a YAML frontmatter envelope (metadata, refs, closes, supersedes, attachments, derived status/topics) followed by its raw markdown body, with the upstream/downstream neighborhood as a compact markdown tree — one line per node (<ref-kind> <full-id> (<kind>, <status>) — <first-sentence>), indentation encoding depth, and a sub-line for ref descriptions. Two renderers share one data model: a lipgloss/glamour-styled view for terminals and plain markdown for agents and pipes, selected by TTY detection, --format text, and NO_COLOR. Depth is now controlled by independent --up N (grounding, default 2) and --down N (consumers, default 1, shown by default) flags — replacing --max-depth / --downstream — with 0 turning a direction off (--up 0 --down 0 shows the entry alone). The stored summary is omitted by default; pass --with-summary to include it for drift review.

  • Interactive terminal output for sdd index & sdd search — A new reusable internal/cliout package drives a transient inline progress region — spinner, a determinate bar where a total is known, and an absolute count — that redraws in place at the bottom of normal terminal flow and clears on completion, with leveled log lines scrolling above it. sdd index shows per-entry progress and a final summary; sdd search keeps lazy-fill indexing transient so only the ranked results remain. Producers stay oblivious: handlers and finders log only through the context logger, and the CLI layer alone decides whether that drives the TUI or a plain leveled stderr handler. Non-TTY consumers and NO_COLOR get clean structured stderr logs and stdout results with no TUI — agents never see progress animation.

  • Supersede-chain resolution — Refs and derived status now walk the supersede chain transitively to the live head instead of stopping at a superseded intermediate. A new ResolvedRef model type exposes the ordered path from origin to head; sdd show and sdd view expand(refs) render the path to the head for stale targets only; pre-flight resolves each ref target to its live head before reasoning about it; and status reporting selects an active closer/superseder rather than a superseded one. sdd lint flags a fork — an entry with more than one currently-active head — as an anomaly.

  • CLI color scheme — Styled TTY output is committed to a single concept-keyed palette so every command reads consistently: entry ids in gold, kinds and live-status words white-bold, ref kinds purple, YAML keys cyan, with prominence carried by weight rather than extra hues and closed/superseded nodes receding wholesale. Color lives only on the styled path — lipgloss renders through a colorprofile writer that downsamples to the terminal and strips color entirely for non-TTY writers or NO_COLOR. Applied to sdd show and sdd stats.

Other changes

  • Capture-time check blocks superseding a non-head entry, emitting a high-severity pre-flight finding that directs authors to the live head; settled branches stay exempt.
  • The supersede-fork lint is narrowed to live forks only — a settled fork, where every branch has since closed or been superseded, stays quiet.
  • sdd init now adds .sdd/stats/ to the gitignore set it writes, so the machine-local stats sink is excluded on upgraded projects.

Full Changelog: v0.8.0...v0.9.0

v0.8.0

08 Jun 08:08

Choose a tag to compare

Highlights

  • sdd stats — LLM and embedding usage analytics — A new top-level command reads the per-call stats sink at .sdd/stats/llm.jsonl and reports usage rolled up by model/provider and by operation (preflight, summarize, embed-documents, embed-queries) over a selectable --since range (all-time default, durations, or an ISO date). Each rollup shows call count, tokens in/out, cache read/create, total duration, and per-op throughput — tokens/s, ms/call, and items/s for embedding ops. Interactive terminals get a styled table; non-TTY and agent invocations get the same aggregates as structured JSON on stdout. A live --watch monitor and graph-derived activity stats are scoped as follow-ups.

  • sdd sync --pull — merge-only pull that never rewrites shared history — A new pull command that merges on a clean working tree (git pull --no-rebase) and refuses on a dirty one, so background sync can never rewrite the shared graph's history. The background sync-check status lines now speak in merge terms rather than rebase, and the /sdd skill's conflict guidance was rewritten to a single-resolution merge flow — resolve once, one commit — in place of the old rebase-continue loop.

  • Worktree workflow for concurrent agent sessions — The bundled /sdd skill now carries a worktree workflow recipe — shipped and refreshed by sdd init — for running an implementation session in an isolated git worktree and concluding it back to the branch. The recipe drives the agent harness's worktree entry/exit plus plain git plumbing (git worktree add, merge, branch delete), with a two-gate conclude: one confirmation to start, one to merge. By design no sdd command owns the worktree lifecycle — a CLI subprocess can't relocate its caller's working directory, so the seamless part belongs to the harness and the rest is ordinary git.

  • Pre-flight prompt caching restructure — The pre-flight system prompt is now a byte-stable, type-independent preamble with per-type rubrics, and proposed entries moved to the user prompt. The open-signal completeness scan was dropped from the decision-refs check in favor of skill-side coverage. Together this makes the cacheable prefix reusable across captures, cutting redundant token cost and reducing attention dilution as the graph grows.

Other changes

  • Embedding calls now record per-batch timing and token data to .sdd/stats/llm.jsonl, so sdd stats can report embedding throughput (verified live against Ollama).
  • Upgraded the charm TUI stack to v2 (bubbletea 2.0.7, bubbles 2.1.0, lipgloss 2.0.3); sdd init's interactive prompts migrated to the new API.
  • sdd init no longer fails when OS junk files like .DS_Store are present — the skill embed now excludes dotfiles at the source rather than carrying them into the bundle.

Full Changelog: v0.7.1...v0.8.0

v0.7.1

05 Jun 12:26

Choose a tag to compare

Highlights

  • llm — per-call usage observability — The gollm/anthropic path no longer silently drops LLM metadata. A GenerateWithUsage extension in the gollm fork maps Anthropic's input/output token counts and prompt-cache read/creation breakdown into the agent-neutral LLMMetadata struct (with an OpenAI prompt/completion fallback). A default-on JSONL sink appends one record per call to .sdd/stats/llm.jsonl — operation (pre-flight, summarize), provider, model, token counts, cache read/creation, and duration — so prompt-cache effectiveness and per-operation token cost become measurable over time. Verified end-to-end: two identical pre-flight calls recorded a cache_creation followed by a 6163-token cache_read. Cost is deliberately excluded — the provider APIs report tokens, not dollars, and no pricing table is maintained.

  • preflight — ref-meta advisory recalibration — Pre-flight's LLM ref-meta consistency check no longer blocks valid entries on ambiguity. [high] severity is now reserved strictly for genuine precondition violations (a ref-kind inapplicable to the target's status/kind, or a desc the body refutes); any defensible-but-sharper choice between applicable kinds caps at [low]. The recurring terminal-done tie-break is single-sourced in the ref-kind vocabulary — addresses does not apply to a completed fact, so builds-on/grounded-in are canonical when a later entry takes up a follow-up a done flagged. The oscillation case that motivated this (identical input producing contradictory [high] blocks, each recommending the kind the other rejected) now produces zero findings on Sonnet, while real precondition violations still fire high.

Other changes

  • Pre-flight eval harness refactored onto an external llm_test package that drives the production llm.Preflight orchestrator through the real factory Runner (provider/model configurable via SDD_EVAL_PROVIDER / SDD_EVAL_MODEL, default claude-cli + Sonnet), replacing the bespoke single-model CLI reconstruction; adds a calibration case pinning the terminal-done ref shape.
  • Refined the /sdd skill's ref-capture guidance from provenance-only framing to connecting an entry's reasoning to the graph, with body↔edge consistency as the contract.

Full Changelog: v0.7.0...v0.7.1

v0.7.0

03 Jun 13:51

Choose a tag to compare

Highlights

  • Topics — cluster entries across kind, layer, and type — Topics are now a first-class way to group related work. sdd view gained as-counts (per-topic count and heat without listing members), an untagged filter (the grooming worklist), and an id(...) filter for pulling named entries. sdd search --max-citations 0 returns headers only — the terse "which entries match, and what topics do they carry" lookup. Annotations now fold their own declared labels into their effective topic set, so an annotation surfaces under the topics it assigns. The /sdd capture flow gained a topic-research procedure (check existing clusters → inspect refs → semantic search) plus a label-stability policy, so new entries join existing clusters instead of starting drift.

  • Principle-based ref-kind vocabulary — The ref-kind set is redefined by principle (the relationship and its direction) rather than by which target types a kind is allowed on. Eight kinds: grounded-in, builds-on, refines, addresses, surfaces, depends-on, required-by, related. The old grounds/evidence kinds merge into grounded-in (legacy on-disk values still parse, no entry files rewritten), required-by is added as the forward inverse of depends-on, and addresses now covers realizing a decision's commitment as well as responding to a gap. The vocabulary lives in one canonical fragment, resolved into both the skill surfaces and the pre-flight rubric at build time. Pre-flight now receives each referenced entry's derived status, so it can separate grounded-in / builds-on / refines correctly and stop firing debatable findings on correct choices.

  • Provider-aware LLM retry with backoffsdd's LLM calls (pre-flight, summarization) now retry transient failures instead of failing on the first connection blip. Built on a fork of gollm that classifies errors as retryable-transient (408/409/5xx including Anthropic 529, network errors), rate-limited (429, honoring Retry-After and reset hints), or permanent, then applies full-jitter exponential backoff floored by any server-provided delay. Retry bounds are configurable (max_attempts/base_delay/max_delay, defaults 5/2s/60s); attempts log at debug level so batch summarize no longer floods.

Other changes

  • sdd view gained expand(refs) — render each entry's outgoing refs as indented sub-lines, with an optional expand(refs(inactive)) narrowing to refs whose target is now closed, superseded, or retired. Wired into /sdd-catchup's "Active and hot" fetch to flag dependencies that are no longer live.
  • Summary hash-drift fix — summaries now render each ref's on-disk kind while keeping pre-flight and user-facing output canonical, stopping the re-summarize treadmill the grounds/evidencegrounded-in alias caused. Legacy entries restored to their original byte form with no history rewrite.
  • Scoped automatic git commitssdd new's auto-commit now stages only the paths it touched (git add -- <paths>) instead of a wide net, so concurrent sessions and active WIP don't get swept into the wrong commit.
  • Grounding discipline in the skills/sdd grounding restructured into two named moves, Widen (search from several angles) then Inspect (bundle IDs, read chains), with redundant CLI mentions consolidated across the catch-up, explore, groom, and engage surfaces.

Full Changelog: v0.6.0...v0.7.0

v0.6.0

21 May 11:37

Choose a tag to compare

Highlights

  • Per-ref kind taxonomy — every reference now carries an explicit kindrefs: entries shift from bare-string IDs to object form {id, kind, desc?}, with kind drawn from a closed eight-value vocabulary: grounds, builds-on, refines, addresses, surfaces, evidence, depends-on, related. This gives the graph the structural metadata needed for label-aware downstream consumers (heat weighting, drill expansion, render filtering) and gives readers per-ref rationale via the optional desc. The CLI moves to a JSON-per-ref shape: --refs '{"id":"...","kind":"builds-on","desc":"..."}', repeated once per reference; the legacy CSV form (--refs id1,id2) is rejected with guidance. Reads stay backwards-compatible — legacy bare-string refs parse as kind: unknown for traversal forever, no retroactive backfill required. New entries cannot carry bare-string or unknown-kind refs: mechanical pre-flight blocks at high severity, and an LLM consistency check (three-tier severity) flags drift between a ref's kind/desc and how the body frames the relationship. sdd show renders kind per ref line and desc (when present) inline beneath; preflight prompts use a multi-line ref block that lets the LLM check reason about per-ref framing. The refines kind distinguishes in-place refinement of an active commitment (the augmenting-directive pattern) from forward-continuation (builds-on).

  • README rewrite for current feature set — refreshed positioning and skill-as-primary framing, added concept blocks for actors/roles, topics, and focus (the 7+7 type system), updated the session walkthrough to the current mode table, and added a Configuration section covering LLM and embedding provider examples.

Other changes

  • Engage playbook sharpens implementation-load timing — the playbook now loads when dialogue turns toward how to implement, before the choices it should inform are already shaped.
  • Default Claude Code settings file added at .claude/settings.json.
  • Devbox PATH includes bin/, so sdd is invokable directly without ./bin/sdd.

Full Changelog: v0.5.2...v0.6.0

v0.5.2

17 May 16:24

Choose a tag to compare

Highlights

  • /sdd-catchup sub-skill — colleague-style briefings with always-on /sdd framing/sdd's check-in mode now invokes a dedicated sub-skill that produces story-arc-clustered briefings, compressed by project thread rather than kind or layer. Every /sdd invocation also injects aspirations, active focus, and participants as structural context — surfacing what the project is pulling toward and who participates, without re-fetching each session. The sub-skill carries its own tone-of-voice guidance and a fixed render template with italic focus line, bold story-arc headers, numbered action items, and a drill section. This should reduce catch-up times to under a minute.

  • sdd info command — new lightweight command prints just the session framing (Local participant, Language when configured, Search) matching sdd status header byte-for-byte. Stable surface for skill !sdd ...`` injections that need participant/language/retrieval context without the rest of sdd status.

Other changes

  • Catch-up sub-skill's Recent done fetch drops the time-window filter — uses the ten most recent regardless of interval, after evaluation surfaced a data-availability blur on quieter weeks.

Full Changelog: v0.5.1...v0.5.2

v0.5.1

08 May 07:44

Choose a tag to compare

Highlights

  • sdd init readiness-checksdd init now persists skill_scope (user or project) in .sdd/config.yaml and offers an interactive selector when missing; non-interactive runs aggregate missing-flag errors into a single message and reject contradicting --scope flags. The action is write-gated against older binaries — --bump raises minimum_version so older binaries fail with a clear message rather than corrupting state. Other commands now warn when the configured local participant is missing.

  • sdd viewnot(<filter>) negation primitive — new composable filter scoped to kind, layer, and topic. Multiple not(kind(...)) calls union their exclusion sets. Practical use: top(20):not(kind(contract,aspiration)) surfaces actionable signals by removing structural anchors.

Other changes

  • README Quickstart leads with sdd init for cloned SDD repos.

Full Changelog: v0.5.0...v0.5.1

v0.5.0

07 May 15:56

Choose a tag to compare

Highlights

  • sdd view — composable pipeline for graph views — new CLI command with a functional, colon-chained pipeline of primitives (source, filter, transform, aggregate, rank, page, render) and named macros (top(N), focus, topic(L), decisions, signals, participants, wip, etc.). Configurable rank algorithms (heat with decay as default; in-degree, mult, add, log, by(date)) with decay vocabulary (exp-{7,14,30}d, linear-{7,14,30}d, none). Filter primitives topic(L), layer(L), since(date|duration), kind(K, ...) intersect cumulatively. sdd status is unchanged.

  • Type system 7+7 — annotation and focus — the kind system extends from 6+6 to 7+7. New kind: annotation (signal) carries topics: [{label, members}] for retroactive/bulk topic clustering and is excluded from catch-up narrative. New kind: focus (decision) carries involvement: [{target, actors?, when?}] triples with dual lifecycle (supersedable mid-cycle or completable via done signal) and three derived states: attributed, stalled, pull-available. Topics are first-class on every entry via inline topics: [...] frontmatter; topic-paths are case-insensitive with first-seen casing preserved as canonical. New contract d-cpt-ni0 codifies the 7+7 rules and supersedes d-cpt-ygn.

  • /sdd Engage mode — Explore and Act/Implement modes collapse into a single Engage mode anchored on a new playbook-engage.md reference: anchor → read chain via sdd show --downstream → brief → offer per-kind post-engage moves (acting-on vs. lens-flavor split). /sdd-explore is rewritten as a goal-tagged compressed-brief generator that requires a stated goal and uses sdd search as the primary related-entry mechanism. Evaluate temporarily routes through playbook-engage.md pending a dedicated playbook-evaluate.md.

  • Augment-aware pre-flightdecision_refs.tmpl recognizes the augment-plan pattern so directives that refine an open plan no longer trigger false missing-required-ref findings.

Other changes

  • sdd init adds .sdd/index/ to the managed gitignore set
  • sdd new disables urfave/cli/v3 CSV-splitting on slice flags; the --flag X --flag X repeat form is canonical, in-value commas are no longer accepted (preserves JSON-bearing flag values)
  • Six read-side queries flagged as conflating intent with pre-resolved data (CQRS leak s-tac-m09); follow-up captured, not blocking
  • CLAUDE.md: forbid git add -A / git add . to prevent contamination from concurrent sessions or active WIP markers

Full Changelog: v0.4.0...v0.5.0