Implement Scene 7 evidence goal flow
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
import { describe, expect, it } from 'vitest'
|
||||
import { readFileSync } from 'node:fs'
|
||||
import { evaluateEvidenceRules, normalizeEvidenceText, scoreEvidenceAnchor } from './evidenceMatching.js'
|
||||
|
||||
const barricelliRule = {
|
||||
@@ -17,6 +18,22 @@ const barricelliRule = {
|
||||
}],
|
||||
}
|
||||
|
||||
const sceneSevenFixture = (name: string) => readFileSync(
|
||||
new URL(`../mysteries/barricelli-scene-7/fixtures/${name}`, import.meta.url),
|
||||
'utf8',
|
||||
)
|
||||
const sceneSevenManifest = JSON.parse(readFileSync(
|
||||
new URL('../mysteries/barricelli-scene-7/mystery.json', import.meta.url),
|
||||
'utf8',
|
||||
)) as {
|
||||
documents: unknown[]
|
||||
goals: { key:string;requiredFlags:string[] }[]
|
||||
evidenceMatchRules: { name:string;flagKey:string;minimumAnchorMatches:number;anchors:{ phrase:string;minimumSimilarity:number }[] }[]
|
||||
}
|
||||
const authoredPatentRule = sceneSevenManifest.evidenceMatchRules[0]
|
||||
const patentRule = { id:'rule-patent',...authoredPatentRule,
|
||||
anchors:authoredPatentRule.anchors.map((anchor,index) => ({ id:`anchor-${index}`,...anchor })) }
|
||||
|
||||
describe('evidence text matching', () => {
|
||||
it('normalizes historical Norwegian characters and page layout noise', () => {
|
||||
expect(normalizeEvidenceText('Født Aall — 2½ aar\n gammel')).toBe('fodt aall 2 1 2 aar gammel')
|
||||
@@ -45,4 +62,30 @@ describe('evidence text matching', () => {
|
||||
expect(evaluateEvidenceRules(barricelliRule.anchors[0].phrase, [rule])[0].matched).toBe(false)
|
||||
expect(evaluateEvidenceRules(barricelliRule.anchors.map(anchor => anchor.phrase).join(' '), [rule])[0].matched).toBe(true)
|
||||
})
|
||||
|
||||
it('accepts the Scene 7 Google Patents OCR fixture', () => {
|
||||
const evaluation = evaluateEvidenceRules(sceneSevenFixture('google-patents-target-ocr.txt'), [patentRule])[0]
|
||||
expect(evaluation).toMatchObject({ matched: true, flagKey: 'scene7.nils_inventor_proved' })
|
||||
expect(evaluation.matchedAnchorCount).toBeGreaterThanOrEqual(2)
|
||||
})
|
||||
|
||||
it('keeps the Scene 7 assignment empty and ties its goal to the source flag', () => {
|
||||
expect(sceneSevenManifest.documents).toEqual([])
|
||||
expect(sceneSevenManifest.goals).toEqual([
|
||||
expect.objectContaining({ key:'barricelli.inventor-proof',requiredFlags:['scene7.nils_inventor_proved'] }),
|
||||
])
|
||||
expect(authoredPatentRule.flagKey).toBe('scene7.nils_inventor_proved')
|
||||
})
|
||||
|
||||
it('does not confuse the father-only source with proof about Nils', () => {
|
||||
expect(evaluateEvidenceRules(sceneSevenFixture('father-only-negative-ocr.txt'), [patentRule])[0])
|
||||
.toMatchObject({ matched: false })
|
||||
})
|
||||
|
||||
it('tolerates a cropped, line-broken patent result without accepting unrelated patents or empty OCR', () => {
|
||||
const cropped = 'GB 695913 A — Improved chest of drawers\nInventor: Nils Aall Barri-\ncelli'
|
||||
expect(evaluateEvidenceRules(cropped, [patentRule])[0].matched).toBe(true)
|
||||
expect(evaluateEvidenceRules('US123456A Improved umbrella stand — Inventor Ada Example', [patentRule])[0].matched).toBe(false)
|
||||
expect(evaluateEvidenceRules('', [patentRule])[0].matched).toBe(false)
|
||||
})
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user