Improve audit pipeline and outreach review

This commit is contained in:
2026-06-08 22:16:32 +02:00
parent ff18fc202e
commit 1695110e0a
34 changed files with 2792 additions and 238 deletions

View File

@@ -20,6 +20,67 @@ export const v3FindingItemSchema = z.object({
export const findingItemSchema = legacyFindingItemSchema;
export const auditFindingEvidenceRefSchema = z.object({
id: nonEmptyTextSchema,
type: z.enum([
"crawl_page",
"technical_check",
"screenshot",
"pagespeed",
"jina_excerpt",
"generation_stage",
]),
label: nonEmptyTextSchema,
sourceUrl: z.string().trim(),
});
export const auditSpecialistFindingSchema = z
.object({
skillId: nonEmptyTextSchema,
claim: nonEmptyTextSchema,
recommendation: nonEmptyTextSchema,
customerBenefit: nonEmptyTextSchema,
severity: z.union([z.literal(1), z.literal(2), z.literal(3)]),
confidence: z.number().min(0).max(1),
evidenceRefs: z.array(auditFindingEvidenceRefSchema).min(1),
applies: z.boolean(),
unknowns: z.array(z.string()),
})
.superRefine((finding, ctx) => {
const combined = [
finding.claim,
finding.recommendation,
finding.customerBenefit,
].join(" ");
if (/\bunbekannt\b|\bunknown\b/i.test(combined)) {
ctx.addIssue({
code: z.ZodIssueCode.custom,
message: "unknown-only findings are not valid audit claims",
path: ["claim"],
});
}
});
export const auditSpecialistResultSchema = z.object({
status: z.enum(["success", "partial", "skipped", "failed"]),
findings: z.array(auditSpecialistFindingSchema),
notes: z.array(z.string()),
});
export const auditRejectedFindingSchema = z.object({
findingId: nonEmptyTextSchema,
skillId: nonEmptyTextSchema,
claim: nonEmptyTextSchema,
rejectionReason: nonEmptyTextSchema,
});
export const auditEvidenceVerificationSchema = z.object({
verifiedFindingIds: z.array(nonEmptyTextSchema),
rejectedFindings: z.array(auditRejectedFindingSchema),
contradictions: z.array(z.string()),
notes: z.array(z.string()),
});
export const internalFindingsSchema = z.object({
findings: z.array(findingItemSchema),
summary: z.string(),
@@ -80,6 +141,10 @@ export const qualityReviewSchema = z.object({
export type FindingItem = z.infer<typeof findingItemSchema>;
export type V3FindingItem = z.infer<typeof v3FindingItemSchema>;
export type AuditFindingEvidenceRef = z.infer<typeof auditFindingEvidenceRefSchema>;
export type AuditSpecialistFinding = z.infer<typeof auditSpecialistFindingSchema>;
export type AuditSpecialistResult = z.infer<typeof auditSpecialistResultSchema>;
export type AuditEvidenceVerification = z.infer<typeof auditEvidenceVerificationSchema>;
export type InternalFindings = z.infer<typeof internalFindingsSchema>;
export type AuditClassification = z.infer<typeof auditClassificationSchema>;
export type AuditGenerationResult = z.infer<typeof auditGenerationResultSchema>;