Changelog
Every release, every line. Straight from CHANGELOG.md.
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Versioning Rules
- Major: File format changes, breaking API changes, and incompatible wire semantics.
- Minor: Backward-compatible features and public API additions.
- Patch: Bug fixes, performance improvements, tests, and documentation.
[Unreleased]
No unreleased changes.
[1.2.0] - 2026-07-04
This release documents the current workspace architecture and records the highest-priority defect inventory across the Rust, Python, CLI, FFI, and MCP surfaces.
Added
- Added a 1.2.0 release note entry for the current repository state.
- Added an architecture snapshot covering the workspace split, the two parallel v1/RFC-001 pipelines, and the Python data flow through PyO3.
Changed
- Clarified that
surp-coreis the shared engine crate,surp-derivehandles proc-macros,surp-iohandles streaming/mmap helpers,surp-ffiexposes the C ABI, andsurp-pythoncombines the native extension with the pure Pythonsurp.modellayer. - Clarified that
surp-mcpis a separate stdio JSON-RPC server outside the workspace, whilesurp_docs,bench,fuzz, andexamplesremain supporting tooling.
Known Issues
- Critical: untrusted CTN
<binary: N bytes>lengths can allocate without a cap, Python subclass handling can surface raw PyO3 exceptions, deep Python recursion can overflow the native stack, and Python wheel compression feature wiring is incomplete. - High: RFC-001 CBF container decoders can preallocate from untrusted counts,
decode recursion can overflow on many consecutive blocks, CTN parsing has no
nesting limit,
surp-iocan allocate from stream-controlled block lengths, MCP tool hinting is inaccurate for file-writing operations, MCP JSON-RPC input is unbounded, inline MCP value tools bypass input-size checks,derive(Surp)/derive(SurpSchema)attribute hygiene needs compile-time diagnostics, SIMD varint pre-scan provides no release-mode benefit, and FFI panics can cross the ABI boundary. - Medium/Low: owned decode tracking, text escaping, encoder limit parity,
BumpDecoderarena behavior, CRC64 implementation strategy, double-buffering in CBF sequences/maps, integer panics in infallible paths, duplicate block framing, Python exception classification, missing Python RFC-001 bindings, lack of GIL release, andsurp-compression/surp-coreduplication remain open design and correctness work.
Validation
cargo test -p surp-derive --test derive_types --test trybuildcargo test -p surp-cli --test cli_integration --test cli_rfc001
[1.0.2] - 2026-05-18
This patch release fixes Python 3.14 model annotation handling, improves model typing for static analyzers, and adds the missing v1 Surp decode companion for model instances.
Added
- Added
SurpModel.from_surp(data, *, validate=True)as the inverse ofSurpModel.to_surp()for stable v1 Surp bytes encoded from a model's plain dictionary form. - Added regression coverage for the v1 model convenience round-trip.
Changed
- Reworked
surp.modeldeveloper docstrings into raw reStructuredText-style docstrings with explicit signatures, arguments, return details, and examples following the repository docstring skill format. - Updated Python API docs and examples to show model round-trips through
to_surp()andfrom_surp(). - Updated workspace, Python package, benchmark, and example version metadata to
1.0.2.
Fixed
- Fixed Python 3.14 lazy class annotations so model fields declared without
from __future__ import annotationsare collected correctly bySurpModelMeta. - Fixed Pylance/Pyright
reportInvalidTypeFormwarnings for public model type markers such asInt64,Str, andSeqOf[Str]by making the shipped stubs valid type expressions while preserving runtime marker behavior.
Validation
python3 -m py_compile surp-python/python/surp/model/*.pyPYTHONPATH=surp-python/python /Users/kuroyami/Pyprojects/Testing/env/bin/python -m pytest surp-python/tests/ -qpython examples/python_v1.pyPYTHONPATH=surp-python/python .venv/bin/pyright surp-python/python/surp/model examples/python_v1.pycargo fmt --all -- --checkcargo test --workspace --all-featuresgit diff --check
[1.0.1] - 2026-05-17
This patch release promotes the staged v1.0.1 API work, expands release
documentation, and adds committed benchmark evidence for the public release.
Added
- Added
surp.model, an RFC-001-native class schema and validation layer inside thesurpPython package. It supports declarativeSurpModelandSurpDocumentclasses,Field(...)descriptors, RFC-001 scalar and composite type markers, symbol enums, references, streams, tensors, sums, validation errors, schema inspection, CQL query helpers, and typed stub generation. - Added Rust v1 introspection helpers on
ValueandSurpValue<'_>for JSON-like object and array access:get,get_index,contains_key,keys,values,items/entries, container predicates, and length checks. - Added RFC-001 AST introspection helpers for documents, products, sums, sequences, tensors, tensor data, streams, and RFC values.
- Added native-backed Python view/model APIs for discoverable attribute access:
SurpValue,to_value,loads_value, andparse_text_value. - Added native-backed Python RFC-001 model APIs:
RfcAnnotation,RfcField,RfcBinding,RfcHeader,RfcDocument,RfcDecodedCbf,RfcValue,parse_ctn_model,decode_cbf_model,query_cbf_model, andquery_ctn_model. - Added a private
_surp_native.pyistub so Pyright and other type checkers can resolve the compiled extension module through the public facade. - Added Protocol Buffers coverage to the Rust benchmark harness using a generic value schema that can represent the same schema-less benchmark payloads as Surp, JSON, MessagePack, and CBOR.
- Added SVG benchmark chart generation for serialized size, encode throughput, and decode throughput.
- Added committed
v1.0.1benchmark artifacts underdocs/assets/bench/v1.0.1.
Changed
- Moved the RFC-001 model validation layer into the native Python distribution
so users import it as
from surp.model import ...; the standalonesurp-modelpackage layout is not shipped. - Expanded Python
.pyistubs and shared typed dictionaries to describe the new v1, RFC-001 introspection, andsurp.modelvalidation surfaces. - Updated Python and Rust docs plus examples to show model/view access while keeping the existing dictionary and built-in Python value APIs documented.
- Updated Python packaging metadata to ship package-local README and license files directly with wheels and sdists.
- Rewrote the root README as a complete project guide covering installation, Rust/Python/CLI usage, RFC-001, Python RFC models, local development, benchmarks, and release workflow.
- Updated Rust workspace version metadata from
1.0.0to1.0.1so the Rust crates align with the Python package and release tag.
Fixed
- Fixed RFC-001 CTN formatting for empty maps so canonical output remains
parseable and
normalize_ctn()stays idempotent for empty map fields. - Fixed Pyright analysis of
surp,surp.exceptions, andsurp.rfc001by providing a typed private stub for the native extension import. - Fixed RFC-001 query overload stubs so
as_ctn=Trueandas_ctn=Falseare distinguishable to type checkers.
Validation
cargo check -p surp-benchcargo fmt --all -- --checkcargo test --workspace --all-featurescargo clippy --workspace --all-features -- -D warningscargo run -p surp-bench --release -- --mode full --output docs/assets/bench/v1.0.1 --version v1.0.1cd surp-python && ../.venv/bin/maturin develop --releasecd surp-python && ../.venv/bin/python -m pytest tests/ -vcd surp-python && ../.venv/bin/python -m mypy python/surpcd surp-python && ../.venv/bin/pyright python/surp
[1.0.0] - 2026-05-17
Added
- First stable Surp release under the
surpproject and package name. - Rust workspace crates:
surp-corefor v1 binary encoding/decoding, block framing,Value, zero-copySurpValue, resource limits, checksums, text parsing, and RFC-001 modules.surp-derivefor#[derive(Surp)]and#[derive(SurpSchema)].surp-clifor v1 file inspection/conversion/validation and RFC-001 CTN/CBF/CQL commands.surp-iofor file/shared-buffer helpers, Tokio framed IO, and optional mmap support.surp-compressionfor compressor adapters and adaptive selection.surp-ffifor C-compatible JSON-to-Surp and Surp-to-JSON buffers.surp-simdfor byte scanning and batched varint helpers.surp-python, published as the native Python packagesurp.
- v1 binary format support for null, booleans, unsigned and signed integers, floats, strings, bytes, arrays, ordered objects, block checksums, trailer checksums, optional block compression, and per-block string dictionary deduplication.
- Human-readable v1 text notation with object fields, arrays, base64 bytes,
comments, optional type annotations,
inf,-inf, andNaN. - Native Python API:
dumps,loads,dump,loadencode,decode,encode_to_file,decode_from_fileparse_text,pretty_printEncoder,SurpDecoderSurpError,SurpEncodeError,SurpDecodeError,SurpChecksumError,SurpTypeError, andSurpRfcError
- RFC-001 implementation under
surp_core::rfc001with CTN parsing and formatting, CBF encoding/decoding, CRC64 validation, symbol tables, product, sum, sequence, map, reference, tensor, stream, and opaque/tagged value support. - Python RFC-001 API under
surp.rfc001for CTN parsing/normalization, CTN-to-CBF compilation, CBF decoding, CBF-to-CTN formatting, and baseline CQL queries. - CLI RFC-001 commands:
rfc-compile,rfc-inspect, andrfc-query. - Comprehensive Rust, Python, CLI, and RFC-001 documentation under
docs/. - Runnable examples and fixtures under
examples/for Rust, Python, CLI, v1 text/binary workflows, derives, and RFC-001 CTN/CBF/CQL. - Regression tests for v1 roundtrips, adversarial inputs, resource limits, string dictionary references, compression, text parsing, derive macros, RFC-001 CTN/CBF/CQL behavior, Python native APIs, and cross-language behavior.
Changed
- Versioning is reset to
1.0.0for the Surp project, Rust workspace crates, Python package metadata, native extension metadata, benchmark crate, and example package. - Release metadata now targets a fresh
v1.0.0GitHub release.
Removed
- Removed the legacy pure-Python package tree. Python users should install the
Rust-backed native
surppackage. - Removed legacy project/version history from the active changelog so the
public Surp line starts at
v1.0.0.
Release Checklist
- Update version metadata to
1.0.0 - Update changelog and release notes
- Run
cargo fmt --all - Run
cargo test --workspace --all-features - Run
cargo clippy --workspace --all-features -- -D warnings - Run Python native tests
- Verify Rust, Python, and CLI examples
- Push commits and tag
v1.0.0 - Create GitHub release with
gh