feat: add deterministic content extractor selector engine with F1 consensus

This commit is contained in:
2026-08-20 22:09:43 -03:00
parent 6a45368cb0
commit ff7a50e0eb
46 changed files with 18503 additions and 2813 deletions
+22 -6
View File
@@ -44,10 +44,10 @@
"42": "1. Input Schemas",
"43": "2. Basic CLI Usage Examples",
"44": "2. Standard Streams & Exit Codes",
"45": "classifier.py",
"45": "ClassificationResult",
"46": "InherenceClassifier",
"47": "detect_language",
"48": "ClassificationError",
"47": "classifier.py",
"48": "main",
"49": "content_northvolt_de.md",
"50": "content_presal_pt.md",
"51": "content_tangential_es.md",
@@ -99,12 +99,12 @@
"97": "🧠 TextNLPClassifierApp",
"98": "Extraction Pipeline Checklist: Article Content Multi-Engine Extractor",
"99": "sample_rss_xml",
"100": "main",
"100": "models.py",
"101": "ECPSnapshot",
"102": "Feature Specification: Multilingual NLP Entity Inherence Classifier (POC)",
"103": "4. Requisitos Funcionais (FR)",
"104": "Tasks: Article Content Multi-Engine Extractor",
"105": "models.py",
"105": "LocalEmbeddingsAdapter",
"106": "Implementation Plan: Article Content Multi-Engine Extractor",
"107": "2. Cenários de Validação",
"108": "1. Technical Decisions & Tradeoffs",
@@ -113,5 +113,21 @@
"111": "Specification Quality Checklist: Multilingual NLP Entity Inherence Classifier",
"112": "CLI Contract: Article Content Multi-Engine Extractor",
"113": "001-multilingual-entity-classifier/spec.md",
"114": "JSON Schema Contract: Article Content Multi-Engine Extractor"
"114": "JSON Schema Contract: Article Content Multi-Engine Extractor",
"115": "PRD — Seleção determinística da biblioteca de extração de conteúdo",
"116": "select_article_extractor.py",
"117": "1. Text Normalization Pipeline",
"118": "Tasks: Deterministic Article Content Selection",
"119": "select_article_extractor",
"120": "process_batch",
"122": "test_select_article_extractor.py",
"123": "Feature Specification: Deterministic Content Selection",
"124": "2. Entity Descriptions & Fields",
"125": "Implementation Plan: Deterministic Article Content Selection",
"126": "Deterministic Content Selection Checklist: End-to-End Requirements Quality",
"127": "Quickstart: Deterministic Article Content Selection",
"128": "Specification Quality Checklist: Deterministic Content Selection",
"129": "CLI Interface Contract: Deterministic Article Content Selection",
"130": "004-deterministic-content-selection/spec.md",
"131": "JSON Schema Contract: Deterministic Article Content Selection"
}
+1 -1
View File
@@ -1 +1 @@
{"0": "36bdb6f09c457f7c", "1": "8c5bf6244cf710c6", "2": "efbcc9c62a3ee78b", "3": "8599153989b07faa", "4": "b5952a1f7fee9f20", "5": "5b8462a3f82d188c", "6": "80f79e9e2011a3e3", "7": "4654167fd211d027", "8": "50acfa00fe353440", "9": "c6d2f770737823f1", "10": "44f2ca451aea24be", "11": "feaac5ab67a8c17a", "12": "b71bd92e5edbf2e0", "13": "219d65ba6d2689e4", "14": "8e30bb8112fd02d1", "15": "03906ab80b99db85", "16": "5d51c60ba1bc2be0", "17": "a1da914f522dcd21", "18": "fbad840891b90569", "19": "0686ff2d6fe29fb3", "20": "060baa9e1924b465", "21": "a5c8f2c3080b8243", "22": "0d76852f1d29eeb1", "23": "6ff68619f2d72924", "24": "3da11675eee7ec46", "25": "a6696589e9556f97", "26": "6c752999e8a4d4b6", "27": "2d4e13ea2111d750", "28": "4b60cb0ee1ac186a", "29": "f56fbca9bb8235ec", "30": "c7beed940704509f", "31": "38be2d254fb31ae8", "32": "ee5596fcf7e7c0b3", "33": "e4d4e0a440bc599f", "34": "c897e49c001acdae", "35": "3aad272a2cf5d495", "36": "0a197439d306b956", "37": "f43acf5c8b1329af", "38": "6775efafc9b33338", "39": "8176a164778526f9", "40": "66b69189c0acc3ff", "41": "0322ff824966a4d8", "42": "784c9e3d336a7f53", "43": "4b8bb6c3f7b64856", "44": "18c0ff3e6225bcb2", "45": "70b30e0a139bbd59", "46": "58f3596265f5f902", "47": "f89e819a4cc2d299", "48": "b45478cb1443df68", "49": "0d0f9f015921feef", "50": "8d0c81e5ca23e9a6", "51": "f79963571b9c15ee", "52": "5935824c825606cb", "53": "9685f9cbe158e50b", "54": "3d5ab759f350bc79", "55": "d549f24931a990e9", "56": "3cc031dcb648797c", "57": "a0ab88e6c629251d", "58": "76bd6412e2a22ecd", "59": "54827845564490c9", "60": "0a9736c416c0c6b9", "61": "77358620ac528153", "62": "3b0c585df09df48a", "63": "7e78cd3b28828c20", "64": "1c0c958231735f61", "65": "60b0f81225f62f69", "66": "920754c65cc94b88", "67": "df911472140a9b94", "68": "8e17bc11bcea91b9", "69": "7e905b75e4f28b95", "70": "a28424eca5d36c55", "71": "2cdb53d5b6051ab6", "72": "e42fbd3dc744e730", "73": "7fe2cac980de160c", "74": "2b1343a6a9db1487", "75": "54a1bb232f1d4ceb", "76": "442ba11d31ec0e0a", "77": "852a25b8b95bf8d1", "78": "1810ab370b9cd608", "79": "0fc5dca02a3f02f6", "80": "6ff8a97e63c9a2f3", "81": "a38f84ae3d895236", "82": "08e48bd11f9714df", "83": "5095122914e83cf5", "84": "1aef305bd7d7d63f", "85": "f8bfd0cfe9e8b478", "86": "410d15a346bd5894", "87": "6b41d288cfd834ab", "88": "5aa6db96312a8811", "89": "80225792bb62ba04", "90": "fd291228c3311f40", "91": "d4579c5b7aa2742a", "92": "7b9ba7c3bff11361", "93": "71cd9c1fa4a857f0", "94": "34cd980be3c32d21", "95": "970093453f3b7d90", "96": "9e96780a2b7c4bd6", "97": "a4e57776e229c794", "98": "089ea6a55861c693", "99": "8968e9e7d55afcbe", "100": "daa6156e559cda08", "101": "14e5b6323d34c337", "102": "6aa00d5a83295f11", "103": "f58668f5b10ccdeb", "104": "4ec787414cc6f50b", "105": "de672873b6dec6e2", "106": "edcd5d9bb3c4b00f", "107": "37f2f47110fe3eaa", "108": "b7ad5abb1da8cf8d", "109": "cb48a9c4f54efa38", "110": "f6dd36fd7f3edbe5", "111": "2925b620f0b1fd17", "112": "d8b3099917c3b711", "113": "3bb61caa0302c804", "114": "0d4f1d08dd056bb9"}
{"0": "36bdb6f09c457f7c", "1": "8c5bf6244cf710c6", "2": "efbcc9c62a3ee78b", "3": "8599153989b07faa", "4": "b5952a1f7fee9f20", "5": "5b8462a3f82d188c", "6": "80f79e9e2011a3e3", "7": "4654167fd211d027", "8": "50acfa00fe353440", "9": "c6d2f770737823f1", "10": "44f2ca451aea24be", "11": "feaac5ab67a8c17a", "12": "b71bd92e5edbf2e0", "13": "219d65ba6d2689e4", "14": "8e30bb8112fd02d1", "15": "03906ab80b99db85", "16": "5d51c60ba1bc2be0", "17": "a1da914f522dcd21", "18": "fbad840891b90569", "19": "0686ff2d6fe29fb3", "20": "060baa9e1924b465", "21": "a5c8f2c3080b8243", "22": "0d76852f1d29eeb1", "23": "6ff68619f2d72924", "24": "3da11675eee7ec46", "25": "a6696589e9556f97", "26": "6c752999e8a4d4b6", "27": "2d4e13ea2111d750", "28": "4b60cb0ee1ac186a", "29": "f56fbca9bb8235ec", "30": "c7beed940704509f", "31": "38be2d254fb31ae8", "32": "ee5596fcf7e7c0b3", "33": "e4d4e0a440bc599f", "34": "c897e49c001acdae", "35": "3aad272a2cf5d495", "36": "0a197439d306b956", "37": "f43acf5c8b1329af", "38": "6775efafc9b33338", "39": "8176a164778526f9", "40": "66b69189c0acc3ff", "41": "0322ff824966a4d8", "42": "784c9e3d336a7f53", "43": "4b8bb6c3f7b64856", "44": "18c0ff3e6225bcb2", "45": "1880db165e83768c", "46": "58f3596265f5f902", "47": "4e9a638bf1f93e1b", "48": "cc757e9c9987201b", "49": "0d0f9f015921feef", "50": "8d0c81e5ca23e9a6", "51": "f79963571b9c15ee", "52": "5935824c825606cb", "53": "9685f9cbe158e50b", "54": "3d5ab759f350bc79", "55": "d549f24931a990e9", "56": "3cc031dcb648797c", "57": "a0ab88e6c629251d", "58": "76bd6412e2a22ecd", "59": "54827845564490c9", "60": "0a9736c416c0c6b9", "61": "77358620ac528153", "62": "3b0c585df09df48a", "63": "7e78cd3b28828c20", "64": "1c0c958231735f61", "65": "60b0f81225f62f69", "66": "920754c65cc94b88", "67": "df911472140a9b94", "68": "8e17bc11bcea91b9", "69": "7e905b75e4f28b95", "70": "a28424eca5d36c55", "71": "2cdb53d5b6051ab6", "72": "e42fbd3dc744e730", "73": "7fe2cac980de160c", "74": "2b1343a6a9db1487", "75": "54a1bb232f1d4ceb", "76": "442ba11d31ec0e0a", "77": "852a25b8b95bf8d1", "78": "1810ab370b9cd608", "79": "0fc5dca02a3f02f6", "80": "6ff8a97e63c9a2f3", "81": "a38f84ae3d895236", "82": "08e48bd11f9714df", "83": "5095122914e83cf5", "84": "1aef305bd7d7d63f", "85": "f8bfd0cfe9e8b478", "86": "410d15a346bd5894", "87": "6b41d288cfd834ab", "88": "5aa6db96312a8811", "89": "80225792bb62ba04", "90": "fd291228c3311f40", "91": "d4579c5b7aa2742a", "92": "7b9ba7c3bff11361", "93": "71cd9c1fa4a857f0", "94": "34cd980be3c32d21", "95": "970093453f3b7d90", "96": "9e96780a2b7c4bd6", "97": "e091504212d41fa4", "98": "089ea6a55861c693", "99": "8968e9e7d55afcbe", "100": "a7b5a49d77797f1b", "101": "21a45c852f9aeb96", "102": "6aa00d5a83295f11", "103": "f58668f5b10ccdeb", "104": "4ec787414cc6f50b", "105": "b42f25c7ec3542ab", "106": "edcd5d9bb3c4b00f", "107": "37f2f47110fe3eaa", "108": "b7ad5abb1da8cf8d", "109": "cb48a9c4f54efa38", "110": "f6dd36fd7f3edbe5", "111": "2925b620f0b1fd17", "112": "d8b3099917c3b711", "113": "3bb61caa0302c804", "114": "0d4f1d08dd056bb9", "115": "4ac2dcddeec2ff11", "116": "0bd2e5150cdcc835", "117": "196f63e0c4536d30", "118": "ade84262e3cfac12", "119": "6adb71671a1f363f", "120": "3d4cabafb8ebe1b7", "122": "80cc7c4359559d19", "123": "96618c9a362af46c", "124": "83f104cbb62fd03e", "125": "6db738fb27190349", "126": "6a087a22cbcef972", "127": "85fd71a0cad8d3a5", "128": "22dd4feed96c4229", "129": "c4d2f60f532e6f16", "130": "f6b0aa8a1568926b", "131": "56747bad6345d66b"}
+21 -5
View File
@@ -44,10 +44,10 @@
"42": "1. Input Schemas",
"43": "2. Basic CLI Usage Examples",
"44": "2. Standard Streams & Exit Codes",
"45": "LocalEmbeddingsAdapter",
"45": "ClassificationResult",
"46": "InherenceClassifier",
"47": "detect_language",
"48": "classifier.py",
"48": "models.py",
"49": "content_northvolt_de.md",
"50": "content_presal_pt.md",
"51": "content_tangential_es.md",
@@ -99,12 +99,12 @@
"97": "🧠 TextNLPClassifierApp",
"98": "Extraction Pipeline Checklist: Article Content Multi-Engine Extractor",
"99": "sample_rss_xml",
"100": "models.py",
"100": "ClassificationError",
"101": "ECPSnapshot",
"102": "Feature Specification: Multilingual NLP Entity Inherence Classifier (POC)",
"103": "4. Requisitos Funcionais (FR)",
"104": "Tasks: Article Content Multi-Engine Extractor",
"105": "ClassificationResult",
"105": "classifier.py",
"106": "Implementation Plan: Article Content Multi-Engine Extractor",
"107": "2. Cenários de Validação",
"108": "1. Technical Decisions & Tradeoffs",
@@ -113,5 +113,21 @@
"111": "Specification Quality Checklist: Multilingual NLP Entity Inherence Classifier",
"112": "CLI Contract: Article Content Multi-Engine Extractor",
"113": "001-multilingual-entity-classifier/spec.md",
"114": "JSON Schema Contract: Article Content Multi-Engine Extractor"
"114": "JSON Schema Contract: Article Content Multi-Engine Extractor",
"115": "PRD — Seleção determinística da biblioteca de extração de conteúdo",
"116": "select_article_extractor.py",
"117": "1. Text Normalization Pipeline",
"118": "Tasks: Deterministic Article Content Selection",
"119": "select_article_extractor",
"120": "process_batch",
"122": "test_select_article_extractor.py",
"123": "Feature Specification: Deterministic Content Selection",
"124": "2. Entity Descriptions & Fields",
"125": "Implementation Plan: Deterministic Article Content Selection",
"126": "Deterministic Content Selection Checklist: End-to-End Requirements Quality",
"127": "Quickstart: Deterministic Article Content Selection",
"128": "Specification Quality Checklist: Deterministic Content Selection",
"129": "CLI Interface Contract: Deterministic Article Content Selection",
"130": "004-deterministic-content-selection/spec.md",
"131": "JSON Schema Contract: Deterministic Article Content Selection"
}
+120 -45
View File
@@ -1,16 +1,16 @@
# Graph Report - TextNLPClassifierApp (2026-08-20)
## Corpus Check
- 161 files · ~78,476 words
- 174 files · ~91,254 words
- Verdict: corpus is large enough that graph structure adds value.
## Summary
- 1000 nodes · 1226 edges · 115 communities (77 shown, 38 thin omitted)
- Extraction: 97% EXTRACTED · 3% INFERRED · 0% AMBIGUOUS · INFERRED: 39 edges (avg confidence: 0.95)
- 1233 nodes · 1546 edges · 131 communities (93 shown, 38 thin omitted)
- Extraction: 97% EXTRACTED · 3% INFERRED · 0% AMBIGUOUS · INFERRED: 51 edges (avg confidence: 0.95)
- Token cost: 0 input · 0 output
## Graph Freshness
- Built from commit: `6e3d5761`
- Built from commit: `6a45368c`
- Run `git rev-parse HEAD` and compare to check if the graph is stale.
- Run `graphify update .` after code changes (no API cost).
@@ -56,10 +56,10 @@
- 1. Input Schemas
- 2. Basic CLI Usage Examples
- 2. Standard Streams & Exit Codes
- LocalEmbeddingsAdapter
- ClassificationResult
- InherenceClassifier
- detect_language
- classifier.py
- models.py
- content_northvolt_de.md
- content_presal_pt.md
- content_tangential_es.md
@@ -110,12 +110,12 @@
- 🧠 TextNLPClassifierApp
- Extraction Pipeline Checklist: Article Content Multi-Engine Extractor
- sample_rss_xml
- models.py
- ClassificationError
- ECPSnapshot
- Feature Specification: Multilingual NLP Entity Inherence Classifier (POC)
- 4. Requisitos Funcionais (FR)
- Tasks: Article Content Multi-Engine Extractor
- ClassificationResult
- classifier.py
- Implementation Plan: Article Content Multi-Engine Extractor
- 2. Cenários de Validação
- 1. Technical Decisions & Tradeoffs
@@ -124,18 +124,33 @@
- Specification Quality Checklist: Multilingual NLP Entity Inherence Classifier
- CLI Contract: Article Content Multi-Engine Extractor
- JSON Schema Contract: Article Content Multi-Engine Extractor
- PRD — Seleção determinística da biblioteca de extração de conteúdo
- select_article_extractor.py
- 1. Text Normalization Pipeline
- Tasks: Deterministic Article Content Selection
- select_article_extractor
- process_batch
- test_select_article_extractor.py
- Feature Specification: Deterministic Content Selection
- 2. Entity Descriptions & Fields
- Implementation Plan: Deterministic Article Content Selection
- Deterministic Content Selection Checklist: End-to-End Requirements Quality
- Quickstart: Deterministic Article Content Selection
- Specification Quality Checklist: Deterministic Content Selection
- CLI Interface Contract: Deterministic Article Content Selection
- JSON Schema Contract: Deterministic Article Content Selection
## God Nodes (most connected - your core abstractions)
1. `ECPSnapshot` - 31 edges
2. `InherenceClassifier` - 25 edges
3. `DecisionCategory` - 18 edges
4. `ClassificationResult` - 17 edges
5. `process_batch()` - 15 edges
6. `LocalEmbeddingsAdapter` - 14 edges
7. `LLMFallbackAdapter` - 14 edges
8. `detect_language()` - 14 edges
9. `main()` - 13 edges
10. `ArticleCrawler` - 13 edges
3. `select_article_extractor()` - 23 edges
4. `ExtractorName` - 21 edges
5. `DecisionCategory` - 17 edges
6. `ClassificationResult` - 17 edges
7. `process_batch()` - 15 edges
8. `process_batch()` - 14 edges
9. `LocalEmbeddingsAdapter` - 14 edges
10. `LLMFallbackAdapter` - 14 edges
## Surprising Connections (you probably didn't know these)
- `main()` --uses--> `ECPSnapshot` [INFERRED]
@@ -146,13 +161,13 @@
tests/test_benchmark_24.py → src/classifier.py
- `test_classification_result_serialization()` --uses--> `DecisionCategory` [INFERRED]
tests/test_models.py → src/models.py
- `petrobras_ecp()` --uses--> `ECPSnapshot` [INFERRED]
tests/test_classifier.py → src/models.py
- `test_classification_error_serialization()` --uses--> `ErrorCode` [INFERRED]
tests/test_models.py → src/models.py
## Import Cycles
- None detected.
## Communities (115 total, 38 thin omitted)
## Communities (131 total, 38 thin omitted)
### Community 0 - "Task Planning"
Cohesion: 0.07
@@ -294,21 +309,21 @@ Nodes (7): 1. Prerequisites & Installation, 2.1 Direct Inherence (Portuguese), 2
Cohesion: 0.29
Nodes (6): 1.1 Arguments & Options, 1. Command Line Interface, 2.1 Exit Codes, 2.2 Standard Output (`stdout`) / Standard Error (`stderr`), 2. Standard Streams & Exit Codes, CLI Contract & Interface Specification (POC)
### Community 45 - "LocalEmbeddingsAdapter"
Cohesion: 0.14
Nodes (8): LocalEmbeddingsAdapter, Optional adapter for local multilingual semantic vector embeddings., LLMFallbackAdapter, Optional adapter for LLM fallback boundary disambiguation., Unit tests for optional adapter interfaces (Tier 2 / Tier 3)., test_classifier_with_adapter_flags(), test_embeddings_adapter_interface(), test_llm_adapter_interface()
### Community 45 - "ClassificationResult"
Cohesion: 0.17
Nodes (10): ABC, BaseNLPAdapter, Base abstract adapter interface for optional Tier 2 / Tier 3 NLP enhancers., Abstract interface for pluggable NLP classification adapters., Return True if the underlying provider or model is installed and configured., Compute semantic similarity score between text and a set of candidate terms., Optionally refine an ambiguous classification result., Optional LLM fallback adapter (Tier 3). Disabled by default. Provides fallback… (+2 more)
### Community 46 - "InherenceClassifier"
Cohesion: 0.12
Nodes (27): InherenceClassifier, Tier 1 Deterministic NLP Entity Inherence Classifier., DecisionCategory, RelatedEntity, Adversarial and robustness test suite for Multilingual NLP Entity Inherence…, Run CLI via subprocess with empty content and verify error code and exit code., Content about city/state governance of São Paulo against ECP for São Paulo FC., Run CLI via subprocess with missing target_name and verify error payload. (+19 more)
Nodes (27): InherenceClassifier, Tier 1 Deterministic NLP Entity Inherence Classifier., DecisionCategory, RelatedEntity, Adversarial and robustness test suite for Multilingual NLP Entity Inherence…, Run CLI via subprocess without --output and verify stdout is pure parseable…, Run CLI via subprocess with empty content and verify error code and exit code., Content about city/state governance of São Paulo against ECP for São Paulo FC. (+19 more)
### Community 47 - "detect_language"
Cohesion: 0.14
Nodes (21): count_phrase_occurrences(), match_phrase_in_text(), Check if a normalized phrase appears in normalized text with word boundary…, Count occurrences of a phrase in text., Classify inherence of content against an ECP snapshot., detect_language(), extract_words(), normalize_text() (+13 more)
Cohesion: 0.09
Nodes (30): count_phrase_occurrences(), match_phrase_in_text(), Check if a normalized phrase appears in normalized text with word boundary…, Count occurrences of a phrase in text., Classify inherence of content against an ECP snapshot., detect_language(), extract_words(), normalize_text() (+22 more)
### Community 48 - "classifier.py"
Cohesion: 0.24
Nodes (11): Core deterministic classification engine (Tier 1 core)., extract_evidence_snippets(), extract_sentences(), Markdown content parser and excerpt extraction utilities., Remove markdown syntax markers (headers, bold, italics, links, code blocks) to…, Split text into individual sentences., Extract relevant sentence excerpts from Markdown text that contain any of the…, strip_markdown() (+3 more)
### Community 48 - "models.py"
Cohesion: 0.19
Nodes (15): emit_error(), main(), parse_args(), Namespace, ErrorCode, MatchedGraphEntity, Enum, str (+7 more)
### Community 80 - "test_extract_article_contents.py"
Cohesion: 0.06
@@ -382,13 +397,13 @@ Nodes (34): 1. Requirement Completeness, 2. Requirement Clarity & Non-Ambiguity,
Cohesion: 0.67
Nodes (3): fixture, Fixture que fornece o conteúdo do XML de exemplo para testes offline., sample_rss_xml()
### Community 100 - "models.py"
Cohesion: 0.15
Nodes (17): emit_error(), main(), parse_args(), Namespace, Enum, ClassificationError, ErrorCode, MatchedGraphEntity (+9 more)
### Community 100 - "ClassificationError"
Cohesion: 0.29
Nodes (3): ClassificationError, Any, test_classification_error_serialization()
### Community 101 - "ECPSnapshot"
Cohesion: 0.22
Nodes (10): parametrize, ECPSnapshot, Any, classifier(), fixture, Controlled 24-case benchmark suite for Multilingual NLP Entity Inherence…, test_benchmark_case(), test_ecp_snapshot_defaults() (+2 more)
Cohesion: 0.24
Nodes (10): parametrize, ECPSnapshot, classifier(), fixture, Controlled 24-case benchmark suite for Multilingual NLP Entity Inherence…, test_benchmark_case(), Unit tests for ECP models, schema validation, and structured error handling., test_ecp_snapshot_defaults() (+2 more)
### Community 102 - "Feature Specification: Multilingual NLP Entity Inherence Classifier (POC)"
Cohesion: 0.14
@@ -402,13 +417,13 @@ Nodes (20): 1.1 Objetivo do Produto, 1. Visão Geral e Contexto, 2. Personas e C
Cohesion: 0.11
Nodes (18): Dependencies & Execution Order, Entrega Incremental, Implementation Strategy, Implementação da User Story 1, Implementação da User Story 2, Implementação da User Story 3, MVP First (User Story 1 Only), Oportunidades de Execução Paralela (+10 more)
### Community 105 - "ClassificationResult"
Cohesion: 0.16
Nodes (11): ABC, BaseNLPAdapter, Base abstract adapter interface for optional Tier 2 / Tier 3 NLP enhancers., Abstract interface for pluggable NLP classification adapters., Return True if the underlying provider or model is installed and configured., Compute semantic similarity score between text and a set of candidate terms., Optionally refine an ambiguous classification result., Optional local vector embeddings adapter (Tier 2). Disabled by default.… (+3 more)
### Community 105 - "classifier.py"
Cohesion: 0.13
Nodes (10): LocalEmbeddingsAdapter, Optional local vector embeddings adapter (Tier 2). Disabled by default.…, Optional adapter for local multilingual semantic vector embeddings., LLMFallbackAdapter, Optional adapter for LLM fallback boundary disambiguation., Core deterministic classification engine (Tier 1 core)., Unit tests for optional adapter interfaces (Tier 2 / Tier 3)., test_classifier_with_adapter_flags() (+2 more)
### Community 106 - "Implementation Plan: Article Content Multi-Engine Extractor"
Cohesion: 0.17
Nodes (11): Constitution Check, Documentation (this feature), Implementation Phases, Implementation Plan: Article Content Multi-Engine Extractor, Phase 0: Outline & Research *(Completed)*, Phase 1: Design & Contracts *(Completed)*, Phase 2: Tasks & Execution *(Next: `/speckit-tasks`)*, Project Structure (+3 more)
Nodes (11): Constitution Check, Documentation (this feature), Implementation Phases, Implementation Plan: Article Content Multi-Engine Extractor, Phase 0: Outline & Research *(Completed)*, Phase 1: Design & Contracts *(Completed)*, Phase 2: Tasks & Execution *(Completed)*, Project Structure (+3 more)
### Community 107 - "2. Cenários de Validação"
Cohesion: 0.22
@@ -438,25 +453,85 @@ Nodes (5): 1. Comando de Execução, 2. Argumentos e Flags, 3. Códigos de Saíd
Cohesion: 0.50
Nodes (3): 1. Schema de Entrada (Input JSON), 2. Schema de Saída (Output JSON), JSON Schema Contract: Article Content Multi-Engine Extractor
### Community 115 - "PRD — Seleção determinística da biblioteca de extração de conteúdo"
Cohesion: 0.07
Nodes (29): 10. Requisitos não funcionais, 11. Critérios de aceite, 12. Casos obrigatórios de teste, 13. Definition of Done, 1. Contexto, 2. Objetivo, 3.1 Incluído, 3.2 Fora do escopo (+21 more)
### Community 116 - "select_article_extractor.py"
Cohesion: 0.16
Nodes (17): BatchProcessingResult, break_priority_tie(), calculate_consensus_metrics(), ExtractorCandidate, form_active_set(), main(), parse_args(), Namespace (+9 more)
### Community 117 - "1. Text Normalization Pipeline"
Cohesion: 0.11
Nodes (18): 1. Text Normalization Pipeline, 2. 5-Token Shingles & Consensus Metrics, 3. Regras de Decisão, Empate Técnico e Desempate Hierárquico, 4. Estratégia de I/O Não Destrutiva e Escrita Atômica, Alternatives Considered, Context, Context, Context (+10 more)
### Community 118 - "Tasks: Deterministic Article Content Selection"
Cohesion: 0.11
Nodes (18): Dependencies & Execution Order, Implementation for User Story 1, Implementation for User Story 2, Implementation for User Story 3, Implementation Strategy, Incremental Delivery (Phases 4, 5 & 6), MVP First (Phases 1, 2 & 3), Parallel Opportunities (+10 more)
### Community 119 - "select_article_extractor"
Cohesion: 0.08
Nodes (37): ArticleSelectionResult, CandidateStatus, extract_candidate_data(), ExtractorName, Any, Enum, str, Extrai campo de texto, erro e calcula tokens/shingles para um motor. (+29 more)
### Community 120 - "process_batch"
Cohesion: 0.10
Nodes (26): atomic_save_json(), process_batch(), Path, Salva dados em JSON de forma atômica utilizando arquivo temporário e rename., Lê o JSON de entrada, valida a estrutura, processa todos os artigos e grava o…, Path, CT-012: A entrada já contém selected_extractor -> Recalcular e substituir…, CT-013: articles está vazio -> Gerar saída válida com articles vazio. (+18 more)
### Community 122 - "test_select_article_extractor.py"
Cohesion: 0.21
Nodes (14): generate_shingles(), normalize_text(), Executa a normalização determinística para comparação: 1. Decodificar entidades…, Gera conjunto de shingles ordenados de tamanho window_size (padrão 5). - Se…, Suíte de Testes Automatizados para o Seletor Determinístico de Extrator. Cobre…, Garante que marcação de imagem Markdown ![alt](url) seja descartada e link…, test_generate_shingles_empty(), test_generate_shingles_short_text() (+6 more)
### Community 123 - "Feature Specification: Deterministic Content Selection"
Cohesion: 0.17
Nodes (12): Assumptions, Edge Cases, Feature Specification: Deterministic Content Selection, Functional Requirements, Key Entities *(include if feature involves data)*, Measurable Outcomes, Requirements *(mandatory)*, Success Criteria *(mandatory)* (+4 more)
### Community 124 - "2. Entity Descriptions & Fields"
Cohesion: 0.18
Nodes (11): 1. Domain Entities & Value Types, 2. Entity Descriptions & Fields, 3. JSON Schema Mapping, `ArticleSelectionResult` (Dataclass), `BatchProcessingResult` (Dataclass), `CandidateStatus` (Enum), Data Model: Deterministic Content Selection, Entrada (+3 more)
### Community 125 - "Implementation Plan: Deterministic Article Content Selection"
Cohesion: 0.18
Nodes (11): Constitution Check, Documentation (this feature), Implementation Phases, Implementation Plan: Deterministic Article Content Selection, Phase 0: Outline & Research *(Completed)*, Phase 1: Design & Contracts *(Completed)*, Phase 2: Tasks & Execution *(Next Step via `/speckit-tasks`)*, Project Structure (+3 more)
### Community 126 - "Deterministic Content Selection Checklist: End-to-End Requirements Quality"
Cohesion: 0.25
Nodes (7): Candidate State Transitions & Resilience, Decision & Tie-Breaking Hierarchy, Deterministic Content Selection Checklist: End-to-End Requirements Quality, JSON Schema Integrity & Atomic I/O, Notes, Shingles & Consensus Metric Formulation, Text Normalization & Tokenization Quality
### Community 127 - "Quickstart: Deterministic Article Content Selection"
Cohesion: 0.29
Nodes (7): 1. Pré-requisitos, 2. Execução Rápida via CLI, 3. Execução dos Testes Automatizados, 4. Validação Programática / Uso como Módulo Python, Cenário 1: Selecionar o melhor extrator para uma extração existente, Cenário 2: Especificar caminho de saída customizado e modo verboso, Quickstart: Deterministic Article Content Selection
### Community 128 - "Specification Quality Checklist: Deterministic Content Selection"
Cohesion: 0.33
Nodes (5): Content Quality, Feature Readiness, Notes, Requirement Completeness, Specification Quality Checklist: Deterministic Content Selection
### Community 129 - "CLI Interface Contract: Deterministic Article Content Selection"
Cohesion: 0.33
Nodes (5): 1. Command Syntax, 2. Arguments and Flags, 3. Standard Streams (I/O), 4. Exit Codes, CLI Interface Contract: Deterministic Article Content Selection
### Community 131 - "JSON Schema Contract: Deterministic Article Content Selection"
Cohesion: 0.50
Nodes (3): 1. Input JSON Schema, 2. Output JSON Schema, JSON Schema Contract: Deterministic Article Content Selection
## Knowledge Gaps
- **465 isolated node(s):** `text-nlp-classifier`, `MatchedGraphEntity`, `graphify`, `Usage`, `What graphify is for` (+460 more)
- **560 isolated node(s):** `text-nlp-classifier`, `MatchedGraphEntity`, `graphify`, `Usage`, `What graphify is for` (+555 more)
These have ≤1 connection - possible missing edges or undocumented components.
- **38 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes.
## Suggested Questions
_Questions this graph is uniquely positioned to answer:_
- **Why does `ECPSnapshot` connect `ECPSnapshot` to `models.py`, `ClassificationResult`, `LocalEmbeddingsAdapter`, `InherenceClassifier`, `detect_language`, `classifier.py`?**
_High betweenness centrality (0.005) - this node is a cross-community bridge._
- **Why does `InherenceClassifier` connect `InherenceClassifier` to `models.py`, `ECPSnapshot`, `ClassificationResult`, `LocalEmbeddingsAdapter`, `detect_language`, `classifier.py`?**
- **Why does `ECPSnapshot` connect `ECPSnapshot` to `classifier.py`, `ClassificationResult`, `InherenceClassifier`, `detect_language`, `models.py`?**
_High betweenness centrality (0.003) - this node is a cross-community bridge._
- **Why does `detect_language()` connect `detect_language` to `classifier.py`?**
- **Why does `LLMFallbackAdapter` connect `classifier.py` to `ECPSnapshot`, `ClassificationResult`, `InherenceClassifier`?**
_High betweenness centrality (0.003) - this node is a cross-community bridge._
- **Why does `Research & Architectural Decisions: Deterministic Content Selection` connect `1. Text Normalization Pipeline` to `004-deterministic-content-selection/spec.md`?**
_High betweenness centrality (0.003) - this node is a cross-community bridge._
- **Are the 10 inferred relationships involving `ECPSnapshot` (e.g. with `main()` and `BaseNLPAdapter`) actually correct?**
_`ECPSnapshot` has 10 INFERRED edges - model-reasoned connections that need verification._
- **Are the 6 inferred relationships involving `InherenceClassifier` (e.g. with `LocalEmbeddingsAdapter` and `LLMFallbackAdapter`) actually correct?**
_`InherenceClassifier` has 6 INFERRED edges - model-reasoned connections that need verification._
- **Are the 12 inferred relationships involving `ExtractorName` (e.g. with `test_article_1_regression_technical_tie_markdown_images()` and `test_ct_001_three_candidates_clear_winner()`) actually correct?**
_`ExtractorName` has 12 INFERRED edges - model-reasoned connections that need verification._
- **Are the 10 inferred relationships involving `DecisionCategory` (e.g. with `InherenceClassifier` and `test_adversarial_apple_fruit_recipe()`) actually correct?**
_`DecisionCategory` has 10 INFERRED edges - model-reasoned connections that need verification._
- **Are the 4 inferred relationships involving `ClassificationResult` (e.g. with `BaseNLPAdapter` and `LocalEmbeddingsAdapter`) actually correct?**
_`ClassificationResult` has 4 INFERRED edges - model-reasoned connections that need verification._
_`DecisionCategory` has 10 INFERRED edges - model-reasoned connections that need verification._
File diff suppressed because it is too large Load Diff
+150 -72
View File
@@ -294,15 +294,15 @@
"semantic_hash": ""
},
"classify.py": {
"mtime": 1787197110.3753626,
"seen": 1787197159.9828603,
"ast_hash": "d09a35a5e25d42f6ecc537d5b67bef8e",
"mtime": 1787264412.2457643,
"seen": 1787264519.0539427,
"ast_hash": "e89fc4b64bd7606fc466d5338108705b",
"semantic_hash": ""
},
"pyproject.toml": {
"mtime": 1787234982.768605,
"seen": 1787235020.6850271,
"ast_hash": "26f5f979658067bf447f375f044a8f21",
"mtime": 1787264482.8509245,
"seen": 1787264519.0539448,
"ast_hash": "409c1fc0d7bbda6830ccb71c6196cb2f",
"semantic_hash": ""
},
"src/__init__.py": {
@@ -318,45 +318,45 @@
"semantic_hash": ""
},
"src/adapters/base.py": {
"mtime": 1787196396.6199949,
"seen": 1787196463.0953116,
"ast_hash": "40dc6e175c8708467748c1f42a0e064a",
"mtime": 1787264412.2437606,
"seen": 1787264519.0542011,
"ast_hash": "220635d5d74e73f58259069bf5207908",
"semantic_hash": ""
},
"src/adapters/embeddings.py": {
"mtime": 1787196402.7484262,
"seen": 1787196463.0953145,
"ast_hash": "0444823bb05720d4c4ca1662a00b2c01",
"mtime": 1787264437.92723,
"seen": 1787264519.0542023,
"ast_hash": "7beb0ecfb7482c1fd10422da99f69abe",
"semantic_hash": ""
},
"src/adapters/llm.py": {
"mtime": 1787196408.180451,
"seen": 1787196463.0953166,
"ast_hash": "3d95d98625df3fcd343f2fecb78707c5",
"mtime": 1787264412.2437606,
"seen": 1787264519.0542035,
"ast_hash": "ba2990328f5b25ac6cdfc3b57acc9d39",
"semantic_hash": ""
},
"src/classifier.py": {
"mtime": 1787197085.0250447,
"seen": 1787197159.985785,
"ast_hash": "a2e70f968109d213fdab0ae81ac819ff",
"mtime": 1787264459.052089,
"seen": 1787264519.0542045,
"ast_hash": "b8fb440374ecd66bb8bf67c70c19ed1f",
"semantic_hash": ""
},
"src/language.py": {
"mtime": 1787196384.5545745,
"seen": 1787196463.0953217,
"ast_hash": "985619013e58a7f55af2e955817f223c",
"mtime": 1787264437.9312274,
"seen": 1787264519.0542057,
"ast_hash": "cbaf52272ebb05372e34a05cd201c270",
"semantic_hash": ""
},
"src/models.py": {
"mtime": 1787195855.3266282,
"seen": 1787196463.0953236,
"ast_hash": "ce73bfe85eb54f907e2052c80636ecaf",
"mtime": 1787264437.9302285,
"seen": 1787264519.054207,
"ast_hash": "16e604c14f7d66634dc9e2ed7959dd7c",
"semantic_hash": ""
},
"src/parser.py": {
"mtime": 1787195873.9119804,
"seen": 1787196463.0953257,
"ast_hash": "0a1d64ee7088b266125af071f85f3826",
"mtime": 1787264437.9312274,
"seen": 1787264519.054208,
"ast_hash": "d43fca3f063534e3626f86f36a97a2cc",
"semantic_hash": ""
},
"tests/__init__.py": {
@@ -366,39 +366,39 @@
"semantic_hash": ""
},
"tests/test_adapters.py": {
"mtime": 1787196418.6328156,
"seen": 1787196463.09533,
"ast_hash": "5caf95327ea030dbcc37a99bd9052ebd",
"mtime": 1787264437.9292288,
"seen": 1787264519.0543096,
"ast_hash": "7ed9ba6f62fef404bfc28a2e16ada647",
"semantic_hash": ""
},
"tests/test_benchmark_24.py": {
"mtime": 1787196325.5409796,
"seen": 1787196463.0953324,
"ast_hash": "487d30d6de2dee529fa91b86a1d62c0a",
"mtime": 1787264437.9302285,
"seen": 1787264519.0543122,
"ast_hash": "052a51561002be035de1a79455256b67",
"semantic_hash": ""
},
"tests/test_classifier.py": {
"mtime": 1787196364.7195728,
"seen": 1787196463.0953343,
"ast_hash": "4350a5b11a08d12ccb85a3f332d71e87",
"mtime": 1787264437.92723,
"seen": 1787264519.0543132,
"ast_hash": "14da0c7a7d4c08762437ca777c086dea",
"semantic_hash": ""
},
"tests/test_cli.py": {
"mtime": 1787195939.567137,
"seen": 1787196463.0953364,
"ast_hash": "90b0131d43cfc64a76e499c7a65d95de",
"mtime": 1787264437.9292288,
"seen": 1787264519.0543146,
"ast_hash": "b6f57994937363f8a1b0f2f66ea53d3a",
"semantic_hash": ""
},
"tests/test_language.py": {
"mtime": 1787195891.3329668,
"seen": 1787196463.0953388,
"ast_hash": "66191b43fcd7aef47c07cd20d5a8f03c",
"mtime": 1787264437.9292288,
"seen": 1787264519.0543184,
"ast_hash": "f1a09702410864434274f1b347769742",
"semantic_hash": ""
},
"tests/test_models.py": {
"mtime": 1787195886.5009987,
"seen": 1787196463.095341,
"ast_hash": "1fd725c8ca0f52e52f56c7223e9574d0",
"mtime": 1787264437.9302285,
"seen": 1787264519.0543194,
"ast_hash": "7ec72b612bf758be8c9a3617ce18b132",
"semantic_hash": ""
},
"examples/content_northvolt_de.md": {
@@ -570,27 +570,27 @@
"semantic_hash": ""
},
"tests/test_adversarial.py": {
"mtime": 1787197141.2340336,
"seen": 1787197159.9881344,
"ast_hash": "5e8daf517ee32c261617d96264ef0473",
"mtime": 1787264437.9242287,
"seen": 1787264519.0543108,
"ast_hash": "d353633ce31a624a8dcda790efec4d5e",
"semantic_hash": ""
},
"scripts/extract_google_news.py": {
"mtime": 1787236453.5231855,
"seen": 1787236509.1147037,
"ast_hash": "4216de490a87378d21dab707a3166679",
"mtime": 1787264437.92723,
"seen": 1787264519.0540311,
"ast_hash": "97d8a193901d5e2edf6359fad256b7ef",
"semantic_hash": ""
},
"tests/test_extract_google_news.py": {
"mtime": 1787236301.513448,
"seen": 1787236353.5582018,
"ast_hash": "1fc9a108a8abfecf1d37c8642a885e9e",
"mtime": 1787264437.9312274,
"seen": 1787264519.054317,
"ast_hash": "7561ad8fedcf1bc6cc8ed1e86a345532",
"semantic_hash": ""
},
"docs/googlenews_extractor_guia_completo.md": {
"mtime": 1787231605.0830677,
"seen": 1787234772.8112028,
"ast_hash": "59db8e652000ba6087a00289a0ce0959",
"mtime": 1787264437.9282286,
"seen": 1787264519.0578,
"ast_hash": "d7c3c64e2009dded496a08c7c91f63b9",
"semantic_hash": ""
},
"specs/002-google-news-extractor/checklists/readiness.md": {
@@ -654,21 +654,21 @@
"semantic_hash": ""
},
"README.md": {
"mtime": 1787240502.4633865,
"seen": 1787240516.5990582,
"ast_hash": "a075f140e2dd8383bec3991f92b32b26",
"mtime": 1787264334.4498444,
"seen": 1787264519.0577974,
"ast_hash": "196db110cfde06179fb750fc75afb6fe",
"semantic_hash": ""
},
"scripts/extract_article_contents.py": {
"mtime": 1787241061.3097162,
"seen": 1787241108.1811028,
"ast_hash": "08cd37738da1500b6912ffa1fb2fc0cc",
"mtime": 1787264465.3415215,
"seen": 1787264519.0540295,
"ast_hash": "2bea6b2a048526cb49d95fb88a001600",
"semantic_hash": ""
},
"tests/test_extract_article_contents.py": {
"mtime": 1787240910.5980105,
"seen": 1787241108.1826632,
"ast_hash": "98cf3b30fa6ce044d943eff381eaf8a7",
"mtime": 1787264437.9292288,
"seen": 1787264519.0543158,
"ast_hash": "56aee72480f05c714865791a935d539c",
"semantic_hash": ""
},
"docs/prd_extrator_artigos_nlp.md": {
@@ -708,9 +708,9 @@
"semantic_hash": ""
},
"specs/003-article-content-extractor/plan.md": {
"mtime": 1787239601.395844,
"seen": 1787240516.6008782,
"ast_hash": "406c3ebad1d32984c1b98f8a9b7ae9f1",
"mtime": 1787264323.707266,
"seen": 1787264519.0605621,
"ast_hash": "b2232491829a303a49e749c75f3adca2",
"semantic_hash": ""
},
"specs/003-article-content-extractor/quickstart.md": {
@@ -726,9 +726,9 @@
"semantic_hash": ""
},
"specs/003-article-content-extractor/spec.md": {
"mtime": 1787239197.9064422,
"seen": 1787240516.6008813,
"ast_hash": "9fd196b7ba4d9ba7adb2cad25d094764",
"mtime": 1787264319.2883234,
"seen": 1787264519.060745,
"ast_hash": "187b1307e28a02f0ac44895b5f9cca55",
"semantic_hash": ""
},
"specs/003-article-content-extractor/tasks.md": {
@@ -736,5 +736,83 @@
"seen": 1787240516.6008823,
"ast_hash": "d95c4763728496703cd89590288a2bed",
"semantic_hash": ""
},
"scripts/select_article_extractor.py": {
"mtime": 1787273522.903319,
"seen": 1787273548.728257,
"ast_hash": "3e6938964c7e4549051cb1637207698d",
"semantic_hash": ""
},
"tests/test_select_article_extractor.py": {
"mtime": 1787274189.7777488,
"seen": 1787274207.7989414,
"ast_hash": "9f91e09d47f06140b243b6f516d14c60",
"semantic_hash": ""
},
"docs/prd_deterministic_content_selection.md": {
"mtime": 1787264674.2038286,
"seen": 1787272611.6604555,
"ast_hash": "2c421402df8b6469ce60eaa984dce666",
"semantic_hash": ""
},
"specs/004-deterministic-content-selection/checklists/deterministic-selection.md": {
"mtime": 1787272346.8692143,
"seen": 1787272611.6713927,
"ast_hash": "6d9bcda99dbd284ffcbce372102fd868",
"semantic_hash": ""
},
"specs/004-deterministic-content-selection/checklists/requirements.md": {
"mtime": 1787264728.7202728,
"seen": 1787272611.6713977,
"ast_hash": "074efe6ba551e93f7d005c5462805693",
"semantic_hash": ""
},
"specs/004-deterministic-content-selection/contracts/cli-contract.md": {
"mtime": 1787274329.2175446,
"seen": 1787274402.0944166,
"ast_hash": "2cd795eaed6198dc343424bd20673728",
"semantic_hash": ""
},
"specs/004-deterministic-content-selection/contracts/json-schema.md": {
"mtime": 1787271837.7328393,
"seen": 1787272611.6714034,
"ast_hash": "155f0bccb7bcffabcedb6ef86b8003c5",
"semantic_hash": ""
},
"specs/004-deterministic-content-selection/data-model.md": {
"mtime": 1787271825.5970395,
"seen": 1787272611.671406,
"ast_hash": "23ec4a144f4aeeed9fee259b6165bea3",
"semantic_hash": ""
},
"specs/004-deterministic-content-selection/plan.md": {
"mtime": 1787271850.1744206,
"seen": 1787272611.671409,
"ast_hash": "3bebc2a73a9632d42ccca646af592133",
"semantic_hash": ""
},
"specs/004-deterministic-content-selection/quickstart.md": {
"mtime": 1787274324.1467915,
"seen": 1787274402.0946271,
"ast_hash": "a7886ca618af43f33971213e2255b3c6",
"semantic_hash": ""
},
"specs/004-deterministic-content-selection/research.md": {
"mtime": 1787274316.8544433,
"seen": 1787274402.0946283,
"ast_hash": "73ac1637d31472e25b0a1709cd137e5c",
"semantic_hash": ""
},
"specs/004-deterministic-content-selection/spec.md": {
"mtime": 1787274311.1564865,
"seen": 1787274402.0946293,
"ast_hash": "b2c994a14871c2e6e1cf4a11db7dbeb5",
"semantic_hash": ""
},
"specs/004-deterministic-content-selection/tasks.md": {
"mtime": 1787272595.8186145,
"seen": 1787272611.6714194,
"ast_hash": "3a2617478f44c6400ed57088d2039f93",
"semantic_hash": ""
}
}
+122 -47
View File
@@ -1,16 +1,16 @@
# Graph Report - TextNLPClassifierApp (2026-08-20)
## Corpus Check
- 161 files · ~78,549 words
- 174 files · ~91,961 words
- Verdict: corpus is large enough that graph structure adds value.
## Summary
- 1000 nodes · 1220 edges · 115 communities (77 shown, 38 thin omitted)
- Extraction: 97% EXTRACTED · 3% INFERRED · 0% AMBIGUOUS · INFERRED: 39 edges (avg confidence: 0.95)
- 1235 nodes · 1548 edges · 131 communities (93 shown, 38 thin omitted)
- Extraction: 97% EXTRACTED · 3% INFERRED · 0% AMBIGUOUS · INFERRED: 51 edges (avg confidence: 0.95)
- Token cost: 0 input · 0 output
## Graph Freshness
- Built from commit: `6e3d5761`
- Built from commit: `6a45368c`
- Run `git rev-parse HEAD` and compare to check if the graph is stale.
- Run `graphify update .` after code changes (no API cost).
@@ -56,10 +56,10 @@
- 1. Input Schemas
- 2. Basic CLI Usage Examples
- 2. Standard Streams & Exit Codes
- classifier.py
- ClassificationResult
- InherenceClassifier
- detect_language
- ClassificationError
- classifier.py
- main
- content_northvolt_de.md
- content_presal_pt.md
- content_tangential_es.md
@@ -110,12 +110,12 @@
- 🧠 TextNLPClassifierApp
- Extraction Pipeline Checklist: Article Content Multi-Engine Extractor
- sample_rss_xml
- main
- models.py
- ECPSnapshot
- Feature Specification: Multilingual NLP Entity Inherence Classifier (POC)
- 4. Requisitos Funcionais (FR)
- Tasks: Article Content Multi-Engine Extractor
- models.py
- LocalEmbeddingsAdapter
- Implementation Plan: Article Content Multi-Engine Extractor
- 2. Cenários de Validação
- 1. Technical Decisions & Tradeoffs
@@ -124,35 +124,50 @@
- Specification Quality Checklist: Multilingual NLP Entity Inherence Classifier
- CLI Contract: Article Content Multi-Engine Extractor
- JSON Schema Contract: Article Content Multi-Engine Extractor
- PRD — Seleção determinística da biblioteca de extração de conteúdo
- select_article_extractor.py
- 1. Text Normalization Pipeline
- Tasks: Deterministic Article Content Selection
- select_article_extractor
- process_batch
- test_select_article_extractor.py
- Feature Specification: Deterministic Content Selection
- 2. Entity Descriptions & Fields
- Implementation Plan: Deterministic Article Content Selection
- Deterministic Content Selection Checklist: End-to-End Requirements Quality
- Quickstart: Deterministic Article Content Selection
- Specification Quality Checklist: Deterministic Content Selection
- CLI Interface Contract: Deterministic Article Content Selection
- JSON Schema Contract: Deterministic Article Content Selection
## God Nodes (most connected - your core abstractions)
1. `ECPSnapshot` - 31 edges
2. `InherenceClassifier` - 25 edges
3. `DecisionCategory` - 17 edges
4. `ClassificationResult` - 17 edges
5. `process_batch()` - 15 edges
6. `LocalEmbeddingsAdapter` - 14 edges
7. `LLMFallbackAdapter` - 14 edges
8. `detect_language()` - 14 edges
9. `main()` - 13 edges
10. `ArticleCrawler` - 13 edges
3. `select_article_extractor()` - 23 edges
4. `ExtractorName` - 21 edges
5. `DecisionCategory` - 17 edges
6. `ClassificationResult` - 17 edges
7. `process_batch()` - 15 edges
8. `process_batch()` - 14 edges
9. `LocalEmbeddingsAdapter` - 14 edges
10. `LLMFallbackAdapter` - 14 edges
## Surprising Connections (you probably didn't know these)
- `main()` --uses--> `ECPSnapshot` [INFERRED]
classify.py → src/models.py
- `main()` --uses--> `ErrorCode` [INFERRED]
classify.py → src/models.py
- `test_extract_google_news_orchestration_mocked()` --uses--> `ExtractionResult` [INFERRED]
tests/test_extract_google_news.py → scripts/extract_google_news.py
- `test_llm_adapter_interface()` --calls--> `LLMFallbackAdapter` [EXTRACTED]
tests/test_adapters.py → src/adapters/llm.py
- `classifier()` --uses--> `InherenceClassifier` [INFERRED]
tests/test_benchmark_24.py → src/classifier.py
- `test_classification_result_serialization()` --uses--> `DecisionCategory` [INFERRED]
tests/test_models.py → src/models.py
- `test_classification_error_serialization()` --uses--> `ErrorCode` [INFERRED]
tests/test_models.py → src/models.py
## Import Cycles
- None detected.
## Communities (115 total, 38 thin omitted)
## Communities (131 total, 38 thin omitted)
### Community 0 - "Task Planning"
Cohesion: 0.07
@@ -294,21 +309,21 @@ Nodes (7): 1. Prerequisites & Installation, 2.1 Direct Inherence (Portuguese), 2
Cohesion: 0.29
Nodes (6): 1.1 Arguments & Options, 1. Command Line Interface, 2.1 Exit Codes, 2.2 Standard Output (`stdout`) / Standard Error (`stderr`), 2. Standard Streams & Exit Codes, CLI Contract & Interface Specification (POC)
### Community 45 - "classifier.py"
### Community 45 - "ClassificationResult"
Cohesion: 0.14
Nodes (9): LocalEmbeddingsAdapter, Optional adapter for local multilingual semantic vector embeddings., LLMFallbackAdapter, Optional adapter for LLM fallback boundary disambiguation., Core deterministic classification engine (Tier 1 core)., Unit tests for optional adapter interfaces (Tier 2 / Tier 3)., test_classifier_with_adapter_flags(), test_embeddings_adapter_interface() (+1 more)
Nodes (12): ABC, BaseNLPAdapter, Base abstract adapter interface for optional Tier 2 / Tier 3 NLP enhancers., Abstract interface for pluggable NLP classification adapters., Return True if the underlying provider or model is installed and configured., Compute semantic similarity score between text and a set of candidate terms., Optionally refine an ambiguous classification result., LLMFallbackAdapter (+4 more)
### Community 46 - "InherenceClassifier"
Cohesion: 0.12
Nodes (27): InherenceClassifier, Tier 1 Deterministic NLP Entity Inherence Classifier., DecisionCategory, RelatedEntity, Adversarial and robustness test suite for Multilingual NLP Entity Inherence…, Run CLI via subprocess without --output and verify stdout is pure parseable…, Run CLI via subprocess with empty content and verify error code and exit code., Content about city/state governance of São Paulo against ECP for São Paulo FC. (+19 more)
### Community 47 - "detect_language"
Cohesion: 0.09
Nodes (30): count_phrase_occurrences(), match_phrase_in_text(), Check if a normalized phrase appears in normalized text with word boundary…, Count occurrences of a phrase in text., Classify inherence of content against an ECP snapshot., detect_language(), extract_words(), normalize_text() (+22 more)
### Community 47 - "classifier.py"
Cohesion: 0.10
Nodes (31): count_phrase_occurrences(), match_phrase_in_text(), Core deterministic classification engine (Tier 1 core)., Check if a normalized phrase appears in normalized text with word boundary…, Count occurrences of a phrase in text., Classify inherence of content against an ECP snapshot., detect_language(), extract_words() (+23 more)
### Community 48 - "ClassificationError"
Cohesion: 0.29
Nodes (3): ClassificationError, Any, test_classification_error_serialization()
### Community 48 - "main"
Cohesion: 0.31
Nodes (9): main(), parse_args(), Namespace, CLI execution tests covering flags, arguments, stdout, and error handling., test_cli_empty_content_file(), test_cli_missing_ecp_file(), test_cli_missing_required_ecp_field(), test_cli_output_file() (+1 more)
### Community 80 - "test_extract_article_contents.py"
Cohesion: 0.06
@@ -372,7 +387,7 @@ Nodes (6): 1. Comando e Argumentos, 2. Códigos de Saída (Exit Codes), 3. Proto
### Community 97 - "🧠 TextNLPClassifierApp"
Cohesion: 0.06
Nodes (33): 1. 🧠 Classificador de Conteúdo e Inerência (NLP / LLM / ECP), 1. Clonar o Repositório e Criar Ambiente Virtual, 1. Extração Completa Automática, 1. River Plate (Argentina / Espanhol / 2 Páginas / Salvar em Arquivo), 2. Amostragem Rápida (Limit 2 Notícias), 2. Cruzeiro (Brasil / Português / Formatado no Terminal), 2. 📰 Extrator de Manchetes do Google News, 2. Instalar Dependências (+25 more)
Nodes (35): 1. 🧠 Classificador de Conteúdo e Inerência (NLP / LLM / ECP), 1. Clonar o Repositório e Criar Ambiente Virtual, 1. Execução Padrão Automática, 2. Execução com Modo Verboso, 2. 📰 Extrator de Manchetes do Google News, 2. Instalar Dependências, 3. Baixar Binários do Navegador Stealth (Camoufox), 3. 📄 Extrator e Parser Multimotor de Artigos (+27 more)
### Community 98 - "Extraction Pipeline Checklist: Article Content Multi-Engine Extractor"
Cohesion: 0.05
@@ -382,13 +397,13 @@ Nodes (34): 1. Requirement Completeness, 2. Requirement Clarity & Non-Ambiguity,
Cohesion: 0.67
Nodes (3): fixture, Fixture que fornece o conteúdo do XML de exemplo para testes offline., sample_rss_xml()
### Community 100 - "main"
Cohesion: 0.23
Nodes (13): emit_error(), main(), parse_args(), Namespace, Enum, ErrorCode, str, CLI execution tests covering flags, arguments, stdout, and error handling. (+5 more)
### Community 100 - "models.py"
Cohesion: 0.24
Nodes (8): emit_error(), ClassificationError, ErrorCode, MatchedGraphEntity, Enum, str, Data models and validation schemas for Multilingual NLP Entity Inherence…, test_classification_error_serialization()
### Community 101 - "ECPSnapshot"
Cohesion: 0.22
Nodes (11): parametrize, ECPSnapshot, classifier(), fixture, Controlled 24-case benchmark suite for Multilingual NLP Entity Inherence…, test_benchmark_case(), Unit tests for ECP models, schema validation, and structured error handling., test_classification_result_serialization() (+3 more)
Cohesion: 0.19
Nodes (11): parametrize, ECPSnapshot, Any, classifier(), fixture, Controlled 24-case benchmark suite for Multilingual NLP Entity Inherence…, test_benchmark_case(), Unit tests for ECP models, schema validation, and structured error handling. (+3 more)
### Community 102 - "Feature Specification: Multilingual NLP Entity Inherence Classifier (POC)"
Cohesion: 0.14
@@ -402,9 +417,9 @@ Nodes (20): 1.1 Objetivo do Produto, 1. Visão Geral e Contexto, 2. Personas e C
Cohesion: 0.11
Nodes (18): Dependencies & Execution Order, Entrega Incremental, Implementation Strategy, Implementação da User Story 1, Implementação da User Story 2, Implementação da User Story 3, MVP First (User Story 1 Only), Oportunidades de Execução Paralela (+10 more)
### Community 105 - "models.py"
Cohesion: 0.16
Nodes (12): ABC, BaseNLPAdapter, Base abstract adapter interface for optional Tier 2 / Tier 3 NLP enhancers., Abstract interface for pluggable NLP classification adapters., Return True if the underlying provider or model is installed and configured., Compute semantic similarity score between text and a set of candidate terms., Optionally refine an ambiguous classification result., Optional local vector embeddings adapter (Tier 2). Disabled by default.… (+4 more)
### Community 105 - "LocalEmbeddingsAdapter"
Cohesion: 0.18
Nodes (7): LocalEmbeddingsAdapter, Optional local vector embeddings adapter (Tier 2). Disabled by default.…, Optional adapter for local multilingual semantic vector embeddings., Unit tests for optional adapter interfaces (Tier 2 / Tier 3)., test_classifier_with_adapter_flags(), test_embeddings_adapter_interface(), test_llm_adapter_interface()
### Community 106 - "Implementation Plan: Article Content Multi-Engine Extractor"
Cohesion: 0.17
@@ -438,25 +453,85 @@ Nodes (5): 1. Comando de Execução, 2. Argumentos e Flags, 3. Códigos de Saíd
Cohesion: 0.50
Nodes (3): 1. Schema de Entrada (Input JSON), 2. Schema de Saída (Output JSON), JSON Schema Contract: Article Content Multi-Engine Extractor
### Community 115 - "PRD — Seleção determinística da biblioteca de extração de conteúdo"
Cohesion: 0.07
Nodes (29): 10. Requisitos não funcionais, 11. Critérios de aceite, 12. Casos obrigatórios de teste, 13. Definition of Done, 1. Contexto, 2. Objetivo, 3.1 Incluído, 3.2 Fora do escopo (+21 more)
### Community 116 - "select_article_extractor.py"
Cohesion: 0.16
Nodes (17): BatchProcessingResult, break_priority_tie(), calculate_consensus_metrics(), ExtractorCandidate, form_active_set(), main(), parse_args(), Namespace (+9 more)
### Community 117 - "1. Text Normalization Pipeline"
Cohesion: 0.11
Nodes (18): 1. Text Normalization Pipeline, 2. 5-Token Shingles & Consensus Metrics, 3. Regras de Decisão, Empate Técnico e Desempate Hierárquico, 4. Estratégia de I/O Não Destrutiva e Escrita Atômica, Alternatives Considered, Context, Context, Context (+10 more)
### Community 118 - "Tasks: Deterministic Article Content Selection"
Cohesion: 0.11
Nodes (18): Dependencies & Execution Order, Implementation for User Story 1, Implementation for User Story 2, Implementation for User Story 3, Implementation Strategy, Incremental Delivery (Phases 4, 5 & 6), MVP First (Phases 1, 2 & 3), Parallel Opportunities (+10 more)
### Community 119 - "select_article_extractor"
Cohesion: 0.08
Nodes (37): ArticleSelectionResult, CandidateStatus, extract_candidate_data(), ExtractorName, Any, Enum, str, Extrai campo de texto, erro e calcula tokens/shingles para um motor. (+29 more)
### Community 120 - "process_batch"
Cohesion: 0.10
Nodes (26): atomic_save_json(), process_batch(), Path, Salva dados em JSON de forma atômica utilizando arquivo temporário e rename., Lê o JSON de entrada, valida a estrutura, processa todos os artigos e grava o…, Path, CT-012: A entrada já contém selected_extractor -> Recalcular e substituir…, CT-013: articles está vazio -> Gerar saída válida com articles vazio. (+18 more)
### Community 122 - "test_select_article_extractor.py"
Cohesion: 0.21
Nodes (14): generate_shingles(), normalize_text(), Executa a normalização determinística para comparação: 1. Decodificar entidades…, Gera conjunto de shingles ordenados de tamanho window_size (padrão 5). - Se…, Suíte de Testes Automatizados para o Seletor Determinístico de Extrator. Cobre…, Garante que marcação de imagem Markdown ![alt](url) seja descartada e link…, test_generate_shingles_empty(), test_generate_shingles_short_text() (+6 more)
### Community 123 - "Feature Specification: Deterministic Content Selection"
Cohesion: 0.17
Nodes (12): Assumptions, Edge Cases, Feature Specification: Deterministic Content Selection, Functional Requirements, Key Entities *(include if feature involves data)*, Measurable Outcomes, Requirements *(mandatory)*, Success Criteria *(mandatory)* (+4 more)
### Community 124 - "2. Entity Descriptions & Fields"
Cohesion: 0.18
Nodes (11): 1. Domain Entities & Value Types, 2. Entity Descriptions & Fields, 3. JSON Schema Mapping, `ArticleSelectionResult` (Dataclass), `BatchProcessingResult` (Dataclass), `CandidateStatus` (Enum), Data Model: Deterministic Content Selection, Entrada (+3 more)
### Community 125 - "Implementation Plan: Deterministic Article Content Selection"
Cohesion: 0.18
Nodes (11): Constitution Check, Documentation (this feature), Implementation Phases, Implementation Plan: Deterministic Article Content Selection, Phase 0: Outline & Research *(Completed)*, Phase 1: Design & Contracts *(Completed)*, Phase 2: Tasks & Execution *(Next Step via `/speckit-tasks`)*, Project Structure (+3 more)
### Community 126 - "Deterministic Content Selection Checklist: End-to-End Requirements Quality"
Cohesion: 0.25
Nodes (7): Candidate State Transitions & Resilience, Decision & Tie-Breaking Hierarchy, Deterministic Content Selection Checklist: End-to-End Requirements Quality, JSON Schema Integrity & Atomic I/O, Notes, Shingles & Consensus Metric Formulation, Text Normalization & Tokenization Quality
### Community 127 - "Quickstart: Deterministic Article Content Selection"
Cohesion: 0.29
Nodes (7): 1. Pré-requisitos, 2. Execução Rápida via CLI, 3. Execução dos Testes Automatizados, 4. Validação Programática / Uso como Módulo Python, Cenário 1: Selecionar o melhor extrator para uma extração existente, Cenário 2: Especificar caminho de saída customizado e modo verboso, Quickstart: Deterministic Article Content Selection
### Community 128 - "Specification Quality Checklist: Deterministic Content Selection"
Cohesion: 0.33
Nodes (5): Content Quality, Feature Readiness, Notes, Requirement Completeness, Specification Quality Checklist: Deterministic Content Selection
### Community 129 - "CLI Interface Contract: Deterministic Article Content Selection"
Cohesion: 0.33
Nodes (5): 1. Command Syntax, 2. Arguments and Flags, 3. Standard Streams (I/O), 4. Exit Codes, CLI Interface Contract: Deterministic Article Content Selection
### Community 131 - "JSON Schema Contract: Deterministic Article Content Selection"
Cohesion: 0.50
Nodes (3): 1. Input JSON Schema, 2. Output JSON Schema, JSON Schema Contract: Deterministic Article Content Selection
## Knowledge Gaps
- **465 isolated node(s):** `text-nlp-classifier`, `MatchedGraphEntity`, `graphify`, `Usage`, `What graphify is for` (+460 more)
- **562 isolated node(s):** `text-nlp-classifier`, `MatchedGraphEntity`, `graphify`, `Usage`, `What graphify is for` (+557 more)
These have ≤1 connection - possible missing edges or undocumented components.
- **38 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes.
## Suggested Questions
_Questions this graph is uniquely positioned to answer:_
- **Why does `ECPSnapshot` connect `ECPSnapshot` to `main`, `models.py`, `classifier.py`, `InherenceClassifier`, `detect_language`?**
_High betweenness centrality (0.006) - this node is a cross-community bridge._
- **Why does `InherenceClassifier` connect `InherenceClassifier` to `main`, `ECPSnapshot`, `models.py`, `classifier.py`, `detect_language`?**
- **Why does `ECPSnapshot` connect `ECPSnapshot` to `models.py`, `LocalEmbeddingsAdapter`, `ClassificationResult`, `InherenceClassifier`, `classifier.py`, `main`?**
_High betweenness centrality (0.003) - this node is a cross-community bridge._
- **Why does `detect_language()` connect `detect_language` to `classifier.py`?**
- **Why does `LLMFallbackAdapter` connect `ClassificationResult` to `LocalEmbeddingsAdapter`, `ECPSnapshot`, `InherenceClassifier`, `classifier.py`?**
_High betweenness centrality (0.003) - this node is a cross-community bridge._
- **Why does `Research & Architectural Decisions: Deterministic Content Selection` connect `1. Text Normalization Pipeline` to `004-deterministic-content-selection/spec.md`?**
_High betweenness centrality (0.003) - this node is a cross-community bridge._
- **Are the 10 inferred relationships involving `ECPSnapshot` (e.g. with `main()` and `BaseNLPAdapter`) actually correct?**
_`ECPSnapshot` has 10 INFERRED edges - model-reasoned connections that need verification._
- **Are the 6 inferred relationships involving `InherenceClassifier` (e.g. with `LocalEmbeddingsAdapter` and `LLMFallbackAdapter`) actually correct?**
_`InherenceClassifier` has 6 INFERRED edges - model-reasoned connections that need verification._
- **Are the 12 inferred relationships involving `ExtractorName` (e.g. with `test_article_1_regression_technical_tie_markdown_images()` and `test_ct_001_three_candidates_clear_winner()`) actually correct?**
_`ExtractorName` has 12 INFERRED edges - model-reasoned connections that need verification._
- **Are the 10 inferred relationships involving `DecisionCategory` (e.g. with `InherenceClassifier` and `test_adversarial_apple_fruit_recipe()`) actually correct?**
_`DecisionCategory` has 10 INFERRED edges - model-reasoned connections that need verification._
- **Are the 4 inferred relationships involving `ClassificationResult` (e.g. with `BaseNLPAdapter` and `LocalEmbeddingsAdapter`) actually correct?**
_`ClassificationResult` has 4 INFERRED edges - model-reasoned connections that need verification._
_`DecisionCategory` has 10 INFERRED edges - model-reasoned connections that need verification._
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"nodes": [{"id": "$graphify-root$_specs_004_deterministic_content_selection_contracts_cli_contract_md", "label": "cli-contract.md", "file_type": "document", "node_kind": "page", "source_file": "specs/004-deterministic-content-selection/contracts/cli-contract.md", "source_location": "L1"}, {"id": "$graphify-root$_specs_004_deterministic_content_selection_contracts_cli_contract_cli_interface_contract_deterministic_article_content_selection", "label": "CLI Interface Contract: Deterministic Article Content Selection", "file_type": "document", "node_kind": "heading", "source_file": "specs/004-deterministic-content-selection/contracts/cli-contract.md", "source_location": "L1"}, {"id": "$graphify-root$_specs_004_deterministic_content_selection_contracts_cli_contract_1_command_syntax", "label": "1. Command Syntax", "file_type": "document", "node_kind": "heading", "source_file": "specs/004-deterministic-content-selection/contracts/cli-contract.md", "source_location": "L7"}, {"id": "$graphify-root$_specs_004_deterministic_content_selection_contracts_cli_contract_2_arguments_and_flags", "label": "2. Arguments and Flags", "file_type": "document", "node_kind": "heading", "source_file": "specs/004-deterministic-content-selection/contracts/cli-contract.md", "source_location": "L15"}, {"id": "$graphify-root$_specs_004_deterministic_content_selection_contracts_cli_contract_3_standard_streams_i_o", "label": "3. Standard Streams (I/O)", "file_type": "document", "node_kind": "heading", "source_file": "specs/004-deterministic-content-selection/contracts/cli-contract.md", "source_location": "L26"}, {"id": "$graphify-root$_specs_004_deterministic_content_selection_contracts_cli_contract_4_exit_codes", "label": "4. Exit Codes", "file_type": "document", "node_kind": "heading", "source_file": "specs/004-deterministic-content-selection/contracts/cli-contract.md", "source_location": "L48"}], "edges": [{"source": "$graphify-root$_specs_004_deterministic_content_selection_contracts_cli_contract_md", "target": "$graphify-root$_specs_004_deterministic_content_selection_contracts_cli_contract_cli_interface_contract_deterministic_article_content_selection", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/004-deterministic-content-selection/contracts/cli-contract.md", "source_location": "L1", "weight": 1.0}, {"source": "$graphify-root$_specs_004_deterministic_content_selection_contracts_cli_contract_md", "target": "$graphify-root$_specs_004_deterministic_content_selection_spec_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "specs/004-deterministic-content-selection/contracts/cli-contract.md", "source_location": "L3", "weight": 1.0, "target_file": "$graphify-root$/specs/004-deterministic-content-selection/spec.md"}, {"source": "$graphify-root$_specs_004_deterministic_content_selection_contracts_cli_contract_cli_interface_contract_deterministic_article_content_selection", "target": "$graphify-root$_specs_004_deterministic_content_selection_contracts_cli_contract_1_command_syntax", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/004-deterministic-content-selection/contracts/cli-contract.md", "source_location": "L7", "weight": 1.0}, {"source": "$graphify-root$_specs_004_deterministic_content_selection_contracts_cli_contract_cli_interface_contract_deterministic_article_content_selection", "target": "$graphify-root$_specs_004_deterministic_content_selection_contracts_cli_contract_2_arguments_and_flags", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/004-deterministic-content-selection/contracts/cli-contract.md", "source_location": "L15", "weight": 1.0}, {"source": "$graphify-root$_specs_004_deterministic_content_selection_contracts_cli_contract_cli_interface_contract_deterministic_article_content_selection", "target": "$graphify-root$_specs_004_deterministic_content_selection_contracts_cli_contract_3_standard_streams_i_o", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/004-deterministic-content-selection/contracts/cli-contract.md", "source_location": "L26", "weight": 1.0}, {"source": "$graphify-root$_specs_004_deterministic_content_selection_contracts_cli_contract_cli_interface_contract_deterministic_article_content_selection", "target": "$graphify-root$_specs_004_deterministic_content_selection_contracts_cli_contract_4_exit_codes", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/004-deterministic-content-selection/contracts/cli-contract.md", "source_location": "L48", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0}
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"nodes": [{"id": "$graphify-root$_specs_004_deterministic_content_selection_contracts_cli_contract_md", "label": "cli-contract.md", "file_type": "document", "node_kind": "page", "source_file": "specs/004-deterministic-content-selection/contracts/cli-contract.md", "source_location": "L1"}, {"id": "$graphify-root$_specs_004_deterministic_content_selection_contracts_cli_contract_cli_interface_contract_deterministic_article_content_selection", "label": "CLI Interface Contract: Deterministic Article Content Selection", "file_type": "document", "node_kind": "heading", "source_file": "specs/004-deterministic-content-selection/contracts/cli-contract.md", "source_location": "L1"}, {"id": "$graphify-root$_specs_004_deterministic_content_selection_contracts_cli_contract_1_command_syntax", "label": "1. Command Syntax", "file_type": "document", "node_kind": "heading", "source_file": "specs/004-deterministic-content-selection/contracts/cli-contract.md", "source_location": "L7"}, {"id": "$graphify-root$_specs_004_deterministic_content_selection_contracts_cli_contract_2_arguments_and_flags", "label": "2. Arguments and Flags", "file_type": "document", "node_kind": "heading", "source_file": "specs/004-deterministic-content-selection/contracts/cli-contract.md", "source_location": "L15"}, {"id": "$graphify-root$_specs_004_deterministic_content_selection_contracts_cli_contract_3_standard_streams_i_o", "label": "3. Standard Streams (I/O)", "file_type": "document", "node_kind": "heading", "source_file": "specs/004-deterministic-content-selection/contracts/cli-contract.md", "source_location": "L26"}, {"id": "$graphify-root$_specs_004_deterministic_content_selection_contracts_cli_contract_4_exit_codes", "label": "4. Exit Codes", "file_type": "document", "node_kind": "heading", "source_file": "specs/004-deterministic-content-selection/contracts/cli-contract.md", "source_location": "L48"}], "edges": [{"source": "$graphify-root$_specs_004_deterministic_content_selection_contracts_cli_contract_md", "target": "$graphify-root$_specs_004_deterministic_content_selection_contracts_cli_contract_cli_interface_contract_deterministic_article_content_selection", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/004-deterministic-content-selection/contracts/cli-contract.md", "source_location": "L1", "weight": 1.0}, {"source": "$graphify-root$_specs_004_deterministic_content_selection_contracts_cli_contract_md", "target": "$graphify-root$_specs_004_deterministic_content_selection_spec_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "specs/004-deterministic-content-selection/contracts/cli-contract.md", "source_location": "L3", "weight": 1.0, "target_file": "$graphify-root$/specs/004-deterministic-content-selection/spec.md"}, {"source": "$graphify-root$_specs_004_deterministic_content_selection_contracts_cli_contract_cli_interface_contract_deterministic_article_content_selection", "target": "$graphify-root$_specs_004_deterministic_content_selection_contracts_cli_contract_1_command_syntax", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/004-deterministic-content-selection/contracts/cli-contract.md", "source_location": "L7", "weight": 1.0}, {"source": "$graphify-root$_specs_004_deterministic_content_selection_contracts_cli_contract_cli_interface_contract_deterministic_article_content_selection", "target": "$graphify-root$_specs_004_deterministic_content_selection_contracts_cli_contract_2_arguments_and_flags", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/004-deterministic-content-selection/contracts/cli-contract.md", "source_location": "L15", "weight": 1.0}, {"source": "$graphify-root$_specs_004_deterministic_content_selection_contracts_cli_contract_cli_interface_contract_deterministic_article_content_selection", "target": "$graphify-root$_specs_004_deterministic_content_selection_contracts_cli_contract_3_standard_streams_i_o", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/004-deterministic-content-selection/contracts/cli-contract.md", "source_location": "L26", "weight": 1.0}, {"source": "$graphify-root$_specs_004_deterministic_content_selection_contracts_cli_contract_cli_interface_contract_deterministic_article_content_selection", "target": "$graphify-root$_specs_004_deterministic_content_selection_contracts_cli_contract_4_exit_codes", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/004-deterministic-content-selection/contracts/cli-contract.md", "source_location": "L48", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0}
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"nodes": [{"id": "$graphify-root$_specs_004_deterministic_content_selection_checklists_requirements_md", "label": "requirements.md", "file_type": "document", "node_kind": "page", "source_file": "specs/004-deterministic-content-selection/checklists/requirements.md", "source_location": "L1"}, {"id": "$graphify-root$_specs_004_deterministic_content_selection_checklists_requirements_specification_quality_checklist_deterministic_content_selection", "label": "Specification Quality Checklist: Deterministic Content Selection", "file_type": "document", "node_kind": "heading", "source_file": "specs/004-deterministic-content-selection/checklists/requirements.md", "source_location": "L1"}, {"id": "$graphify-root$_specs_004_deterministic_content_selection_checklists_requirements_content_quality", "label": "Content Quality", "file_type": "document", "node_kind": "heading", "source_file": "specs/004-deterministic-content-selection/checklists/requirements.md", "source_location": "L7"}, {"id": "$graphify-root$_specs_004_deterministic_content_selection_checklists_requirements_requirement_completeness", "label": "Requirement Completeness", "file_type": "document", "node_kind": "heading", "source_file": "specs/004-deterministic-content-selection/checklists/requirements.md", "source_location": "L14"}, {"id": "$graphify-root$_specs_004_deterministic_content_selection_checklists_requirements_feature_readiness", "label": "Feature Readiness", "file_type": "document", "node_kind": "heading", "source_file": "specs/004-deterministic-content-selection/checklists/requirements.md", "source_location": "L25"}, {"id": "$graphify-root$_specs_004_deterministic_content_selection_checklists_requirements_notes", "label": "Notes", "file_type": "document", "node_kind": "heading", "source_file": "specs/004-deterministic-content-selection/checklists/requirements.md", "source_location": "L32"}], "edges": [{"source": "$graphify-root$_specs_004_deterministic_content_selection_checklists_requirements_md", "target": "$graphify-root$_specs_004_deterministic_content_selection_checklists_requirements_specification_quality_checklist_deterministic_content_selection", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/004-deterministic-content-selection/checklists/requirements.md", "source_location": "L1", "weight": 1.0}, {"source": "$graphify-root$_specs_004_deterministic_content_selection_checklists_requirements_md", "target": "$graphify-root$_specs_004_deterministic_content_selection_spec_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "specs/004-deterministic-content-selection/checklists/requirements.md", "source_location": "L5", "weight": 1.0, "target_file": "$graphify-root$/specs/004-deterministic-content-selection/spec.md"}, {"source": "$graphify-root$_specs_004_deterministic_content_selection_checklists_requirements_specification_quality_checklist_deterministic_content_selection", "target": "$graphify-root$_specs_004_deterministic_content_selection_checklists_requirements_content_quality", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/004-deterministic-content-selection/checklists/requirements.md", "source_location": "L7", "weight": 1.0}, {"source": "$graphify-root$_specs_004_deterministic_content_selection_checklists_requirements_specification_quality_checklist_deterministic_content_selection", "target": "$graphify-root$_specs_004_deterministic_content_selection_checklists_requirements_requirement_completeness", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/004-deterministic-content-selection/checklists/requirements.md", "source_location": "L14", "weight": 1.0}, {"source": "$graphify-root$_specs_004_deterministic_content_selection_checklists_requirements_specification_quality_checklist_deterministic_content_selection", "target": "$graphify-root$_specs_004_deterministic_content_selection_checklists_requirements_feature_readiness", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/004-deterministic-content-selection/checklists/requirements.md", "source_location": "L25", "weight": 1.0}, {"source": "$graphify-root$_specs_004_deterministic_content_selection_checklists_requirements_specification_quality_checklist_deterministic_content_selection", "target": "$graphify-root$_specs_004_deterministic_content_selection_checklists_requirements_notes", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/004-deterministic-content-selection/checklists/requirements.md", "source_location": "L32", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"nodes": [{"id": "$graphify-root$_specs_004_deterministic_content_selection_contracts_json_schema_md", "label": "json-schema.md", "file_type": "document", "node_kind": "page", "source_file": "specs/004-deterministic-content-selection/contracts/json-schema.md", "source_location": "L1"}, {"id": "$graphify-root$_specs_004_deterministic_content_selection_contracts_json_schema_json_schema_contract_deterministic_article_content_selection", "label": "JSON Schema Contract: Deterministic Article Content Selection", "file_type": "document", "node_kind": "heading", "source_file": "specs/004-deterministic-content-selection/contracts/json-schema.md", "source_location": "L1"}, {"id": "$graphify-root$_specs_004_deterministic_content_selection_contracts_json_schema_1_input_json_schema", "label": "1. Input JSON Schema", "file_type": "document", "node_kind": "heading", "source_file": "specs/004-deterministic-content-selection/contracts/json-schema.md", "source_location": "L7"}, {"id": "$graphify-root$_specs_004_deterministic_content_selection_contracts_json_schema_2_output_json_schema", "label": "2. Output JSON Schema", "file_type": "document", "node_kind": "heading", "source_file": "specs/004-deterministic-content-selection/contracts/json-schema.md", "source_location": "L52"}], "edges": [{"source": "$graphify-root$_specs_004_deterministic_content_selection_contracts_json_schema_md", "target": "$graphify-root$_specs_004_deterministic_content_selection_contracts_json_schema_json_schema_contract_deterministic_article_content_selection", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/004-deterministic-content-selection/contracts/json-schema.md", "source_location": "L1", "weight": 1.0}, {"source": "$graphify-root$_specs_004_deterministic_content_selection_contracts_json_schema_md", "target": "$graphify-root$_specs_004_deterministic_content_selection_spec_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "specs/004-deterministic-content-selection/contracts/json-schema.md", "source_location": "L3", "weight": 1.0, "target_file": "$graphify-root$/specs/004-deterministic-content-selection/spec.md"}, {"source": "$graphify-root$_specs_004_deterministic_content_selection_contracts_json_schema_json_schema_contract_deterministic_article_content_selection", "target": "$graphify-root$_specs_004_deterministic_content_selection_contracts_json_schema_1_input_json_schema", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/004-deterministic-content-selection/contracts/json-schema.md", "source_location": "L7", "weight": 1.0}, {"source": "$graphify-root$_specs_004_deterministic_content_selection_contracts_json_schema_json_schema_contract_deterministic_article_content_selection", "target": "$graphify-root$_specs_004_deterministic_content_selection_contracts_json_schema_2_output_json_schema", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/004-deterministic-content-selection/contracts/json-schema.md", "source_location": "L52", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+7053 -585
View File
File diff suppressed because it is too large Load Diff
+81 -3
View File
@@ -654,9 +654,9 @@
"semantic_hash": ""
},
"README.md": {
"mtime": 1787264334.4498444,
"seen": 1787264519.0577974,
"ast_hash": "196db110cfde06179fb750fc75afb6fe",
"mtime": 1787274445.4631622,
"seen": 1787274455.3244681,
"ast_hash": "5270e11cfba31a235ba379effb2db0d5",
"semantic_hash": ""
},
"scripts/extract_article_contents.py": {
@@ -736,5 +736,83 @@
"seen": 1787240516.6008823,
"ast_hash": "d95c4763728496703cd89590288a2bed",
"semantic_hash": ""
},
"scripts/select_article_extractor.py": {
"mtime": 1787273522.903319,
"seen": 1787273548.728257,
"ast_hash": "3e6938964c7e4549051cb1637207698d",
"semantic_hash": ""
},
"tests/test_select_article_extractor.py": {
"mtime": 1787274189.7777488,
"seen": 1787274207.7989414,
"ast_hash": "9f91e09d47f06140b243b6f516d14c60",
"semantic_hash": ""
},
"docs/prd_deterministic_content_selection.md": {
"mtime": 1787264674.2038286,
"seen": 1787272611.6604555,
"ast_hash": "2c421402df8b6469ce60eaa984dce666",
"semantic_hash": ""
},
"specs/004-deterministic-content-selection/checklists/deterministic-selection.md": {
"mtime": 1787272346.8692143,
"seen": 1787272611.6713927,
"ast_hash": "6d9bcda99dbd284ffcbce372102fd868",
"semantic_hash": ""
},
"specs/004-deterministic-content-selection/checklists/requirements.md": {
"mtime": 1787264728.7202728,
"seen": 1787272611.6713977,
"ast_hash": "074efe6ba551e93f7d005c5462805693",
"semantic_hash": ""
},
"specs/004-deterministic-content-selection/contracts/cli-contract.md": {
"mtime": 1787274329.2175446,
"seen": 1787274402.0944166,
"ast_hash": "2cd795eaed6198dc343424bd20673728",
"semantic_hash": ""
},
"specs/004-deterministic-content-selection/contracts/json-schema.md": {
"mtime": 1787271837.7328393,
"seen": 1787272611.6714034,
"ast_hash": "155f0bccb7bcffabcedb6ef86b8003c5",
"semantic_hash": ""
},
"specs/004-deterministic-content-selection/data-model.md": {
"mtime": 1787271825.5970395,
"seen": 1787272611.671406,
"ast_hash": "23ec4a144f4aeeed9fee259b6165bea3",
"semantic_hash": ""
},
"specs/004-deterministic-content-selection/plan.md": {
"mtime": 1787271850.1744206,
"seen": 1787272611.671409,
"ast_hash": "3bebc2a73a9632d42ccca646af592133",
"semantic_hash": ""
},
"specs/004-deterministic-content-selection/quickstart.md": {
"mtime": 1787274324.1467915,
"seen": 1787274402.0946271,
"ast_hash": "a7886ca618af43f33971213e2255b3c6",
"semantic_hash": ""
},
"specs/004-deterministic-content-selection/research.md": {
"mtime": 1787274316.8544433,
"seen": 1787274402.0946283,
"ast_hash": "73ac1637d31472e25b0a1709cd137e5c",
"semantic_hash": ""
},
"specs/004-deterministic-content-selection/spec.md": {
"mtime": 1787274311.1564865,
"seen": 1787274402.0946293,
"ast_hash": "b2c994a14871c2e6e1cf4a11db7dbeb5",
"semantic_hash": ""
},
"specs/004-deterministic-content-selection/tasks.md": {
"mtime": 1787272595.8186145,
"seen": 1787272611.6714194,
"ast_hash": "3a2617478f44c6400ed57088d2039f93",
"semantic_hash": ""
}
}