mirror of
https://github.com/garrytan/gstack.git
synced 2026-10-04 18:36:54 +02:00
The census unknown actor wrote 'nothing about read, search, or write capability is confirmed either way' after a YELLOW/WARN verdict. The claim window started at 'write', so the leading 'nothing' was outside it. Check the clause subject for nothing/neither/none/no; keep the original in-claim negations. Replay of the captured output passes; positive controls still flag an unnegated claim.
29 lines
2.0 KiB
TypeScript
29 lines
2.0 KiB
TypeScript
export function readinessVerdictProblems(kind: 'ready' | 'unknown', output: string): string[] {
|
|
const problems: string[] = [];
|
|
if (kind === 'ready') {
|
|
const capability = [...output.matchAll(/^\s*Capability[\s.:-]+(OK|FIX|WARN|ERR)\b[^\r\n]*/gim)];
|
|
if (capability.length !== 1 || capability[0]![1]?.toUpperCase() !== 'OK' || !/\bsource-scoped page read verified\b/i.test(capability[0]![0]))
|
|
problems.push('ready result lacks verified source-scoped Capability OK');
|
|
const overallStatuses = [...output.matchAll(/\b(?:gbrain\s+status|verdict)\s*:\s*(GREEN|YELLOW|RED)\b/gi)].map((match) => match[1].toUpperCase());
|
|
if (overallStatuses.includes('GREEN'))
|
|
problems.push('ready result claims GREEN with unavailable rows');
|
|
if (overallStatuses.includes('RED'))
|
|
problems.push('ready result has conflicting overall verdict');
|
|
if (!overallStatuses.includes('YELLOW'))
|
|
problems.push('ready result lacks YELLOW overall verdict');
|
|
} else {
|
|
if (!/unknown|unverified|retry|could not verify/i.test(output)) problems.push('unknown status not reported');
|
|
if (!/\bCapability\s*[.: ]+\s*WARN\b|\b(?:gbrain\s+status|verdict)\s*:\s*YELLOW\b/i.test(output))
|
|
problems.push('unknown result lacks WARN/YELLOW verdict');
|
|
if (/\b(?:gbrain\s+status|verdict)\s*:\s*GREEN\b|\bCapability\s*[.: ]+\s*OK\b/i.test(output))
|
|
problems.push('unknown result claims GREEN or capability OK');
|
|
}
|
|
for (const claim of output.matchAll(/\b(?:semantic search|writes?|write readiness|write availability)[^.!?\n]{0,60}\b(?:ready|verified|proven|confirmed|working)\b/gi)) {
|
|
const clauseStart = Math.max(...['.', '!', '?', '\n', ';'].map((stop) => output.lastIndexOf(stop, claim.index!)));
|
|
const subject = output.slice(clauseStart + 1, claim.index!);
|
|
if (!/\b(?:not|never|without|unknown|unverified)\b/i.test(claim[0]) && !/\b(?:nothing|neither|none|no)\b/i.test(subject))
|
|
problems.push('read-only check claims semantic search or write readiness');
|
|
}
|
|
return problems;
|
|
}
|