/** * Slice `b1-filesplit-campaign` (wave 3) — verbatim extraction of the JSON-artifact * half of `./promotion-artifact-evidence.ts` (the evidence vocabulary and the three * layer-A / layer-B shape predicates) so that module clears the 300 raw-line cap. * No predicate body, no doc comment and no message string changed; the original * module re-exports the two public type names from its own path, so importers are * untouched. */ export type PromotionEvidence = /** A SOP manifest: a JSON object whose `id` is the SOP's and whose `gates` is an array. */ 'sop-manifest' /** An entry with the SOP's `id` inside `.sops[]` — what `readRegistry()` enumerates. */ | 'sop-registry-entry' /** A hook registration (hook command) inside `hooks` that runs something named after the rule. */ | 'hook-registration' /** A member of `HARD_FLOOR_CATEGORIES` — the array `isHardFloorCategory` reads — that names the rule. */ | 'hard-floor-category'; export type PromotionArtifactCheck = { /** Project-relative POSIX path whose CONTENT must carry the evidence. */ path: string; /** * Other project-relative paths where the SAME evidence may legitimately live. * * The conjunction is across CHECKS — layer A needs its manifest AND its * registry entry — so an alternative location cannot be expressed as another * check: that would demand it too. It belongs here, where the sense is OR. * * Layer B is the reason the field exists. Its registration is written into * whichever Claude settings file the project actually reads: a consumer gets * the generated snapshot, while this repository registers its own development * hooks in the tracked `.claude/settings.json` — the template that produces the * snapshot is written into a consumer tree, where a command naming * `${CLAUDE_PROJECT_DIR}/src/**` resolves to nothing. * * `artifactEvidenceFailure` reads `evidence` and `id` only, so the same check * is tried against every candidate as it stands. */ alternatives?: readonly string[]; evidence: PromotionEvidence; /** The rule id the evidence must name (a SOP id for layer A, a memory name for B and C). */ id: string; }; /** Is `value` a JSON object (not null, not an array)? */ export declare function isRecord(value: unknown): value is Record; export declare function manifestFailure(parsed: unknown, id: string): string | null; export declare function registryFailure(parsed: unknown, id: string): string | null; export declare function isToolMatcher(matcher: string): boolean;