docs(evidence): publish curated-only workspace contract

This commit is contained in:
2026-08-25 01:52:27 +02:00
parent 619ac2e141
commit 9f0184388d
7 changed files with 153 additions and 14 deletions
+31 -3
View File
@@ -115,6 +115,7 @@ export type EvidenceSource =
};
export interface WorkspaceEvidence {
schema_version: 1 | 2;
source: EvidenceSource;
policy: EvidencePolicy;
}
@@ -246,10 +247,10 @@ const evidencePattern = z.string().refine(isSafeEvidencePattern, {
const filesystemEvidenceSourceSchema = z.object({
type: z.literal("filesystem"),
uri: z.string(),
patterns: z.array(evidencePattern).min(1).default(["**/*.md"]),
patterns: z.array(evidencePattern).min(1).optional(),
max_bytes: positiveSafeInteger.default(10 * 1024 * 1024),
}).strict().superRefine((source, context) => {
if (new Set(source.patterns).size !== source.patterns.length) {
if (source.patterns !== undefined && new Set(source.patterns).size !== source.patterns.length) {
context.addIssue({ code: "custom", path: ["patterns"], message: "evidence patterns must not repeat" });
}
});
@@ -323,12 +324,39 @@ const evidencePolicySchema = z.object({
retain_published_generations: positiveSafeInteger.default(3),
}).strict();
const workspaceEvidenceSchema = z.object({
schema_version: z.union([z.literal(1), z.literal(2)]).default(1),
source: evidenceSourceSchema,
policy: evidencePolicySchema.default({
max_chunk_chars: 4_000,
retain_published_generations: 3,
}),
}).strict();
}).strict().superRefine((evidence, context) => {
if (evidence.schema_version !== 2 || evidence.source.type !== "filesystem") return;
const patterns = evidence.source.patterns ?? ["curated/**/*.md"];
const selectsSource = patterns.some((pattern) => pattern === "source" || pattern.startsWith("source/"));
const selectsCurated = patterns.some((pattern) => pattern === "curated" || pattern.startsWith("curated/"));
if (selectsSource && selectsCurated) {
context.addIssue({
code: "custom",
path: ["source", "patterns"],
message: "schema-versioned filesystem Evidence patterns cannot span source and curated",
});
} else if (!patterns.every((pattern) => pattern === "curated" || pattern.startsWith("curated/"))) {
context.addIssue({
code: "custom",
path: ["source", "patterns"],
message: "schema-versioned filesystem Evidence patterns must acquire curated documents only",
});
}
}).transform((evidence) => ({
...evidence,
source: evidence.source.type !== "filesystem" || evidence.source.patterns !== undefined
? evidence.source
: {
...evidence.source,
patterns: evidence.schema_version === 2 ? ["curated/**/*.md"] : ["**/*.md"],
},
}));
function unique<T>(values: readonly T[], context: z.RefinementCtx, path: PropertyKey[]) {
if (new Set(values).size !== values.length) {