ruview @ v1225
integrity
- size
- 59.6 MiB
- downloaded
- last checked
release notes
Automated release from CI pipeline
Changes: cog-ha-matter (ADR-116 P4): pure witness hash-chain primitive
Second P4 unit: an append-only SHA-256 hash chain for tamper-evident audit logging. ADR-116 §2.2 promised this for healthcare / education / shared-housing deployments — this lands the primitive with no key dependency so the next iter can layer Ed25519 signing on top without touching the chain itself.
Module shape:
WitnessHash([u8; 32])newtype +WitnessHash::GENESISsentinelWitnessEvent { seq, prev_hash, ts, kind, payload, this_hash }— once committed, every field is immutableWitnessChain—append,tip,verify,eventscanonical_bytes— length-prefixed serialization that prevents the classic concatenation forgery (abc|def≠ab|cdef)WitnessVerifyError— auditor-friendly error withat: usizeon every variant (SeqGap, PrevHashMismatch, HashMismatch)
13 new tests covering both happy path and active tampering:
- genesis hash all-zeros
- empty chain tip is genesis
- canonical bytes length-prefixed (anti-forgery)
- canonical bytes start with prev_hash (wire-format lock)
- append links to prev_hash
- seq monotonic from 0
- verify passes on clean chain
- verify catches tampered payload (fires HashMismatch)
- verify catches broken prev_hash link
- verify catches seq gap
- hash hex is 64 lowercase chars
- first event prev_hash == GENESIS (auditor anchor)
- different payloads → different hashes
Hash-chain over Merkle is the right tradeoff for the cog's event rate (a few/min steady, dozens during a fall) — linear scan is fine and we save the Merkle complexity for a future tier when chains span days.
34/34 cog tests green (21 → 34).
ADR-116 P4 row updated to enumerate the three P4 sub-units shipped / pending: (a) mDNS record-builder ✅, (b) witness hash-chain ✅, (c) responder + embedded broker + Ed25519 signing pending.
Co-Authored-By: claude-flow ruv@ruv.net
Docker Image:
ghcr.io/ruvnet/RuView:fe913b0ea7b01b15fae931148282a3a8f761def1
download
curl -fL -o v1225.zip https://ratatoskr.space/pkg/ruview/v1225.zip
printf '%s %s\n' '367cae1dbf80eafc343c86325b9cf3aa1871e13fbbf841a30e6502c012aec009' 'v1225.zip' | sha256sum -c -
$url = "https://ratatoskr.space/pkg/ruview/v1225.zip"
$out = "v1225.zip"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "367cae1dbf80eafc343c86325b9cf3aa1871e13fbbf841a30e6502c012aec009") { throw "sha256 mismatch" }
curl -fL -o v1225.tar.gz https://ratatoskr.space/pkg/ruview/v1225.tar.gz
printf '%s %s\n' 'f76a394f97fb974c9f591a72e4a3c689fa01d55ec93ef318bde128e05247b92e' 'v1225.tar.gz' | sha256sum -c -
$url = "https://ratatoskr.space/pkg/ruview/v1225.tar.gz"
$out = "v1225.tar.gz"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "f76a394f97fb974c9f591a72e4a3c689fa01d55ec93ef318bde128e05247b92e") { throw "sha256 mismatch" }
download via yggdrasil mesh
curl -fL -o v1225.zip http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v1225.zip
printf '%s %s\n' '367cae1dbf80eafc343c86325b9cf3aa1871e13fbbf841a30e6502c012aec009' 'v1225.zip' | sha256sum -c -
$url = "http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v1225.zip"
$out = "v1225.zip"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "367cae1dbf80eafc343c86325b9cf3aa1871e13fbbf841a30e6502c012aec009") { throw "sha256 mismatch" }
curl -fL -o v1225.tar.gz http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v1225.tar.gz
printf '%s %s\n' 'f76a394f97fb974c9f591a72e4a3c689fa01d55ec93ef318bde128e05247b92e' 'v1225.tar.gz' | sha256sum -c -
$url = "http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v1225.tar.gz"
$out = "v1225.tar.gz"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "f76a394f97fb974c9f591a72e4a3c689fa01d55ec93ef318bde128e05247b92e") { throw "sha256 mismatch" }
| artifact | format | size | hashes |
|---|---|---|---|
| v1225.zip | zip | 59.6 MiB |
blake3-24 25cc8871367c033e8d94f9a681b003008f491a172f36a16e
sha256 367cae1dbf80eafc343c86325b9cf3aa1871e13fbbf841a30e6502c012aec009
sha1 523cf18f3c982bde79b3642d087c3571ee7cf91f
|
| v1225.tar.gz | tar.gz | 58.1 MiB |
blake3-24 9a9c4edfe146f3a0687c8669594bd5f6e4849a131c17cb6d
sha256 f76a394f97fb974c9f591a72e4a3c689fa01d55ec93ef318bde128e05247b92e
sha1 22ddd48965f835c3cf9c23af894d69982e2ac8c5
|
install
http_archive(
name = "ruview",
urls = ["https://ratatoskr.space/pkg/ruview/v1225.tar.gz"],
integrity = "sha256-92o5T5f7l0yfWRpy5KPGifoB1V7JPvMYveEo4FJHuS4=",
strip_prefix = "ruview-v1225",
)
.url = "https://ratatoskr.space/pkg/ruview/v1225.tar.gz",
install via yggdrasil mesh
http_archive(
name = "ruview",
urls = ["http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v1225.tar.gz"],
integrity = "sha256-92o5T5f7l0yfWRpy5KPGifoB1V7JPvMYveEo4FJHuS4=",
strip_prefix = "ruview-v1225",
)
.url = "http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v1225.tar.gz",