Releases: networkteam/sdd
v0.11.0
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_agentslist in.sdd/config.yamlrecords which agents a project renders;sdd initoffers 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 undermetadata:, runtime undercompatibility:. Instructions bridge through a canonicalAGENTS.mdthatCLAUDE.mdimports via@AGENTS.md;sdd initscaffolds the bridge on a fresh project when a non-Claude agent is selected, never overwriting files you already have. Per-agent deviations (Claude'sSkill-tool sub-skills and dynamic injection vs. Codex's instructed$skillinvocation and explicitrun sdd …steps) are template conditionals from the one source — no duplicated definitions. Skill text generation moved to Gotext/templateunderneath, 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 newsurfaced-byref-kind records, on an entry, that an earlier entry's work raised or produced it — the backward-class inverse ofsurfaces. This makes thesurfacespair order-independent (the waydepends-on/required-byalready is) and fills the case where the producing entry is a terminaldonesignal, whereaddressesis 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 thesurfaced-by-vs-grounded-inboundary so it does not regress.
Known limitations
Codex support is new — treat it as experimental:
sdd init --agentsdoesn't persist on an existing project. Adding an agent to an already-initialized repo requires editingsupported_agentsin.sdd/config.yamlby hand for now (a freshsdd initpersists 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_tokensparameter SDD sends (they requiremax_completion_tokens), breaking summary and pre-flight calls; the fix is pending in thenetworkteam/gollmfork. Use agpt-4omodel, 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
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 serveworkflow 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
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 showrestructure — 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, andNO_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— with0turning a direction off (--up 0 --down 0shows the entry alone). The stored summary is omitted by default; pass--with-summaryto include it for drift review. -
Interactive terminal output for
sdd index&sdd search— A new reusableinternal/clioutpackage 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 indexshows per-entry progress and a final summary;sdd searchkeeps 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 andNO_COLORget 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
ResolvedRefmodel type exposes the ordered path from origin to head;sdd showandsdd viewexpand(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 lintflags 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 tosdd showandsdd 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 initnow 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
Highlights
-
sdd stats— LLM and embedding usage analytics — A new top-level command reads the per-call stats sink at.sdd/stats/llm.jsonland reports usage rolled up by model/provider and by operation (preflight, summarize, embed-documents, embed-queries) over a selectable--sincerange (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--watchmonitor 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/sddskill'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
/sddskill now carries a worktree workflow recipe — shipped and refreshed bysdd 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 nosddcommand 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, sosdd statscan 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 initno longer fails when OS junk files like.DS_Storeare 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
Highlights
-
llm— per-call usage observability — The gollm/anthropic path no longer silently drops LLM metadata. AGenerateWithUsageextension in the gollm fork maps Anthropic's input/output token counts and prompt-cache read/creation breakdown into the agent-neutralLLMMetadatastruct (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 adescthe body refutes); any defensible-but-sharper choice between applicable kinds caps at[low]. The recurring terminal-donetie-break is single-sourced in the ref-kind vocabulary —addressesdoes not apply to a completed fact, sobuilds-on/grounded-inare 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_testpackage that drives the productionllm.Preflightorchestrator through the real factory Runner (provider/model configurable viaSDD_EVAL_PROVIDER/SDD_EVAL_MODEL, default claude-cli + Sonnet), replacing the bespoke single-model CLI reconstruction; adds a calibration case pinning the terminal-doneref shape. - Refined the
/sddskill'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
Highlights
-
Topics — cluster entries across kind, layer, and type — Topics are now a first-class way to group related work.
sdd viewgainedas-counts(per-topic count and heat without listing members), anuntaggedfilter (the grooming worklist), and anid(...)filter for pulling named entries.sdd search --max-citations 0returns 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/sddcapture 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 oldgrounds/evidencekinds merge intogrounded-in(legacy on-disk values still parse, no entry files rewritten),required-byis added as the forward inverse ofdepends-on, andaddressesnow 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 separategrounded-in/builds-on/refinescorrectly and stop firing debatable findings on correct choices. -
Provider-aware LLM retry with backoff —
sdd'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, honoringRetry-Afterand 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 viewgainedexpand(refs)— render each entry's outgoing refs as indented sub-lines, with an optionalexpand(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/evidence→grounded-inalias caused. Legacy entries restored to their original byte form with no history rewrite. - Scoped automatic git commits —
sdd 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 —
/sddgrounding 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
Highlights
-
Per-ref kind taxonomy — every reference now carries an explicit kind —
refs:entries shift from bare-string IDs to object form{id, kind, desc?}, withkinddrawn 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 optionaldesc. 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 askind: unknownfor 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 showrenders kind per ref line anddesc(when present) inline beneath; preflight prompts use a multi-line ref block that lets the LLM check reason about per-ref framing. Therefineskind 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/, sosddis invokable directly without./bin/sdd.
Full Changelog: v0.5.2...v0.6.0
v0.5.2
Highlights
-
/sdd-catchupsub-skill — colleague-style briefings with always-on/sddframing —/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/sddinvocation 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 infocommand — new lightweight command prints just the session framing (Local participant,Languagewhen configured,Search) matchingsdd statusheader byte-for-byte. Stable surface for skill!sdd ...`` injections that need participant/language/retrieval context without the rest ofsdd 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
Highlights
-
sdd initreadiness-check —sdd initnow persistsskill_scope(userorproject) in.sdd/config.yamland offers an interactive selector when missing; non-interactive runs aggregate missing-flag errors into a single message and reject contradicting--scopeflags. The action is write-gated against older binaries —--bumpraisesminimum_versionso older binaries fail with a clear message rather than corrupting state. Other commands now warn when the configured local participant is missing. -
sdd view—not(<filter>)negation primitive — new composable filter scoped tokind,layer, andtopic. Multiplenot(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 initfor cloned SDD repos.
Full Changelog: v0.5.0...v0.5.1
v0.5.0
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 (heatwith 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 primitivestopic(L),layer(L),since(date|duration),kind(K, ...)intersect cumulatively.sdd statusis unchanged. -
Type system 7+7 — annotation and focus — the kind system extends from 6+6 to 7+7. New
kind: annotation(signal) carriestopics: [{label, members}]for retroactive/bulk topic clustering and is excluded from catch-up narrative. Newkind: focus(decision) carriesinvolvement: [{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 inlinetopics: [...]frontmatter; topic-paths are case-insensitive with first-seen casing preserved as canonical. New contractd-cpt-ni0codifies the 7+7 rules and supersedesd-cpt-ygn. -
/sddEngage mode — Explore and Act/Implement modes collapse into a single Engage mode anchored on a newplaybook-engage.mdreference: anchor → read chain viasdd show --downstream→ brief → offer per-kind post-engage moves (acting-on vs. lens-flavor split)./sdd-exploreis rewritten as a goal-tagged compressed-brief generator that requires a stated goal and usessdd searchas the primary related-entry mechanism. Evaluate temporarily routes throughplaybook-engage.mdpending a dedicatedplaybook-evaluate.md. -
Augment-aware pre-flight —
decision_refs.tmplrecognizes the augment-plan pattern so directives that refine an open plan no longer trigger falsemissing-required-reffindings.
Other changes
sdd initadds.sdd/index/to the managed gitignore setsdd newdisables urfave/cli/v3 CSV-splitting on slice flags; the--flag X --flag Xrepeat 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: forbidgit add -A/git add .to prevent contamination from concurrent sessions or active WIP markers
Full Changelog: v0.4.0...v0.5.0