Skip to main content

signalsafe-tree-spec (Python)

Python implementation of the TreeSpec wire contract: Pydantic models, parsing, lint, patch helpers, and constants. Backend counterpart to @signalsafe/tree-spec on npm.

PyPI distribution name signalsafe-tree-spec
Import path deliveryplus_tree_spec (stable; historical name)
GitHub SignalSafeSoftware/tree-spec-python
Python 3.12+ (requires-python >=3.12,<4.0)
Runtime dependency Pydantic v2 (pydantic>=2.11.3,<3)

License: MIT — see LICENSE. See SECURITY.md for vulnerability reporting.

What this package does

  • Validate and parse TreeSpec wire JSON into typed Pydantic models (TreeSpec, Node, Transition, …).
  • Lint wire payloads (lint_tree_spec) with structured issues.
  • Build wire documents programmatically (TreeSpecBuilder).
  • Apply JSON patches to wire dicts (apply_patch_to_spec_dict).
  • Expose wire constants (END_NODE_ID, TREESPEC_WIRE_VERSION).

See docs/compatibility.md for how unknown JSON fields are handled (extra="ignore") and how that compares to TypeScript compile/decompile.

What this package does not do

  • HTTP APIs, authentication, persistence, or training UI.
  • Scenario simulation (use @signalsafe/simulator-core / simulator-react in TypeScript stacks).
  • Graph editor UI (use @signalsafe/tree-spec-editor-* packages).
  • General sandboxing or authorization — contract validation only; host apps decide trust and access control.

Install

pip install signalsafe-tree-spec

Development (this repo uses uv):

uv sync --extra dev
uv run pytest

Distribution name vs import path

pip install signalsafe-tree-spec
import deliveryplus_tree_spec
from deliveryplus_tree_spec import TreeSpec, lint_tree_spec, TreeSpecBuilder

The PyPI name (signalsafe-tree-spec) differs from the import path (deliveryplus_tree_spec) for backward compatibility with existing backends.

Quick start

from deliveryplus_tree_spec import (
    END_NODE_ID,
    TREESPEC_WIRE_VERSION,
    TreeSpec,
    TreeSpecBuilder,
    lint_tree_spec,
)

wire = {
    "wire_version": TREESPEC_WIRE_VERSION,
    "start_node": "start",
    "nodes": {
        "start": {
            "type": "prompt",
            "prompt": "Verify the sender before clicking?",
            "choices": [{"id": "inspect", "label": "Inspect sender"}],
        }
    },
    "transitions": [
        {"from": ["start", "inspect"], "to": END_NODE_ID, "outcome": "safe"},
    ],
}

issues = lint_tree_spec(wire)
assert not issues

spec = TreeSpec.model_validate(wire)
builder = TreeSpecBuilder()
# builder.add_node(...) — see tests/ for full builder flows

Public API

All symbols below are exported from the top-level deliveryplus_tree_spec package:

Category Symbols
Constants END_NODE_ID, TREESPEC_WIRE_VERSION
Models TreeSpec, Node, Transition, Choice, Delta, MicroFeedback, ABMeta, ABVariant, …
Lint lint_tree_spec, TreeSpecIssue
Builder TreeSpecBuilder, TreeSpecError
Patch apply_patch_to_spec_dict, PatchApplyError, PatchDict, ReplacePatch, …

There are no subpath exports — import from deliveryplus_tree_spec only.

Wire contract (high level)

  • wire_version: optional; omit for implicit v1. Constant TREESPEC_WIRE_VERSION documents the current version string.
  • start_node: entry node id.
  • nodes: map of node id → node object (type, prompt, choices or legacy options, optional render_hints).
  • transitions: list of { from: [nodeId, choiceId], to, outcome? }. Terminal transitions target END_NODE_ID and require outcome.
  • _meta: optional tree-level metadata (for example graph-editor viewport persisted by editor packages).

Legacy payloads may use options instead of choices and legacy terminal ids; both implementations normalize these to canonical choices and END on read. Python lint validates the wire shape your backend accepts.

Python / TypeScript parity

Concern Python (tree-spec-python) TypeScript (@signalsafe/tree-spec)
Wire models & lint Pydantic models, lint_tree_spec TreeSpecWire, lintTreeSpecWire
Authoring graph compile — compileTreeSpec / decompileTreeSpec
Cross-language fixtures Share JSON fixtures in your product repo or CI Same

Keep fixture JSON in sync when changing wire rules in either language. Full compile/decompile parity lives in TypeScript today; Python focuses on validation, lint, builder, and patch flows used by backends.

Development

uv sync --extra dev
uv run pytest
uv run flake8 .
uv run python -m build   # wheel/sdist smoke — full artifact tests in Batch 6

Security

See SECURITY.md. TreeSpec parsing is contract validation, not a sandbox. Validate and authorize TreeSpec JSON in your application layer before treating content as trusted.

Changelog and releases

Metadata

Release files for signalsafe-tree-spec 0.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for signalsafe-tree-spec 0.2.0
File Size Uploaded Provenance
signalsafe_tree_spec-0.2.0.tar.gz 13.1 kB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for signalsafe-tree-spec 0.2.0
File Interpreter ABI Platform
signalsafe_tree_spec-0.2.0-py3-none-any.whl Python 3 none any Details

Total release size: 26.1 kB

Release files / signalsafe_tree_spec-0.2.0.tar.gz

Download URL signalsafe_tree_spec-0.2.0.tar.gz
Size 13.1 kB
Tags Source
SHA-256 checksum
How to use checksums
b19b9ae3195c97dcd3855dab6aaddb3ba2de342c79fd609db0598965329696c1
BLAKE2b-256 checksum
How to use checksums
b9083eee7989caba984881780adeb7e78ab475e11b621ef14a80fdbc336e417c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 30, 2026.

Transparency log

Release files / signalsafe_tree_spec-0.2.0-py3-none-any.whl

Download URL signalsafe_tree_spec-0.2.0-py3-none-any.whl
Size 13.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
2462bc8d46461f2d937ffdce03c7f9fb60f68323d68bd1b67d1d0a1e15aad051
BLAKE2b-256 checksum
How to use checksums
d247cd0a972294eb0e8c27017e7f6972a1eba62e84a84fb1fd53316d0063e17c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 30, 2026.

Transparency log

Security for signalsafe-tree-spec 0.2.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for signalsafe_tree_spec-0.2.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 30, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page