From 09b686d4ecdfc8ef0bd88836aa95281218e0d63e Mon Sep 17 00:00:00 2001 From: garrytan Date: Wed, 30 Sep 2026 23:17:08 +0000 Subject: [PATCH] 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. --- test/helpers/sync-gbrain-readiness-verdict.ts | 4 +++- test/sync-gbrain-readiness-fixture.test.ts | 7 +++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/test/helpers/sync-gbrain-readiness-verdict.ts b/test/helpers/sync-gbrain-readiness-verdict.ts index daceec1fa..6b3aead7f 100644 --- a/test/helpers/sync-gbrain-readiness-verdict.ts +++ b/test/helpers/sync-gbrain-readiness-verdict.ts @@ -19,7 +19,9 @@ export function readinessVerdictProblems(kind: 'ready' | 'unknown', output: stri 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)) { - if (!/\b(?:not|never|without|unknown|unverified)\b/i.test(claim[0])) + 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; diff --git a/test/sync-gbrain-readiness-fixture.test.ts b/test/sync-gbrain-readiness-fixture.test.ts index 02f4ad768..dca1af274 100644 --- a/test/sync-gbrain-readiness-fixture.test.ts +++ b/test/sync-gbrain-readiness-fixture.test.ts @@ -27,6 +27,13 @@ test('unknown actor negative replay rejects a contradictory GREEN verdict', () = expect(readinessVerdictProblems('unknown', 'Capability WARN: read unverified; gbrain status: YELLOW')).toEqual([]); }); +test('a negation earlier in the claim sentence is not a search/write readiness claim', () => { + const base = 'Capability ...... WARN source-scoped read unverified\ngbrain status: YELLOW\n'; + expect(readinessVerdictProblems('unknown', `${base}With an unknown result, nothing about read, search, or write capability is confirmed either way.`)).toEqual([]); + expect(readinessVerdictProblems('unknown', `${base}Nothing was probed. With an unknown result, write capability is confirmed.`)).toContain('read-only check claims semantic search or write readiness'); + expect(readinessVerdictProblems('unknown', `${base}Search is not probed; write capability is confirmed.`)).toContain('read-only check claims semantic search or write readiness'); +}); + test('ready actor negative replay rejects search/write claims from a read probe', () => { const verified = 'Capability ...... OK source-scoped page read verified; semantic search and writes were not tested.\ngbrain status: YELLOW'; expect(readinessVerdictProblems('ready', 'Capability ...... OK source-scoped page read verified; semantic search and write readiness verified.\ngbrain status: YELLOW')).not.toEqual([]);