A namespace node: `["ns", [[name, [hashes]]...], [[child, nodeHash]...]]`, both lists sorted by name. Where a name shows a definition with other text than it was first stored with (its comments, layout or doc changed), a fourth list says which version: `[[name, hash, textHash]...]`, sorted by name and hash. A node without one is written, and hashed, as before there were text versions.
How a definition reads: its code as written (comments, layout, names spelled as then) and its doc. None of it is in its hash, so one definition can have several; each is kept by its textHash.
A message as given (`-m`, a tool's `message`): line endings as `\n`, trailing spaces and blank lines at either end taken off. Nothing left is no message.
How a history entry's `command` column holds what made it: the label of the command (`update lib.f`), then, after a line break, the message it was given (`-m`), if any. One column, so the message goes wherever the entry does (a push, a pull, a migration), with any tcm; it's in no hash, so it can change without changing history.
A signature with other names for what it names: `renames` maps the name a definition was made as (how a signature prints it) to the name to show. Only types and values are renamed, not property or parameter names (`{ Foo: Foo }` keeps its key), a qualified name's members, or what's in a string literal type.