import { BlockedResult } from './types'; /** The delivered copy of `guards/L1-location.md`, as a rules-config template name. */ export declare const LOCATION_MATRIX_DOC = "webpieces.location-matrix.md"; /** * The pointer appended to an L1 deny, or '' when the doc could not be written. * * Opens with a NEWLINE and carries no quotes or backslashes, for the same two reasons L0's and L2's * do: the deny renders in the house format (a header, a `[guard-name]` block, `Fix Option N:` lines) * so a pointer glued onto the last line is the one place that shape breaks; and the text is * interpolated into a JSON payload, where a quote would corrupt the decision rather than merely the * prose. * * It names the ROW as well as the path — including the pre-stage `0`, which is a real row in the * delivered table precisely so this pointer can name it. A bare "read this doc" is a page; a row * number is the two lines that explain this exact verdict, and the L1-decisions log line for this * same call carries the same `row=`. */ export declare function locationMatrixPointer(docPath: string, row: string): string; /** * The write and the pointer, applied to one L1 deny — the whole delivery mechanism in one call. * * `runner.l1LocationBlock` uses this on EVERY branch, which is the point: that is the single scope * every L1 deny funnels through and the same scope that logs `row=`, so the deny and the trail cannot * name different rows, and no L1 block path added later can silently skip the pointer. The three report * builders keep owning their own deny prose — none of them learns about the doc, which is what keeps * this from becoming three near-identical stanzas that drift apart. * * `null` in, `null` out: the tree-based builders own a predicate of their own and can still decline * (see `versionSkewBlock`). No deny, no write, no pointer. */ export declare function withLocationMatrixPointer(block: BlockedResult | null, root: string, row: string): BlockedResult | null;