Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .github/workflows/verify.yml
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,9 @@ jobs:
node tools/interop-crosscheck.mjs

- name: Python-frame verify (stdlib only)
run: python3 tools/python-frame-reference.py verify
run: |
python3 tools/test_python_frame_reference.py
python3 tools/python-frame-reference.py verify

- name: File-backend format verify (stdlib only)
run: python3 tools/file-backend-reference.py
Expand Down
36 changes: 36 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,42 @@ All notable changes to the CacheKit Protocol Specification.

### Test Vectors

- `tools/python-frame-reference.py generate` now **upserts by vector name**
(LAB-1203): it rebuilds only the vectors the installed `cachekit` wheel can
reproduce and leaves every other committed vector byte-untouched, so dropping
a committed vector is structurally impossible — which deletes the LAB-903
drop-refusal guard and both wheel-direction refusals, and folds the
append-only `generate-bin-twin` mode into `generate` (a protocol 1.1 wheel
rebuilds the `_bin` twin, a legacy wheel the legacy original; whenever both
default-path vectors are present the pair is checked to differ only in
envelope encoding, and a partial fixture missing either twin skips that
check with a stderr note rather than aborting). That check is a stderr
**warning**, not a hard failure (fix-loop, 2026-09-19, adversarial finding):
the legacy wheel is gone from every installable release, so `legacy` can
never be regenerated — a `_require()` there would permanently deadlock
`generate` the first time the default write path legitimately changes for
reasons other than the encoding flip. A human reviews the reported diff and
decides whether it's a codec/wheel regression or a genuine protocol
evolution; `generate` itself cannot tell the two apart. Pinned by
`tools/test_python_frame_reference.py` (new; wired into `verify.yml`
alongside the frame reference verify step), which asserts the divergence
path warns and does not raise.
The ByteStorage envelope codec is no longer reimplemented there: encode/decode
come from `tools/wire-format-reference.py`, the one shared implementation of
the encoding these fixtures pin. Rewritten vectors carry per-vector
`generator` provenance (and the top-level provenance flips to an explicit
"mixed provenance" statement the first time a previously-unstamped vector is
rewritten); `test-vectors/python-frame.json` is byte-unchanged by this
refactor, and a no-op `generate` never rewrites the file. The stdlib `verify`
leg got strictly stronger (expert-panel findings): it now fully decodes each
`payload_envelope` via the shared codec (enforcing the protocol 1.1 flip
exclusions — checksum stays an array of 8 integers, format stays fixstr),
requires the envelope to re-encode byte-identically (pinning the canonical
rmp_serde shortest-form encoding, including the outer fixarray(4) marker),
and pins the declared `compressed_data_hex`/`checksum_hex`/`original_size`/
`format` fields against the actual envelope bytes; the generate-time twin
proof now compares frame prefixes at the byte level, not as parsed JSON.

- 7 legacy/`bin` vector pairs in `test-vectors/wire-format.json` (append-only;
legacy vectors are retained forever as legacy-read proof; fixture
1.0.0 → 1.1.1). The original six `bin` twins were generated by the stdlib-only
Expand Down
Loading
Loading