Releases: blackwell-systems/gcf-rust
v2.2.1
Flatten Opt-Out
encode_generic_with_options(data, &GenericOptions { no_flatten: true })disables nested object flattening- Backward compatible:
encode_generic(data)unchanged
Bug Fixes
- Field names containing
>excluded from tabular columns (spec rule 7.4.6.1.4) - Field names containing
>no longer eligible for flattening analysis - Decoder no longer treats literal
>in key names as a path separator - Decoder accepts orphan attachments (fields excluded from column list)
- Fuzz key generator includes
>for adversarial testing; 12 targeted edge case tests - 4.49M+ round-trips across JSON, YAML, MessagePack, CSV with zero failures
Full changelog: v2.2.0...v2.2.1
v2.2.0: Nested Object Flattening (Spec v3.2)
Encoder flattens fixed-shape nested objects into > path columns. 20-48% fewer tokens. 50M+ fuzz verified. Install: cargo add gcf@2.2.0
v2.1.1
Patch release. Fixes encoder quoting for edge cases involving bracket-colon patterns in string values. Updated crate description.
Full Changelog: v2.1.0...v2.1.1
v2.1.0
Spec v3.1 Conformance
Spec change
toolfield in graph profile header is now optional (SHOULD be present for MCP, not required)
Bug fixes
- Quote strings containing commas in scalar values
- Decode v2-format indented attachments in tabular rows
- Reject duplicate attachments on the same row
- Reject orphan attachments on rows without
^cells
Conformance
- 157/157 fixtures passing
- 23.25B+ round-trips verified across all 6 implementations, zero failures
Full spec release: gcf v3.1.0
v2.0.0: Inline Schema Encoding
v2.0.0: Inline Schema Encoding
The generic profile encoder now produces inline schema format for nested objects with 3+ scalar fields. This is a breaking change from v1.x output.
Breaking Changes
encodeGenericoutput format changed (inline schemas, no attachment indentation)- Decoders no longer accept v1.x indented attachment syntax
- Comma no longer quoted in pipe-delimited contexts (only in comma-delimited inline arrays)
- Strings starting with digits no longer quoted unless they match JSON number grammar
New Features
- Inline object schema (
^{fields}): nested objects encoded positionally - Shared array schemas: identical nested arrays omit field headers after first row
- 25.5% fewer tokens than TOON across 15 real-world datasets
Integrity
- 1B+ lossless round-trip iterations across 6 language implementations
- 100% comprehension accuracy on every frontier model tested
- 156 conformance fixtures passing
Full spec: https://github.com/blackwell-systems/gcf/releases/tag/v3.0.0
v1.0.1: CLI binary
- CLI:
encode,decode,encode-generic,decode-genericsubcommands - Both graph and generic profiles supported from the command line
gcf-rust v1.0.0
SPEC v2.0 implementation
125/133 conformance fixtures passing (8 skipped: session, delta, binary UTF-8, negative zero, graph encode). 40M property-based round-trips with zero failures.
Breaking changes from v0.5.0
encode_genericemitsGCF profile=genericheaderdecode_genericrequiresGCF profile=header- Strings colliding with typed literals are quoted
- Full JSON string escaping and number grammar
-for null,~for absent,^for nested attachments##! summarytrailer replaces## _summary- Graph encoder emits
profile=graph serde_jsonnow usespreserve_orderfeature- Added
regexdependency
Install
cargo add gcf@1.0.0
v0.5.1: docs update
What's new
Updated all documentation with multi-model benchmark data:
- 1,300+ LLM evaluations across 10 models, 3 providers, and 51 independent test runs
- 90.5% average comprehension accuracy (four models hit 100%: Sonnet, Gemini 2.5 Pro, Gemini 3.1 Pro, Gemini 3.5 Flash)
- 5/5 generation validity on every frontier model from Anthropic, OpenAI, and Google
- TOON's official decoder rejects LLM-generated output on 7 of 9 models tested
- GCF wins all 6 datasets on TOON's own benchmark
Full benchmarks: https://gcformat.com/guide/benchmarks.html
v0.5.0: Full round-trip + Generic streaming
What's new
decode_generic
Parse any GCF text back to native Rust values (serde_json::Value). Works with both generic profile and graph profile payloads. Full round-trip: encode_generic -> GCF -> decode_generic.
use gcf::decode_generic;
let result = decode_generic(gcf_text)?;
// Returns serde_json::ValueGenericStreamEncoder
Zero-buffering streaming encoder for the generic profile. Write rows as data arrives with O(1) memory per row.
use gcf::GenericStreamEncoder;
let mut enc = GenericStreamEncoder::new(writer);
enc.begin_array("users", &["name", "email", "role"]);
enc.write_row(&[json!("alice"), json!("alice@co.com"), json!("admin")]);
enc.write_row(&[json!("bob"), json!("bob@co.com"), json!("user")]);
enc.end_array();
enc.close(); // emits ## _summary trailerAlso in this release
- Repositioned as drop-in JSON replacement for AI pipelines
- Generic profile documentation leads all examples
Full changelog: v0.4.0...v0.5.0
v0.4.0
StreamEncoder: zero-buffering streaming encode to any impl Write. write_symbol/write_edge emit immediately, close() emits trailer summary. O(1) memory, thread-safe via Mutex.