{"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > `hashOf()` JS instances > Date > produces different hashes for different Dates"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > JS instances > Date > produces different hashes for different Dates"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > `hashOf()` JS instances > Date > produces the same hash for a JS `Date` as for an equivalent `FabricEpochNsec`"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > JS instances > Date > produces the same hash for a JS `Date` as for an equivalent `FabricEpochNsec`"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > `hashOf()` JS instances > Deferred types (not yet handled — these document known gaps) > throws for `Error` (deferred — needs recursive translation)"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > JS instances > Deferred types (not yet handled — these document known gaps) > throws for `Error` (deferred — needs recursive translation)"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > `hashOf()` JS instances > Deferred types (not yet handled — these document known gaps) > throws for `Map` (deferred — needs recursive translation)"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > JS instances > Deferred types (not yet handled — these document known gaps) > throws for `Map` (deferred — needs recursive translation)"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > `hashOf()` JS instances > Deferred types (not yet handled — these document known gaps) > throws for `Set` (deferred — needs recursive translation)"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > JS instances > Deferred types (not yet handled — these document known gaps) > throws for `Set` (deferred — needs recursive translation)"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > `hashOf()` JS instances > Deferred types (not yet handled — these document known gaps) > throws for a member that is a function"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > JS instances > Deferred types (not yet handled — these document known gaps) > throws for a member that is a function"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > `hashOf()` JS instances > RegExp > produces different hashes for different RegExps"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > JS instances > RegExp > produces different hashes for different RegExps"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > `hashOf()` JS instances > RegExp > produces the same hash for a JS `RegExp` as for an equivalent `FabricRegExp`"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > JS instances > RegExp > produces the same hash for a JS `RegExp` as for an equivalent `FabricRegExp`"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > `hashOf()` JS instances > Uint8Array > produces different hashes for different Uint8Arrays"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > JS instances > Uint8Array > produces different hashes for different Uint8Arrays"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > `hashOf()` JS instances > Uint8Array > produces the same hash for a JS `Uint8Array` as for a `FabricBytes` with the same bytes"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > JS instances > Uint8Array > produces the same hash for a JS `Uint8Array` as for a `FabricBytes` with the same bytes"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > `hashOf()` interned symbols > also throws for a unique symbol nested in an object"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > interned symbols > also throws for a unique symbol nested in an object"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > `hashOf()` interned symbols > does not collide a same-key string with an interned symbol"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > interned symbols > does not collide a same-key string with an interned symbol"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > `hashOf()` interned symbols > empty-key `Symbol.for(\"\")` has length zero, not absent"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > interned symbols > empty-key `Symbol.for(\"\")` has length zero, not absent"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > `hashOf()` interned symbols > hashes deterministically for an interned symbol nested in an array"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > interned symbols > hashes deterministically for an interned symbol nested in an array"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > `hashOf()` interned symbols > hashes deterministically for an interned symbol nested in an object"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > interned symbols > hashes deterministically for an interned symbol nested in an object"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > `hashOf()` interned symbols > hashes differently-keyed interned symbols differently"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > interned symbols > hashes differently-keyed interned symbols differently"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > `hashOf()` interned symbols > hashes equal-keyed interned symbols identically"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > interned symbols > hashes equal-keyed interned symbols identically"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > `hashOf()` interned symbols > is deterministic and key-distinct on the long-key path"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > interned symbols > is deterministic and key-distinct on the long-key path"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > `hashOf()` interned symbols > takes the TAG_STRING_HASH path for a long key"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > interned symbols > takes the TAG_STRING_HASH path for a long key"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > `hashOf()` interned symbols > takes the inline TAG_STRING path for a short key"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > interned symbols > takes the inline TAG_STRING path for a short key"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > Arrays > coalesces multiple consecutive holes into one run"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > Arrays > coalesces multiple consecutive holes into one run"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > Arrays > produces TAG_ARRAY + TAG_END for an empty array"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > Arrays > produces TAG_ARRAY + TAG_END for an empty array"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > Arrays > produces distinct hashes for `[1, undefined, 3]` vs. `[1, , 3]` vs. `[1, null, 3]`"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > Arrays > produces distinct hashes for `[1, undefined, 3]` vs. `[1, , 3]` vs. `[1, null, 3]`"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > Arrays > recursively hashes nested arrays"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > Arrays > recursively hashes nested arrays"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > Arrays > uses hole run-length encoding for the sparse array [1, , 3]"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > Arrays > uses hole run-length encoding for the sparse array [1, , 3]"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > Consistency and distinctness > produces different hashes for different values of different types"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > Consistency and distinctness > produces different hashes for different values of different types"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > Cycles > encodes a cycle through a `FabricInstance`, counting the instance and its state"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > Cycles > encodes a cycle through a `FabricInstance`, counting the instance and its state"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > Cycles > encodes a cyclic value the same way wherever it sits"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > Cycles > encodes a cyclic value the same way wherever it sits"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > Cycles > encodes a distance past the height at which the path is indexed"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > Cycles > encodes a distance past the height at which the path is indexed"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > Cycles > encodes an array that holds itself as `TAG_CYCLE` + distance 1"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > Cycles > encodes an array that holds itself as `TAG_CYCLE` + distance 1"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > Cycles > encodes an object that holds itself as `TAG_CYCLE` + distance 1"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > Cycles > encodes an object that holds itself as `TAG_CYCLE` + distance 1"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > Cycles > encodes the distance up the path to the container the cycle returns to"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > Cycles > encodes the distance up the path to the container the cycle returns to"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > Cycles > expands a shared container that is not on the path, as it does in an acyclic value"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > Cycles > expands a shared container that is not on the path, as it does in an acyclic value"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > Cycles > hashes differently where a cycle closes at a different container"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > Cycles > hashes differently where a cycle closes at a different container"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > Edge cases > hashes an array with all holes"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > Edge cases > hashes an array with all holes"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > Edge cases > is deterministic and key-distinct for long object keys"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > Edge cases > is deterministic and key-distinct for long object keys"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > Edge cases > sorts non-ASCII object keys by UTF-8 bytes"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > Edge cases > sorts non-ASCII object keys by UTF-8 bytes"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > Edge cases > sorts object keys by UTF-8, not UTF-16 (supplementary vs. BMP)"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > Edge cases > sorts object keys by UTF-8, not UTF-16 (supplementary vs. BMP)"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > Edge cases > takes the TAG_STRING_HASH path for a long object key"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > Edge cases > takes the TAG_STRING_HASH path for a long object key"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > FabricBytes > produces `TAG_BYTES` + LEB128 length + raw bytes for a `FabricBytes`"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > FabricBytes > produces `TAG_BYTES` + LEB128 length + raw bytes for a `FabricBytes`"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > FabricBytes > produces `TAG_BYTES` + zero length for an empty `FabricBytes`"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > FabricBytes > produces `TAG_BYTES` + zero length for an empty `FabricBytes`"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > FabricEpochDay (dedicated TAG_EPOCH_DAY primitive tag) > matches a hand-computed byte stream for `FabricEpochDay(0n)`"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > FabricEpochDay (dedicated TAG_EPOCH_DAY primitive tag) > matches a hand-computed byte stream for `FabricEpochDay(0n)`"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > FabricEpochDay (dedicated TAG_EPOCH_DAY primitive tag) > produces different hashes for FabricEpochDay values"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > FabricEpochDay (dedicated TAG_EPOCH_DAY primitive tag) > produces different hashes for FabricEpochDay values"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > FabricEpochDay (dedicated TAG_EPOCH_DAY primitive tag) > produces different hashes for `FabricEpochNsec` and `FabricEpochDay` with the same `bigint`"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > FabricEpochDay (dedicated TAG_EPOCH_DAY primitive tag) > produces different hashes for `FabricEpochNsec` and `FabricEpochDay` with the same `bigint`"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > FabricEpochNsec (dedicated TAG_EPOCH_NSEC primitive tag) > matches a hand-computed byte stream for `FabricEpochNsec(0n)`"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > FabricEpochNsec (dedicated TAG_EPOCH_NSEC primitive tag) > matches a hand-computed byte stream for `FabricEpochNsec(0n)`"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > FabricEpochNsec (dedicated TAG_EPOCH_NSEC primitive tag) > produces different hashes for FabricEpochNsec values"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > FabricEpochNsec (dedicated TAG_EPOCH_NSEC primitive tag) > produces different hashes for FabricEpochNsec values"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > FabricError (FabricInstance via [CODEC]) > matches a byte stream built from `[CODEC]` `encode()` output for `FabricError`"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > FabricError (FabricInstance via [CODEC]) > matches a byte stream built from `[CODEC]` `encode()` output for `FabricError`"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > FabricError (FabricInstance via [CODEC]) > produces different hashes for `TypeError` vs. `Error`"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > FabricError (FabricInstance via [CODEC]) > produces different hashes for `TypeError` vs. `Error`"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > FabricError (FabricInstance via [CODEC]) > produces different hashes for different errors"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > FabricError (FabricInstance via [CODEC]) > produces different hashes for different errors"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > FabricHash hashing (TAG_HASH = 0x29) > matches a hand-computed byte stream for `FabricHash`"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > FabricHash hashing (TAG_HASH = 0x29) > matches a hand-computed byte stream for `FabricHash`"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > FabricHash hashing (TAG_HASH = 0x29) > produces different hashes for `FabricHash` with different algorithm tags"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > FabricHash hashing (TAG_HASH = 0x29) > produces different hashes for `FabricHash` with different algorithm tags"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > FabricHash hashing (TAG_HASH = 0x29) > produces different hashes for `FabricHash` with different hash bytes"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > FabricHash hashing (TAG_HASH = 0x29) > produces different hashes for `FabricHash` with different hash bytes"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > FabricKeyPair hashing (TAG_KEY_PAIR = 0x2C) > hashes the two keys in a fixed order"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > FabricKeyPair hashing (TAG_KEY_PAIR = 0x2C) > hashes the two keys in a fixed order"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > FabricKeyPair hashing (TAG_KEY_PAIR = 0x2C) > matches a hand-computed byte stream for `FabricKeyPair`"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > FabricKeyPair hashing (TAG_KEY_PAIR = 0x2C) > matches a hand-computed byte stream for `FabricKeyPair`"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > FabricUnavailable (dedicated TAG_UNAVAILABLE primitive tag) > feeds `TAG_NULL` for the message of an error given none"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > FabricUnavailable (dedicated TAG_UNAVAILABLE primitive tag) > feeds `TAG_NULL` for the message of an error given none"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > FabricUnavailable (dedicated TAG_UNAVAILABLE primitive tag) > matches a hand-computed byte stream for `FabricUnavailable(\"error\", \"network\", \"boom\")`"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > FabricUnavailable (dedicated TAG_UNAVAILABLE primitive tag) > matches a hand-computed byte stream for `FabricUnavailable(\"error\", \"network\", \"boom\")`"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > FabricUnavailable (dedicated TAG_UNAVAILABLE primitive tag) > matches a hand-computed byte stream for `FabricUnavailable(\"pending\")`"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > FabricUnavailable (dedicated TAG_UNAVAILABLE primitive tag) > matches a hand-computed byte stream for `FabricUnavailable(\"pending\")`"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > FabricUnavailable (dedicated TAG_UNAVAILABLE primitive tag) > produces different hashes for different kinds"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > FabricUnavailable (dedicated TAG_UNAVAILABLE primitive tag) > produces different hashes for different kinds"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > FabricUnavailable (dedicated TAG_UNAVAILABLE primitive tag) > produces different hashes for different messages"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > FabricUnavailable (dedicated TAG_UNAVAILABLE primitive tag) > produces different hashes for different messages"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > FabricUnavailable (dedicated TAG_UNAVAILABLE primitive tag) > produces different hashes for different reasons"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > FabricUnavailable (dedicated TAG_UNAVAILABLE primitive tag) > produces different hashes for different reasons"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > FabricUnavailable (dedicated TAG_UNAVAILABLE primitive tag) > produces the same hash for a prefab and a fresh instance with its reason"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > FabricUnavailable (dedicated TAG_UNAVAILABLE primitive tag) > produces the same hash for a prefab and a fresh instance with its reason"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > FabricUnavailable (dedicated TAG_UNAVAILABLE primitive tag) > produces the same hash for an error given its kind's default message and one given none"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > FabricUnavailable (dedicated TAG_UNAVAILABLE primitive tag) > produces the same hash for an error given its kind's default message and one given none"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > Objects > hashes a null-prototype object as an ordinary plain object"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > Objects > hashes a null-prototype object as an ordinary plain object"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > Objects > is deterministic in object key order (sorted by UTF-8)"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > Objects > is deterministic in object key order (sorted by UTF-8)"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > Objects > matches a hand-computed byte stream for {a: 1, b: 2}"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > Objects > matches a hand-computed byte stream for {a: 1, b: 2}"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > Objects > produces TAG_OBJECT + TAG_END for an empty object"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > Objects > produces TAG_OBJECT + TAG_END for an empty object"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > Objects > recursively hashes nested objects"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > Objects > recursively hashes nested objects"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > `FabricHash` result > produces `fid1:` via `FabricHash.toString()`"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > digest() > produces `fid1:` via `FabricHash.toString()`"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > `FabricHash` result > produces a frozen `FabricHash` (`FabricPrimitive`)"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > digest() > produces a frozen `FabricHash` (`FabricPrimitive`)"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > `FabricHash` result > returns a `FabricHash` with the `fid1` tag"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > digest() > returns a `FabricHash` with the `fid1` tag"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > bigint > encodes `-128n` as 1 byte: `0x80`"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > bigint > encodes `-128n` as 1 byte: `0x80`"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > bigint > encodes `-129n` as 2 bytes: `0xFF`, `0x7F`"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > bigint > encodes `-129n` as 2 bytes: `0xFF`, `0x7F`"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > bigint > encodes `-1n` as 1 byte: `0xFF`"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > bigint > encodes `-1n` as 1 byte: `0xFF`"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > bigint > encodes `0n` as `TAG_BIGINT` + LEB128 length 1 + `[0x00]`"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > bigint > encodes `0n` as `TAG_BIGINT` + LEB128 length 1 + `[0x00]`"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > bigint > encodes `127n` as 1 byte: `0x7F`"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > bigint > encodes `127n` as 1 byte: `0x7F`"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > bigint > encodes `128n` as 2 bytes: `0x00`, `0x80`"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > bigint > encodes `128n` as 2 bytes: `0x00`, `0x80`"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > bigint > matches a hand-computed byte stream for `-0x112233445566778899abcdefn`"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > bigint > matches a hand-computed byte stream for `-0x112233445566778899abcdefn`"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > bigint > matches a hand-computed byte stream for `0x112233445566778899abcdefn`"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > bigint > matches a hand-computed byte stream for `0x112233445566778899abcdefn`"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > bigint > produces `TAG_UNDEFINED` for `undefined`"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > bigint > produces `TAG_UNDEFINED` for `undefined`"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > boolean > produces `TAG_BOOLEAN` + `0x00` for `false`"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > boolean > produces `TAG_BOOLEAN` + `0x00` for `false`"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > boolean > produces `TAG_BOOLEAN` + `0x01` for `true`"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > boolean > produces `TAG_BOOLEAN` + `0x01` for `true`"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > boolean > produces different hashes for `true` and `false`"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > boolean > produces different hashes for `true` and `false`"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > cross-type distinctness > number `0` vs `bigint` value `0n` vs string `\"0\"` are distinct"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > cross-type distinctness > number `0` vs `bigint` value `0n` vs string `\"0\"` are distinct"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > cross-type distinctness > produces different hashes for `null`, `undefined`, and `false`"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > cross-type distinctness > produces different hashes for `null`, `undefined`, and `false`"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > number > produces `TAG_NUMBER` + IEEE 754 `+Infinity` bit pattern for `Infinity`"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > number > produces `TAG_NUMBER` + IEEE 754 `+Infinity` bit pattern for `Infinity`"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > number > produces `TAG_NUMBER` + IEEE 754 `-Infinity` bit pattern for `-Infinity`"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > number > produces `TAG_NUMBER` + IEEE 754 `-Infinity` bit pattern for `-Infinity`"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > number > produces `TAG_NUMBER` + IEEE 754 float64 BE for `42`"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > number > produces `TAG_NUMBER` + IEEE 754 float64 BE for `42`"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > number > produces `TAG_NUMBER` + IEEE 754 negative-zero bit pattern for `-0`"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > number > produces `TAG_NUMBER` + IEEE 754 negative-zero bit pattern for `-0`"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > number > produces `TAG_NUMBER` + all zeros for `0`"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > number > produces `TAG_NUMBER` + all zeros for `0`"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > number > produces `TAG_NUMBER` + all-nonzero IEEE 754 bytes for `Number.MAX_VALUE`"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > number > produces `TAG_NUMBER` + all-nonzero IEEE 754 bytes for `Number.MAX_VALUE`"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > number > produces canonical `TAG_NUMBER` quiet-NaN bytes for `NaN`"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > number > produces canonical `TAG_NUMBER` quiet-NaN bytes for `NaN`"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > number > produces different hashes for `-0` and `+0`"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > number > produces different hashes for `-0` and `+0`"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > number > produces different hashes for different numbers"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > number > produces different hashes for different numbers"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > number > produces distinct hashes for `NaN`, `+Infinity`, and `-Infinity`"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > number > produces distinct hashes for `NaN`, `+Infinity`, and `-Infinity`"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > produces `TAG_NULL` byte stream for `null`"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > produces `TAG_NULL` byte stream for `null`"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > string > encodes a lone surrogate as its three WTF-8 bytes"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > string > encodes a lone surrogate as its three WTF-8 bytes"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > string > encodes multi-byte UTF-8 characters correctly"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > string > encodes multi-byte UTF-8 characters correctly"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > string > encodes surrogate pairs (emoji) correctly"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > string > encodes surrogate pairs (emoji) correctly"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > string > is deterministic and value-distinct on the long-string path"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > string > is deterministic and value-distinct on the long-string path"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > string > produces `TAG_STRING` + LEB128 byte length + UTF-8 for `hello`"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > string > produces `TAG_STRING` + LEB128 byte length + UTF-8 for `hello`"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > string > produces `TAG_STRING` + zero length for the empty string"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > string > produces `TAG_STRING` + zero length for the empty string"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > string > produces different hashes for different strings"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > string > produces different hashes for different strings"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > string > sorts object keys by the byte order of their WTF-8 encodings"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > string > sorts object keys by the byte order of their WTF-8 encodings"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > string > takes the TAG_STRING_HASH path for a long string"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > string > takes the TAG_STRING_HASH path for a long string"}} {"date":"2026-09-23","from":{"k":"unit","s":"data-model","n":"value-hash/impl > hashOf() > string > takes the TAG_STRING_HASH path over the WTF-8 bytes of a long string"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > string > takes the TAG_STRING_HASH path over the WTF-8 bytes of a long string"}} {"date":"2026-09-24","from":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > JS instances > Deferred types (not yet handled — these document known gaps) > throws for `Map` (deferred — needs recursive translation)"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > values outside the data model > throws for `Map`"}} {"date":"2026-09-24","from":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > JS instances > Deferred types (not yet handled — these document known gaps) > throws for `Set` (deferred — needs recursive translation)"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > values outside the data model > throws for `Set`"}} {"date":"2026-09-24","from":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > JS instances > Deferred types (not yet handled — these document known gaps) > throws for `Error` (deferred — needs recursive translation)"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > values outside the data model > throws for `Error`"}} {"date":"2026-09-24","from":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > JS instances > Deferred types (not yet handled — these document known gaps) > throws for a member that is a function"},"to":{"k":"unit","s":"data-model","n":"ValueHasher > instance members > feedValue() > values outside the data model > throws for a member that is a function"}}