contradiction-mcp 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -9,16 +9,17 @@
9
9
  [![Node.js Version](https://img.shields.io/badge/Node.js-%3E%3D20.0.0-339933.svg?logo=node.js&logoColor=white&style=flat-square)](https://nodejs.org/)
10
10
  [![TypeScript](https://img.shields.io/badge/TypeScript-5.x-3178C6.svg?logo=typescript&logoColor=white&style=flat-square)](https://www.typescriptlang.org/)
11
11
  [![MCP Specification](https://img.shields.io/badge/MCP-2.0.0-8A2BE2.svg?logo=anthropic&logoColor=white&style=flat-square)](https://modelcontextprotocol.io/)
12
- [![Vitest Tests](https://img.shields.io/badge/Tests-169%20passed-2ea44f.svg?logo=vitest&logoColor=white&style=flat-square)](tests)
12
+ [![Vitest Tests](https://img.shields.io/badge/Tests-173%20passed-2ea44f.svg?logo=vitest&logoColor=white&style=flat-square)](tests)
13
13
  [![Security Audit](https://img.shields.io/badge/Security-0%20vulnerabilities-brightgreen.svg?style=flat-square)](package.json)
14
14
  [![Code Style](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?logo=prettier&logoColor=white&style=flat-square)](https://prettier.io/)
15
15
 
16
16
  <p align="center">
17
17
  <a href="#the-problem-it-solves">Problem</a> •
18
18
  <a href="#core-capabilities">Capabilities</a> •
19
+ <a href="#limitations--known-edge-cases">Limitations</a> •
19
20
  <a href="#system-architecture">Architecture</a> •
20
21
  <a href="#one-command-quickstart-all-ides">Quickstart</a> •
21
- <a href="#mcp-interface-21-tools-4-resources-2-prompts">Tools Reference</a> •
22
+ <a href="#mcp-interface-12-canonical-tools-4-resources-2-prompts">Tools Reference</a> •
22
23
  <a href="#step-by-step-hands-on-tutorial">Tutorials</a> •
23
24
  <a href="#documentation-index">Docs</a> •
24
25
  <a href="#license">License</a>
@@ -28,6 +29,14 @@
28
29
 
29
30
  ---
30
31
 
32
+ > [!NOTE]
33
+ >
34
+ > ### Project Status: Active Development (v0.3.0)
35
+ >
36
+ > **Contradiction MCP is currently under active development.** Core multi-format document ingestion (Markdown, RFC822 `.eml`, OpenXML `.docx`, and JSON) and cross-document contradiction discovery are operational and verified. Heuristic classifiers, deep JSON scoping, and public APIs are actively evolving prior to v1.0.0.
37
+
38
+ ---
39
+
31
40
  ## The Problem It Solves
32
41
 
33
42
  Modern engineering ecosystems rely on fragmented, uncoordinated sources of truth:
@@ -53,18 +62,42 @@ When these systems diverge—for example, a Kubernetes manifest deploying Node.j
53
62
  - **Deterministic SemVer Mathematics**: Employs rigorous version range satisfaction algebra rather than naive string comparisons.
54
63
  - **Multi-Source Ingestion Pipeline**:
55
64
  - **GitHub Connector**: Analyzes runtime engines, Dockerfiles, GitHub Actions workflows, and READMEs.
56
- - **Document Connector**: Extracts structured claims from JSON, YAML, Markdown, CSV, TXT, and PDF documents with exact page- and line-numbered evidence citations.
65
+ - **Document Connector**: Extracts structured claims from JSON, YAML, Markdown, CSV, TXT, RFC822 (`.eml`), and OpenXML (`.docx`) documents with exact page- and line-numbered evidence citations.
57
66
  - **Public Website Connector**: Web crawler hardened with multi-layer SSRF protection against loopback, private IPv4/IPv6 CIDRs, and cloud metadata endpoints (`169.254.169.254`).
58
67
  - **Scoring & Advisory Intelligence**:
59
68
  - `AuthorityScorer`: Ranks conflicting claims based on source hierarchy and origin credibility.
60
69
  - `FreshnessScorer`: Applies exponential half-life time decay models.
61
- - `EvidenceEvaluator`: Quantifies citation directness and snippet quality.
70
+ * `EvidenceEvaluator`: Quantifies citation directness and snippet quality.
62
71
  - `ResolutionAdvisor`: Generates actionable resolution recommendations without mutating state without operator consent.
63
72
  - **Review & Resolution Workflows**: Full lifecycle transitions (`OPEN` → `REVIEWED` → `RESOLVED` / `DISMISSED` → `REOPENED`) backed by append-only audit histories.
64
73
  - **Dual Transport Architecture**: Operates over standard **Stdio** (for Claude Desktop, Google Antigravity, Cursor) or **Streamable HTTP/SSE** with Bearer API key authentication and sliding rate limiting.
65
74
 
66
75
  ---
67
76
 
77
+ ## Limitations & Known Edge Cases
78
+
79
+ While Contradiction MCP is battle-tested on cross-document and cross-source consistency audits, users should be aware of current development limitations:
80
+
81
+ 1. **Intra-Manifest Hierarchical Collisions (Deeply Nested JSON/YAML)**:
82
+ - **Behavior**: Key-value extraction flattens object hierarchies into leaf tokens. In complex single manifests (such as Kubernetes deployments), parameters sharing identical leaf keys across distinct blocks (e.g., `readinessProbe.initialDelaySeconds` vs `livenessProbe.initialDelaySeconds`, or container `resources.requests.cpu` vs `resources.limits.cpu`) can trigger intra-file candidate comparisons and false-positive warnings.
83
+ - **Mitigation**: Focus analysis on cross-document source verification or filter by external source boundaries. Hierarchical path-aware namespace isolation is currently under active development.
84
+
85
+ 2. **Heading & Brand Entity Extraction**:
86
+ - **Behavior**: Document headings containing version-like keywords (e.g., `"2. Node.js V8 Engine Upgrade"`) may occasionally extract the engine brand or section numeral as a software version string, triggering local version mismatch warnings against runtime version specifications.
87
+ - **Mitigation**: Structure specifications using standard tables, key-value mappings, or explicit parameter declarations.
88
+
89
+ 3. **Static Specifications vs Live Network State**:
90
+ - **Behavior**: The engine analyzes declared assertions across files, repositories, and documentation. It does not probe live runtime sockets, ephemeral cloud infrastructure, or running processes unless synced as structured state documents.
91
+
92
+ 4. **Candidate Pair Scalability on Giant Monoliths**:
93
+ - **Behavior**: Files producing >1,000 claims increase pairwise combinations quadratically ($O(N^2)$ worst-case prior to similarity filtering).
94
+ - **Mitigation**: Bounded file size guards (`MAX_FILE_SIZE_BYTES`, default 10MB) prevent memory exhaust. Partition giant monoliths into modular architecture specs.
95
+
96
+ 5. **Language & Syntax Scope**:
97
+ - **Behavior**: Extraction heuristics, unit normalizers (e.g., `GB`, `MB`, `ms`), and predicate patterns are currently tuned for English documentation and standard DevOps/software configuration keys. Multi-lingual natural language extraction without standard keying is planned for future releases.
98
+
99
+ ---
100
+
68
101
  ## System Architecture
69
102
 
70
103
  ### Visual Dataflow
@@ -81,7 +114,7 @@ flowchart TD
81
114
  subgraph Protocol["MCP Protocol Layer"]
82
115
  StdioT["StdioServerTransport"]
83
116
  HttpT["StreamableHttpTransport"]
84
- Router["21 Tools | 4 Resources | 2 Prompts"]
117
+ Router["12 Canonical Tools | 4 Resources | 2 Prompts"]
85
118
  end
86
119
 
87
120
  subgraph Core["Analysis & Intelligence Engine"]
@@ -252,33 +285,29 @@ Connect distributed agents or team members to a centralized server daemon:
252
285
 
253
286
  ---
254
287
 
255
- ## MCP Interface: 21 Tools, 4 Resources, 2 Prompts
256
-
257
- ### Active MCP Tools (21)
258
-
259
- | Tool Name | Description | Key Arguments |
260
- | :------------------------------ | :---------------------------------------------------------------- | :----------------------------------------- |
261
- | `health_check` | Checks server runtime health, database latency, and entity counts | `{}` |
262
- | `analyze_claim_pair` | Runs pairwise contradiction analysis between two claim IDs | `claimIdA`, `claimIdB` |
263
- | `scan_for_contradictions` | Scans the full knowledge base for conflicting assertions | `limit`, `minSeverity` |
264
- | `scan_claim_for_contradictions` | Incrementally scans candidate pairs for a specific claim | `claimId` |
265
- | `list_contradictions` | Lists contradictions filtered by status and severity | `status`, `severity`, `limit` |
266
- | `get_contradiction` | Retrieves detailed contradiction record with claims and sources | `contradictionId` |
267
- | `explain_claim_relationship` | Explains contextual factors (env, scope, role, SemVer) | `claimIdA`, `claimIdB` |
268
- | `advise_resolution` | Heuristically compares authority, freshness, and evidence | `contradictionId` |
269
- | `review_contradiction` | Transitions contradiction to `REVIEWED` status | `contradictionId`, `reviewedBy`, `notes` |
270
- | `resolve_contradiction` | Resolves contradiction by selecting canonical claim | `contradictionId`, `resolvedBy`, `reason` |
271
- | `dismiss_contradiction` | Dismisses false positives or intentional differences | `contradictionId`, `dismissedBy`, `reason` |
272
- | `reopen_contradiction` | Reopens a previously resolved or dismissed contradiction | `contradictionId`, `reopenedBy`, `reason` |
273
- | `get_contradiction_history` | Returns chronological, immutable audit trail of transitions | `contradictionId` |
274
- | `get_claim_history` | Returns value history and supersessions for a specific claim | `externalId` |
275
- | `list_connectors` | Lists registered ingestion connectors and capabilities | `{}` |
276
- | `test_github_connection` | Tests GitHub connectivity and rate-limit headroom | `owner`, `repo` |
277
- | `sync_github_repository` | Ingests package.json, Dockerfile, README, and workflows | `owner`, `repo`, `branch` |
278
- | `sync_document` | Ingests local JSON, YAML, MD, CSV, TXT, or PDF files | `filePath`, `subject`, `sourceRole` |
279
- | `sync_website` | Ingests web URL with pre-flight SSRF protection | `url`, `subject`, `maxDepth` |
280
- | `sync_source` | Synchronizes an existing registered source by ID | `sourceId` |
281
- | `sync_sources` | Bounded-concurrency batch synchronization | `sourceIds` |
288
+ ## MCP Interface: 12 Canonical Tools, 4 Resources, 2 Prompts
289
+
290
+ Contradiction MCP exposes **12 canonical tools** engineered to the highest specification standards (Glama Tool Definition Quality Score **5.0 / 5.0 Grade A**). Every tool strictly follows `verb_noun` nomenclature, provides rich typed schemas, and isolates distinct operational domains.
291
+
292
+ ### Active Canonical MCP Tools (12)
293
+
294
+ | Tool Name | Operational Domain | Description | Key Arguments |
295
+ | :---------------------- | :----------------- | :------------------------------------------------------------------------------------------ | :------------------------------------------------------------------- |
296
+ | `check_health` | Diagnostics | Verifies server runtime health, database connectivity, and active connector health | `{}` |
297
+ | `list_sources` | Discovery | Lists registered knowledge sources and connector types with pagination | `type`, `limit`, `offset` |
298
+ | `test_connection` | Connectivity | Validates credentials, permissions, and network reachability without persisting data | `type`, `target`, `credentials` |
299
+ | `sync_source` | Ingestion | Unified ingestion engine for files, Markdown, Word (.docx), JSON, URLs, or Git repositories | `sourceId` OR (`filePath` / `url` / `owner`+`repo`), `subject` |
300
+ | `scan_contradictions` | Intelligence | Scans the knowledge base, a source, or a claim for logical/semantic contradictions | `sourceId`, `claimId`, `limit`, `minConfidence`, `includeDismissed` |
301
+ | `analyze_claim_pair` | Intelligence | Performs pairwise contradiction and contextual relationship analysis between two claims | `claimIdA`, `claimIdB` |
302
+ | `list_claims` | Knowledge Base | Lists extracted factual claims with multi-field filtering and pagination | `sourceId`, `subject`, `predicate`, `environment`, `limit`, `offset` |
303
+ | `get_claim` | Knowledge Base | Retrieves factual claim details, contextual metadata, and audit supersession history | `claimId` |
304
+ | `list_contradictions` | Lifecycle | Queries detected contradictions filtered by lifecycle status, severity, and confidence | `status`, `severity`, `minConfidence`, `limit`, `offset` |
305
+ | `get_contradiction` | Lifecycle | Retrieves full contradiction state, conflicting claims, and contextual explanation | `contradictionId` |
306
+ | `advise_resolution` | Advisory | Evaluates source authority, freshness, and evidence quality to recommend canonical truth | `contradictionId` |
307
+ | `resolve_contradiction` | Resolution | Executes lifecycle transitions (`REVIEW`, `RESOLVE`, `DISMISS`, `REOPEN`) with audit trail | `contradictionId`, `action`, `actor`, `reason`, `canonicalClaimId` |
308
+
309
+ > [!TIP]
310
+ > **Full Backwards Compatibility**: Legacy tool names (`health_check`, `sync_document`, `sync_website`, `sync_github_repository`, `scan_for_contradictions`, `scan_claim_for_contradictions`, `scan_source_for_contradictions`, `explain_claim_relationship`, `review_contradiction`, `dismiss_contradiction`, `reopen_contradiction`, `get_contradiction_history`, `get_claim_history`, `list_connectors`, `test_github_connection`, `sync_sources`) continue to function without error via automatic request routing and parameter translation.
282
311
 
283
312
  ### Active MCP Resources (4)
284
313
 
@@ -297,7 +326,7 @@ Connect distributed agents or team members to a centralized server daemon:
297
326
  ## Example Tool Payloads & Responses
298
327
 
299
328
  <details>
300
- <summary><b>1. Ingesting a Document (<code>sync_document</code>)</b></summary>
329
+ <summary><b>1. Ingesting a Document (<code>sync_source</code> / legacy: <code>sync_document</code>)</b></summary>
301
330
 
302
331
  **Request**:
303
332
 
@@ -325,7 +354,7 @@ Connect distributed agents or team members to a centralized server daemon:
325
354
  </details>
326
355
 
327
356
  <details>
328
- <summary><b>2. Scanning for Contradictions (<code>scan_for_contradictions</code>)</b></summary>
357
+ <summary><b>2. Scanning for Contradictions (<code>scan_contradictions</code> / legacy: <code>scan_for_contradictions</code>)</b></summary>
329
358
 
330
359
  **Request**:
331
360
 
@@ -414,20 +443,20 @@ async function main() {
414
443
  const client = new Client({ name: "tester", version: "1.0.0" }, { capabilities: {} });
415
444
  await client.connect(new StdioClientTransport({ command: "node", args: ["dist/index.js"] }));
416
445
 
417
- // Ingest Deployment Spec (role: deployment)
446
+ // Ingest Deployment Spec (canonical: sync_source, role: deployment)
418
447
  await client.callTool({
419
- name: "sync_document",
448
+ name: "sync_source",
420
449
  arguments: { filePath: "/tmp/deployment_spec.json", subject: "api-server", sourceRole: "deployment", environment: "production" }
421
450
  });
422
451
 
423
- // Ingest Architecture Guide (role: documentation)
452
+ // Ingest Architecture Guide (canonical: sync_source, role: documentation)
424
453
  await client.callTool({
425
- name: "sync_document",
454
+ name: "sync_source",
426
455
  arguments: { filePath: "/tmp/architecture_guide.md", subject: "api-server", sourceRole: "documentation", environment: "production" }
427
456
  });
428
457
 
429
- // Automatically scan knowledge base
430
- const scan = await client.callTool({ name: "scan_for_contradictions", arguments: {} });
458
+ // Automatically scan knowledge base (canonical: scan_contradictions)
459
+ const scan = await client.callTool({ name: "scan_contradictions", arguments: {} });
431
460
  console.log("\nDISCOVERED CONTRADICTIONS:\n", JSON.stringify(JSON.parse(scan.content[0].text), null, 2));
432
461
 
433
462
  await client.close();
@@ -445,7 +474,7 @@ main();
445
474
  | `npm run build` | Compiles TypeScript and packages SQL migration scripts |
446
475
  | `npm start` | Launches compiled production server (`node dist/index.js`) |
447
476
  | `npm run dev` | Runs development server with on-the-fly TypeScript execution |
448
- | `npm test` | Runs complete Vitest test suite (**169 tests across 23 files**) |
477
+ | `npm test` | Runs complete Vitest test suite (**173 tests across 24 files**) |
449
478
  | `npm run test:coverage` | Generates detailed V8 code coverage report |
450
479
  | `npm run verify` | Runs all 62 end-to-end verification gates (protocol, security, heuristics) |
451
480
  | `npm run demo` | Executes live 17-step end-to-end demonstration scenario |
@@ -512,6 +541,31 @@ docker compose logs -f
512
541
 
513
542
  ---
514
543
 
544
+ ## Release History
545
+
546
+ ### v0.3.0 (2026-09-14)
547
+
548
+ - **12 Canonical Tools Architecture**: Streamlined tool interface into 12 orthogonal, strictly typed `verb_noun` tools (`check_health`, `list_sources`, `test_connection`, `sync_source`, `scan_contradictions`, `analyze_claim_pair`, `list_claims`, `get_claim`, `list_contradictions`, `get_contradiction`, `advise_resolution`, `resolve_contradiction`).
549
+ - **Zero-Breaking Backwards Compatibility Routing**: Added a transparent request router shim ensuring all legacy tool names continue to function seamlessly with argument translation.
550
+ - **Enhanced OpenXML (.docx) Ingestion**: Direct extraction of table structures (`<w:tr>`, `<w:tc>`) as key-value assertions with XML stripping to eliminate duplicate claims.
551
+ - **Multi-Format Cross-Document Consistency**: Verified cross-referencing and contradiction discovery across Markdown runbooks, JSON configs, and Word architecture documents.
552
+ - **Parametric Claim Queries**: Extended SQLite database layer with multi-field filtering (`predicate`, `environment`, `valueType`, `limit`, `offset`).
553
+
554
+ ### v0.2.1 (2026-09-14)
555
+
556
+ - **22 Active MCP Tools**: Full interface alignment including `scan_source_for_contradictions` for targeted source discovery.
557
+ - **Section Heading Namespacing in Markdown**: Hierarchical markdown headings (`##` to `######`) namespace nested properties (e.g. `### API Gateway` $\rightarrow$ `api_gateway_port`), preventing intra-document collisions while matching nested JSON configurations.
558
+ - **Precision Predicate Similarity Guard**: Enhanced `claimMatcher` requiring $\ge 50\%$ token overlap on multi-token phrases, eliminating false matches between distinct properties sharing generic suffixes (`node_version` vs `cache_version`, `runtime_node_version` vs `runtime_python_version`).
559
+ - **Scoped JSON Extraction**: Streamlined `flattenJsonObject` to emit unique composite paths, avoiding leaf key duplication explosions.
560
+ - **Numeric Claim Validation**: Excluded valid single-digit numbers (`4`, `3`) from short-value extraction warnings.
561
+ - **Multi-Format Ingestion**: End-to-end verified across Markdown, JSON, OpenXML `.docx`, and Kubernetes manifests.
562
+
563
+ ### v0.2.0 (2026-09-13)
564
+
565
+ - Initial public release with 21 core MCP tools, SQLite WAL persistence, GitHub, Document, and Website ingestion connectors.
566
+
567
+ ---
568
+
515
569
  ## Documentation Index
516
570
 
517
571
  - [Architecture Guide](docs/architecture.md) — Layered design, protocol topology, and component contracts.
@@ -34,6 +34,7 @@ export declare function calculateLevenshteinSimilarity(s1: string, s2: string):
34
34
  * Combined similarity score leveraging token overlap and string distance.
35
35
  */
36
36
  export declare function calculateCompositeSimilarity(strA: string, strB: string): number;
37
+ export declare function stripWrapperPrefix(pred: string): string;
37
38
  export declare function arePredicateSynonyms(predA: string, predB: string): boolean;
38
39
  export declare function getCanonicalPredicate(predicate: string): string;
39
40
  export declare const SYSTEM_LEVEL_PREDICATES: Set<string>;
@@ -85,7 +85,14 @@ export function calculateCompositeSimilarity(strA, strB) {
85
85
  const inclusionScore = minLen / maxLen;
86
86
  return Math.max(tokenSim, editSim, inclusionScore * 0.9);
87
87
  }
88
- return Math.max(tokenSim, editSim);
88
+ // For multi-token phrases, edit distance can be misleading if tokens differ:
89
+ // e.g. 'node version' vs 'cache version' has editSim 0.69 even though 'node' != 'cache'.
90
+ // Only use editSim if token overlap is already substantial (>= 0.5).
91
+ if (tokenSim >= 0.5) {
92
+ const editSim = calculateLevenshteinSimilarity(normA, normB);
93
+ return Math.max(tokenSim, editSim);
94
+ }
95
+ return tokenSim;
89
96
  }
90
97
  const PREDICATE_SYNONYM_GROUPS = [
91
98
  new Set(['port', 'listen_port', 'server_port', 'http_port', 'service_port']),
@@ -100,18 +107,29 @@ const PREDICATE_SYNONYM_GROUPS = [
100
107
  'timeout_ms',
101
108
  ]),
102
109
  new Set(['db_engine', 'database_type', 'database_engine', 'db_type', 'database', 'db_backend']),
103
- new Set(['node_version', 'node', 'nodejs_version', 'node_ver']),
104
- new Set(['python_version', 'python', 'python_ver']),
110
+ new Set(['db_version', 'database_version', 'database_db_version', 'db_ver']),
111
+ new Set(['node_version', 'node', 'nodejs_version', 'node_ver', 'runtime_node_version']),
112
+ new Set(['python_version', 'python', 'python_ver', 'runtime_python_version']),
105
113
  new Set(['memory', 'ram', 'min_ram', 'minimum_ram', 'min_memory', 'memory_limit']),
106
114
  new Set(['cpu', 'cores', 'min_cpu', 'cpu_cores']),
107
115
  ];
116
+ export function stripWrapperPrefix(pred) {
117
+ const norm = pred.toLowerCase().replace(/[^a-z0-9_]/g, '_');
118
+ return norm.replace(/^(runtime|spec|config|configuration|settings|env|metadata|properties|parameters)_+/, '');
119
+ }
108
120
  export function arePredicateSynonyms(predA, predB) {
109
121
  const a = predA.toLowerCase().replace(/[^a-z0-9_]/g, '_');
110
122
  const b = predB.toLowerCase().replace(/[^a-z0-9_]/g, '_');
111
123
  if (a === b)
112
124
  return true;
125
+ const strippedA = stripWrapperPrefix(a);
126
+ const strippedB = stripWrapperPrefix(b);
127
+ if (strippedA === strippedB && strippedA.length > 0)
128
+ return true;
113
129
  for (const group of PREDICATE_SYNONYM_GROUPS) {
114
- if (group.has(a) && group.has(b))
130
+ const hasA = group.has(a) || group.has(strippedA);
131
+ const hasB = group.has(b) || group.has(strippedB);
132
+ if (hasA && hasB)
115
133
  return true;
116
134
  }
117
135
  return false;
@@ -227,14 +245,21 @@ export class ClaimMatcher {
227
245
  if (entityMatch.isMatch) {
228
246
  subjectSimilarity = Math.max(subjectSimilarity, entityMatch.confidence);
229
247
  }
230
- const leafA = normPredA.split('_').pop() || normPredA;
231
- const leafB = normPredB.split('_').pop() || normPredB;
232
- const isSynonym = arePredicateSynonyms(claimA.predicate, claimB.predicate) ||
233
- arePredicateSynonyms(leafA, leafB);
248
+ const tokensA = normPredA.split(' ').filter(Boolean);
249
+ const tokensB = normPredB.split(' ').filter(Boolean);
250
+ const leafA = tokensA[tokensA.length - 1] || normPredA;
251
+ const leafB = tokensB[tokensB.length - 1] || normPredB;
252
+ const isSynonym = arePredicateSynonyms(claimA.predicate, claimB.predicate);
234
253
  let predicateSimilarity = calculateCompositeSimilarity(claimA.predicate, claimB.predicate);
235
- // Guard against accidental prefix matching (e.g. deployment_server_database vs deployment_server_port)
236
- if (!isSynonym && leafA !== leafB && (normPredA.includes('_') || normPredB.includes('_'))) {
237
- predicateSimilarity = 0;
254
+ // Guard against cross-subsystem false matches where two predicates share only
255
+ // a generic leaf (e.g. 'port', 'version') but have different subsystem prefixes
256
+ // (e.g. 'api_gateway_port' vs 'cache_port', 'node_version' vs 'cache_version').
257
+ if (!isSynonym) {
258
+ const prefixA = tokensA.slice(0, -1).join(' ');
259
+ const prefixB = tokensB.slice(0, -1).join(' ');
260
+ if (prefixA && prefixB && prefixA !== prefixB && leafA === leafB) {
261
+ predicateSimilarity = 0;
262
+ }
238
263
  }
239
264
  let matchDetail = '';
240
265
  if (isSynonym) {
@@ -1 +1 @@
1
- {"version":3,"file":"claimMatcher.js","sourceRoot":"","sources":["../../src/analysis/claimMatcher.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"claimMatcher.js","sourceRoot":"","sources":["../../src/analysis/claimMatcher.ts"],"names":[],"mappings":"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"}
@@ -27,7 +27,7 @@ const EnvSchema = z.object({
27
27
  DATABASE_PATH: z.string().min(1).default(getDefaultDatabasePath()),
28
28
  LOG_LEVEL: z.enum(['debug', 'info', 'warn', 'error']).default('info'),
29
29
  SERVER_NAME: z.string().min(1).default('contradiction-mcp'),
30
- SERVER_VERSION: z.string().min(1).default('0.1.0'),
30
+ SERVER_VERSION: z.string().min(1).default('0.3.0'),
31
31
  GITHUB_TOKEN: z.string().optional(),
32
32
  MCP_TRANSPORT: z.enum(['stdio', 'http']).default('stdio'),
33
33
  HTTP_HOST: z.string().default('0.0.0.0'),
@@ -1,3 +1,4 @@
1
+ import type { ClaimValueType } from '../../domain/entities/claim.js';
1
2
  /**
2
3
  * Sanitizes an error message or string to ensure tokens, secrets,
3
4
  * and sensitive authentication headers are never leaked.
@@ -28,4 +29,4 @@ export declare function hashContent(content: string): string;
28
29
  * Heuristically infers the most accurate ClaimValueType from predicate and value
29
30
  * (e.g. quantity, version, price, date, status, etc.).
30
31
  */
31
- export declare function inferClaimValueType(predicate: string, value: string): string;
32
+ export declare function inferClaimValueType(predicate: string, value: string): ClaimValueType;
@@ -1 +1 @@
1
- {"version":3,"file":"connectorUtils.js","sourceRoot":"","sources":["../../../src/connectors/base/connectorUtils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"connectorUtils.js","sourceRoot":"","sources":["../../../src/connectors/base/connectorUtils.ts"],"names":[],"mappings":"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"}
@@ -145,18 +145,44 @@ export class DocumentConnector {
145
145
  encoding: 'utf-8',
146
146
  maxBuffer: this.maxFileSizeBytes,
147
147
  });
148
- const paragraphs = xml.match(/<w:p\b[^>]*>.*?<\/w:p>/gs) || [xml];
149
- lines = paragraphs
150
- .map((p) => {
148
+ const extractedLines = [];
149
+ // 1. Extract table rows (<w:tr>) first to capture tabular specifications and key-value matrices
150
+ const tableRows = xml.match(/<w:tr\b[^>]*>.*?<\/w:tr>/gs) || [];
151
+ for (const tr of tableRows) {
152
+ const cells = tr.match(/<w:tc\b[^>]*>.*?<\/w:tc>/gs) || [];
153
+ const cellTexts = cells
154
+ .map((cell) => {
155
+ const tMatches = cell.match(/<w:t\b[^>]*>([^<]*)<\/w:t>/g) || [];
156
+ return tMatches
157
+ .map((t) => t.replace(/<[^>]+>/g, ''))
158
+ .join('')
159
+ .trim();
160
+ })
161
+ .filter(Boolean);
162
+ if (cellTexts.length >= 2) {
163
+ extractedLines.push(`- ${cellTexts[0]}: ${cellTexts.slice(1).join(' ')}`);
164
+ }
165
+ else if (cellTexts.length === 1) {
166
+ extractedLines.push(cellTexts[0]);
167
+ }
168
+ }
169
+ // 2. Extract regular paragraphs outside tables
170
+ const xmlWithoutTables = xml.replace(/<w:tbl\b[^>]*>.*?<\/w:tbl>/gs, '');
171
+ const paragraphs = xmlWithoutTables.match(/<w:p\b[^>]*>.*?<\/w:p>/gs) || [];
172
+ for (const p of paragraphs) {
151
173
  const textMatches = p.match(/<w:t\b[^>]*>([^<]*)<\/w:t>/g);
152
174
  if (!textMatches)
153
- return '';
154
- return textMatches
175
+ continue;
176
+ const text = textMatches
155
177
  .map((t) => t.replace(/<[^>]+>/g, ''))
156
178
  .join('')
157
179
  .trim();
158
- })
159
- .filter(Boolean);
180
+ if (text) {
181
+ extractedLines.push(text);
182
+ }
183
+ }
184
+ // De-duplicate contiguous identical lines
185
+ lines = extractedLines.filter((l, idx) => idx === 0 || l !== extractedLines[idx - 1]);
160
186
  content = lines.join('\n');
161
187
  }
162
188
  catch (err) {
@@ -243,7 +269,6 @@ export class DocumentConnector {
243
269
  return claims;
244
270
  }
245
271
  extractFromEmail(lines, filePath, subjectBase, env, scope, sourceRole, claims, observedAt) {
246
- let emailSubject = '';
247
272
  let emailDate = null;
248
273
  const bodyLines = [];
249
274
  let isBody = false;
@@ -253,10 +278,6 @@ export class DocumentConnector {
253
278
  isBody = true;
254
279
  continue;
255
280
  }
256
- const subMatch = line.match(/^Subject:\s*(.+)$/i);
257
- if (subMatch) {
258
- emailSubject = subMatch[1].trim();
259
- }
260
281
  const dateMatch = line.match(/^Date:\s*(.+)$/i);
261
282
  if (dateMatch) {
262
283
  const parsed = Date.parse(dateMatch[1]);
@@ -308,18 +329,34 @@ export class DocumentConnector {
308
329
  // Fallback
309
330
  }
310
331
  }
311
- flattenJsonObject(obj, prefix = '') {
332
+ flattenJsonObject(obj, prefix = '', depth = 0) {
312
333
  const entries = [];
313
334
  for (const [k, v] of Object.entries(obj)) {
314
335
  const compositeKey = prefix ? `${prefix}_${k}` : k;
315
336
  if (typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean') {
337
+ // Always emit the full composite key (namespaced path) for uniqueness.
338
+ // Only emit a bare leaf alias at depth 0 (top-level keys are unambiguous).
339
+ // For nested keys (depth > 0), the bare leaf is ambiguous across sections
340
+ // (e.g. api_gateway.port vs cache.port) and causes false-positive pairs.
316
341
  entries.push([compositeKey, v]);
317
- if (prefix && !entries.some(([exK]) => exK === k)) {
318
- entries.push([k, v]);
319
- }
320
342
  }
321
343
  else if (typeof v === 'object' && v !== null && !Array.isArray(v)) {
322
- entries.push(...this.flattenJsonObject(v, compositeKey));
344
+ entries.push(...this.flattenJsonObject(v, compositeKey, depth + 1));
345
+ }
346
+ else if (Array.isArray(v)) {
347
+ // For env-style arrays [{name, value}], extract name=value pairs
348
+ for (const item of v) {
349
+ if (typeof item === 'object' &&
350
+ item !== null &&
351
+ 'name' in item &&
352
+ 'value' in item &&
353
+ typeof item.name === 'string') {
354
+ const envItem = item;
355
+ const leafKey = envItem.name.toLowerCase().replace(/[^a-z0-9_]/g, '_');
356
+ const leafVal = String(envItem.value);
357
+ entries.push([leafKey, leafVal]);
358
+ }
359
+ }
323
360
  }
324
361
  }
325
362
  return entries;
@@ -406,10 +443,29 @@ export class DocumentConnector {
406
443
  const directKvPattern = /^\s*(?:[-*+]|\d+\.)?\s*(?:\*{1,2}|`|__)?([a-zA-Z0-9_\s.-]{2,50}?)(?:\*{1,2}|`|__)?\s*[:=]\s*(?:\*{1,2}|`|__)?([^\r\n#]{1,160}?)(?:\*{1,2}|`|__)?(?:\s+#.*)?$/;
407
444
  // Markdown table row pattern
408
445
  const tablePattern = /^\s*\|\s*([^|:\r\n]{2,50}?)\s*\|\s*([^|\r\n]{1,160}?)\s*\|/;
446
+ let currentSection = null;
409
447
  for (let i = 0; i < lines.length; i++) {
410
448
  const line = lines[i];
411
449
  if (!line || !line.trim())
412
450
  continue;
451
+ const headingMatch = line.match(/^(#{2,6})\s+(.+)$/);
452
+ if (headingMatch) {
453
+ const rawHeading = headingMatch[2].trim();
454
+ const genericSections = /^(overview|introduction|getting started|summary|table of contents|notes|appendix|prerequisites|requirements|runtime requirements|deployment profile|deployment requirements|technology stack|service configuration|configuration|specifications|specs|monitoring|security|hardware requirements)/i;
455
+ if (!genericSections.test(rawHeading)) {
456
+ let s = rawHeading
457
+ .toLowerCase()
458
+ .replace(/[^a-z0-9_]/g, '_')
459
+ .replace(/_+/g, '_')
460
+ .replace(/^_|_$/g, '');
461
+ s = s.replace(/_(cluster|layer|service|server|component|section)$/, '');
462
+ currentSection = s;
463
+ }
464
+ else {
465
+ currentSection = null;
466
+ }
467
+ continue;
468
+ }
413
469
  let key = null;
414
470
  let val = null;
415
471
  let method = 'markdown_pattern';
@@ -419,6 +475,15 @@ export class DocumentConnector {
419
475
  const rawK = directMatch[1].trim();
420
476
  const rawV = directMatch[2].trim();
421
477
  if (rawK && rawV && !rawK.startsWith('#') && !rawK.includes('---')) {
478
+ const lowerK = rawK.toLowerCase();
479
+ if (lowerK === 'specification' ||
480
+ lowerK === 'property' ||
481
+ lowerK === 'setting' ||
482
+ lowerK === 'key' ||
483
+ lowerK === 'parameter' ||
484
+ lowerK === 'attribute') {
485
+ continue;
486
+ }
422
487
  key = rawK.toLowerCase().replace(/[^a-z0-9_]/g, '_');
423
488
  val = rawV.replace(/^[*`_"'\s]+|[*`_"'\s]+$/g, '').trim();
424
489
  const qtyMatch = val.match(/(?:at\s+least|minimum|requires|is)?\s*(\d+(?:\.\d+)?\s*(?:gb|mb|tb|kb|g|m|b|ms|s|sec|seconds|minutes|hours))\b/i);
@@ -500,11 +565,15 @@ export class DocumentConnector {
500
565
  }
501
566
  }
502
567
  if (key && val && key.length > 2 && val.length > 0 && !val.startsWith('http')) {
503
- const externalId = createClaimExternalId('document', filePath, key, String(i + 1));
504
- const valueType = inferClaimValueType(key, val);
568
+ let finalKey = key;
569
+ if (currentSection && !key.startsWith(currentSection)) {
570
+ finalKey = `${currentSection}_${key}`;
571
+ }
572
+ const externalId = createClaimExternalId('document', filePath, finalKey, String(i + 1));
573
+ const valueType = inferClaimValueType(finalKey, val);
505
574
  claims.push({
506
575
  subject: subjectBase,
507
- predicate: key,
576
+ predicate: finalKey,
508
577
  value: val,
509
578
  valueType,
510
579
  environment: env,