Files
gstack/test/helpers/sync-gbrain-readiness-verdict.ts
T
garrytan 09b686d4ec test(sync-gbrain-readiness): a negation earlier in the claim clause is not a search/write readiness claim
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.
2026-09-30 23:23:18 +00:00

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;
}