Skip to content

Commit 5216e6a

Browse files
clay-goodclaude
andcommitted
fix(rules): CROSS-PARTY-001 normalize spelled-out 'Incorporated' & 'LLLP' party suffixes (v4 cross-doc 1.3.0)
What was wrong: the cross-document party-name normalizer stripped "Inc." and "Corporation" but not the spelled-out "Incorporated" (nor "LLLP"), so "Acme Incorporated" and "Acme, Inc." canonicalized differently and CROSS-PARTY-001 missed the same-entity-different-legal-name drift it exists to surface. How it was fixed: added "incorporated" and "lllp" to the entity-suffix strip list in normalizePartyName. "incorporated" is ordered so it wins over the "inc" alternative (whose trailing word-boundary fails inside "incorporated"). Proof: a new regression test pins "Acme Incorporated" vs "Acme, Inc." now being recognized as the same entity across two documents. Full suite green (5688 passing). The shared V4_VERSION bump drifts the bundle consistency goldens; a finding-level check confirms zero drift in finding_count / finding_rule_ids across every bundle fixture (prospective — no fixture uses a spelled-out suffix; version-only hash bump). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1 parent 4c0f402 commit 5216e6a

17 files changed

Lines changed: 34 additions & 16 deletions

src/engine/consistency/rules/v4/_helpers.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ export function normalizePartyName(name: string): string {
2323
return name
2424
.toLowerCase()
2525
.replace(
26-
/\b(inc\.?|corp\.?|corporation|llc|l\.l\.c\.|lp|l\.p\.|llp|l\.l\.p\.|ltd\.?|limited|company|co\.?|plc|gmbh|s\.?a\.?|s\.?a\.?r\.?l\.?|n\.?v\.?|ag|pte\.?|sdn\.?\s*bhd\.?)\b/g,
26+
/\b(inc\.?|incorporated|corp\.?|corporation|llc|l\.l\.c\.|lllp|lp|l\.p\.|llp|l\.l\.p\.|ltd\.?|limited|company|co\.?|plc|gmbh|s\.?a\.?|s\.?a\.?r\.?l\.?|n\.?v\.?|ag|pte\.?|sdn\.?\s*bhd\.?)\b/g,
2727
"",
2828
)
2929
.replace(/[,.()]/g, " ")

src/engine/consistency/rules/v4/cross-doc-rules.test.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,24 @@ describe("CROSS-PARTY-001", () => {
103103
});
104104
expect(run.findings).toHaveLength(0);
105105
});
106+
107+
it("recognizes the spelled-out 'Incorporated' suffix as equivalent to 'Inc.'", async () => {
108+
const msa = makeDoc("msa", "msa-vendor-deep", [
109+
"Agreement",
110+
'This Master Services Agreement is between Acme Incorporated ("Provider") and Globex Industries, Inc. ("Customer").',
111+
]);
112+
const dpa = makeDoc("dpa", "dpa-controller-processor", [
113+
"Agreement",
114+
'This DPA is between Acme, Inc. ("Processor") and Globex Industries, Inc. ("Controller").',
115+
]);
116+
const run = await runConsistency({
117+
rules: [CROSS_PARTY_001],
118+
documents: [msa, dpa],
119+
dkb: STARTER_DKB,
120+
});
121+
expect(run.findings.length).toBeGreaterThanOrEqual(1);
122+
expect(run.findings[0]!.title.toLowerCase()).toMatch(/acme/);
123+
});
106124
});
107125

108126
/* ---------------- CROSS-JURIS-001 ----------------- */

src/engine/consistency/rules/v4/cross-doc-rules.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ import {
4141
} from "./_helpers.js";
4242
import { forEachParagraph } from "../../../../extract/walk.js";
4343

44-
const V4_VERSION = "1.2.0";
44+
const V4_VERSION = "1.3.0";
4545

4646
/* -------------------- CROSS-PARTY-001 ----------------------------- */
4747

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"consistency":{"execution_log_count":20,"finding_count":1,"finding_rule_ids":["CROSS-AMOUNT-001"],"result_hash":"86257e42b478192923c5d3248af2c7c43c9b6164beb47b207e90e31e723271a6"},"per_document":[{"doc_id":"msa","finding_count":10,"result_hash":"39aa467546faf93f7bb801d839ac4ffd1e4f2f000ed8d0b8808e6c4460916e2b","source_file_name":"msa.txt"},{"doc_id":"sow","finding_count":10,"result_hash":"161f2b33212029b4cedc039abffc550f89893342bdcd09fcbb84b4340b10b324","source_file_name":"sow.txt"}]}
1+
{"consistency":{"execution_log_count":20,"finding_count":1,"finding_rule_ids":["CROSS-AMOUNT-001"],"result_hash":"9e5aed07689d144ab3788b4aaafae5611bac0a5890e4379dff728179eac7c586"},"per_document":[{"doc_id":"msa","finding_count":10,"result_hash":"39aa467546faf93f7bb801d839ac4ffd1e4f2f000ed8d0b8808e6c4460916e2b","source_file_name":"msa.txt"},{"doc_id":"sow","finding_count":10,"result_hash":"161f2b33212029b4cedc039abffc550f89893342bdcd09fcbb84b4340b10b324","source_file_name":"sow.txt"}]}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"consistency":{"execution_log_count":20,"finding_count":1,"finding_rule_ids":["CROSS-CARVEOUT-001"],"result_hash":"6a7a03c07055b9bccde452e7d83815fc46e729084fdc4cd3ecf4bef80e1a97eb"},"per_document":[{"doc_id":"dpa","finding_count":92,"result_hash":"b0ae3754fd7b4372b3d3f7c16259c6676cda673d42fd0c8fff4fd2fd224b4ef0","source_file_name":"dpa.txt"},{"doc_id":"msa","finding_count":9,"result_hash":"bc782f573c285e1d70c2dba90d540e97bc0fe8ddef477e5477e15c9bc946f2bb","source_file_name":"msa.txt"}]}
1+
{"consistency":{"execution_log_count":20,"finding_count":1,"finding_rule_ids":["CROSS-CARVEOUT-001"],"result_hash":"d4361bd93edfd0f2d3b036447780319b4c68501314c29ac5148b8e75f245efea"},"per_document":[{"doc_id":"dpa","finding_count":92,"result_hash":"b0ae3754fd7b4372b3d3f7c16259c6676cda673d42fd0c8fff4fd2fd224b4ef0","source_file_name":"dpa.txt"},{"doc_id":"msa","finding_count":9,"result_hash":"bc782f573c285e1d70c2dba90d540e97bc0fe8ddef477e5477e15c9bc946f2bb","source_file_name":"msa.txt"}]}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"consistency":{"execution_log_count":20,"finding_count":1,"finding_rule_ids":["CROSS-MISSING-001"],"result_hash":"8da085189f2e1690f89e2e63367cdf74b072de449c9f8b1470ae9ea9e3004209"},"per_document":[{"doc_id":"baa","finding_count":35,"result_hash":"4dfd9b77fe0f7a1308195e42f551d4100ac872197bd96057981afb163e347704","source_file_name":"baa.txt"},{"doc_id":"msa","finding_count":10,"result_hash":"fe2adf89ec8621dc54bf0dfdf6b665be360d24362093785bb92cd143723da1c5","source_file_name":"msa.txt"}]}
1+
{"consistency":{"execution_log_count":20,"finding_count":1,"finding_rule_ids":["CROSS-MISSING-001"],"result_hash":"51ba269011a4f82367ab56e7ee62daadfe2826d2dbf436466fae44cab0530a46"},"per_document":[{"doc_id":"baa","finding_count":35,"result_hash":"4dfd9b77fe0f7a1308195e42f551d4100ac872197bd96057981afb163e347704","source_file_name":"baa.txt"},{"doc_id":"msa","finding_count":10,"result_hash":"fe2adf89ec8621dc54bf0dfdf6b665be360d24362093785bb92cd143723da1c5","source_file_name":"msa.txt"}]}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"consistency":{"execution_log_count":20,"finding_count":1,"finding_rule_ids":["CROSS-CURRENCY-001"],"result_hash":"6fcb551a963c3726c8cf0a12ffa35deacf7ee215ac06170cedf104e2eb21989d"},"per_document":[{"doc_id":"appendix","finding_count":11,"result_hash":"ce6f4e953eef5c0b47eef821afdd02d447c9f98efb4b4ed85562749058f82146","source_file_name":"appendix.txt"},{"doc_id":"msa","finding_count":11,"result_hash":"e922010fbf05207c5145f621e1ac1db3b7a984dddf8177f473c34f07b584175b","source_file_name":"msa.txt"}]}
1+
{"consistency":{"execution_log_count":20,"finding_count":1,"finding_rule_ids":["CROSS-CURRENCY-001"],"result_hash":"d444f39eff60c911f3e8f392cef6a609fec0da072791f1271c278cb77ad85d43"},"per_document":[{"doc_id":"appendix","finding_count":11,"result_hash":"ce6f4e953eef5c0b47eef821afdd02d447c9f98efb4b4ed85562749058f82146","source_file_name":"appendix.txt"},{"doc_id":"msa","finding_count":11,"result_hash":"e922010fbf05207c5145f621e1ac1db3b7a984dddf8177f473c34f07b584175b","source_file_name":"msa.txt"}]}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"consistency":{"execution_log_count":20,"finding_count":2,"finding_rule_ids":["CROSS-DEFTERM-001","CROSS-MISSING-001"],"result_hash":"842cabc91ea832b65274cb765329ca99c134fefb279026f5b8d1f449a31f3703"},"per_document":[{"doc_id":"dpa","finding_count":82,"result_hash":"f7bcdb7ad800742cbe36e8699786cc001e2c4edcbe7382e8ca62137972e3a203","source_file_name":"dpa.txt"},{"doc_id":"msa","finding_count":11,"result_hash":"f981ca80eff31bcb83997431c2869d25bea651de1990a3240f92d06fbb512284","source_file_name":"msa.txt"}]}
1+
{"consistency":{"execution_log_count":20,"finding_count":2,"finding_rule_ids":["CROSS-DEFTERM-001","CROSS-MISSING-001"],"result_hash":"f207939018184dba43b364552aa262fbda7d3f078120ad15ce2dec6cc12752eb"},"per_document":[{"doc_id":"dpa","finding_count":82,"result_hash":"f7bcdb7ad800742cbe36e8699786cc001e2c4edcbe7382e8ca62137972e3a203","source_file_name":"dpa.txt"},{"doc_id":"msa","finding_count":11,"result_hash":"f981ca80eff31bcb83997431c2869d25bea651de1990a3240f92d06fbb512284","source_file_name":"msa.txt"}]}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"consistency":{"execution_log_count":20,"finding_count":1,"finding_rule_ids":["CROSS-DEFTERM-002"],"result_hash":"b05b357d0395426ca847d5bf8c3e9a509b6f151224d285122957e559a069aa55"},"per_document":[{"doc_id":"msa","finding_count":10,"result_hash":"47cbc23ebeb67f7a620acb33f4c00e5e8ffc9e08d169a5c71a340a91ce847e8a","source_file_name":"msa.txt"},{"doc_id":"sow","finding_count":9,"result_hash":"87cab84b46769381e53117d3f6924c2a28de0e92904f10b3aa3868f97e4c1a1e","source_file_name":"sow.txt"}]}
1+
{"consistency":{"execution_log_count":20,"finding_count":1,"finding_rule_ids":["CROSS-DEFTERM-002"],"result_hash":"dac67db443e7c7f81bc9feb8f8e59db59a363e4f22d763395b419f69c09cffd1"},"per_document":[{"doc_id":"msa","finding_count":10,"result_hash":"47cbc23ebeb67f7a620acb33f4c00e5e8ffc9e08d169a5c71a340a91ce847e8a","source_file_name":"msa.txt"},{"doc_id":"sow","finding_count":9,"result_hash":"87cab84b46769381e53117d3f6924c2a28de0e92904f10b3aa3868f97e4c1a1e","source_file_name":"sow.txt"}]}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"consistency":{"execution_log_count":20,"finding_count":2,"finding_rule_ids":["CROSS-DATE-001","CROSS-DEFTERM-002"],"result_hash":"81fe70bc73a956019bf0412433110639ac895026b81217573040a05cc6f4b5ca"},"per_document":[{"doc_id":"baa","finding_count":39,"result_hash":"8e5b6a1e0e1190c57a79432e3e07fe396beef3f34d57ed149c30149587735283","source_file_name":"baa.txt"},{"doc_id":"msa","finding_count":11,"result_hash":"26dbd5c8d116f96ea1f8be0d1f6be6096aa9b23bf7cd43b06f6b175a796bfa59","source_file_name":"msa.txt"}]}
1+
{"consistency":{"execution_log_count":20,"finding_count":2,"finding_rule_ids":["CROSS-DATE-001","CROSS-DEFTERM-002"],"result_hash":"b370dafe9b39ac96010245284e55dacd68c8e94d6ac46f3d91295e909468f32e"},"per_document":[{"doc_id":"baa","finding_count":39,"result_hash":"8e5b6a1e0e1190c57a79432e3e07fe396beef3f34d57ed149c30149587735283","source_file_name":"baa.txt"},{"doc_id":"msa","finding_count":11,"result_hash":"26dbd5c8d116f96ea1f8be0d1f6be6096aa9b23bf7cd43b06f6b175a796bfa59","source_file_name":"msa.txt"}]}

0 commit comments

Comments
 (0)