/**
 * pipeline/context-hash.ts
 *
 * Computes `provenance.contextHash`: a portable hash of the per-task
 * documentation context the agent actually saw. The literacy compiler feeds
 * each task `contexts/canonical/{taskId}.md` (compiler.ts), and the doc-impact
 * eval works by injecting a document into a task's `context.docs[]`, which the
 * fetch step resolves into that same canonical file. So a hash over the
 * canonical context files is machine-checkable proof of the apples-to-apples
 * guarantee: injecting a document moves the hash, and nothing else should
 * (D0059 validity axis; see docs/superpowers/specs/2026-06-14-doc-impact-eval-design.md).
 *
 * Deliberately NOT the cache key (pipeline/cache.ts). The eval cache key folds
 * in absolute paths, configs, and task files — correct for invalidation, wrong
 * here. `contextHash` must be PORTABLE: baseline and treatment runs execute in
 * different working directories, so the digest is keyed on each file's basename
 * (the stable `{taskId}.md`) plus its content, never the absolute path. Two runs
 * over identical scope and context produce an equal hash regardless of rootDir.
 */
/**
 * Compute a stable SHA-256 over the assembled per-task documentation context.
 *
 * Reads the `.md` files under `<rootDir>/contexts/canonical/`, sorted by
 * filename for deterministic ordering, and hashes each file's basename and
 * content. Returns `undefined` when the canonical context directory is absent
 * or holds no `.md` files — e.g. a non-literacy run, or a run where no docs
 * were fetched — so callers leave `provenance.contextHash` unset rather than
 * stamping a hash of nothing.
 */
export declare function computeContextHash(rootDir: string): string | undefined;
