- Added
GenericOptionsstruct withno_flattenfield to disable nested object flattening encode_generic_with_options(data, &GenericOptions { no_flatten: true })produces attachment syntax instead of path columns- Backward compatible:
encode_generic(data)behavior unchanged (flatten on by default) - Fixed: field names containing
>no longer appear as tabular columns (spec rule 7.4.6.1.4) - Fixed: field names containing
>no longer eligible for flattening analysis - Fixed: decoder no longer treats literal
>in key names as a path separator - Fixed: decoder accepts orphan attachments (fields excluded from column list)
- Fuzz key generator now includes
>for adversarial testing
- Encoder automatically flattens fixed-shape nested objects into
>path column names (e.g.,"customer>name"instead of^+.customer {}attachment) - Decoder reconstructs nested objects from
>path columns - 20-48% fewer tokens on deeply nested API data (Jira, Stripe, K8s, calendar events)
- 100% comprehension on every frontier model (validated across 9 models, 7 providers)
- Zero regression on lossless round-trips (50M across JSON, YAML, MessagePack, CSV)
- Falls back to attachment mechanism for: variable-length arrays, objects with different keys across rows, objects with
>in key names, empty nested objects - Configurable fuzz iterations via
FUZZ_ITERATIONSenv var
toolfield in graph profile header is now optional (SHOULD be present for MCP, not required)- Removed
MissingToolerror variant fromDecodeErrorenum
- Quote strings containing commas (conformance:
inline-schema/006_inline_with_quoted_values)
encode_genericnow produces inline schema format (not backwards compatible with v1.x decoders)- Attachment lines no longer indented (same depth as parent row)
- Inline object fields use positional encoding without field-name prefix
- Inline object schema: objects with 3+ scalar fields encoded positionally with
^{fields}header - Shared array schemas: identical nested arrays omit
{fields}after first row - 472M+ fuzz iterations across all 6 implementations, zero failures
- Quote strings starting with
.(dot prefix) - Quote C1 control characters (U+0080-U+009F)
- Quote Unicode whitespace (NBSP, hair space, etc.)
- CLI:
encode,decode,encode-generic,decode-genericsubcommands - Both graph and generic profiles supported from the command line
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.
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 for insertion-order keys- Added
regexdependency for scalar grammar
scalar.rs: common scalar grammar (quoting, escaping, parsing, number formatting)- Conformance test runner (133 fixtures)
- Property-based round-trip tests (40M verified, configurable via
GCF_ITERATIONS)
GenericStreamEncoder: zero-buffering tabular streaming encode (begin_array/write_row/end_array/write_kv/write_section/write_inline_array)decode_generic: parse GCF tabular text intoserde_json::Value(tabular arrays, key-value, nested sections, inline arrays, nested row fields, empty arrays, graph fallback)
encode_generic: primitive arrays inlined asname[N]: val1,val2,val3
- Breaking:
encode()now emitsedges=Nin header line - Breaking:
encode()now emits## edges [N]section header (was## edges) decode()updated to parse## edges [N]format (strips bracket suffix)- Session encoder updated to emit new edge count format
- Initial release
encode/decode: full GCF round-tripencode_with_session: session deduplicationencode_delta: delta encodingencode_generic: tabular profile encoding- Thread-safe
Sessiontype - 16 kind abbreviations
- Zero dependencies, published to crates.io as
gcf