From c2dbafcaa2256e40b645c19f17d3092c7711e654 Mon Sep 17 00:00:00 2001 From: DEls Date: Fri, 9 Oct 2026 13:32:48 +0200 Subject: [PATCH] fix(dn): strip each of the slip's own numbers before looking for a second document The joined 'DOC|ALT' string never matched the evidence text, so a slip with alternate numbers counted its own numbers as a second document and stayed held in grouping. Co-Authored-By: Claude Opus 5.5 --- src/lib/dn-pipeline/assemble.test.ts | 11 ++++++++++- src/lib/dn-pipeline/assemble.ts | 4 ++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/lib/dn-pipeline/assemble.test.ts b/src/lib/dn-pipeline/assemble.test.ts index 6f81bee..839a411 100644 --- a/src/lib/dn-pipeline/assemble.test.ts +++ b/src/lib/dn-pipeline/assemble.test.ts @@ -92,7 +92,16 @@ describe("background fragments", () => { expect(result.openPages).toEqual([{ page: 1, reason: "multiple_documents" }]); }); - it("groups a fragment with no evidence text at all on a complete page", () => { + it("does not mistake the slip's own alternate numbers for a second document", () => { + const result = assemblePages([fragment({ + doc_number_alts: ["07565729", "99058993"], + evidence: { multiple_documents: "Partial edge of paper behind slip 07565729 (internal 99058993)." }, + })]); + expect(result.groups.map((group) => group.pages)).toEqual([[1]]); + expect(result.openPages).toEqual([]); + }); + + it("still holds a flagged page whose evidence says nothing about background", () => { const result = assemblePages([fragment({ evidence: {} })]); expect(result.openPages).toEqual([{ page: 1, reason: "multiple_documents" }]); }); diff --git a/src/lib/dn-pipeline/assemble.ts b/src/lib/dn-pipeline/assemble.ts index 5967c2d..b249638 100644 --- a/src/lib/dn-pipeline/assemble.ts +++ b/src/lib/dn-pipeline/assemble.ts @@ -132,8 +132,8 @@ function backgroundFragment(read: PageRead): boolean { if (!read.doc_number.trim() || read.items.length === 0) return false; const evidence = read.evidence?.multiple_documents; if (!evidence || !BACKGROUND.test(evidence)) return false; - const own = [read.doc_number, ...(read.doc_number_alts ?? [])].join("|"); - const elsewhere = evidence.replace(own, " ").match(DOCUMENT_NUMBER); + const own = [read.doc_number, ...(read.doc_number_alts ?? [])].map((ref) => ref.trim()).filter(Boolean); + const elsewhere = own.reduce((text, ref) => text.split(ref).join(" "), evidence).match(DOCUMENT_NUMBER); return elsewhere === null; }