Superbol_cache.ManifestManifests: what was observed while producing an entry, and where its value went.
Unlike values, manifests are encoded textually rather than with Marshal. Every lookup reads one, and the pruner reads all of them --- including, in a shared cache directory, those written by other users. Decoding is therefore kept to a parser that cannot do anything worse than reject its input.
val shallow_key : label:string -> inputs:Types.digest list -> Types.keyshallow_key ~label ~inputs is the key an entry is looked up by.
It digests the producer tag together with label and inputs, which are the digests of everything known before the work is performed --- the primary input and the effective configuration. Whatever is only discovered while working belongs in the manifest's witnesses instead.
val encode : Types.manifest -> stringencode manifest renders manifest for storage.
val decode : string -> (Types.manifest, Types.read_error) Stdlib.resultdecode s reads back a manifest rendered by encode.