Compare commits
base: ShadowsOverWestgate/sow-tools:v0.3.35
ShadowsOverWestgate/sow-tools:main
ShadowsOverWestgate/sow-tools:feat/channel-promote
ShadowsOverWestgate/sow-tools:design/global-json-validation
ShadowsOverWestgate/sow-tools:v0.3.36
ShadowsOverWestgate/sow-tools:v0.3.35
ShadowsOverWestgate/sow-tools:v0.3.34
ShadowsOverWestgate/sow-tools:v0.3.33
ShadowsOverWestgate/sow-tools:v0.3.32
ShadowsOverWestgate/sow-tools:v0.3.31
ShadowsOverWestgate/sow-tools:v0.3.30
ShadowsOverWestgate/sow-tools:v0.3.22
ShadowsOverWestgate/sow-tools:v0.3.21
ShadowsOverWestgate/sow-tools:v0.3.20
ShadowsOverWestgate/sow-tools:v0.3.19
ShadowsOverWestgate/sow-tools:v0.3.18
ShadowsOverWestgate/sow-tools:v0.3.17
ShadowsOverWestgate/sow-tools:v0.3.16
ShadowsOverWestgate/sow-tools:v0.3.15
ShadowsOverWestgate/sow-tools:v0.3.14
ShadowsOverWestgate/sow-tools:v0.3.13
ShadowsOverWestgate/sow-tools:v0.3.12
ShadowsOverWestgate/sow-tools:v0.3.11
ShadowsOverWestgate/sow-tools:v0.3.10
ShadowsOverWestgate/sow-tools:v0.3.9
ShadowsOverWestgate/sow-tools:v0.3.8
ShadowsOverWestgate/sow-tools:v0.3.7
ShadowsOverWestgate/sow-tools:v0.3.6
ShadowsOverWestgate/sow-tools:v0.3.5
ShadowsOverWestgate/sow-tools:v0.3.4
ShadowsOverWestgate/sow-tools:v0.3.3
ShadowsOverWestgate/sow-tools:v0.3.2
ShadowsOverWestgate/sow-tools:v0.3.1
ShadowsOverWestgate/sow-tools:v0.3.0
ShadowsOverWestgate/sow-tools:v0.2.7
ShadowsOverWestgate/sow-tools:v0.2.6
ShadowsOverWestgate/sow-tools:v0.2.5
ShadowsOverWestgate/sow-tools:v0.2.4
ShadowsOverWestgate/sow-tools:v0.2.3
ShadowsOverWestgate/sow-tools:v0.2.2
ShadowsOverWestgate/sow-tools:v0.2.1
ShadowsOverWestgate/sow-tools:v0.2.0
ShadowsOverWestgate/sow-tools:v0.1.97.2
..
compare: ShadowsOverWestgate/sow-tools:9b7be2c76edb7785a9da939b7ad62849b9cdb0b5
ShadowsOverWestgate/sow-tools:main
ShadowsOverWestgate/sow-tools:feat/channel-promote
ShadowsOverWestgate/sow-tools:design/global-json-validation
ShadowsOverWestgate/sow-tools:v0.3.36
ShadowsOverWestgate/sow-tools:v0.3.35
ShadowsOverWestgate/sow-tools:v0.3.34
ShadowsOverWestgate/sow-tools:v0.3.33
ShadowsOverWestgate/sow-tools:v0.3.32
ShadowsOverWestgate/sow-tools:v0.3.31
ShadowsOverWestgate/sow-tools:v0.3.30
ShadowsOverWestgate/sow-tools:v0.3.22
ShadowsOverWestgate/sow-tools:v0.3.21
ShadowsOverWestgate/sow-tools:v0.3.20
ShadowsOverWestgate/sow-tools:v0.3.19
ShadowsOverWestgate/sow-tools:v0.3.18
ShadowsOverWestgate/sow-tools:v0.3.17
ShadowsOverWestgate/sow-tools:v0.3.16
ShadowsOverWestgate/sow-tools:v0.3.15
ShadowsOverWestgate/sow-tools:v0.3.14
ShadowsOverWestgate/sow-tools:v0.3.13
ShadowsOverWestgate/sow-tools:v0.3.12
ShadowsOverWestgate/sow-tools:v0.3.11
ShadowsOverWestgate/sow-tools:v0.3.10
ShadowsOverWestgate/sow-tools:v0.3.9
ShadowsOverWestgate/sow-tools:v0.3.8
ShadowsOverWestgate/sow-tools:v0.3.7
ShadowsOverWestgate/sow-tools:v0.3.6
ShadowsOverWestgate/sow-tools:v0.3.5
ShadowsOverWestgate/sow-tools:v0.3.4
ShadowsOverWestgate/sow-tools:v0.3.3
ShadowsOverWestgate/sow-tools:v0.3.2
ShadowsOverWestgate/sow-tools:v0.3.1
ShadowsOverWestgate/sow-tools:v0.3.0
ShadowsOverWestgate/sow-tools:v0.2.7
ShadowsOverWestgate/sow-tools:v0.2.6
ShadowsOverWestgate/sow-tools:v0.2.5
ShadowsOverWestgate/sow-tools:v0.2.4
ShadowsOverWestgate/sow-tools:v0.2.3
ShadowsOverWestgate/sow-tools:v0.2.2
ShadowsOverWestgate/sow-tools:v0.2.1
ShadowsOverWestgate/sow-tools:v0.2.0
ShadowsOverWestgate/sow-tools:v0.1.97.2
2
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
9b7be2c76e |
fix(nwsync): close the review findings on the framing fix and verify
ci / ci (pull_request) Successful in 3m38s
- compressBlob now asserts its own output declares a content size, instead of trusting that the only way to lose the field is the one #86 found. An encoder upgrade that finds another way would otherwise republish the same undecodable blob in silence, and a blob is skipped by every later emit once written. - inspectBlob asserts the frame whenever one is present, rather than only when the payload is non-empty. - dirSink stats instead of reading when not verifying. Reading every existing blob back on the default path was a plain regression, and it contradicted the documented promise that verifying is a repair pass, not the default. - The manifest sha1 is now checked as hex before it is interpolated into a URL path, rather than only measured. - One blobKey rule for where a blob lives, replacing three copies of the fanout-path expression. - Renamed frameSizeThreshold to oneByteContentSizeCeiling, which says whose threshold it is. - The read-back in zoneSink reads the storage API on purpose; said so, and corrected a comment that claimed a failed read-back re-uploads when it aborts. - Tests derive their expected blob counts from the run instead of hard-coding fixture arithmetic, and the size-mismatch category has a test. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> |
||
|
|
56d4054118 |
fix(nwsync): declare Frame_Content_Size, and verify what is published (#86, #85)
These two land together on purpose. Fixing the encoder alone changes nothing for the blobs already in the zone, because emit skips whatever is already present. #86 — klauspost/compress omits the zstd Frame_Content_Size field for inputs under 256 bytes, which the format permits. Reference libzstd never does, so the NWN client — which sizes its output buffer from ZSTD_getFrameContentSize and has therefore never met a frame without one — rejected roughly 6% of our blobs outright. Any single one stops a sync dead, so no client could complete a sync of the live manifest. No encoder option changes this, so emit re-headers the affected frames into the shape libzstd itself emits: Single_Segment_flag set, Window_Descriptor dropped, and the freed byte spent on a one-byte Frame_Content_Size. Same length in, same length out. Verified against the zstd CLI end to end: a real emitted 230-byte blob now reports its decompressed size where it previously reported none. emitter_version goes to 2, so assemble refuses to merge an index written by the encoder that omitted the field. #85 — a published blob was verified by exactly one thing, a player's client, at download time. `nwsync verify <manifest-sha1>` now reads a manifest and its blobs back through the public pull zone with no credential, decompresses and hashes every one, and reports missing / malformed framing / size mismatch / hash mismatch per blob. `--sample N` makes a routine check cheap against a manifest that is ~69,000 blobs and 15 GB. `emit --verify` applies the same check where emit would otherwise trust presence, and replaces a stored blob that is not what its name claims — which is what makes the #86 blobs repairable. Both new checks assert the frame property, not just a round trip. Round-tripping cannot see this class of fault: both the zstd CLI and Go's decoder stream such a frame happily, being more capable decoders than the client's, which is how the defect reached production and survived an audit. Refs #54, #55, #59, #75, sow-platform#79. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> |