ruview @ v1226
integrity
- size
- 59.6 MiB
- downloaded
- last checked
release notes
Automated release from CI pipeline
Changes: cog-ha-matter (ADR-116 P4): witness JSONL persistence
Third P4 sub-unit: serialize/parse for the witness hash chain so audit bundles can be written to disk and replayed.
Wire shape (one record per line, alphabetical field order locked):
{"kind":"...","payload_hex":"...","prev_hash":"...","seq":N, "this_hash":"...","timestamp_unix_s":N}
Why alphabetical field order: auditors archive whole bundles and hash them. A rebuild that reordered fields would silently invalidate every archival hash — locking the order is what makes the JSONL stable across compiler / serde-json upgrades.
Why hex everywhere: human-greppable, monospace-friendly, no base64
ambiguity, no Vec JSON-array ugliness. Same convention as
ADR-101's binary_sha256.
Critically, from_jsonl_line RE-VERIFIES this_hash against
the canonical bytes derived from the parsed fields. A tampered
bundle fires WitnessParseError::HashMismatch BEFORE the event
loads — the parser is itself an auditor.
New surfaces:
WitnessHash::from_hex(with structured length/parse errors)WitnessEvent::to_jsonl_line,from_jsonl_lineWitnessParseErrorenum: Json | MissingField | WrongType | HashLength | HashHex | PayloadHex | PayloadLength | HashMismatch- private
hex_encode/hex_decodehelpers (nohexcrate dep)
10 new tests:
- jsonl round-trip preserves all fields
- jsonl line has no embedded \n / \r (one record per line)
- jsonl field order is alphabetical (byte-stable archival)
- parser rejects tampered payload via HashMismatch
- parser rejects non-hex characters in hash
- parser rejects missing field
- hex encode/decode round-trip across empty / single byte / 0xff / UTF-8 / arbitrary bytes
- hex decode rejects odd-length input
- WitnessHash::from_hex round-trip
- WitnessHash::from_hex rejects wrong length
44/44 cog tests green (34 → 44).
ADR-116 P4 row enumerates 4 sub-units now: ✅ mDNS record-builder, ✅ witness chain primitive, ✅ witness JSONL persistence, ⏳ responder + embedded broker + Ed25519 signing.
Co-Authored-By: claude-flow ruv@ruv.net
Docker Image:
ghcr.io/ruvnet/RuView:a3478ea3b50b5a1550dbd8234a575e2978e00183
download
curl -fL -o v1226.zip https://ratatoskr.space/pkg/ruview/v1226.zip
printf '%s %s\n' '5901ac81a054545cee04db06104e4d1b90188a34e9fadf6867b2920bbfceb479' 'v1226.zip' | sha256sum -c -
$url = "https://ratatoskr.space/pkg/ruview/v1226.zip"
$out = "v1226.zip"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "5901ac81a054545cee04db06104e4d1b90188a34e9fadf6867b2920bbfceb479") { throw "sha256 mismatch" }
curl -fL -o v1226.tar.gz https://ratatoskr.space/pkg/ruview/v1226.tar.gz
printf '%s %s\n' 'baaf8c1aabc19ed003943f3f890c0c1182397e6990b1629c5576737ca27d114a' 'v1226.tar.gz' | sha256sum -c -
$url = "https://ratatoskr.space/pkg/ruview/v1226.tar.gz"
$out = "v1226.tar.gz"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "baaf8c1aabc19ed003943f3f890c0c1182397e6990b1629c5576737ca27d114a") { throw "sha256 mismatch" }
download via yggdrasil mesh
curl -fL -o v1226.zip http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v1226.zip
printf '%s %s\n' '5901ac81a054545cee04db06104e4d1b90188a34e9fadf6867b2920bbfceb479' 'v1226.zip' | sha256sum -c -
$url = "http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v1226.zip"
$out = "v1226.zip"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "5901ac81a054545cee04db06104e4d1b90188a34e9fadf6867b2920bbfceb479") { throw "sha256 mismatch" }
curl -fL -o v1226.tar.gz http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v1226.tar.gz
printf '%s %s\n' 'baaf8c1aabc19ed003943f3f890c0c1182397e6990b1629c5576737ca27d114a' 'v1226.tar.gz' | sha256sum -c -
$url = "http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v1226.tar.gz"
$out = "v1226.tar.gz"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "baaf8c1aabc19ed003943f3f890c0c1182397e6990b1629c5576737ca27d114a") { throw "sha256 mismatch" }
| artifact | format | size | hashes |
|---|---|---|---|
| v1226.zip | zip | 59.6 MiB |
blake3-24 ee766412b6655d3e44e1e6dbbcd201d35f05b3dddb0bc050
sha256 5901ac81a054545cee04db06104e4d1b90188a34e9fadf6867b2920bbfceb479
sha1 b4321aa7cf0bea9e3d6ad650188d7c7dea02b4a3
|
| v1226.tar.gz | tar.gz | 58.1 MiB |
blake3-24 b15e73796d2d51bd784eef9cbe7b0732f9cfbedc99f9dafd
sha256 baaf8c1aabc19ed003943f3f890c0c1182397e6990b1629c5576737ca27d114a
sha1 daafb043d91ae11413887d877a64a884bb2ce5b0
|
install
http_archive(
name = "ruview",
urls = ["https://ratatoskr.space/pkg/ruview/v1226.tar.gz"],
integrity = "sha256-uq+MGqvBntADlD8/iQwMEYI5fmmQsWKcVXZzfKJ9EUo=",
strip_prefix = "ruview-v1226",
)
.url = "https://ratatoskr.space/pkg/ruview/v1226.tar.gz",
install via yggdrasil mesh
http_archive(
name = "ruview",
urls = ["http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v1226.tar.gz"],
integrity = "sha256-uq+MGqvBntADlD8/iQwMEYI5fmmQsWKcVXZzfKJ9EUo=",
strip_prefix = "ruview-v1226",
)
.url = "http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v1226.tar.gz",