gcf-python 2.5.2__tar.gz → 2.5.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. {gcf_python-2.5.2 → gcf_python-2.5.3}/CHANGELOG.md +4 -0
  2. {gcf_python-2.5.2 → gcf_python-2.5.3}/PKG-INFO +2 -2
  3. {gcf_python-2.5.2 → gcf_python-2.5.3}/README.md +1 -1
  4. {gcf_python-2.5.2 → gcf_python-2.5.3}/pyproject.toml +1 -1
  5. {gcf_python-2.5.2 → gcf_python-2.5.3}/src/gcf/scalar.py +4 -2
  6. {gcf_python-2.5.2 → gcf_python-2.5.3}/.github/FUNDING.yml +0 -0
  7. {gcf_python-2.5.2 → gcf_python-2.5.3}/.github/workflows/ci.yml +0 -0
  8. {gcf_python-2.5.2 → gcf_python-2.5.3}/.github/workflows/publish.yml +0 -0
  9. {gcf_python-2.5.2 → gcf_python-2.5.3}/.gitignore +0 -0
  10. {gcf_python-2.5.2 → gcf_python-2.5.3}/LICENSE +0 -0
  11. {gcf_python-2.5.2 → gcf_python-2.5.3}/assets/divider-wave-2.png +0 -0
  12. {gcf_python-2.5.2 → gcf_python-2.5.3}/assets/divider.png +0 -0
  13. {gcf_python-2.5.2 → gcf_python-2.5.3}/assets/gcf-hero-wire-delta.png +0 -0
  14. {gcf_python-2.5.2 → gcf_python-2.5.3}/assets/gcf-python-diagram.png +0 -0
  15. {gcf_python-2.5.2 → gcf_python-2.5.3}/src/gcf/__init__.py +0 -0
  16. {gcf_python-2.5.2 → gcf_python-2.5.3}/src/gcf/__main__.py +0 -0
  17. {gcf_python-2.5.2 → gcf_python-2.5.3}/src/gcf/cli.py +0 -0
  18. {gcf_python-2.5.2 → gcf_python-2.5.3}/src/gcf/constants.py +0 -0
  19. {gcf_python-2.5.2 → gcf_python-2.5.3}/src/gcf/decode.py +0 -0
  20. {gcf_python-2.5.2 → gcf_python-2.5.3}/src/gcf/decode_generic.py +0 -0
  21. {gcf_python-2.5.2 → gcf_python-2.5.3}/src/gcf/delta.py +0 -0
  22. {gcf_python-2.5.2 → gcf_python-2.5.3}/src/gcf/encode.py +0 -0
  23. {gcf_python-2.5.2 → gcf_python-2.5.3}/src/gcf/generic.py +0 -0
  24. {gcf_python-2.5.2 → gcf_python-2.5.3}/src/gcf/generic_delta.py +0 -0
  25. {gcf_python-2.5.2 → gcf_python-2.5.3}/src/gcf/keyed_map.py +0 -0
  26. {gcf_python-2.5.2 → gcf_python-2.5.3}/src/gcf/packroot.py +0 -0
  27. {gcf_python-2.5.2 → gcf_python-2.5.3}/src/gcf/session.py +0 -0
  28. {gcf_python-2.5.2 → gcf_python-2.5.3}/src/gcf/stream.py +0 -0
  29. {gcf_python-2.5.2 → gcf_python-2.5.3}/src/gcf/stream_generic.py +0 -0
  30. {gcf_python-2.5.2 → gcf_python-2.5.3}/src/gcf/types.py +0 -0
  31. {gcf_python-2.5.2 → gcf_python-2.5.3}/tests/__init__.py +0 -0
  32. {gcf_python-2.5.2 → gcf_python-2.5.3}/tests/test_conformance_v2.py +0 -0
  33. {gcf_python-2.5.2 → gcf_python-2.5.3}/tests/test_decode.py +0 -0
  34. {gcf_python-2.5.2 → gcf_python-2.5.3}/tests/test_delta.py +0 -0
  35. {gcf_python-2.5.2 → gcf_python-2.5.3}/tests/test_encode.py +0 -0
  36. {gcf_python-2.5.2 → gcf_python-2.5.3}/tests/test_generic.py +0 -0
  37. {gcf_python-2.5.2 → gcf_python-2.5.3}/tests/test_generic_delta.py +0 -0
  38. {gcf_python-2.5.2 → gcf_python-2.5.3}/tests/test_generic_delta_fuzz.py +0 -0
  39. {gcf_python-2.5.2 → gcf_python-2.5.3}/tests/test_generic_delta_session.py +0 -0
  40. {gcf_python-2.5.2 → gcf_python-2.5.3}/tests/test_keyed_map_fuzz.py +0 -0
  41. {gcf_python-2.5.2 → gcf_python-2.5.3}/tests/test_roundtrip.py +0 -0
  42. {gcf_python-2.5.2 → gcf_python-2.5.3}/tests/test_roundtrip_v2.py +0 -0
  43. {gcf_python-2.5.2 → gcf_python-2.5.3}/tests/test_session.py +0 -0
  44. {gcf_python-2.5.2 → gcf_python-2.5.3}/tests/test_stream.py +0 -0
  45. {gcf_python-2.5.2 → gcf_python-2.5.3}/tests/test_stream_fielddecl.py +0 -0
  46. {gcf_python-2.5.2 → gcf_python-2.5.3}/tests/test_stream_generic.py +0 -0
  47. {gcf_python-2.5.2 → gcf_python-2.5.3}/uv.lock +0 -0
@@ -1,5 +1,9 @@
1
1
  # Changelog
2
2
 
3
+ ## v2.5.3 (2026-08-10)
4
+
5
+ - **Losslessness fix (spec v3.5.2, SPEC 2.3/2.4).** The number grammar and numeric-like classification now pin digits to ASCII `[0-9]`. Python's `re` compiles `\d` in Unicode mode (matching `\p{Nd}`), so a value like `1.٥` (ASCII `1`, `.`, U+0665) was treated as number-shaped: quoted on encode, and a bare `1.٥` decoded through `float()` to the number `1.5`. That diverged from the ASCII SDKs and silently turned a string into a number when decoding wire produced by another SDK. `\d` is replaced with `[0-9]`; such tokens stay strings and encode bare. Verified against new `scalar/029-031` and `decode/007` conformance fixtures and the cross-SDK differential fuzz.
6
+
3
7
  ## v2.5.2 (2026-08-09)
4
8
 
5
9
  - **Spec v3.5.1 conformance (SPEC 5, score-rounding errata).** SPEC 5 now pins the graph `score` two-decimal wire form to round-half-to-even on the exact IEEE-754 double, resolving a midpoint divergence in the JavaScript and Kotlin SDKs. This SDK's `f"{score:.2f}"` formatter already rounds half-to-even, so there is no behavior change; re-verified against the new `graph-encode/004_score_midpoint_rounding` conformance fixture.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gcf-python
3
- Version: 2.5.2
3
+ Version: 2.5.3
4
4
  Summary: The AI-native wire format for structured data. 50-92% fewer tokens than JSON, with multi-turn delta encoding for agent loops. 100% comprehension on every frontier model. Zero dependencies.
5
5
  Project-URL: Homepage, https://github.com/blackwell-systems/gcf-python
6
6
  Project-URL: Documentation, https://gcformat.com/
@@ -304,7 +304,7 @@ GCF wins 15/16 datasets on the expanded [token efficiency benchmark](https://git
304
304
 
305
305
  **Zero runtime dependencies. Permanently.** All six implementations depend only on their language's standard library. No transitive dependencies. No supply chain risk. This is a permanent commitment: GCF will never take on external runtime dependencies. MIT licensed. All implementations support both generic profile (`encodeGeneric`) and graph profile (`encode`). CLI included in all 6 languages.
306
306
 
307
- **Specification:** [SPEC v3.5.0 Stable](https://github.com/blackwell-systems/gcf/blob/main/SPEC.md) with 264 conformance fixtures, 43,000,000,000+ lossless round-trips verified across 5 formats and 6 languages. All implementations at v2.5.1+ (Go v1.6.1, Swift v2.6.0). Cross-language 6x6 matrix verified.
307
+ **Specification:** [SPEC v3.5.2 Stable](https://github.com/blackwell-systems/gcf/blob/main/SPEC.md) with 269 conformance fixtures, 43,000,000,000+ lossless round-trips verified across 5 formats and 6 languages. Current versions: Go v1.6.2, TypeScript v2.5.2, Python v2.5.3, Rust v2.5.3, Swift v2.6.2, Kotlin v2.5.2, .NET v0.1.2. Cross-language conformance verified across all seven SDKs.
308
308
 
309
309
  ## Adopted by
310
310
 
@@ -279,7 +279,7 @@ GCF wins 15/16 datasets on the expanded [token efficiency benchmark](https://git
279
279
 
280
280
  **Zero runtime dependencies. Permanently.** All six implementations depend only on their language's standard library. No transitive dependencies. No supply chain risk. This is a permanent commitment: GCF will never take on external runtime dependencies. MIT licensed. All implementations support both generic profile (`encodeGeneric`) and graph profile (`encode`). CLI included in all 6 languages.
281
281
 
282
- **Specification:** [SPEC v3.5.0 Stable](https://github.com/blackwell-systems/gcf/blob/main/SPEC.md) with 264 conformance fixtures, 43,000,000,000+ lossless round-trips verified across 5 formats and 6 languages. All implementations at v2.5.1+ (Go v1.6.1, Swift v2.6.0). Cross-language 6x6 matrix verified.
282
+ **Specification:** [SPEC v3.5.2 Stable](https://github.com/blackwell-systems/gcf/blob/main/SPEC.md) with 269 conformance fixtures, 43,000,000,000+ lossless round-trips verified across 5 formats and 6 languages. Current versions: Go v1.6.2, TypeScript v2.5.2, Python v2.5.3, Rust v2.5.3, Swift v2.6.2, Kotlin v2.5.2, .NET v0.1.2. Cross-language conformance verified across all seven SDKs.
283
283
 
284
284
  ## Adopted by
285
285
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "gcf-python"
7
- version = "2.5.2"
7
+ version = "2.5.3"
8
8
  description = "The AI-native wire format for structured data. 50-92% fewer tokens than JSON, with multi-turn delta encoding for agent loops. 100% comprehension on every frontier model. Zero dependencies."
9
9
  readme = "README.md"
10
10
  license = {text = "MIT"}
@@ -9,8 +9,10 @@ from typing import Any
9
9
  # \Z (end of string), not $, so a trailing newline does not count as the end:
10
10
  # in Python $ also matches just before a final \n, which would misclassify a
11
11
  # string like "5\n" as a number or "W\n" as a bare key and break round-trip.
12
- _JSON_NUMBER_RE = re.compile(r"^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?\Z")
13
- _NUMERIC_LIKE_RE = re.compile(r"^[+-]\.?\d|^\.\d|^0\d")
12
+ # Digits are ASCII 0-9 (SPEC 2.3): \d is avoided because in Python's re it also
13
+ # matches Unicode decimal digits (\p{Nd}), which would accept e.g. "1.<U+0665>".
14
+ _JSON_NUMBER_RE = re.compile(r"^-?(?:0|[1-9][0-9]*)(?:\.[0-9]+)?(?:[eE][+-]?[0-9]+)?\Z")
15
+ _NUMERIC_LIKE_RE = re.compile(r"^[+-]\.?[0-9]|^\.[0-9]|^0[0-9]")
14
16
  _INLINE_ARRAY_RE = re.compile(r"\[[^\]]*\]\s*:")
15
17
  _BARE_KEY_RE = re.compile(r"^[a-zA-Z_][a-zA-Z0-9_]*\Z")
16
18
 
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes