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; the TypeScript package normalizes these on compile/decompile. 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.1.3

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.1.3
File Size Uploaded Provenance
signalsafe_tree_spec-0.1.3.tar.gz 12.9 kB With provenance Details

Built distribution (wheel)

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

Total release size: 25.6 kB

Release files / signalsafe_tree_spec-0.1.3.tar.gz

Download URL signalsafe_tree_spec-0.1.3.tar.gz
Size 12.9 kB
Tags Source
SHA-256 checksum
How to use checksums
be861e11f0bffd1a96bb983bdcb423bfddd20afa5c98a570adf16ef6d48aa802
BLAKE2b-256 checksum
How to use checksums
0dbe9a2da363ab64734f0ecb81d52fd3f02cc62896005ff54a3028188a835d87
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.1.3-py3-none-any.whl

Download URL signalsafe_tree_spec-0.1.3-py3-none-any.whl
Size 12.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
cb5cae4010ea27729e9abb8572f217ac026f3b1dff0f05d6b2277fc012797cc5
BLAKE2b-256 checksum
How to use checksums
5ed5438bf92393d318d2cfd212570bbaabe2824c0db8a14c1dea4c4977a4f019
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.1.3

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.1.3.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