docs(evidence): publish curated-only workspace contract
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user