From 926a6b8cfc50c59412b40a9462d3ec533e852375 Mon Sep 17 00:00:00 2001 From: Andre Ferraro Date: Fri, 21 Aug 2026 10:30:14 -0300 Subject: [PATCH] feat(converter): implement deterministic JSON to Markdown article converter (spec 005) --- README.md | 155 +- docs/prd_convert_json_markdown.md | 516 + graphify-out/.graphify_labels.json | 42 +- graphify-out/.graphify_labels.json.sig | 2 +- graphify-out/2026-08-21/.graphify_labels.json | 38 +- graphify-out/2026-08-21/GRAPH_REPORT.md | 239 +- graphify-out/2026-08-21/graph.json | 9541 ++++++++++++++--- graphify-out/2026-08-21/manifest.json | 126 +- graphify-out/GRAPH_REPORT.md | 236 +- ...589d6f005d3dd4a50d1a6303c426415313326.json | 1 + ...f362759127986c834a2f069ed4fa64ab1cd30.json | 1 + ...53a744cdc90a79f00331dde7c351619b4036e.json | 1 + ...92afd73b719c8baa2fb5fe47020a024f93520.json | 1 + ...4a76f243c48ce6eedffde51cac9e97b5cd57c.json | 1 + ...9c502c6b89b63070bf17120f39dafd6b27475.json | 1 + ...b790fa7c297002154eabfabbab737cf2e1eae.json | 1 + ...d5cc230e031e9002d434d69cdf79ca6fcea77.json | 1 + ...0719017c3387e69b4433fc9e4a2448d3efb9c.json | 1 + ...d434d5c348b7691f12688a1c00c0ee4956afd.json | 1 + ...3352f7482ee8ab7e10177b227b213c8eb53e9.json | 1 + ...7f8121e7492213ffb20398af13ae520acb58d.json | 1 + ...dd3a838a4f0453ed5a669a1d7f778b98e16d7.json | 1 + ...a2a1ff44614fb28853c2f1aa915e58558c4ab.json | 1 + ...63c45da3080bb6d5725066aafab49d765746b.json | 1 + ...b4a4a5713285af478b2c6a7973f6e4a1007a6.json | 1 + ...509b30e7c152293298bcae22c1f96570415fb.json | 1 + ...84d9021a5e3889b01d4a8df1db900b912c21b.json | 1 + ...b26c1746051cac95d8594ec056b13ecd3ebeb.json | 1 + ...633153f57d2fd468073a6a4701fbc14b25ef7.json | 1 + graphify-out/cache/stat-index.json | 2 +- graphify-out/graph.html | 8 +- graphify-out/graph.json | 8857 +++++++++++++-- graphify-out/manifest.json | 108 +- requirements.txt | 1 + scripts/convert_article_to_markdown.py | 720 ++ .../checklists/markdown-conversion.md | 86 + .../checklists/requirements.md | 36 + .../contracts/cli-contract.md | 31 + .../contracts/markdown-schema.md | 38 + specs/005-convert-json-markdown/data-model.md | 156 + specs/005-convert-json-markdown/plan.md | 115 + specs/005-convert-json-markdown/quickstart.md | 58 + specs/005-convert-json-markdown/research.md | 100 + specs/005-convert-json-markdown/spec.md | 137 + specs/005-convert-json-markdown/tasks.md | 139 + .../batch_articles_invalid.json | 9 + .../corrupt_json_invalid.json | 1 + .../invalid_url_invalid.json | 8 + .../missing_body_invalid.json | 14 + .../missing_extractor_invalid.json | 8 + .../missing_title_invalid.json | 8 + .../valid_newspaper4k.json | 27 + .../markdown_conversion/valid_newspaper4k.md | 19 + .../valid_readability.json | 14 + .../markdown_conversion/valid_readability.md | 14 + .../valid_trafilatura.json | 29 + .../markdown_conversion/valid_trafilatura.md | 23 + tests/test_convert_article_to_markdown.py | 758 ++ 58 files changed, 20138 insertions(+), 2301 deletions(-) create mode 100644 docs/prd_convert_json_markdown.md create mode 100644 graphify-out/cache/ast/v0.9.47-s2/024ca5b2b269152ed2e7afbc719589d6f005d3dd4a50d1a6303c426415313326.json create mode 100644 graphify-out/cache/ast/v0.9.47-s2/05c37379ff5c24c9c875a806c74f362759127986c834a2f069ed4fa64ab1cd30.json create mode 100644 graphify-out/cache/ast/v0.9.47-s2/1481575738d29705da2fb1db54f53a744cdc90a79f00331dde7c351619b4036e.json create mode 100644 graphify-out/cache/ast/v0.9.47-s2/2eb414a927cb0f39ba466d0870792afd73b719c8baa2fb5fe47020a024f93520.json create mode 100644 graphify-out/cache/ast/v0.9.47-s2/32a5e4fac2616b5d9ff8859c4e14a76f243c48ce6eedffde51cac9e97b5cd57c.json create mode 100644 graphify-out/cache/ast/v0.9.47-s2/36cde38c040c6fbfb15792ad8479c502c6b89b63070bf17120f39dafd6b27475.json create mode 100644 graphify-out/cache/ast/v0.9.47-s2/657df7e7174eb6dbe8846045ab0b790fa7c297002154eabfabbab737cf2e1eae.json create mode 100644 graphify-out/cache/ast/v0.9.47-s2/66f816e6bda19ec162a55f35d16d5cc230e031e9002d434d69cdf79ca6fcea77.json create mode 100644 graphify-out/cache/ast/v0.9.47-s2/6e7faebc853323fb40729b8ea0b0719017c3387e69b4433fc9e4a2448d3efb9c.json create mode 100644 graphify-out/cache/ast/v0.9.47-s2/702ba88fb2e7c9740d4c83a0c1fd434d5c348b7691f12688a1c00c0ee4956afd.json create mode 100644 graphify-out/cache/ast/v0.9.47-s2/91fdcde7bf9404ff4fc8abd6b093352f7482ee8ab7e10177b227b213c8eb53e9.json create mode 100644 graphify-out/cache/ast/v0.9.47-s2/93b93b8fe832e887faa7acf1dcd7f8121e7492213ffb20398af13ae520acb58d.json create mode 100644 graphify-out/cache/ast/v0.9.47-s2/9ec3cc4573e6b7e18b68101acfcdd3a838a4f0453ed5a669a1d7f778b98e16d7.json create mode 100644 graphify-out/cache/ast/v0.9.47-s2/b28308c2c54a4f569f5e533beb0a2a1ff44614fb28853c2f1aa915e58558c4ab.json create mode 100644 graphify-out/cache/ast/v0.9.47-s2/b5d0d4f6da5666dd115bd84f2a963c45da3080bb6d5725066aafab49d765746b.json create mode 100644 graphify-out/cache/ast/v0.9.47-s2/c4db190f72e59cd2403bbbd7f99b4a4a5713285af478b2c6a7973f6e4a1007a6.json create mode 100644 graphify-out/cache/ast/v0.9.47-s2/d4203d9d5a6b9107bcc8ced682b509b30e7c152293298bcae22c1f96570415fb.json create mode 100644 graphify-out/cache/ast/v0.9.47-s2/d7c4ff57e6843d60ebc5a15f59984d9021a5e3889b01d4a8df1db900b912c21b.json create mode 100644 graphify-out/cache/ast/v0.9.47-s2/e1a9fb842244feb21c26788183db26c1746051cac95d8594ec056b13ecd3ebeb.json create mode 100644 graphify-out/cache/ast/v0.9.47-s2/f2c146fd734cceaa4f2268d03c8633153f57d2fd468073a6a4701fbc14b25ef7.json create mode 100644 scripts/convert_article_to_markdown.py create mode 100644 specs/005-convert-json-markdown/checklists/markdown-conversion.md create mode 100644 specs/005-convert-json-markdown/checklists/requirements.md create mode 100644 specs/005-convert-json-markdown/contracts/cli-contract.md create mode 100644 specs/005-convert-json-markdown/contracts/markdown-schema.md create mode 100644 specs/005-convert-json-markdown/data-model.md create mode 100644 specs/005-convert-json-markdown/plan.md create mode 100644 specs/005-convert-json-markdown/quickstart.md create mode 100644 specs/005-convert-json-markdown/research.md create mode 100644 specs/005-convert-json-markdown/spec.md create mode 100644 specs/005-convert-json-markdown/tasks.md create mode 100644 tests/fixtures/markdown_conversion/batch_articles_invalid.json create mode 100644 tests/fixtures/markdown_conversion/corrupt_json_invalid.json create mode 100644 tests/fixtures/markdown_conversion/invalid_url_invalid.json create mode 100644 tests/fixtures/markdown_conversion/missing_body_invalid.json create mode 100644 tests/fixtures/markdown_conversion/missing_extractor_invalid.json create mode 100644 tests/fixtures/markdown_conversion/missing_title_invalid.json create mode 100644 tests/fixtures/markdown_conversion/valid_newspaper4k.json create mode 100644 tests/fixtures/markdown_conversion/valid_newspaper4k.md create mode 100644 tests/fixtures/markdown_conversion/valid_readability.json create mode 100644 tests/fixtures/markdown_conversion/valid_readability.md create mode 100644 tests/fixtures/markdown_conversion/valid_trafilatura.json create mode 100644 tests/fixtures/markdown_conversion/valid_trafilatura.md create mode 100644 tests/test_convert_article_to_markdown.py diff --git a/README.md b/README.md index 9b722e4..8913581 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,13 @@ - [Critérios de Desempate Técnico e Resiliência](#critérios-de-desempate-técnico-e-resiliência) - [Argumentos e Flags CLI](#argumentos-e-flags-cli-1) - [Exemplos Práticos de Uso](#exemplos-práticos-de-uso-1) +- [5. Conversor de Artigo JSON para Markdown](#5--conversor-de-artigo-json-para-markdown) + - [Visão Geral e Estrutura do Documento](#visão-geral-e-estrutura-do-documento) + - [Isolamento Estrito de Extratores e Fallback](#isolamento-estrito-de-extratores-e-fallback) + - [Matriz Determinística de Metadados](#matriz-determinística-de-metadados) + - [Sanitização Editorial e Deduplicação](#sanitização-editorial-e-deduplicação) + - [Argumentos e Flags CLI](#argumentos-e-flags-cli-2) + - [Exemplos Práticos de Uso](#exemplos-práticos-de-uso-2) - [Estrutura do Projeto](#-estrutura-do-projeto) - [Testes e Qualidade de Código](#-testes-e-qualidade-de-código) - [Licença](#-licença) @@ -49,6 +56,7 @@ O **TextNLPClassifierApp** reúne um ecossistema completo de ferramentas de enge 2. **`scripts/extract_google_news.py`**: Extrator de notícias por palavra-chave, idioma e região geográfica utilizando navegação stealth **Foxcape** (headless), decodificação paralela de URLs para links reais e feedback em tempo real. 3. **`scripts/extract_article_contents.py`**: Extrator e parser de artigos multimotor com navegação stealth Foxcape headless e extração simultânea via **Trafilatura**, **Newspaper4k** (NLP) e **Readability**, consolidando texto higienizado, autores, datas, imagens e resumos. 4. **`scripts/select_article_extractor.py`**: Motor determinístico de seleção de extratores que avalia as saídas dos três motores, aplica normalização em memória, calcula métricas de consenso de shingles (5-tokens) com pontuação $F_1$, desempata tecnicamente ($\le 0.03$) favorecendo menor concisão/ruído e enriquece os dados de forma não-destrutiva e atômica. +5. **`scripts/convert_article_to_markdown.py`**: Conversor determinístico que recebe o JSON de um único artigo selecionado, isola estritamente o corpo do extrator vencedor (`trafilatura`, `newspaper4k` ou `readability`), resolve metadados editoriais por prioridade estrita, higieniza links/imagens/cabeçalhos e gera um documento Markdown (`.md`) padronizado com gravação atômica transacional. --- @@ -353,47 +361,147 @@ print("Motivo:", result.selection_reason) --- +## 5. 📝 Conversor de Artigo JSON para Markdown + +### Visão Geral e Estrutura do Documento + +O script `scripts/convert_article_to_markdown.py` realiza a conversão de um arquivo JSON contendo exatamente um artigo (com `selected_extractor`) para um documento Markdown (`.md`) pronto para consumo editorial ou classificação downstream. + +A estrutura do Markdown gerado segue estritamente o padrão: + +```markdown +# Título do Artigo + +Subtítulo ou descrição editorial (omitido se ausente ou igual ao título). + +**Autor:** Nome do Autor 1, Nome do Autor 2 +**Publicado em:** 2026-08-20T00:36:33-03:00 +**Site:** Nome do Veículo +**Categoria:** Categoria 1, Categoria 2 +**Tags:** Tag 1, Tag 2 +**Palavras-chave:** Palavra 1, Palavra 2 +**Idioma:** es +**Fonte original:** [https://exemplo.com/artigo](https://exemplo.com/artigo) + +![Imagem principal](https://exemplo.com/imagem_capa.jpg) + +--- + +Conteúdo textual do artigo convertido em Markdown. +``` + +### Isolamento Estrito de Extratores e Fallback + +- **Isolamento Total do Corpo**: O texto e HTML do corpo vêm **exclusivamente** do extrator indicado em `selected_extractor`. Caso o extrator selecionado não possua corpo válido, o processo encerra imediatamente com erro (código `1`). Nunca ocorre fallback de corpo para outro extrator. +- **Fallback Interno**: + - `trafilatura`: usa `trafilatura.markdown`; se vazio, usa `trafilatura.text`. + - `newspaper4k`: converte `newspaper4k.article_html` para Markdown; se vazio, usa `newspaper4k.text`. + - `readability`: converte `readability.cleaned_html` para Markdown; se vazio, usa `readability.cleaned_text`. +- **Conversão HTML→Markdown**: Utiliza a biblioteca `markdownify` configurada para títulos padrão ATX (`#`, `##`, `###`), preservando negrito, itálico, listas, tabelas, citações, links e blocos de código. + +### Matriz Determinística de Metadados + +Os metadados editoriais são resolvidos deterministicamente consultando fontes na ordem de prioridade estrita: + +1. **Título**: `SELECIONADO.title` → `input_meta.titulo` → `page_title` → `newspaper4k.title` → `trafilatura.title` → `readability.title` +2. **URL Original**: `input_meta.url` → `crawled_url` → URL canônica do selecionado → `trafilatura.canonical_url` → `newspaper4k.canonical_link` +3. **Subtítulo/Descrição**: descrição do selecionado → `trafilatura.description` → `newspaper4k.meta_description` → `input_meta.subtitulo` +4. **Autores**: autor(es) do selecionado → `newspaper4k.authors` → `trafilatura.author` → `readability.author` +5. **Data de Publicação**: data do selecionado → `newspaper4k.publish_date` → `trafilatura.date` → `input_meta.quando_publicado` +6. **Site**: site do selecionado → `trafilatura.sitename` → `newspaper4k.meta_site_name` → `trafilatura.hostname` → Hostname da URL original +7. **Categorias**: categorias do selecionado → `trafilatura.categories` +8. **Tags**: tags do selecionado → `trafilatura.tags` → `newspaper4k.tags` → `newspaper4k.meta_keywords` +9. **Palavras-chave**: `newspaper4k.keywords` → `newspaper4k.meta_keywords` +10. **Idioma**: idioma do selecionado → `trafilatura.language` → `newspaper4k.meta_lang` +11. **Imagem Principal**: imagem do selecionado → `newspaper4k.top_image` → `trafilatura.image` + +### Sanitização Editorial e Deduplicação + +- **Remoção de H1 Duplicado**: Se o corpo iniciar com um título H1 idêntico ao título resolvido do artigo, esse H1 inicial é removido automaticamente. +- **Filtro de Imagens**: Remove imagens com URLs relativas, vazias ou em formato `data:`. Deduplica URLs de imagem repetidas no corpo. +- **Filtro de Placeholders**: Descarta valores como `null`, `None`, `N/A`, `unknown`, `[no-author]` ou rótulos vazios. +- **Gravação Atômica**: Escrita transacional em arquivo temporário seguida de substituição com `os.replace`, garantindo integridade e nenhum resíduo em falhas. + +### Argumentos e Flags CLI + +| Parâmetro | Tipo | Obrigatoriedade | Padrão | Descrição | +|---|---|:---:|---|---| +| `-i, --input` | Caminho | **Sim** | — | Arquivo JSON contendo exatamente um único artigo. | +| `-o, --output` | Caminho | Não | `.md` | Caminho do arquivo Markdown de destino. | + +### Exemplos Práticos de Uso + +#### 1. Conversão Padrão +```bash +python scripts/convert_article_to_markdown.py -i out/article_001.json +# Gera automaticamente out/article_001.md +``` + +#### 2. Conversão com Caminho de Destino Personalizado +```bash +python scripts/convert_article_to_markdown.py \ + -i out/article_001.json \ + -o out/markdown/meu_artigo.md +``` + +#### 3. Uso Programático em Python +```python +from pathlib import Path +from scripts.convert_article_to_markdown import convert_article + +out_file = convert_article(Path("out/article_001.json"), Path("out/artigo.md")) +print(f"Markdown gerado em: {out_file}") +``` + +--- + ## 📁 Estrutura do Projeto ```text TextNLPClassifierApp/ -├── classify.py # CLI principal do Classificador de Inerência +├── classify.py # CLI principal do Classificador de Inerência ├── scripts/ -│ ├── __init__.py # Pacote utilitário de scripts -│ ├── extract_google_news.py # CLI de Extração de Manchetes do Google News -│ ├── extract_article_contents.py # CLI de Extração e Parsing Multimotor de Artigos -│ └── select_article_extractor.py # CLI de Seleção Determinística de Extrator -├── src/ # Módulos centrais do classificador -│ ├── classifier.py # Orquestrador de classificação (Tier 1, 2, 3) -│ ├── models.py # Modelos de dados e esquemas (ECPSnapshot, Decision) -│ ├── preprocessor.py # Normalização de texto e detecção de idioma -│ └── adapters/ # Adaptadores opcionais de Embeddings e LLM -├── specs/ # Especificações e planos arquiteturais (Speckit) +│ ├── __init__.py # Pacote utilitário de scripts +│ ├── extract_google_news.py # CLI de Extração de Manchetes do Google News +│ ├── extract_article_contents.py # CLI de Extração e Parsing Multimotor de Artigos +│ ├── select_article_extractor.py # CLI de Seleção Determinística de Extrator +│ └── convert_article_to_markdown.py # CLI de Conversão de Artigo JSON para Markdown +├── src/ # Módulos centrais do classificador +│ ├── classifier.py # Orquestrador de classificação (Tier 1, 2, 3) +│ ├── models.py # Modelos de dados e esquemas (ECPSnapshot, Decision) +│ ├── preprocessor.py # Normalização de texto e detecção de idioma +│ └── adapters/ # Adaptadores opcionais de Embeddings e LLM +├── specs/ # Especificações e planos arquiteturais (Speckit) │ ├── 001-multilingual-entity-classifier/ │ ├── 002-google-news-extractor/ │ ├── 003-article-content-extractor/ -│ └── 004-deterministic-content-selection/ # Specs da seleção determinística -├── tests/ # Suíte de testes automatizados +│ ├── 004-deterministic-content-selection/ +│ └── 005-convert-json-markdown/ # Specs da conversão JSON para Markdown +├── tests/ # Suíte de testes automatizados │ ├── test_classifier.py │ ├── test_extract_google_news.py │ ├── test_extract_article_contents.py -│ └── test_select_article_extractor.py # Testes do seletor determinístico -├── requirements.txt # Dependências do projeto -├── pyproject.toml # Configurações de ferramentas (pytest, ruff, mypy) -└── README.md # Documentação principal +│ ├── test_select_article_extractor.py +│ └── test_convert_article_to_markdown.py # Testes da conversão para Markdown +├── requirements.txt # Dependências do projeto +├── pyproject.toml # Configurações de ferramentas (pytest, ruff, mypy) +└── README.md # Documentação principal ``` --- ## 🧪 Testes e Qualidade de Código -O repositório possui **120 testes automatizados** com 100% de aprovação cobrindo testes unitários, de regressão, de integração e testes End-to-End (E2E) via CLI subprocess: +O repositório possui **187 testes automatizados** com 100% de aprovação cobrindo testes unitários, de regressão, de integração, Golden Fixtures exatas, testes de sensibilidade de mutação e testes End-to-End (E2E) via CLI subprocess: ```bash -# Executar toda a suíte de testes do projeto (120 testes) +# Executar toda a suíte de testes do projeto (187 testes) pytest -v -# Executar especificamente os testes do Seletor Determinístico +# Executar os testes de Conversão de Artigo para Markdown (67 testes) +pytest tests/test_convert_article_to_markdown.py -v + +# Executar os testes do Seletor Determinístico pytest tests/test_select_article_extractor.py -v # Executar os testes do Extrator de Conteúdo Multimotor @@ -402,12 +510,11 @@ pytest tests/test_extract_article_contents.py -v # Executar os testes do Extrator do Google News pytest tests/test_extract_google_news.py -v -# Validação e correção automática de formatação com Ruff -ruff check --fix . -ruff format . +# Validação com Ruff +ruff check . # Verificação estática de tipos com Mypy -mypy scripts/ src/ +mypy scripts/convert_article_to_markdown.py ``` --- diff --git a/docs/prd_convert_json_markdown.md b/docs/prd_convert_json_markdown.md new file mode 100644 index 0000000..a9b0bf6 --- /dev/null +++ b/docs/prd_convert_json_markdown.md @@ -0,0 +1,516 @@ +# PRD — Conversão de artigo JSON para Markdown + +## 1. Visão geral + +O `TextNLPClassifierApp` já possui scripts para extrair artigos com Trafilatura, Newspaper4k e Readability e para selecionar deterministicamente o melhor extrator de conteúdo. + +Esta feature adicionará a etapa seguinte do pipeline: receber o JSON de um único artigo, já contendo `selected_extractor`, selecionar deterministicamente os metadados disponíveis e gerar um arquivo Markdown com o conteúdo do extrator escolhido. + +O arquivo `river_plate_extracted_selected(2).json` foi usado como referência de estrutura. Embora esse arquivo contenha uma coleção em `articles`, a entrada operacional desta feature será somente um objeto individual dessa coleção. + +## 2. Problema + +Cada artigo possui três resultados de extração com campos, formatos e níveis de preenchimento diferentes. O `selected_extractor` define qual corpo tem o maior peso e deve ser utilizado, mas metadados úteis podem estar ausentes nesse extrator e disponíveis em outro. + +É necessário produzir um Markdown único e previsível sem escolher novamente o melhor conteúdo, sem usar LLM e sem depender de interpretação manual. + +## 3. Objetivo + +Criar um CLI Python que: + +1. receba um arquivo JSON contendo exatamente um artigo; +2. valide os campos obrigatórios; +3. use exclusivamente o `selected_extractor` para obter o corpo do artigo; +4. selecione título, URL original e metadados opcionais por regras determinísticas; +5. converta o corpo HTML para Markdown quando necessário; +6. grave um arquivo `.md` legível, consistente e pronto para as etapas posteriores do pipeline. + +## 4. História do usuário + +Como operador do pipeline de conteúdo, quero converter o JSON selecionado de um artigo em um arquivo Markdown para que o conteúdo e os melhores metadados disponíveis possam ser consumidos pelas etapas seguintes do sistema. + +## 5. Escopo + +### 5.1 Incluído + +- CLI Python. +- Leitura de um arquivo JSON com um único artigo. +- Suporte a `trafilatura`, `newspaper4k` e `readability` como valores de `selected_extractor`. +- Seleção determinística de metadados. +- Conversão de HTML para Markdown. +- Uso direto do Markdown já gerado pela Trafilatura quando disponível. +- Geração de um único arquivo `.md` por execução. +- Validação de entrada, saída e erros. +- Gravação atômica do arquivo de saída. +- Testes unitários, testes do CLI e arquivos de resultado esperado. + +### 5.2 Fora do escopo + +- Receber o objeto raiz com o array `articles`. +- Processar vários artigos em uma execução. +- Executar novamente Trafilatura, Newspaper4k ou Readability. +- Calcular ou alterar `selected_extractor`. +- Comparar, combinar ou complementar o corpo com conteúdo de outro extrator. +- Usar LLM, embeddings ou qualquer seleção probabilística. +- Fazer novas requisições HTTP. +- Baixar ou armazenar imagens. +- Limpar semanticamente publicidade, recomendações, overlays ou outros blocos editoriais presentes no corpo selecionado. +- Criar API, banco de dados, fila, interface gráfica ou integração externa. +- Alterar o JSON recebido. + +## 6. Contrato de entrada + +### 6.1 Formato + +A entrada será um arquivo JSON UTF-8 cujo objeto raiz representa um único item do array `articles` observado no arquivo de referência. + +Campos esperados no objeto: + +| Campo | Tipo esperado | Obrigatoriedade | Uso | +|---|---|---:|---| +| `selected_extractor` | string | Obrigatório | Define a única fonte permitida para o corpo. | +| `input_meta` | object | Opcional | Fornece principalmente URL original, título e data de fallback. | +| `crawled_url` | string | Opcional | URL de fallback. | +| `page_title` | string | Opcional | Título de fallback. | +| `trafilatura` | object | Condicional | Obrigatório quando selecionado; opcional nos demais casos. | +| `newspaper4k` | object | Condicional | Obrigatório quando selecionado; opcional nos demais casos. | +| `readability` | object | Condicional | Obrigatório quando selecionado; opcional nos demais casos. | + +### 6.2 Valores aceitos para `selected_extractor` + +- `trafilatura` +- `newspaper4k` +- `readability` + +Qualquer outro valor deve invalidar a entrada. + +### 6.3 Campos obrigatórios após a resolução + +O processamento somente será bem-sucedido se for possível resolver: + +- título não vazio; +- URL original absoluta com protocolo `http` ou `https`; +- corpo não vazio pertencente ao `selected_extractor`. + +Os demais campos são opcionais e nunca devem impedir a geração do Markdown. + +## 7. Contrato de saída + +### 7.1 Arquivo + +- Formato: Markdown UTF-8. +- Quantidade: um arquivo por execução. +- Nome padrão: mesmo nome-base do JSON de entrada, substituindo `.json` por `.md`. +- Caminho alternativo: informado por `-o` ou `--output`. +- Escrita: arquivo temporário seguido de substituição atômica do destino. + +### 7.2 Estrutura do Markdown + +O Markdown deve seguir esta ordem: + +```markdown +# Título do artigo + +Subtítulo ou descrição, quando disponível. + +**Autor:** Nome do autor +**Publicado em:** 2026-08-20T00:36:33-03:00 +**Site:** Nome do site +**Categoria:** Categoria 1, Categoria 2 +**Tags:** Tag 1, Tag 2 +**Palavras-chave:** Palavra 1, Palavra 2 +**Idioma:** es +**Fonte original:** [https://exemplo.com/artigo](https://exemplo.com/artigo) + +![Imagem principal](https://exemplo.com/imagem.jpg) + +--- + +Conteúdo do artigo em Markdown. +``` + +Regras de apresentação: + +- título, URL original e corpo sempre devem aparecer; +- cada linha opcional deve ser completamente omitida quando não houver valor válido; +- nenhum placeholder como `null`, `None`, `N/A`, `unknown` ou `[no-author]` deve aparecer; +- o subtítulo deve ser omitido quando for igual ao título após normalização; +- a imagem principal deve ser omitida quando não possuir URL absoluta `http` ou `https`; +- o nome do `selected_extractor` não deve ser exibido no documento; +- os metadados técnicos internos do JSON não devem ser exibidos. + +## 8. Regras funcionais + +### RF-001 — Receber um único artigo + +O CLI deve aceitar somente um objeto individual de artigo. Um objeto contendo `articles` deve ser rejeitado, pois o processamento em lote não pertence a esta feature. + +### RF-002 — Respeitar o extrator selecionado + +O corpo deve vir exclusivamente do extrator indicado em `selected_extractor`. A ausência de corpo utilizável nesse extrator deve encerrar o processamento com erro. O sistema não pode trocar silenciosamente para outro extrator. + +### RF-003 — Resolver o corpo dentro do extrator selecionado + +| `selected_extractor` | Fonte principal | Fallback do mesmo extrator | Tratamento | +|---|---|---|---| +| `trafilatura` | `trafilatura.markdown` | `trafilatura.text` | Usar o Markdown diretamente; o texto puro já é Markdown válido. | +| `newspaper4k` | `newspaper4k.article_html` | `newspaper4k.text` | Converter o HTML; usar texto puro somente quando o HTML estiver vazio. | +| `readability` | `readability.cleaned_html` | `readability.cleaned_text` | Converter o HTML; usar texto puro somente quando o HTML estiver vazio. | + +O fallback ocorre somente entre representações do mesmo extrator selecionado. + +### RF-004 — Selecionar metadados deterministicamente + +Para cada campo, o sistema deve: + +1. percorrer as fontes na ordem definida neste PRD; +2. normalizar e validar cada candidato; +3. selecionar o primeiro candidato válido; +4. não consultar as fontes restantes após a seleção; +5. omitir o campo se nenhum candidato opcional for válido. + +A mesma entrada deve sempre gerar a mesma seleção e o mesmo arquivo. + +### RF-005 — Priorizar metadados por campo + +`SELECIONADO` representa o campo equivalente dentro do objeto indicado por `selected_extractor`. Quando o extrator não possuir o campo, essa posição é ignorada. + +| Campo de saída | Ordem de prioridade | +|---|---| +| Título | `SELECIONADO.title` → `input_meta.titulo` → `page_title` → `newspaper4k.title` → `trafilatura.title` → `readability.title` | +| URL original | `input_meta.url` → `crawled_url` → URL canônica do selecionado → `trafilatura.canonical_url` → `newspaper4k.canonical_link` | +| Subtítulo/descrição | descrição do selecionado → `trafilatura.description` → `newspaper4k.meta_description` → `input_meta.subtitulo` | +| Autores | autor(es) do selecionado → `newspaper4k.authors` → `trafilatura.author` → `readability.author` | +| Data de publicação | data do selecionado → `newspaper4k.publish_date` → `trafilatura.date` → `input_meta.quando_publicado` | +| Site | site do selecionado → `trafilatura.sitename` → `newspaper4k.meta_site_name` → `trafilatura.hostname` → hostname da URL original | +| Categorias | categorias do selecionado → `trafilatura.categories` | +| Tags | tags do selecionado → `trafilatura.tags` → `newspaper4k.tags` → `newspaper4k.meta_keywords` | +| Palavras-chave | `newspaper4k.keywords` → `newspaper4k.meta_keywords` | +| Idioma | idioma do selecionado → `trafilatura.language` → `newspaper4k.meta_lang` | +| Imagem principal | imagem do selecionado → `newspaper4k.top_image` → `trafilatura.image` | + +Mapeamento dos campos equivalentes do extrator selecionado: + +| Informação | Trafilatura | Newspaper4k | Readability | +|---|---|---|---| +| Título | `title` | `title` | `title` | +| Descrição | `description` | `meta_description` | Não disponível | +| Autores | `author` | `authors` | `author` | +| Data | `date` | `publish_date` | Não disponível | +| Site | `sitename` | `meta_site_name` | Não disponível | +| Categorias | `categories` | Não disponível | Não disponível | +| Tags | `tags` | `tags` | Não disponível | +| Idioma | `language` | `meta_lang` | Não disponível | +| Imagem principal | `image` | `top_image` | Não disponível | +| URL canônica | `canonical_url` | `canonical_link` | Não disponível | + +### RF-006 — Normalizar valores escalares + +Antes da validação, toda string candidata deve: + +- ter entidades HTML decodificadas; +- remover espaços no início e no fim; +- colapsar sequências internas de espaços em um único espaço; +- ser considerada ausente quando vazia ou quando corresponder, sem diferença entre maiúsculas e minúsculas, a um placeholder conhecido: `null`, `none`, `n/a`, `unknown`, `[no-author]` ou `no-author`. + +### RF-007 — Normalizar listas + +Autores, categorias, tags e palavras-chave podem chegar como lista ou string. O sistema deve: + +- aceitar lista de strings; +- aceitar string única; +- separar strings com múltiplos valores apenas por ponto e vírgula; +- normalizar cada item conforme RF-006; +- descartar autor iniciado por `http://`, `https://` ou `www.`; +- eliminar duplicatas sem diferenciar maiúsculas de minúsculas, preservando a primeira grafia e a ordem original; +- considerar a fonte inválida quando nenhum item válido restar; +- usar somente a primeira fonte da tabela de prioridade que resultar em lista válida, sem unir listas de fontes diferentes. + +### RF-008 — Normalizar datas + +- Aceitar datas ISO 8601 e RFC 2822 observadas na entrada de referência. +- Emitir ISO 8601. +- Preservar o fuso horário informado. +- Emitir somente `YYYY-MM-DD` quando a fonte fornecer apenas a data. +- Considerar inválida uma data que não possa ser interpretada e continuar para a próxima fonte de prioridade. + +### RF-009 — Validar URLs + +- Aceitar somente URLs absolutas com protocolo `http` ou `https`. +- Não fazer requisições para validar existência ou disponibilidade. +- Não aceitar `data:`, `javascript:`, caminhos relativos ou strings sem hostname. + +### RF-010 — Converter HTML para Markdown + +A conversão deve usar a biblioteca Python `markdownify`, configurada para produzir títulos no padrão ATX (`#`, `##`, `###`). + +Devem ser preservados, quando presentes no HTML selecionado: + +- parágrafos; +- títulos e subtítulos estruturais; +- listas ordenadas e não ordenadas; +- negrito e itálico; +- links; +- citações; +- blocos de código; +- tabelas suportadas pela biblioteca; +- imagens válidas do próprio corpo. + +A escolha de `markdownify` é intencional: a necessidade é exclusivamente converter HTML para Markdown. O Microsoft MarkItDown suporta HTML, mas atende vários outros formatos e acrescentaria uma abstração mais ampla do que a requerida por esta feature. + +### RF-011 — Tratar imagens do corpo + +- Preservar imagens convertidas do corpo somente quando o destino for uma URL absoluta `http` ou `https`. +- Remover imagens com URL vazia, relativa ou `data:`. +- Eliminar repetições exatas da mesma URL de imagem, preservando a primeira ocorrência. +- Não adicionar ao corpo a coleção `newspaper4k.images`. +- Não baixar, redimensionar ou validar remotamente imagens. + +### RF-012 — Evitar título duplicado + +Após a conversão do corpo, o sistema deve remover o primeiro título H1 do corpo somente quando ele for igual ao título resolvido após decodificação de HTML, normalização de espaços e comparação sem diferença entre maiúsculas e minúsculas. + +Outros títulos do conteúdo devem ser preservados. + +### RF-013 — Normalizar o Markdown final + +O arquivo final deve: + +- usar quebra de linha `LF`; +- terminar com exatamente uma quebra de linha; +- eliminar espaços no final das linhas; +- limitar sequências de linhas vazias a no máximo duas; +- não conter tags HTML remanescentes geradas apenas pela estrutura do documento; +- preservar o texto, a pontuação e os caracteres Unicode do conteúdo selecionado. + +### RF-014 — Não gerar saída parcial + +Se ocorrer qualquer erro antes da conclusão, o arquivo de destino existente deve permanecer intacto e nenhum arquivo temporário deve permanecer no diretório de saída. + +## 9. Interface CLI + +### 9.1 Script + +`scripts/convert_article_to_markdown.py` + +### 9.2 Argumentos + +| Parâmetro | Tipo | Obrigatoriedade | Padrão | Descrição | +|---|---|---:|---|---| +| `-i`, `--input` | caminho | Obrigatório | — | JSON contendo um único artigo. | +| `-o`, `--output` | caminho | Opcional | `.md` | Arquivo Markdown de destino. | + +Não devem ser adicionadas flags sem requisito funcional neste PRD. + +### 9.3 Exemplos + +```bash +python scripts/convert_article_to_markdown.py -i out/article_001.json +``` + +Resultado: `out/article_001.md`. + +```bash +python scripts/convert_article_to_markdown.py \ + -i out/article_001.json \ + -o out/markdown/article_001.md +``` + +### 9.4 Saída do processo + +- Código `0`: arquivo gerado com sucesso. +- Código `2`: argumentos inválidos, conforme comportamento do `argparse`. +- Código `1`: erro de leitura, validação, conversão ou gravação. +- Mensagens de erro e confirmação devem ir para `stderr`. +- O conteúdo Markdown não deve ser impresso no terminal quando houver arquivo de saída. + +## 10. Tratamento de erros + +O processamento deve falhar de forma clara nos seguintes casos: + +| Situação | Comportamento esperado | +|---|---| +| Arquivo não encontrado ou ilegível | Encerrar com código `1` e informar o caminho. | +| JSON inválido | Encerrar com código `1` e informar que a entrada não é JSON válido. | +| Raiz diferente de objeto | Encerrar com código `1`. | +| Entrada contém `articles` | Encerrar com código `1` e informar que o CLI aceita um único artigo. | +| `selected_extractor` ausente ou desconhecido | Encerrar com código `1`. | +| Objeto do extrator selecionado ausente | Encerrar com código `1`. | +| Corpo do extrator selecionado vazio | Encerrar com código `1`; não usar outro extrator. | +| Título não resolvido | Encerrar com código `1`. | +| URL original não resolvida ou inválida | Encerrar com código `1`. | +| Metadado opcional inválido | Ignorar o candidato e tentar o próximo; omitir se todos falharem. | +| Falha na conversão | Encerrar com código `1`. | +| Falha na gravação | Encerrar com código `1` sem alterar o destino anterior. | + +As mensagens não devem imprimir o conteúdo integral do artigo. + +## 11. Requisitos não funcionais + +### RNF-001 — Determinismo + +A mesma entrada e a mesma versão das dependências devem produzir exatamente o mesmo arquivo Markdown. + +### RNF-002 — Compatibilidade + +A feature deve manter as versões de Python declaradas como suportadas pelo projeto e funcionar nos sistemas operacionais já suportados pelo repositório. + +### RNF-003 — Execução local + +O processamento deve ocorrer inteiramente em memória local, sem rede, browser, LLM ou serviço externo. + +### RNF-004 — Integridade + +A entrada não deve ser modificada. A gravação de saída deve ser atômica. + +### RNF-005 — Manutenibilidade + +As regras de resolução de campos e as regras de conversão devem ser isoladas em funções testáveis, sem duplicação entre o CLI e o uso interno. + +### RNF-006 — Qualidade + +O código deve atender aos gates já adotados pelo projeto: Ruff, Mypy, Pytest e SonarQube. + +## 12. Critérios de aceite + +### CA-001 — Trafilatura selecionada + +**Dado** um artigo com `selected_extractor` igual a `trafilatura` e `trafilatura.markdown` preenchido +**Quando** o CLI for executado +**Então** o corpo do arquivo deve vir de `trafilatura.markdown` e nenhum corpo dos demais extratores deve ser incorporado. + +### CA-002 — Newspaper4k selecionado + +**Dado** um artigo com `selected_extractor` igual a `newspaper4k` e `newspaper4k.article_html` preenchido +**Quando** o CLI for executado +**Então** esse HTML deve ser convertido para Markdown preservando sua estrutura editorial. + +### CA-003 — Readability selecionado + +**Dado** um artigo com `selected_extractor` igual a `readability` e `readability.cleaned_html` preenchido +**Quando** o CLI for executado +**Então** esse HTML deve ser convertido para Markdown preservando sua estrutura editorial. + +### CA-004 — Fallback dentro do extrator + +**Dado** um extrator selecionado cujo campo estruturado esteja vazio, mas cujo campo de texto puro esteja preenchido +**Quando** o CLI for executado +**Então** o texto puro do mesmo extrator deve ser usado. + +### CA-005 — Proibição de fallback de corpo entre extratores + +**Dado** um extrator selecionado sem HTML, Markdown ou texto utilizável e outro extrator com conteúdo +**Quando** o CLI for executado +**Então** o processamento deve falhar sem utilizar o outro extrator. + +### CA-006 — Metadado vindo de outro extrator + +**Dado** um artigo cujo extrator selecionado não possua autor e outro extrator possua autor válido +**Quando** o CLI for executado +**Então** o primeiro autor válido conforme a prioridade deve aparecer no Markdown. + +### CA-007 — Obrigatórios presentes + +**Dado** um artigo válido +**Quando** o Markdown for gerado +**Então** ele deve conter título, URL original e corpo não vazio. + +### CA-008 — Opcionais ausentes + +**Dado** um artigo sem metadados opcionais válidos +**Quando** o Markdown for gerado +**Então** nenhuma linha vazia de metadado ou placeholder deve ser exibida. + +### CA-009 — Imagens inválidas + +**Dado** um corpo com imagens `data:`, vazias ou relativas +**Quando** o conteúdo for convertido +**Então** essas imagens devem ser removidas do Markdown. + +### CA-010 — Título repetido no corpo + +**Dado** um corpo que começa com H1 igual ao título resolvido +**Quando** o Markdown for montado +**Então** deve existir somente um H1 com esse título no arquivo final. + +### CA-011 — Entrada em lote rejeitada + +**Dado** o arquivo completo de referência contendo `articles` +**Quando** ele for passado diretamente ao CLI +**Então** o processamento deve falhar informando que a entrada esperada é um único artigo. + +### CA-012 — Determinismo + +**Dado** o mesmo JSON processado duas vezes com as mesmas dependências +**Quando** os arquivos forem comparados byte a byte +**Então** eles devem ser idênticos. + +### CA-013 — Gravação segura + +**Dado** um arquivo de destino preexistente e uma falha durante o processamento +**Quando** o CLI encerrar +**Então** o arquivo preexistente deve continuar inalterado. + +## 13. Estratégia de testes + +### 13.1 Testes unitários + +- resolução de cada campo conforme a ordem de prioridade; +- normalização de strings e placeholders; +- normalização, deduplicação e seleção de listas; +- parsing e padronização de datas ISO 8601 e RFC 2822; +- validação de URLs; +- seleção do corpo para cada extrator; +- fallback de representação dentro do mesmo extrator; +- bloqueio do fallback de corpo para outro extrator; +- conversão dos principais elementos HTML; +- remoção de imagens inválidas e duplicadas; +- remoção somente do H1 inicial duplicado; +- normalização final de espaços e quebras de linha. + +### 13.2 Testes de integração do CLI + +- geração com caminho padrão; +- geração com `--output`; +- códigos de saída `0`, `1` e `2`; +- mensagens em `stderr`; +- rejeição do JSON com coleção `articles`; +- preservação do destino em caso de falha; +- codificação UTF-8 com caracteres acentuados. + +### 13.3 Casos de resultado esperado + +Devem existir pelo menos três fixtures válidas, uma para cada valor de `selected_extractor`, acompanhadas dos respectivos arquivos Markdown esperados. A comparação deve ser exata. + +Também devem existir fixtures inválidas cobrindo: + +- JSON corrompido; +- `selected_extractor` ausente; +- extrator desconhecido; +- corpo selecionado vazio; +- título ausente em todas as fontes; +- URL ausente ou inválida em todas as fontes; +- objeto raiz contendo `articles`. + +## 14. Definition of Done + +A feature será considerada concluída quando: + +- o script `scripts/convert_article_to_markdown.py` estiver implementado; +- `markdownify` estiver declarada nas dependências do projeto; +- todos os requisitos funcionais e critérios de aceite estiverem cobertos; +- os testes unitários e de integração estiverem passando; +- as três fixtures de extratores produzirem exatamente os Markdown esperados; +- Ruff não apontar erros; +- Mypy não apontar erros; +- o conjunto completo de testes do projeto permanecer aprovado; +- o Quality Gate do SonarQube estiver aprovado; +- o README documentar a nova etapa, os argumentos e exemplos do CLI; +- nenhuma funcionalidade fora do escopo tiver sido adicionada. + +## 15. Dependência técnica escolhida + +- Biblioteca: [`markdownify`](https://github.com/matthewwithanm/python-markdownify) +- Finalidade: conversão direta de HTML para Markdown em Python. +- Alternativa avaliada: [`Microsoft MarkItDown`](https://github.com/microsoft/markitdown). +- Decisão: não usar MarkItDown nesta feature porque seu escopo de conversão multiformato excede a necessidade de HTML para Markdown. diff --git a/graphify-out/.graphify_labels.json b/graphify-out/.graphify_labels.json index f2b8b77..6612580 100644 --- a/graphify-out/.graphify_labels.json +++ b/graphify-out/.graphify_labels.json @@ -47,7 +47,7 @@ "45": "ClassificationResult", "46": "InherenceClassifier", "47": "classifier.py", - "48": "main", + "48": "test_convert_article_to_markdown.py", "49": "content_northvolt_de.md", "50": "content_presal_pt.md", "51": "content_tangential_es.md", @@ -98,13 +98,13 @@ "96": "readiness.md", "97": "🧠 TextNLPClassifierApp", "98": "Extraction Pipeline Checklist: Article Content Multi-Engine Extractor", - "99": "sample_rss_xml", + "99": "parametrize", "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": "LocalEmbeddingsAdapter", + "105": "Tasks: Convert Article JSON to Markdown", "106": "Implementation Plan: Article Content Multi-Engine Extractor", "107": "2. Cenários de Validação", "108": "1. Technical Decisions & Tradeoffs", @@ -120,6 +120,7 @@ "118": "Tasks: Deterministic Article Content Selection", "119": "select_article_extractor", "120": "process_batch", + "121": "detect_language", "122": "test_select_article_extractor.py", "123": "Feature Specification: Deterministic Content Selection", "124": "2. Entity Descriptions & Fields", @@ -129,5 +130,38 @@ "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" + "131": "convert_article_to_markdown.py", + "132": "8. Regras funcionais", + "133": "12. Critérios de aceite", + "134": "PRD — Conversão de artigo JSON para Markdown", + "135": "resolve_article_body", + "136": "Implementation Plan: Convert Article JSON to Markdown", + "137": "2. Technical Decisions & Research Findings", + "138": "Feature Specification: Convert Article JSON to Markdown", + "139": "Markdown Conversion Checklist: End-to-End Requirements Quality", + "140": "convert_article", + "141": "005-convert-json-markdown/plan.md", + "142": "Quickstart: Convert Article JSON to Markdown", + "143": "1. Domain Entities & Schemas", + "144": "11. Requisitos não funcionais", + "145": "parse_arguments", + "146": "Specification Quality Checklist: Convert Article JSON to Markdown", + "147": "CLI Contract: `convert_article_to_markdown.py`", + "148": "9. Interface CLI", + "149": "get_hl_gl_ceid", + "150": "13. Estratégia de testes", + "151": "6. Contrato de entrada", + "152": "assemble_markdown_document", + "153": "convert_html_to_markdown", + "154": "JSON Schema Contract: Deterministic Article Content Selection", + "155": "5. Escopo", + "156": "Los puntajes de River vs. Independiente Santa Fe, por la Copa Sudamericana - TyC Sports", + "157": "valid_newspaper4k.md", + "158": "valid_readability.md", + "159": "test_normalize_date_rfc_2822_variants", + "160": "test_normalize_date_invalid_and_placeholders", + "161": "test_metadata_priority_title_all_fallbacks", + "162": "test_metadata_priority_subtitle_omitted_when_equal_to_title", + "163": "test_metadata_priority_first_valid_source_no_cross_merging", + "164": "test_normalize_scalar_non_string_types" } diff --git a/graphify-out/.graphify_labels.json.sig b/graphify-out/.graphify_labels.json.sig index 35ed7cd..e2585f6 100644 --- a/graphify-out/.graphify_labels.json.sig +++ b/graphify-out/.graphify_labels.json.sig @@ -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": "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": "07da9aae9668f573", "117": "196f63e0c4536d30", "118": "ade84262e3cfac12", "119": "ebe4e5e0c42c613f", "120": "27256931b19a2867", "122": "aa8a1de55696b666", "123": "96618c9a362af46c", "124": "83f104cbb62fd03e", "125": "6db738fb27190349", "126": "6a087a22cbcef972", "127": "85fd71a0cad8d3a5", "128": "22dd4feed96c4229", "129": "c4d2f60f532e6f16", "130": "f6b0aa8a1568926b", "131": "56747bad6345d66b"} \ No newline at end of file +{"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": "0e7fcc21c22f118e", "46": "58f3596265f5f902", "47": "4de4f30d96344790", "48": "779ea305cb4270dc", "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": "dc6ddc157a3b9efb", "83": "a05140495d7a0353", "84": "24ca89fec34df075", "85": "f8bfd0cfe9e8b478", "86": "410d15a346bd5894", "87": "6b41d288cfd834ab", "88": "5aa6db96312a8811", "89": "80225792bb62ba04", "90": "e18a0a239fe528ba", "91": "d4579c5b7aa2742a", "92": "7b9ba7c3bff11361", "93": "71cd9c1fa4a857f0", "94": "34cd980be3c32d21", "95": "970093453f3b7d90", "96": "9e96780a2b7c4bd6", "97": "0b41ca143bd19d3a", "98": "089ea6a55861c693", "99": "683812f7e5020d43", "100": "8c97d8c400895e15", "101": "55faed4f78d00dd4", "102": "6aa00d5a83295f11", "103": "f58668f5b10ccdeb", "104": "4ec787414cc6f50b", "105": "1cf3077fd45d874a", "106": "edcd5d9bb3c4b00f", "107": "37f2f47110fe3eaa", "108": "b7ad5abb1da8cf8d", "109": "cb48a9c4f54efa38", "110": "f6dd36fd7f3edbe5", "111": "2925b620f0b1fd17", "112": "d8b3099917c3b711", "113": "3bb61caa0302c804", "114": "0d4f1d08dd056bb9", "115": "4ac2dcddeec2ff11", "116": "07da9aae9668f573", "117": "196f63e0c4536d30", "118": "ade84262e3cfac12", "119": "ebe4e5e0c42c613f", "120": "27256931b19a2867", "121": "5396e68ca6c185ad", "122": "aa8a1de55696b666", "123": "96618c9a362af46c", "124": "83f104cbb62fd03e", "125": "6db738fb27190349", "126": "6a087a22cbcef972", "127": "85fd71a0cad8d3a5", "128": "22dd4feed96c4229", "129": "c4d2f60f532e6f16", "130": "f6b0aa8a1568926b", "131": "bf5dd1f3361b9d31", "132": "67ea4284cbc02c54", "133": "d899cfc86c7a4a27", "134": "ba9464410a9b4168", "135": "5406c193e79cdc9e", "136": "521f5c7b9d566b4d", "137": "9e37828bdd2ba8c5", "138": "ec03c97194c56f91", "139": "f4e6d5dfa30034c5", "140": "b48c7d99e847e352", "141": "1e0330b8757f333e", "142": "f35d75e1194c008d", "143": "4d2ae7190b514a34", "144": "4a98716cabf43f86", "145": "c80d7bdacb7f0aa3", "146": "edc785fd71bb0675", "147": "4c7347f8f86e1fbd", "148": "8ca77cc4fd6fd437", "149": "09850697b717469a", "150": "f4f4ce1a1180ddb1", "151": "e426746f6e9ee15f", "152": "3d72689c6c4d76be", "153": "3eef4100c7957556", "154": "56747bad6345d66b", "155": "a8e7498fa7e257df", "156": "56e7b2355898077f", "157": "f2fc88f7d8214711", "158": "c966f6f8570c8c29", "159": "3846d1135f02ad84", "160": "d19878b60c21c9dc", "161": "f288304e804126ee", "162": "fe285d17e79eaab7", "163": "97e7e26a5ea11e7a", "164": "bc4c32aee32f28c8"} \ No newline at end of file diff --git a/graphify-out/2026-08-21/.graphify_labels.json b/graphify-out/2026-08-21/.graphify_labels.json index f2b8b77..697dacd 100644 --- a/graphify-out/2026-08-21/.graphify_labels.json +++ b/graphify-out/2026-08-21/.graphify_labels.json @@ -47,7 +47,7 @@ "45": "ClassificationResult", "46": "InherenceClassifier", "47": "classifier.py", - "48": "main", + "48": "test_convert_article_to_markdown.py", "49": "content_northvolt_de.md", "50": "content_presal_pt.md", "51": "content_tangential_es.md", @@ -104,7 +104,7 @@ "102": "Feature Specification: Multilingual NLP Entity Inherence Classifier (POC)", "103": "4. Requisitos Funcionais (FR)", "104": "Tasks: Article Content Multi-Engine Extractor", - "105": "LocalEmbeddingsAdapter", + "105": "Tasks: Convert Article JSON to Markdown", "106": "Implementation Plan: Article Content Multi-Engine Extractor", "107": "2. Cenários de Validação", "108": "1. Technical Decisions & Tradeoffs", @@ -116,10 +116,11 @@ "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", + "117": "Research & Architectural Decisions: Deterministic Content Selection", "118": "Tasks: Deterministic Article Content Selection", "119": "select_article_extractor", "120": "process_batch", + "121": "detect_language", "122": "test_select_article_extractor.py", "123": "Feature Specification: Deterministic Content Selection", "124": "2. Entity Descriptions & Fields", @@ -129,5 +130,34 @@ "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" + "131": "convert_article_to_markdown.py", + "132": "8. Regras funcionais", + "133": "12. Critérios de aceite", + "134": "PRD — Conversão de artigo JSON para Markdown", + "135": "resolve_article_body", + "136": "Implementation Plan: Convert Article JSON to Markdown", + "137": "2. Technical Decisions & Research Findings", + "138": "Feature Specification: Convert Article JSON to Markdown", + "139": "Markdown Conversion Checklist: End-to-End Requirements Quality", + "140": "convert_article", + "141": "005-convert-json-markdown/plan.md", + "142": "Quickstart: Convert Article JSON to Markdown", + "143": "1. Domain Entities & Schemas", + "144": "11. Requisitos não funcionais", + "145": "parse_arguments", + "146": "Specification Quality Checklist: Convert Article JSON to Markdown", + "147": "CLI Contract: `convert_article_to_markdown.py`", + "148": "9. Interface CLI", + "149": "1. Text Normalization Pipeline", + "150": "13. Estratégia de testes", + "151": "6. Contrato de entrada", + "152": "assemble_markdown_document", + "153": "convert_html_to_markdown", + "154": "remove_duplicate_initial_h1", + "155": "5. Escopo", + "156": "Los puntajes de River vs. Independiente Santa Fe, por la Copa Sudamericana - TyC Sports", + "157": "valid_newspaper4k.md", + "158": "valid_readability.md", + "159": "test_normalize_list_strings_and_deduplication", + "160": "test_validate_url_schemes" } diff --git a/graphify-out/2026-08-21/GRAPH_REPORT.md b/graphify-out/2026-08-21/GRAPH_REPORT.md index c63d99b..166e4c4 100644 --- a/graphify-out/2026-08-21/GRAPH_REPORT.md +++ b/graphify-out/2026-08-21/GRAPH_REPORT.md @@ -1,16 +1,16 @@ -# Graph Report - TextNLPClassifierApp (2026-08-20) +# Graph Report - TextNLPClassifierApp (2026-08-21) ## Corpus Check -- 174 files · ~91,961 words +- 199 files · ~107,634 words - Verdict: corpus is large enough that graph structure adds value. ## Summary -- 1235 nodes · 1548 edges · 131 communities (93 shown, 38 thin omitted) +- 1504 nodes · 1860 edges · 161 communities (118 shown, 43 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: `6a45368c` +- Built from commit: `64dfd842` - Run `git rev-parse HEAD` and compare to check if the graph is stale. - Run `graphify update .` after code changes (no API cost). @@ -59,7 +59,7 @@ - ClassificationResult - InherenceClassifier - classifier.py -- main +- test_convert_article_to_markdown.py - content_northvolt_de.md - content_presal_pt.md - content_tangential_es.md @@ -115,7 +115,7 @@ - Feature Specification: Multilingual NLP Entity Inherence Classifier (POC) - 4. Requisitos Funcionais (FR) - Tasks: Article Content Multi-Engine Extractor -- LocalEmbeddingsAdapter +- Tasks: Convert Article JSON to Markdown - Implementation Plan: Article Content Multi-Engine Extractor - 2. Cenários de Validação - 1. Technical Decisions & Tradeoffs @@ -126,10 +126,11 @@ - 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 +- Research & Architectural Decisions: Deterministic Content Selection - Tasks: Deterministic Article Content Selection - select_article_extractor - process_batch +- detect_language - test_select_article_extractor.py - Feature Specification: Deterministic Content Selection - 2. Entity Descriptions & Fields @@ -138,7 +139,37 @@ - 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 +- 004-deterministic-content-selection/spec.md +- convert_article_to_markdown.py +- 8. Regras funcionais +- 12. Critérios de aceite +- PRD — Conversão de artigo JSON para Markdown +- resolve_article_body +- Implementation Plan: Convert Article JSON to Markdown +- 2. Technical Decisions & Research Findings +- Feature Specification: Convert Article JSON to Markdown +- Markdown Conversion Checklist: End-to-End Requirements Quality +- convert_article +- 005-convert-json-markdown/plan.md +- Quickstart: Convert Article JSON to Markdown +- 1. Domain Entities & Schemas +- 11. Requisitos não funcionais +- parse_arguments +- Specification Quality Checklist: Convert Article JSON to Markdown +- CLI Contract: `convert_article_to_markdown.py` +- 9. Interface CLI +- 1. Text Normalization Pipeline +- 13. Estratégia de testes +- 6. Contrato de entrada +- assemble_markdown_document +- convert_html_to_markdown +- remove_duplicate_initial_h1 +- 5. Escopo +- Los puntajes de River vs. Independiente Santa Fe, por la Copa Sudamericana - TyC Sports +- valid_newspaper4k.md +- valid_readability.md +- test_normalize_list_strings_and_deduplication +- test_validate_url_schemes ## God Nodes (most connected - your core abstractions) 1. `ECPSnapshot` - 31 edges @@ -147,27 +178,27 @@ 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 +7. `PRD — Conversão de artigo JSON para Markdown` - 16 edges +8. `process_batch()` - 15 edges +9. `8. Regras funcionais` - 15 edges +10. `process_batch()` - 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 +- `petrobras_ecp()` --uses--> `ECPSnapshot` [INFERRED] + tests/test_classifier.py → src/models.py ## Import Cycles - None detected. -## Communities (131 total, 38 thin omitted) +## Communities (161 total, 43 thin omitted) ### Community 0 - "Task Planning" Cohesion: 0.07 @@ -310,20 +341,20 @@ 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 - "ClassificationResult" -Cohesion: 0.14 -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) +Cohesion: 0.09 +Nodes (19): 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., LocalEmbeddingsAdapter (+11 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 - "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) +Cohesion: 0.16 +Nodes (16): 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., extract_evidence_snippets(), extract_sentences() (+8 more) -### 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 48 - "test_convert_article_to_markdown.py" +Cohesion: 0.08 +Nodes (23): Suíte de Testes Automatizados para Conversão de Artigo JSON para Markdown.…, Testa decodificação de entidades HTML, colapso de espaços e filtro de…, Testa a matriz determinística de prioridades dos metadados., Validação exata byte a byte da Golden Fixture de Trafilatura., Validação exata byte a byte da Golden Fixture de Newspaper4k., Validação exata byte a byte da Golden Fixture de Readability., Testa geração do arquivo de saída padrão .md., Testa rejeição com código 1 quando a entrada contém a chave articles. (+15 more) ### Community 80 - "test_extract_article_contents.py" Cohesion: 0.06 @@ -386,8 +417,8 @@ Cohesion: 0.33 Nodes (6): 1. Comando e Argumentos, 2. Códigos de Saída (Exit Codes), 3. Protocolo de Streams (Stdout / Stderr), Argumentos de Linha de Comando, CLI Contract: Google News Headlines Extractor, Sintaxe ### Community 97 - "🧠 TextNLPClassifierApp" -Cohesion: 0.06 -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) +Cohesion: 0.04 +Nodes (45): 1. 🧠 Classificador de Conteúdo e Inerência (NLP / LLM / ECP), 1. Clonar o Repositório e Criar Ambiente Virtual, 1. Conversão Padrão, 1. Execução Padrão Automática, 2. Conversão com Caminho de Destino Personalizado, 2. Execução com Modo Verboso, 2. 📰 Extrator de Manchetes do Google News, 2. Instalar Dependências (+37 more) ### Community 98 - "Extraction Pipeline Checklist: Article Content Multi-Engine Extractor" Cohesion: 0.05 @@ -398,12 +429,12 @@ 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.24 -Nodes (8): emit_error(), ClassificationError, ErrorCode, MatchedGraphEntity, Enum, str, Data models and validation schemas for Multilingual NLP Entity Inherence…, test_classification_error_serialization() +Cohesion: 0.15 +Nodes (17): emit_error(), main(), parse_args(), Namespace, ClassificationError, ErrorCode, MatchedGraphEntity, Enum (+9 more) ### Community 101 - "ECPSnapshot" -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) +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) ### Community 102 - "Feature Specification: Multilingual NLP Entity Inherence Classifier (POC)" Cohesion: 0.14 @@ -417,9 +448,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 - "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 105 - "Tasks: Convert Article JSON to Markdown" +Cohesion: 0.11 +Nodes (19): Dependencies & Execution Order, Implementation for User Story 1, Implementation for User Story 2, Implementation for User Story 3, Implementation Strategy, Incremental Delivery, MVP First (User Story 1 Only), Parallel Opportunities (+11 more) ### Community 106 - "Implementation Plan: Article Content Multi-Engine Extractor" Cohesion: 0.17 @@ -458,12 +489,12 @@ 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) +Cohesion: 0.14 +Nodes (19): ArticleSelectionResult, BatchProcessingResult, break_priority_tie(), calculate_consensus_metrics(), ExtractorCandidate, form_active_set(), main(), parse_args() (+11 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 117 - "Research & Architectural Decisions: Deterministic Content Selection" +Cohesion: 0.15 +Nodes (13): 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, Context, Context, Context, Decisions, Decisions (+5 more) ### Community 118 - "Tasks: Deterministic Article Content Selection" Cohesion: 0.11 @@ -471,15 +502,19 @@ Nodes (18): Dependencies & Execution Order, Implementation for User Story 1, Imp ### 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) +Nodes (35): CandidateStatus, extract_candidate_data(), ExtractorName, Any, Enum, str, Extrai campo de texto, erro e calcula tokens/shingles para um motor., Nomes canônicos e catálogo fechado dos motores de extração. (+27 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) +Cohesion: 0.11 +Nodes (24): 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. (+16 more) + +### Community 121 - "detect_language" +Cohesion: 0.19 +Nodes (16): detect_language(), extract_words(), normalize_text(), Lightweight multilingual language detection and text normalization., Normalize text by converting to lowercase and stripping combining diacritical…, Tokenize text into lowercase alphanumeric words., Detect the ISO-639-1 language code of text among supported languages (pt, en,…, Unit tests for language detection and text normalization. (+8 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) +Cohesion: 0.18 +Nodes (16): 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…, E2E: Executa scripts/select_article_extractor.py como subprocesso real na linha…, test_e2e_cli_subprocess_real_execution() (+8 more) ### Community 123 - "Feature Specification: Deterministic Content Selection" Cohesion: 0.17 @@ -509,23 +544,123 @@ Nodes (5): Content Quality, Feature Readiness, Notes, Requirement Completeness, 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 +### Community 130 - "004-deterministic-content-selection/spec.md" +Cohesion: 0.29 Nodes (3): 1. Input JSON Schema, 2. Output JSON Schema, JSON Schema Contract: Deterministic Article Content Selection +### Community 131 - "convert_article_to_markdown.py" +Cohesion: 0.23 +Nodes (15): _get_dict(), normalize_date(), normalize_list(), normalize_scalar(), Any, Interpreta datas ISO 8601 e RFC 2822 preservando fuso horário ou YYYY-MM-DD…, Valida se a URL é absoluta com protocolo http ou https e hostname não vazio., Retorna o dicionário associado à chave ou um dicionário vazio caso não seja… (+7 more) + +### Community 132 - "8. Regras funcionais" +Cohesion: 0.13 +Nodes (15): 8. Regras funcionais, RF-001 — Receber um único artigo, RF-002 — Respeitar o extrator selecionado, RF-003 — Resolver o corpo dentro do extrator selecionado, RF-004 — Selecionar metadados deterministicamente, RF-005 — Priorizar metadados por campo, RF-006 — Normalizar valores escalares, RF-007 — Normalizar listas (+7 more) + +### Community 133 - "12. Critérios de aceite" +Cohesion: 0.14 +Nodes (14): 12. Critérios de aceite, CA-001 — Trafilatura selecionada, CA-002 — Newspaper4k selecionado, CA-003 — Readability selecionado, CA-004 — Fallback dentro do extrator, CA-005 — Proibição de fallback de corpo entre extratores, CA-006 — Metadado vindo de outro extrator, CA-007 — Obrigatórios presentes (+6 more) + +### Community 134 - "PRD — Conversão de artigo JSON para Markdown" +Cohesion: 0.17 +Nodes (11): 10. Tratamento de erros, 14. Definition of Done, 15. Dependência técnica escolhida, 1. Visão geral, 2. Problema, 3. Objetivo, 4. História do usuário, 7.1 Arquivo (+3 more) + +### Community 135 - "resolve_article_body" +Cohesion: 0.17 +Nodes (12): Obtém o corpo do artigo exclusivamente do selected_extractor com fallback…, resolve_article_body(), Garante que falhe se o corpo do extrator selecionado for vazio, sem usar outro…, Garante que Trafilatura use diretamente o campo markdown., Garante que Trafilatura faça fallback para text se markdown estiver vazio., Garante conversão de HTML para Markdown para Newspaper4k., Garante conversão de HTML para Markdown para Readability., test_resolve_article_body_newspaper4k_html_conversion() (+4 more) + +### Community 136 - "Implementation Plan: Convert Article JSON to Markdown" +Cohesion: 0.17 +Nodes (12): Complexity Tracking, Constitution Check, Documentation (this feature), Implementation Phases, Implementation Plan: Convert Article JSON to Markdown, Phase 0: Outline & Research *(Completed)*, Phase 1: Design & Contracts *(Completed)*, Phase 2: Tasks & Implementation Breakdown *(Next: `/speckit-tasks`)* (+4 more) + +### Community 137 - "2. Technical Decisions & Research Findings" +Cohesion: 0.17 +Nodes (11): 1. Executive Summary & Goals, 2. Technical Decisions & Research Findings, 3. Technology Stack & Dependencies, Decision 1: HTML-to-Markdown Engine Selection, Decision 2: Direct Markdown Handling for Trafilatura, Decision 3: Metadata Normalization & Priority Resolution Pipeline, Decision 4: Date Parsing Strategy (ISO 8601 & RFC 2822), Decision 5: URL Validation & Media Filtering (+3 more) + +### Community 138 - "Feature Specification: Convert Article JSON to Markdown" +Cohesion: 0.17 +Nodes (12): Assumptions, Edge Cases, Feature Specification: Convert Article JSON to Markdown, Functional Requirements, Key Entities, Measurable Outcomes, Requirements *(mandatory)*, Success Criteria *(mandatory)* (+4 more) + +### Community 139 - "Markdown Conversion Checklist: End-to-End Requirements Quality" +Cohesion: 0.18 +Nodes (11): 1. Validação de Entrada, Tipagem & Isolamento de Lotes, 2. Isolamento Estrito de Extrator & Conversão de Conteúdo (HTML/MD), 3. Resolução Determinística de Metadados & Mapeamento de SELECIONADO, 4. Normalização de Escalares, Placeholders & Sanitização de Listas, 5. Normalização de Datas, Fusos & Validação Estrita de URLs, 6. Sanitização Editorial, Tratamento de Imagens & Título Duplicado, 7. Estrutura, Sintaxe do Markdown de Saída & Restrições, 8. Interface CLI, Tratamento de Erros & Atomicidade (+3 more) + +### Community 140 - "convert_article" +Cohesion: 0.22 +Nodes (9): clean_body_images(), convert_article(), Path, Preserva imagens com URL absoluta http/https, remove relativas/data:/vazias e…, Executa a leitura do JSON, validação, conversão e escrita atômica do arquivo…, Garante remoção de imagens relativas/data: e deduplicação de imagens idênticas., Testa diretamente a função convert_article em Python., test_clean_body_images_and_deduplicate() (+1 more) + +### Community 141 - "005-convert-json-markdown/plan.md" +Cohesion: 0.33 +Nodes (3): 1. Output Document Specification, 2. Formatting & Syntax Constraints, Markdown Schema Contract: Output Article Markdown + +### Community 142 - "Quickstart: Convert Article JSON to Markdown" +Cohesion: 0.22 +Nodes (8): 1. Prerequisites & Setup, 2. Running the CLI Tool, 3. Verification & Testing, Basic Conversion (Default Output Path), Custom Destination Path, Quickstart: Convert Article JSON to Markdown, Run All Unit & Integration Tests, Run Linter & Type Checker + +### Community 143 - "1. Domain Entities & Schemas" +Cohesion: 0.25 +Nodes (8): 1. Domain Entities & Schemas, 2. Priority Resolution Matrix, Data Model: Convert Article JSON to Markdown, Entity 1: `ArticleInput` (Source JSON), Entity 2: `ExtractorBlock` (Per-Extractor Data), Entity 3: `ResolvedArticleMetadata`, Entity 4: `MarkdownDocument`, Validation Rules: + +### Community 144 - "11. Requisitos não funcionais" +Cohesion: 0.29 +Nodes (7): 11. Requisitos não funcionais, RNF-001 — Determinismo, RNF-002 — Compatibilidade, RNF-003 — Execução local, RNF-004 — Integridade, RNF-005 — Manutenibilidade, RNF-006 — Qualidade + +### Community 145 - "parse_arguments" +Cohesion: 0.29 +Nodes (7): main(), parse_arguments(), Namespace, Configura o parser de argumentos do CLI., Ponto de entrada do CLI., Testa diretamente o parsing de argumentos., test_parse_arguments_direct() + +### Community 146 - "Specification Quality Checklist: Convert Article JSON to Markdown" +Cohesion: 0.33 +Nodes (5): Content Quality, Feature Readiness, Notes, Requirement Completeness, Specification Quality Checklist: Convert Article JSON to Markdown + +### Community 147 - "CLI Contract: `convert_article_to_markdown.py`" +Cohesion: 0.33 +Nodes (5): 1. Script Signature, 2. Command-Line Arguments, 3. Exit Codes, 4. Standard Stream Behavior, CLI Contract: `convert_article_to_markdown.py` + +### Community 148 - "9. Interface CLI" +Cohesion: 0.40 +Nodes (5): 9.1 Script, 9.2 Argumentos, 9.3 Exemplos, 9.4 Saída do processo, 9. Interface CLI + +### Community 149 - "1. Text Normalization Pipeline" +Cohesion: 0.40 +Nodes (5): 1. Text Normalization Pipeline, Alternatives Considered, Context, Decisions, Rationale + +### Community 150 - "13. Estratégia de testes" +Cohesion: 0.50 +Nodes (4): 13.1 Testes unitários, 13.2 Testes de integração do CLI, 13.3 Casos de resultado esperado, 13. Estratégia de testes + +### Community 151 - "6. Contrato de entrada" +Cohesion: 0.50 +Nodes (4): 6.1 Formato, 6.2 Valores aceitos para `selected_extractor`, 6.3 Campos obrigatórios após a resolução, 6. Contrato de entrada + +### Community 152 - "assemble_markdown_document" +Cohesion: 0.50 +Nodes (4): assemble_markdown_document(), Monta a estrutura final do documento Markdown respeitando a ordem estrita do…, Testa a montagem completa da estrutura de seções do documento Markdown., test_assemble_markdown_document() + +### Community 153 - "convert_html_to_markdown" +Cohesion: 0.50 +Nodes (4): convert_html_to_markdown(), Converte HTML para Markdown usando títulos ATX., Testa diretamente a função convert_html_to_markdown., test_convert_html_to_markdown_basic() + +### Community 154 - "remove_duplicate_initial_h1" +Cohesion: 0.50 +Nodes (4): Remove o primeiro título H1 do corpo somente quando ele for igual ao título…, remove_duplicate_initial_h1(), Garante remoção apenas do H1 inicial que for idêntico ao título., test_remove_duplicate_initial_h1() + +### Community 155 - "5. Escopo" +Cohesion: 0.67 +Nodes (3): 5.1 Incluído, 5.2 Fora do escopo, 5. Escopo + ## Knowledge Gaps -- **562 isolated node(s):** `text-nlp-classifier`, `MatchedGraphEntity`, `graphify`, `Usage`, `What graphify is for` (+557 more) +- **696 isolated node(s):** `text-nlp-classifier`, `MatchedGraphEntity`, `graphify`, `Usage`, `What graphify is for` (+691 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. +- **43 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`, `LocalEmbeddingsAdapter`, `ClassificationResult`, `InherenceClassifier`, `classifier.py`, `main`?** - _High betweenness centrality (0.003) - this node is a cross-community bridge._ -- **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`?** +- **Why does `PRD — Conversão de artigo JSON para Markdown` connect `PRD — Conversão de artigo JSON para Markdown` to `8. Regras funcionais`, `12. Critérios de aceite`, `11. Requisitos não funcionais`, `9. Interface CLI`, `13. Estratégia de testes`, `6. Contrato de entrada`, `5. Escopo`?** + _High betweenness centrality (0.007) - this node is a cross-community bridge._ +- **Why does `Tasks: Convert Article JSON to Markdown` connect `Tasks: Convert Article JSON to Markdown` to `005-convert-json-markdown/plan.md`?** + _High betweenness centrality (0.004) - this node is a cross-community bridge._ +- **Why does `Research & Architectural Decisions: Deterministic Content Selection` connect `Research & Architectural Decisions: Deterministic Content Selection` to `004-deterministic-content-selection/spec.md`, `1. Text Normalization Pipeline`?** _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._ diff --git a/graphify-out/2026-08-21/graph.json b/graphify-out/2026-08-21/graph.json index 36b36ec..a685996 100644 --- a/graphify-out/2026-08-21/graph.json +++ b/graphify-out/2026-08-21/graph.json @@ -56,17 +56,17 @@ "source_location": "L58" }, { - "id": "src_adapters_embeddings_localembeddingsadapter", - "label": "LocalEmbeddingsAdapter", + "id": "scripts_select_article_extractor_articleselectionresult", + "label": "ArticleSelectionResult", "_callable": true, "_callable_class": true, "_origin": "ast", - "community": 105, - "community_name": "LocalEmbeddingsAdapter", + "community": 116, + "community_name": "select_article_extractor.py", "file_type": "code", - "norm_label": "localembeddingsadapter", - "source_file": "src/adapters/embeddings.py", - "source_location": "L13" + "norm_label": "articleselectionresult", + "source_file": "scripts/select_article_extractor.py", + "source_location": "L78" }, { "id": "scripts_select_article_extractor_batchprocessingresult", @@ -94,19 +94,6 @@ "source_file": "scripts/select_article_extractor.py", "source_location": "L62" }, - { - "id": "scripts_select_article_extractor_articleselectionresult", - "label": "ArticleSelectionResult", - "_callable": true, - "_callable_class": true, - "_origin": "ast", - "community": 119, - "community_name": "select_article_extractor", - "file_type": "code", - "norm_label": "articleselectionresult", - "source_file": "scripts/select_article_extractor.py", - "source_location": "L78" - }, { "id": "scripts_select_article_extractor_candidatestatus", "label": "CandidateStatus", @@ -146,6 +133,19 @@ "source_file": "src/adapters/base.py", "source_location": "L10" }, + { + "id": "src_adapters_embeddings_localembeddingsadapter", + "label": "LocalEmbeddingsAdapter", + "_callable": true, + "_callable_class": true, + "_origin": "ast", + "community": 45, + "community_name": "ClassificationResult", + "file_type": "code", + "norm_label": "localembeddingsadapter", + "source_file": "src/adapters/embeddings.py", + "source_location": "L13" + }, { "id": "src_adapters_llm_llmfallbackadapter", "label": "LLMFallbackAdapter", @@ -392,6 +392,30 @@ "source_file": "classify.py", "source_location": "L72" }, + { + "id": "classify_main", + "label": "main()", + "_callable": true, + "_origin": "ast", + "community": 100, + "community_name": "models.py", + "file_type": "code", + "norm_label": "main()", + "source_file": "classify.py", + "source_location": "L97" + }, + { + "id": "classify_parse_args", + "label": "parse_args()", + "_callable": true, + "_origin": "ast", + "community": 100, + "community_name": "models.py", + "file_type": "code", + "norm_label": "parse_args()", + "source_file": "classify.py", + "source_location": "L27" + }, { "id": "src_models_classificationerror_to_dict", "label": ".to_dict()", @@ -428,6 +452,66 @@ "source_file": "src/models.py", "source_location": "L150" }, + { + "id": "tests_test_cli_test_cli_empty_content_file", + "label": "test_cli_empty_content_file()", + "_callable": true, + "_origin": "ast", + "community": 100, + "community_name": "models.py", + "file_type": "code", + "norm_label": "test_cli_empty_content_file()", + "source_file": "tests/test_cli.py", + "source_location": "L85" + }, + { + "id": "tests_test_cli_test_cli_missing_ecp_file", + "label": "test_cli_missing_ecp_file()", + "_callable": true, + "_origin": "ast", + "community": 100, + "community_name": "models.py", + "file_type": "code", + "norm_label": "test_cli_missing_ecp_file()", + "source_file": "tests/test_cli.py", + "source_location": "L73" + }, + { + "id": "tests_test_cli_test_cli_missing_required_ecp_field", + "label": "test_cli_missing_required_ecp_field()", + "_callable": true, + "_origin": "ast", + "community": 100, + "community_name": "models.py", + "file_type": "code", + "norm_label": "test_cli_missing_required_ecp_field()", + "source_file": "tests/test_cli.py", + "source_location": "L111" + }, + { + "id": "tests_test_cli_test_cli_output_file", + "label": "test_cli_output_file()", + "_callable": true, + "_origin": "ast", + "community": 100, + "community_name": "models.py", + "file_type": "code", + "norm_label": "test_cli_output_file()", + "source_file": "tests/test_cli.py", + "source_location": "L39" + }, + { + "id": "tests_test_cli_test_cli_success_stdout", + "label": "test_cli_success_stdout()", + "_callable": true, + "_origin": "ast", + "community": 100, + "community_name": "models.py", + "file_type": "code", + "norm_label": "test_cli_success_stdout()", + "source_file": "tests/test_cli.py", + "source_location": "L8" + }, { "id": "tests_test_models_test_classification_error_serialization", "label": "test_classification_error_serialization()", @@ -440,18 +524,6 @@ "source_file": "tests/test_models.py", "source_location": "L88" }, - { - "id": "src_models_classificationresult_to_dict", - "label": ".to_dict()", - "_callable": true, - "_origin": "ast", - "community": 101, - "community_name": "ECPSnapshot", - "file_type": "code", - "norm_label": ".to_dict()", - "source_file": "src/models.py", - "source_location": "L134" - }, { "id": "src_models_ecpsnapshot_from_dict", "label": ".from_dict()", @@ -548,102 +620,6 @@ "source_file": "tests/test_models.py", "source_location": "L15" }, - { - "id": "src_adapters_embeddings_localembeddingsadapter_disambiguate", - "label": ".disambiguate()", - "_callable": true, - "_origin": "ast", - "community": 105, - "community_name": "LocalEmbeddingsAdapter", - "file_type": "code", - "norm_label": ".disambiguate()", - "source_file": "src/adapters/embeddings.py", - "source_location": "L37" - }, - { - "id": "src_adapters_embeddings_localembeddingsadapter_evaluate_similarity", - "label": ".evaluate_similarity()", - "_callable": true, - "_origin": "ast", - "community": 105, - "community_name": "LocalEmbeddingsAdapter", - "file_type": "code", - "norm_label": ".evaluate_similarity()", - "source_file": "src/adapters/embeddings.py", - "source_location": "L31" - }, - { - "id": "src_adapters_embeddings_localembeddingsadapter_init", - "label": ".__init__()", - "_callable": true, - "_origin": "ast", - "community": 105, - "community_name": "LocalEmbeddingsAdapter", - "file_type": "code", - "norm_label": ".__init__()", - "source_file": "src/adapters/embeddings.py", - "source_location": "L16" - }, - { - "id": "src_adapters_embeddings_localembeddingsadapter_is_available", - "label": ".is_available()", - "_callable": true, - "_origin": "ast", - "community": 105, - "community_name": "LocalEmbeddingsAdapter", - "file_type": "code", - "norm_label": ".is_available()", - "source_file": "src/adapters/embeddings.py", - "source_location": "L23" - }, - { - "id": "src_classifier_inherenceclassifier_init", - "label": ".__init__()", - "_callable": true, - "_origin": "ast", - "community": 105, - "community_name": "LocalEmbeddingsAdapter", - "file_type": "code", - "norm_label": ".__init__()", - "source_file": "src/classifier.py", - "source_location": "L44" - }, - { - "id": "tests_test_adapters_test_classifier_with_adapter_flags", - "label": "test_classifier_with_adapter_flags()", - "_callable": true, - "_origin": "ast", - "community": 105, - "community_name": "LocalEmbeddingsAdapter", - "file_type": "code", - "norm_label": "test_classifier_with_adapter_flags()", - "source_file": "tests/test_adapters.py", - "source_location": "L20" - }, - { - "id": "tests_test_adapters_test_embeddings_adapter_interface", - "label": "test_embeddings_adapter_interface()", - "_callable": true, - "_origin": "ast", - "community": 105, - "community_name": "LocalEmbeddingsAdapter", - "file_type": "code", - "norm_label": "test_embeddings_adapter_interface()", - "source_file": "tests/test_adapters.py", - "source_location": "L9" - }, - { - "id": "tests_test_adapters_test_llm_adapter_interface", - "label": "test_llm_adapter_interface()", - "_callable": true, - "_origin": "ast", - "community": 105, - "community_name": "LocalEmbeddingsAdapter", - "file_type": "code", - "norm_label": "test_llm_adapter_interface()", - "source_file": "tests/test_adapters.py", - "source_location": "L15" - }, { "id": "scripts_select_article_extractor_break_priority_tie", "label": "break_priority_tie()", @@ -654,7 +630,7 @@ "file_type": "code", "norm_label": "break_priority_tie()", "source_file": "scripts/select_article_extractor.py", - "source_location": "L280" + "source_location": "L284" }, { "id": "scripts_select_article_extractor_calculate_consensus_metrics", @@ -666,7 +642,7 @@ "file_type": "code", "norm_label": "calculate_consensus_metrics()", "source_file": "scripts/select_article_extractor.py", - "source_location": "L234" + "source_location": "L236" }, { "id": "scripts_select_article_extractor_form_active_set", @@ -690,7 +666,7 @@ "file_type": "code", "norm_label": "main()", "source_file": "scripts/select_article_extractor.py", - "source_location": "L544" + "source_location": "L570" }, { "id": "scripts_select_article_extractor_parse_args", @@ -702,7 +678,7 @@ "file_type": "code", "norm_label": "parse_args()", "source_file": "scripts/select_article_extractor.py", - "source_location": "L523" + "source_location": "L544" }, { "id": "scripts_select_article_extractor_select_with_consensus", @@ -714,7 +690,7 @@ "file_type": "code", "norm_label": "select_with_consensus()", "source_file": "scripts/select_article_extractor.py", - "source_location": "L289" + "source_location": "L293" }, { "id": "scripts_select_article_extractor_select_without_consensus", @@ -726,7 +702,7 @@ "file_type": "code", "norm_label": "select_without_consensus()", "source_file": "scripts/select_article_extractor.py", - "source_location": "L322" + "source_location": "L330" }, { "id": "scripts_select_article_extractor_extract_candidate_data", @@ -750,7 +726,7 @@ "file_type": "code", "norm_label": "select_article_extractor()", "source_file": "scripts/select_article_extractor.py", - "source_location": "L373" + "source_location": "L387" }, { "id": "tests_test_select_article_extractor_test_article_1_regression_technical_tie_markdown_images", @@ -762,7 +738,7 @@ "file_type": "code", "norm_label": "test_article_1_regression_technical_tie_markdown_images()", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L363" + "source_location": "L401" }, { "id": "tests_test_select_article_extractor_test_ct_001_three_candidates_clear_winner", @@ -774,7 +750,7 @@ "file_type": "code", "norm_label": "test_ct_001_three_candidates_clear_winner()", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L115" + "source_location": "L130" }, { "id": "tests_test_select_article_extractor_test_ct_002_technical_tie_smallest_shingles", @@ -786,7 +762,7 @@ "file_type": "code", "norm_label": "test_ct_002_technical_tie_smallest_shingles()", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L128" + "source_location": "L146" }, { "id": "tests_test_select_article_extractor_test_ct_003_technical_tie_priority_fallback", @@ -798,7 +774,7 @@ "file_type": "code", "norm_label": "test_ct_003_technical_tie_priority_fallback()", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L140" + "source_location": "L163" }, { "id": "tests_test_select_article_extractor_test_ct_004_three_candidates_no_consensus", @@ -810,7 +786,7 @@ "file_type": "code", "norm_label": "test_ct_004_three_candidates_no_consensus()", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L161" + "source_location": "L184" }, { "id": "tests_test_select_article_extractor_test_ct_005_two_candidates_no_consensus", @@ -822,7 +798,7 @@ "file_type": "code", "norm_label": "test_ct_005_two_candidates_no_consensus()", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L176" + "source_location": "L199" }, { "id": "tests_test_select_article_extractor_test_ct_006_single_usable_candidate", @@ -834,7 +810,7 @@ "file_type": "code", "norm_label": "test_ct_006_single_usable_candidate()", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L190" + "source_location": "L215" }, { "id": "tests_test_select_article_extractor_test_ct_007_degraded_candidates_only", @@ -846,7 +822,7 @@ "file_type": "code", "norm_label": "test_ct_007_degraded_candidates_only()", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L202" + "source_location": "L230" }, { "id": "tests_test_select_article_extractor_test_ct_008_all_candidates_unavailable", @@ -858,7 +834,7 @@ "file_type": "code", "norm_label": "test_ct_008_all_candidates_unavailable()", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L214" + "source_location": "L242" }, { "id": "tests_test_select_article_extractor_test_ct_009_small_fragment_loses_due_to_low_coverage", @@ -870,7 +846,7 @@ "file_type": "code", "norm_label": "test_ct_009_small_fragment_loses_due_to_low_coverage()", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L226" + "source_location": "L254" }, { "id": "tests_test_select_article_extractor_test_ct_010_excessive_boilerplate_loses_due_to_low_support", @@ -882,7 +858,7 @@ "file_type": "code", "norm_label": "test_ct_010_excessive_boilerplate_loses_due_to_low_support()", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L243" + "source_location": "L271" }, { "id": "tests_test_select_article_extractor_test_ct_011_partial_content_loses_due_to_low_coverage", @@ -894,7 +870,7 @@ "file_type": "code", "norm_label": "test_ct_011_partial_content_loses_due_to_low_coverage()", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L259" + "source_location": "L289" }, { "id": "scripts_select_article_extractor_atomic_save_json", @@ -906,7 +882,7 @@ "file_type": "code", "norm_label": "atomic_save_json()", "source_file": "scripts/select_article_extractor.py", - "source_location": "L430" + "source_location": "L448" }, { "id": "scripts_select_article_extractor_process_batch", @@ -918,7 +894,7 @@ "file_type": "code", "norm_label": "process_batch()", "source_file": "scripts/select_article_extractor.py", - "source_location": "L452" + "source_location": "L470" }, { "id": "tests_test_select_article_extractor_test_ct_012_recalculate_existing_selected_extractor", @@ -930,7 +906,7 @@ "file_type": "code", "norm_label": "test_ct_012_recalculate_existing_selected_extractor()", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L272" + "source_location": "L302" }, { "id": "tests_test_select_article_extractor_test_ct_013_empty_articles_list", @@ -942,7 +918,7 @@ "file_type": "code", "norm_label": "test_ct_013_empty_articles_list()", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L298" + "source_location": "L334" }, { "id": "tests_test_select_article_extractor_test_ct_014_invalid_json_fails_atomically", @@ -954,7 +930,7 @@ "file_type": "code", "norm_label": "test_ct_014_invalid_json_fails_atomically()", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L317" + "source_location": "L353" }, { "id": "tests_test_select_article_extractor_test_e2e_cli_subprocess_default_naming", @@ -966,7 +942,7 @@ "file_type": "code", "norm_label": "test_e2e_cli_subprocess_default_naming()", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L520" + "source_location": "L567" }, { "id": "tests_test_select_article_extractor_test_e2e_cli_subprocess_invalid_input", @@ -978,7 +954,7 @@ "file_type": "code", "norm_label": "test_e2e_cli_subprocess_invalid_input()", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L548" + "source_location": "L595" }, { "id": "tests_test_select_article_extractor_test_e2e_cli_subprocess_missing_file", @@ -990,19 +966,7 @@ "file_type": "code", "norm_label": "test_e2e_cli_subprocess_missing_file()", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L561" - }, - { - "id": "tests_test_select_article_extractor_test_e2e_cli_subprocess_real_execution", - "label": "test_e2e_cli_subprocess_real_execution()", - "_callable": true, - "_origin": "ast", - "community": 120, - "community_name": "process_batch", - "file_type": "code", - "norm_label": "test_e2e_cli_subprocess_real_execution()", - "source_file": "tests/test_select_article_extractor.py", - "source_location": "L483" + "source_location": "L608" }, { "id": "tests_test_select_article_extractor_test_integration_large_batch_determinism", @@ -1014,7 +978,7 @@ "file_type": "code", "norm_label": "test_integration_large_batch_determinism()", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L397" + "source_location": "L435" }, { "id": "tests_test_select_article_extractor_test_integration_pipeline_downstream_consumer", @@ -1026,7 +990,7 @@ "file_type": "code", "norm_label": "test_integration_pipeline_downstream_consumer()", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L446" + "source_location": "L493" }, { "id": "tests_test_select_article_extractor_test_integration_reference_file", @@ -1038,7 +1002,139 @@ "file_type": "code", "norm_label": "test_integration_reference_file()", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L334" + "source_location": "L370" + }, + { + "id": "src_language_detect_language", + "label": "detect_language()", + "_callable": true, + "_origin": "ast", + "community": 121, + "community_name": "detect_language", + "file_type": "code", + "norm_label": "detect_language()", + "source_file": "src/language.py", + "source_location": "L477" + }, + { + "id": "src_language_extract_words", + "label": "extract_words()", + "_callable": true, + "_origin": "ast", + "community": 121, + "community_name": "detect_language", + "file_type": "code", + "norm_label": "extract_words()", + "source_file": "src/language.py", + "source_location": "L472" + }, + { + "id": "src_language_normalize_text", + "label": "normalize_text()", + "_callable": true, + "_origin": "ast", + "community": 121, + "community_name": "detect_language", + "file_type": "code", + "norm_label": "normalize_text()", + "source_file": "src/language.py", + "source_location": "L462" + }, + { + "id": "tests_test_language_test_detect_english", + "label": "test_detect_english()", + "_callable": true, + "_origin": "ast", + "community": 121, + "community_name": "detect_language", + "file_type": "code", + "norm_label": "test_detect_english()", + "source_file": "tests/test_language.py", + "source_location": "L21" + }, + { + "id": "tests_test_language_test_detect_french", + "label": "test_detect_french()", + "_callable": true, + "_origin": "ast", + "community": 121, + "community_name": "detect_language", + "file_type": "code", + "norm_label": "test_detect_french()", + "source_file": "tests/test_language.py", + "source_location": "L51" + }, + { + "id": "tests_test_language_test_detect_german", + "label": "test_detect_german()", + "_callable": true, + "_origin": "ast", + "community": 121, + "community_name": "detect_language", + "file_type": "code", + "norm_label": "test_detect_german()", + "source_file": "tests/test_language.py", + "source_location": "L37" + }, + { + "id": "tests_test_language_test_detect_italian", + "label": "test_detect_italian()", + "_callable": true, + "_origin": "ast", + "community": 121, + "community_name": "detect_language", + "file_type": "code", + "norm_label": "test_detect_italian()", + "source_file": "tests/test_language.py", + "source_location": "L44" + }, + { + "id": "tests_test_language_test_detect_portuguese", + "label": "test_detect_portuguese()", + "_callable": true, + "_origin": "ast", + "community": 121, + "community_name": "detect_language", + "file_type": "code", + "norm_label": "test_detect_portuguese()", + "source_file": "tests/test_language.py", + "source_location": "L14" + }, + { + "id": "tests_test_language_test_detect_spanish", + "label": "test_detect_spanish()", + "_callable": true, + "_origin": "ast", + "community": 121, + "community_name": "detect_language", + "file_type": "code", + "norm_label": "test_detect_spanish()", + "source_file": "tests/test_language.py", + "source_location": "L28" + }, + { + "id": "tests_test_language_test_empty_language", + "label": "test_empty_language()", + "_callable": true, + "_origin": "ast", + "community": 121, + "community_name": "detect_language", + "file_type": "code", + "norm_label": "test_empty_language()", + "source_file": "tests/test_language.py", + "source_location": "L58" + }, + { + "id": "tests_test_language_test_normalize_text", + "label": "test_normalize_text()", + "_callable": true, + "_origin": "ast", + "community": 121, + "community_name": "detect_language", + "file_type": "code", + "norm_label": "test_normalize_text()", + "source_file": "tests/test_language.py", + "source_location": "L6" }, { "id": "scripts_select_article_extractor_generate_shingles", @@ -1064,6 +1160,18 @@ "source_file": "scripts/select_article_extractor.py", "source_location": "L106" }, + { + "id": "tests_test_select_article_extractor_test_e2e_cli_subprocess_real_execution", + "label": "test_e2e_cli_subprocess_real_execution()", + "_callable": true, + "_origin": "ast", + "community": 122, + "community_name": "test_select_article_extractor.py", + "file_type": "code", + "norm_label": "test_e2e_cli_subprocess_real_execution()", + "source_file": "tests/test_select_article_extractor.py", + "source_location": "L530" + }, { "id": "tests_test_select_article_extractor_test_generate_shingles_empty", "label": "test_generate_shingles_empty()", @@ -1074,7 +1182,7 @@ "file_type": "code", "norm_label": "test_generate_shingles_empty()", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L106" + "source_location": "L121" }, { "id": "tests_test_select_article_extractor_test_generate_shingles_short_text", @@ -1086,7 +1194,7 @@ "file_type": "code", "norm_label": "test_generate_shingles_short_text()", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L98" + "source_location": "L113" }, { "id": "tests_test_select_article_extractor_test_generate_shingles_sliding_window", @@ -1098,7 +1206,7 @@ "file_type": "code", "norm_label": "test_generate_shingles_sliding_window()", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L90" + "source_location": "L105" }, { "id": "tests_test_select_article_extractor_test_normalize_text_empty_and_invalid", @@ -1110,7 +1218,7 @@ "file_type": "code", "norm_label": "test_normalize_text_empty_and_invalid()", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L40" + "source_location": "L30" }, { "id": "tests_test_select_article_extractor_test_normalize_text_html_entities_and_tags", @@ -1122,7 +1230,7 @@ "file_type": "code", "norm_label": "test_normalize_text_html_entities_and_tags()", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L47" + "source_location": "L37" }, { "id": "tests_test_select_article_extractor_test_normalize_text_markdown_images_stripped_while_links_preserved", @@ -1134,7 +1242,7 @@ "file_type": "code", "norm_label": "test_normalize_text_markdown_images_stripped_while_links_preserved()", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L59" + "source_location": "L49" }, { "id": "tests_test_select_article_extractor_test_normalize_text_markdown_links", @@ -1146,7 +1254,7 @@ "file_type": "code", "norm_label": "test_normalize_text_markdown_links()", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L53" + "source_location": "L43" }, { "id": "tests_test_select_article_extractor_test_normalize_text_nfkc_unicode_and_punctuation", @@ -1158,7 +1266,343 @@ "file_type": "code", "norm_label": "test_normalize_text_nfkc_unicode_and_punctuation()", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L78" + "source_location": "L79" + }, + { + "id": "scripts_convert_article_to_markdown_get_dict", + "label": "_get_dict()", + "_callable": true, + "_origin": "ast", + "community": 131, + "community_name": "convert_article_to_markdown.py", + "file_type": "code", + "norm_label": "_get_dict()", + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L219" + }, + { + "id": "scripts_convert_article_to_markdown_normalize_date", + "label": "normalize_date()", + "_callable": true, + "_origin": "ast", + "community": 131, + "community_name": "convert_article_to_markdown.py", + "file_type": "code", + "norm_label": "normalize_date()", + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L104" + }, + { + "id": "scripts_convert_article_to_markdown_normalize_list", + "label": "normalize_list()", + "_callable": true, + "_origin": "ast", + "community": 131, + "community_name": "convert_article_to_markdown.py", + "file_type": "code", + "norm_label": "normalize_list()", + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L56" + }, + { + "id": "scripts_convert_article_to_markdown_normalize_scalar", + "label": "normalize_scalar()", + "_callable": true, + "_origin": "ast", + "community": 131, + "community_name": "convert_article_to_markdown.py", + "file_type": "code", + "norm_label": "normalize_scalar()", + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L40" + }, + { + "id": "scripts_convert_article_to_markdown_resolve_article_metadata", + "label": "resolve_article_metadata()", + "_callable": true, + "_origin": "ast", + "community": 131, + "community_name": "convert_article_to_markdown.py", + "file_type": "code", + "norm_label": "resolve_article_metadata()", + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L225" + }, + { + "id": "scripts_convert_article_to_markdown_validate_url", + "label": "validate_url()", + "_callable": true, + "_origin": "ast", + "community": 131, + "community_name": "convert_article_to_markdown.py", + "file_type": "code", + "norm_label": "validate_url()", + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L135" + }, + { + "id": "tests_test_convert_article_to_markdown_test_normalize_date_iso_and_rfc2822", + "label": "test_normalize_date_iso_and_rfc2822()", + "_callable": true, + "_origin": "ast", + "community": 131, + "community_name": "convert_article_to_markdown.py", + "file_type": "code", + "norm_label": "test_normalize_date_iso_and_rfc2822()", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L159" + }, + { + "id": "scripts_convert_article_to_markdown_resolve_article_body", + "label": "resolve_article_body()", + "_callable": true, + "_origin": "ast", + "community": 135, + "community_name": "resolve_article_body", + "file_type": "code", + "norm_label": "resolve_article_body()", + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L161" + }, + { + "id": "tests_test_convert_article_to_markdown_test_resolve_article_body_newspaper4k_html_conversion", + "label": "test_resolve_article_body_newspaper4k_html_conversion()", + "_callable": true, + "_origin": "ast", + "community": 135, + "community_name": "resolve_article_body", + "file_type": "code", + "norm_label": "test_resolve_article_body_newspaper4k_html_conversion()", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L73" + }, + { + "id": "tests_test_convert_article_to_markdown_test_resolve_article_body_readability_html_conversion", + "label": "test_resolve_article_body_readability_html_conversion()", + "_callable": true, + "_origin": "ast", + "community": 135, + "community_name": "resolve_article_body", + "file_type": "code", + "norm_label": "test_resolve_article_body_readability_html_conversion()", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L88" + }, + { + "id": "tests_test_convert_article_to_markdown_test_resolve_article_body_strict_isolation_prohibits_cross_fallback", + "label": "test_resolve_article_body_strict_isolation_prohibits_cross_fallback()", + "_callable": true, + "_origin": "ast", + "community": 135, + "community_name": "resolve_article_body", + "file_type": "code", + "norm_label": "test_resolve_article_body_strict_isolation_prohibits_cross_fallback()", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L102" + }, + { + "id": "tests_test_convert_article_to_markdown_test_resolve_article_body_trafilatura_fallback_text", + "label": "test_resolve_article_body_trafilatura_fallback_text()", + "_callable": true, + "_origin": "ast", + "community": 135, + "community_name": "resolve_article_body", + "file_type": "code", + "norm_label": "test_resolve_article_body_trafilatura_fallback_text()", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L60" + }, + { + "id": "tests_test_convert_article_to_markdown_test_resolve_article_body_trafilatura_markdown", + "label": "test_resolve_article_body_trafilatura_markdown()", + "_callable": true, + "_origin": "ast", + "community": 135, + "community_name": "resolve_article_body", + "file_type": "code", + "norm_label": "test_resolve_article_body_trafilatura_markdown()", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L47" + }, + { + "id": "scripts_convert_article_to_markdown_clean_body_images", + "label": "clean_body_images()", + "_callable": true, + "_origin": "ast", + "community": 140, + "community_name": "convert_article", + "file_type": "code", + "norm_label": "clean_body_images()", + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L508" + }, + { + "id": "scripts_convert_article_to_markdown_convert_article", + "label": "convert_article()", + "_callable": true, + "_origin": "ast", + "community": 140, + "community_name": "convert_article", + "file_type": "code", + "norm_label": "convert_article()", + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L608" + }, + { + "id": "tests_test_convert_article_to_markdown_test_clean_body_images_and_deduplicate", + "label": "test_clean_body_images_and_deduplicate()", + "_callable": true, + "_origin": "ast", + "community": 140, + "community_name": "convert_article", + "file_type": "code", + "norm_label": "test_clean_body_images_and_deduplicate()", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L258" + }, + { + "id": "tests_test_convert_article_to_markdown_test_convert_article_direct", + "label": "test_convert_article_direct()", + "_callable": true, + "_origin": "ast", + "community": 140, + "community_name": "convert_article", + "file_type": "code", + "norm_label": "test_convert_article_direct()", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L462" + }, + { + "id": "scripts_convert_article_to_markdown_main", + "label": "main()", + "_callable": true, + "_origin": "ast", + "community": 145, + "community_name": "parse_arguments", + "file_type": "code", + "norm_label": "main()", + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L690" + }, + { + "id": "scripts_convert_article_to_markdown_parse_arguments", + "label": "parse_arguments()", + "_callable": true, + "_origin": "ast", + "community": 145, + "community_name": "parse_arguments", + "file_type": "code", + "norm_label": "parse_arguments()", + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L667" + }, + { + "id": "tests_test_convert_article_to_markdown_test_parse_arguments_direct", + "label": "test_parse_arguments_direct()", + "_callable": true, + "_origin": "ast", + "community": 145, + "community_name": "parse_arguments", + "file_type": "code", + "norm_label": "test_parse_arguments_direct()", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L455" + }, + { + "id": "scripts_convert_article_to_markdown_assemble_markdown_document", + "label": "assemble_markdown_document()", + "_callable": true, + "_origin": "ast", + "community": 152, + "community_name": "assemble_markdown_document", + "file_type": "code", + "norm_label": "assemble_markdown_document()", + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L540" + }, + { + "id": "tests_test_convert_article_to_markdown_test_assemble_markdown_document", + "label": "test_assemble_markdown_document()", + "_callable": true, + "_origin": "ast", + "community": 152, + "community_name": "assemble_markdown_document", + "file_type": "code", + "norm_label": "test_assemble_markdown_document()", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L274" + }, + { + "id": "scripts_convert_article_to_markdown_convert_html_to_markdown", + "label": "convert_html_to_markdown()", + "_callable": true, + "_origin": "ast", + "community": 153, + "community_name": "convert_html_to_markdown", + "file_type": "code", + "norm_label": "convert_html_to_markdown()", + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L149" + }, + { + "id": "tests_test_convert_article_to_markdown_test_convert_html_to_markdown_basic", + "label": "test_convert_html_to_markdown_basic()", + "_callable": true, + "_origin": "ast", + "community": 153, + "community_name": "convert_html_to_markdown", + "file_type": "code", + "norm_label": "test_convert_html_to_markdown_basic()", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L447" + }, + { + "id": "scripts_convert_article_to_markdown_remove_duplicate_initial_h1", + "label": "remove_duplicate_initial_h1()", + "_callable": true, + "_origin": "ast", + "community": 154, + "community_name": "remove_duplicate_initial_h1", + "file_type": "code", + "norm_label": "remove_duplicate_initial_h1()", + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L473" + }, + { + "id": "tests_test_convert_article_to_markdown_test_remove_duplicate_initial_h1", + "label": "test_remove_duplicate_initial_h1()", + "_callable": true, + "_origin": "ast", + "community": 154, + "community_name": "remove_duplicate_initial_h1", + "file_type": "code", + "norm_label": "test_remove_duplicate_initial_h1()", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L249" + }, + { + "id": "tests_test_convert_article_to_markdown_test_normalize_list_strings_and_deduplication", + "label": "test_normalize_list_strings_and_deduplication()", + "_callable": true, + "_origin": "ast", + "community": 159, + "community_name": "test_normalize_list_strings_and_deduplication", + "file_type": "code", + "norm_label": "test_normalize_list_strings_and_deduplication()", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L139" + }, + { + "id": "tests_test_convert_article_to_markdown_test_validate_url_schemes", + "label": "test_validate_url_schemes()", + "_callable": true, + "_origin": "ast", + "community": 160, + "community_name": "test_validate_url_schemes", + "file_type": "code", + "norm_label": "test_validate_url_schemes()", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L175" }, { "id": "scripts_extract_google_news_build_parser", @@ -1280,6 +1724,54 @@ "source_file": "src/adapters/base.py", "source_location": "L14" }, + { + "id": "src_adapters_embeddings_localembeddingsadapter_disambiguate", + "label": ".disambiguate()", + "_callable": true, + "_origin": "ast", + "community": 45, + "community_name": "ClassificationResult", + "file_type": "code", + "norm_label": ".disambiguate()", + "source_file": "src/adapters/embeddings.py", + "source_location": "L37" + }, + { + "id": "src_adapters_embeddings_localembeddingsadapter_evaluate_similarity", + "label": ".evaluate_similarity()", + "_callable": true, + "_origin": "ast", + "community": 45, + "community_name": "ClassificationResult", + "file_type": "code", + "norm_label": ".evaluate_similarity()", + "source_file": "src/adapters/embeddings.py", + "source_location": "L31" + }, + { + "id": "src_adapters_embeddings_localembeddingsadapter_init", + "label": ".__init__()", + "_callable": true, + "_origin": "ast", + "community": 45, + "community_name": "ClassificationResult", + "file_type": "code", + "norm_label": ".__init__()", + "source_file": "src/adapters/embeddings.py", + "source_location": "L16" + }, + { + "id": "src_adapters_embeddings_localembeddingsadapter_is_available", + "label": ".is_available()", + "_callable": true, + "_origin": "ast", + "community": 45, + "community_name": "ClassificationResult", + "file_type": "code", + "norm_label": ".is_available()", + "source_file": "src/adapters/embeddings.py", + "source_location": "L23" + }, { "id": "src_adapters_llm_llmfallbackadapter_disambiguate", "label": ".disambiguate()", @@ -1328,6 +1820,66 @@ "source_file": "src/adapters/llm.py", "source_location": "L22" }, + { + "id": "src_classifier_inherenceclassifier_init", + "label": ".__init__()", + "_callable": true, + "_origin": "ast", + "community": 45, + "community_name": "ClassificationResult", + "file_type": "code", + "norm_label": ".__init__()", + "source_file": "src/classifier.py", + "source_location": "L44" + }, + { + "id": "src_models_classificationresult_to_dict", + "label": ".to_dict()", + "_callable": true, + "_origin": "ast", + "community": 45, + "community_name": "ClassificationResult", + "file_type": "code", + "norm_label": ".to_dict()", + "source_file": "src/models.py", + "source_location": "L134" + }, + { + "id": "tests_test_adapters_test_classifier_with_adapter_flags", + "label": "test_classifier_with_adapter_flags()", + "_callable": true, + "_origin": "ast", + "community": 45, + "community_name": "ClassificationResult", + "file_type": "code", + "norm_label": "test_classifier_with_adapter_flags()", + "source_file": "tests/test_adapters.py", + "source_location": "L20" + }, + { + "id": "tests_test_adapters_test_embeddings_adapter_interface", + "label": "test_embeddings_adapter_interface()", + "_callable": true, + "_origin": "ast", + "community": 45, + "community_name": "ClassificationResult", + "file_type": "code", + "norm_label": "test_embeddings_adapter_interface()", + "source_file": "tests/test_adapters.py", + "source_location": "L9" + }, + { + "id": "tests_test_adapters_test_llm_adapter_interface", + "label": "test_llm_adapter_interface()", + "_callable": true, + "_origin": "ast", + "community": 45, + "community_name": "ClassificationResult", + "file_type": "code", + "norm_label": "test_llm_adapter_interface()", + "source_file": "tests/test_adapters.py", + "source_location": "L15" + }, { "id": "tests_test_models_test_classification_result_serialization", "label": "test_classification_result_serialization()", @@ -1532,42 +2084,6 @@ "source_file": "src/classifier.py", "source_location": "L17" }, - { - "id": "src_language_detect_language", - "label": "detect_language()", - "_callable": true, - "_origin": "ast", - "community": 47, - "community_name": "classifier.py", - "file_type": "code", - "norm_label": "detect_language()", - "source_file": "src/language.py", - "source_location": "L477" - }, - { - "id": "src_language_extract_words", - "label": "extract_words()", - "_callable": true, - "_origin": "ast", - "community": 47, - "community_name": "classifier.py", - "file_type": "code", - "norm_label": "extract_words()", - "source_file": "src/language.py", - "source_location": "L472" - }, - { - "id": "src_language_normalize_text", - "label": "normalize_text()", - "_callable": true, - "_origin": "ast", - "community": 47, - "community_name": "classifier.py", - "file_type": "code", - "norm_label": "normalize_text()", - "source_file": "src/language.py", - "source_location": "L462" - }, { "id": "src_parser_extract_evidence_snippets", "label": "extract_evidence_snippets()", @@ -1604,102 +2120,6 @@ "source_file": "src/parser.py", "source_location": "L8" }, - { - "id": "tests_test_language_test_detect_english", - "label": "test_detect_english()", - "_callable": true, - "_origin": "ast", - "community": 47, - "community_name": "classifier.py", - "file_type": "code", - "norm_label": "test_detect_english()", - "source_file": "tests/test_language.py", - "source_location": "L21" - }, - { - "id": "tests_test_language_test_detect_french", - "label": "test_detect_french()", - "_callable": true, - "_origin": "ast", - "community": 47, - "community_name": "classifier.py", - "file_type": "code", - "norm_label": "test_detect_french()", - "source_file": "tests/test_language.py", - "source_location": "L51" - }, - { - "id": "tests_test_language_test_detect_german", - "label": "test_detect_german()", - "_callable": true, - "_origin": "ast", - "community": 47, - "community_name": "classifier.py", - "file_type": "code", - "norm_label": "test_detect_german()", - "source_file": "tests/test_language.py", - "source_location": "L37" - }, - { - "id": "tests_test_language_test_detect_italian", - "label": "test_detect_italian()", - "_callable": true, - "_origin": "ast", - "community": 47, - "community_name": "classifier.py", - "file_type": "code", - "norm_label": "test_detect_italian()", - "source_file": "tests/test_language.py", - "source_location": "L44" - }, - { - "id": "tests_test_language_test_detect_portuguese", - "label": "test_detect_portuguese()", - "_callable": true, - "_origin": "ast", - "community": 47, - "community_name": "classifier.py", - "file_type": "code", - "norm_label": "test_detect_portuguese()", - "source_file": "tests/test_language.py", - "source_location": "L14" - }, - { - "id": "tests_test_language_test_detect_spanish", - "label": "test_detect_spanish()", - "_callable": true, - "_origin": "ast", - "community": 47, - "community_name": "classifier.py", - "file_type": "code", - "norm_label": "test_detect_spanish()", - "source_file": "tests/test_language.py", - "source_location": "L28" - }, - { - "id": "tests_test_language_test_empty_language", - "label": "test_empty_language()", - "_callable": true, - "_origin": "ast", - "community": 47, - "community_name": "classifier.py", - "file_type": "code", - "norm_label": "test_empty_language()", - "source_file": "tests/test_language.py", - "source_location": "L58" - }, - { - "id": "tests_test_language_test_normalize_text", - "label": "test_normalize_text()", - "_callable": true, - "_origin": "ast", - "community": 47, - "community_name": "classifier.py", - "file_type": "code", - "norm_label": "test_normalize_text()", - "source_file": "tests/test_language.py", - "source_location": "L6" - }, { "id": "tests_test_models_test_extract_evidence_snippets", "label": "test_extract_evidence_snippets()", @@ -1725,88 +2145,136 @@ "source_location": "L100" }, { - "id": "classify_main", - "label": "main()", + "id": "tests_test_convert_article_to_markdown_test_cli_argument_errors", + "label": "test_cli_argument_errors()", "_callable": true, "_origin": "ast", "community": 48, - "community_name": "main", + "community_name": "test_convert_article_to_markdown.py", "file_type": "code", - "norm_label": "main()", - "source_file": "classify.py", - "source_location": "L97" + "norm_label": "test_cli_argument_errors()", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L437" }, { - "id": "classify_parse_args", - "label": "parse_args()", + "id": "tests_test_convert_article_to_markdown_test_cli_atomic_write_preserves_target_on_failure", + "label": "test_cli_atomic_write_preserves_target_on_failure()", "_callable": true, "_origin": "ast", "community": 48, - "community_name": "main", + "community_name": "test_convert_article_to_markdown.py", "file_type": "code", - "norm_label": "parse_args()", - "source_file": "classify.py", - "source_location": "L27" + "norm_label": "test_cli_atomic_write_preserves_target_on_failure()", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L483" }, { - "id": "tests_test_cli_test_cli_empty_content_file", - "label": "test_cli_empty_content_file()", + "id": "tests_test_convert_article_to_markdown_test_cli_corrupt_json", + "label": "test_cli_corrupt_json()", "_callable": true, "_origin": "ast", "community": 48, - "community_name": "main", + "community_name": "test_convert_article_to_markdown.py", "file_type": "code", - "norm_label": "test_cli_empty_content_file()", - "source_file": "tests/test_cli.py", - "source_location": "L85" + "norm_label": "test_cli_corrupt_json()", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L398" }, { - "id": "tests_test_cli_test_cli_missing_ecp_file", - "label": "test_cli_missing_ecp_file()", + "id": "tests_test_convert_article_to_markdown_test_cli_default_output_path", + "label": "test_cli_default_output_path()", "_callable": true, "_origin": "ast", "community": 48, - "community_name": "main", + "community_name": "test_convert_article_to_markdown.py", "file_type": "code", - "norm_label": "test_cli_missing_ecp_file()", - "source_file": "tests/test_cli.py", - "source_location": "L73" + "norm_label": "test_cli_default_output_path()", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L361" }, { - "id": "tests_test_cli_test_cli_missing_required_ecp_field", - "label": "test_cli_missing_required_ecp_field()", + "id": "tests_test_convert_article_to_markdown_test_cli_missing_required_fields", + "label": "test_cli_missing_required_fields()", "_callable": true, "_origin": "ast", "community": 48, - "community_name": "main", + "community_name": "test_convert_article_to_markdown.py", "file_type": "code", - "norm_label": "test_cli_missing_required_ecp_field()", - "source_file": "tests/test_cli.py", - "source_location": "L111" + "norm_label": "test_cli_missing_required_fields()", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L410" }, { - "id": "tests_test_cli_test_cli_output_file", - "label": "test_cli_output_file()", + "id": "tests_test_convert_article_to_markdown_test_cli_rejection_of_batch_articles_json", + "label": "test_cli_rejection_of_batch_articles_json()", "_callable": true, "_origin": "ast", "community": 48, - "community_name": "main", + "community_name": "test_convert_article_to_markdown.py", "file_type": "code", - "norm_label": "test_cli_output_file()", - "source_file": "tests/test_cli.py", - "source_location": "L39" + "norm_label": "test_cli_rejection_of_batch_articles_json()", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L386" }, { - "id": "tests_test_cli_test_cli_success_stdout", - "label": "test_cli_success_stdout()", + "id": "tests_test_convert_article_to_markdown_test_golden_fixture_newspaper4k", + "label": "test_golden_fixture_newspaper4k()", "_callable": true, "_origin": "ast", "community": 48, - "community_name": "main", + "community_name": "test_convert_article_to_markdown.py", "file_type": "code", - "norm_label": "test_cli_success_stdout()", - "source_file": "tests/test_cli.py", - "source_location": "L8" + "norm_label": "test_golden_fixture_newspaper4k()", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L329" + }, + { + "id": "tests_test_convert_article_to_markdown_test_golden_fixture_readability", + "label": "test_golden_fixture_readability()", + "_callable": true, + "_origin": "ast", + "community": 48, + "community_name": "test_convert_article_to_markdown.py", + "file_type": "code", + "norm_label": "test_golden_fixture_readability()", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L345" + }, + { + "id": "tests_test_convert_article_to_markdown_test_golden_fixture_trafilatura", + "label": "test_golden_fixture_trafilatura()", + "_callable": true, + "_origin": "ast", + "community": 48, + "community_name": "test_convert_article_to_markdown.py", + "file_type": "code", + "norm_label": "test_golden_fixture_trafilatura()", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L313" + }, + { + "id": "tests_test_convert_article_to_markdown_test_normalize_scalar_string_and_placeholders", + "label": "test_normalize_scalar_string_and_placeholders()", + "_callable": true, + "_origin": "ast", + "community": 48, + "community_name": "test_convert_article_to_markdown.py", + "file_type": "code", + "norm_label": "test_normalize_scalar_string_and_placeholders()", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L124" + }, + { + "id": "tests_test_convert_article_to_markdown_test_resolve_article_metadata_priority", + "label": "test_resolve_article_metadata_priority()", + "_callable": true, + "_origin": "ast", + "community": 48, + "community_name": "test_convert_article_to_markdown.py", + "file_type": "code", + "norm_label": "test_resolve_article_metadata_priority()", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L187" }, { "id": "scripts_extract_article_contents_articlecrawler_close", @@ -3236,6 +3704,17 @@ "source_file": "classify.py", "source_location": "L1" }, + { + "id": "classify_py_namespace", + "label": "Namespace", + "_origin": "ast", + "community": 100, + "community_name": "models.py", + "file_type": "code", + "norm_label": "namespace", + "source_file": "", + "source_location": "" + }, { "id": "src_models", "label": "models.py", @@ -3269,6 +3748,17 @@ "source_file": "", "source_location": "" }, + { + "id": "tests_test_cli", + "label": "test_cli.py", + "_origin": "ast", + "community": 100, + "community_name": "models.py", + "file_type": "code", + "norm_label": "test_cli.py", + "source_file": "tests/test_cli.py", + "source_location": "L1" + }, { "id": "src_models_rationale_1", "label": "Data models and validation schemas for Multilingual NLP Entity Inherence\u2026", @@ -3280,6 +3770,17 @@ "source_file": "src/models.py", "source_location": "L1" }, + { + "id": "tests_test_cli_rationale_1", + "label": "CLI execution tests covering flags, arguments, stdout, and error handling.", + "_origin": "ast", + "community": 100, + "community_name": "models.py", + "file_type": "rationale", + "norm_label": "cli execution tests covering flags, arguments, stdout, and error handling.", + "source_file": "tests/test_cli.py", + "source_location": "L1" + }, { "id": "parametrize", "label": "parametrize", @@ -3324,17 +3825,6 @@ "source_file": "", "source_location": "" }, - { - "id": "tests_test_models", - "label": "test_models.py", - "_origin": "ast", - "community": 101, - "community_name": "ECPSnapshot", - "file_type": "code", - "norm_label": "test_models.py", - "source_file": "tests/test_models.py", - "source_location": "L1" - }, { "id": "tests_test_benchmark_24_rationale_1", "label": "Controlled 24-case benchmark suite for Multilingual NLP Entity Inherence\u2026", @@ -3346,17 +3836,6 @@ "source_file": "tests/test_benchmark_24.py", "source_location": "L1" }, - { - "id": "tests_test_models_rationale_1", - "label": "Unit tests for ECP models, schema validation, and structured error handling.", - "_origin": "ast", - "community": 101, - "community_name": "ECPSnapshot", - "file_type": "rationale", - "norm_label": "unit tests for ecp models, schema validation, and structured error handling.", - "source_file": "tests/test_models.py", - "source_location": "L1" - }, { "id": "specs_001_multilingual_entity_classifier_spec_assumptions", "label": "Assumptions", @@ -4006,59 +4485,232 @@ "source_location": "L78" }, { - "id": "src_adapters_embeddings", - "label": "embeddings.py", + "id": "specs_005_convert_json_markdown_tasks_dependencies_execution_order", + "label": "Dependencies & Execution Order", "_origin": "ast", "community": 105, - "community_name": "LocalEmbeddingsAdapter", - "file_type": "code", - "norm_label": "embeddings.py", - "source_file": "src/adapters/embeddings.py", + "community_name": "Tasks: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "dependencies & execution order", + "source_file": "specs/005-convert-json-markdown/tasks.md", + "source_location": "L104" + }, + { + "id": "specs_005_convert_json_markdown_tasks_implementation_for_user_story_1", + "label": "Implementation for User Story 1", + "_origin": "ast", + "community": 105, + "community_name": "Tasks: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "implementation for user story 1", + "source_file": "specs/005-convert-json-markdown/tasks.md", + "source_location": "L41" + }, + { + "id": "specs_005_convert_json_markdown_tasks_implementation_for_user_story_2", + "label": "Implementation for User Story 2", + "_origin": "ast", + "community": 105, + "community_name": "Tasks: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "implementation for user story 2", + "source_file": "specs/005-convert-json-markdown/tasks.md", + "source_location": "L61" + }, + { + "id": "specs_005_convert_json_markdown_tasks_implementation_for_user_story_3", + "label": "Implementation for User Story 3", + "_origin": "ast", + "community": 105, + "community_name": "Tasks: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "implementation for user story 3", + "source_file": "specs/005-convert-json-markdown/tasks.md", + "source_location": "L84" + }, + { + "id": "specs_005_convert_json_markdown_tasks_implementation_strategy", + "label": "Implementation Strategy", + "_origin": "ast", + "community": 105, + "community_name": "Tasks: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "implementation strategy", + "source_file": "specs/005-convert-json-markdown/tasks.md", + "source_location": "L128" + }, + { + "id": "specs_005_convert_json_markdown_tasks_incremental_delivery", + "label": "Incremental Delivery", + "_origin": "ast", + "community": 105, + "community_name": "Tasks: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "incremental delivery", + "source_file": "specs/005-convert-json-markdown/tasks.md", + "source_location": "L135" + }, + { + "id": "specs_005_convert_json_markdown_tasks_mvp_first_user_story_1_only", + "label": "MVP First (User Story 1 Only)", + "_origin": "ast", + "community": 105, + "community_name": "Tasks: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "mvp first (user story 1 only)", + "source_file": "specs/005-convert-json-markdown/tasks.md", + "source_location": "L130" + }, + { + "id": "specs_005_convert_json_markdown_tasks_parallel_opportunities", + "label": "Parallel Opportunities", + "_origin": "ast", + "community": 105, + "community_name": "Tasks: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "parallel opportunities", + "source_file": "specs/005-convert-json-markdown/tasks.md", + "source_location": "L117" + }, + { + "id": "specs_005_convert_json_markdown_tasks_phase_1_setup_shared_infrastructure", + "label": "Phase 1: Setup (Shared Infrastructure)", + "_origin": "ast", + "community": 105, + "community_name": "Tasks: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "phase 1: setup (shared infrastructure)", + "source_file": "specs/005-convert-json-markdown/tasks.md", + "source_location": "L8" + }, + { + "id": "specs_005_convert_json_markdown_tasks_phase_2_foundational_blocking_prerequisites", + "label": "Phase 2: Foundational (Blocking Prerequisites)", + "_origin": "ast", + "community": 105, + "community_name": "Tasks: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "phase 2: foundational (blocking prerequisites)", + "source_file": "specs/005-convert-json-markdown/tasks.md", + "source_location": "L17" + }, + { + "id": "specs_005_convert_json_markdown_tasks_phase_3_user_story_1_single_article_json_to_clean_markdown_conversion_priority_p1_mvp", + "label": "Phase 3: User Story 1 - Single Article JSON to Clean Markdown Conversion (Priority: P1) \ud83c\udfaf MVP", + "_origin": "ast", + "community": 105, + "community_name": "Tasks: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "phase 3: user story 1 - single article json to clean markdown conversion (priority: p1) \ud83c\udfaf mvp", + "source_file": "specs/005-convert-json-markdown/tasks.md", + "source_location": "L30" + }, + { + "id": "specs_005_convert_json_markdown_tasks_phase_4_user_story_2_deterministic_metadata_resolution_and_fallback_priority_p2", + "label": "Phase 4: User Story 2 - Deterministic Metadata Resolution and Fallback (Priority: P2)", + "_origin": "ast", + "community": 105, + "community_name": "Tasks: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "phase 4: user story 2 - deterministic metadata resolution and fallback (priority: p2)", + "source_file": "specs/005-convert-json-markdown/tasks.md", + "source_location": "L50" + }, + { + "id": "specs_005_convert_json_markdown_tasks_phase_5_user_story_3_cli_usability_validation_and_atomic_output_priority_p3", + "label": "Phase 5: User Story 3 - CLI Usability, Validation, and Atomic Output (Priority: P3)", + "_origin": "ast", + "community": 105, + "community_name": "Tasks: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "phase 5: user story 3 - cli usability, validation, and atomic output (priority: p3)", + "source_file": "specs/005-convert-json-markdown/tasks.md", + "source_location": "L73" + }, + { + "id": "specs_005_convert_json_markdown_tasks_phase_6_polish_cross_cutting_concerns", + "label": "Phase 6: Polish & Cross-Cutting Concerns", + "_origin": "ast", + "community": 105, + "community_name": "Tasks: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "phase 6: polish & cross-cutting concerns", + "source_file": "specs/005-convert-json-markdown/tasks.md", + "source_location": "L93" + }, + { + "id": "specs_005_convert_json_markdown_tasks_phase_dependencies", + "label": "Phase Dependencies", + "_origin": "ast", + "community": 105, + "community_name": "Tasks: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "phase dependencies", + "source_file": "specs/005-convert-json-markdown/tasks.md", + "source_location": "L106" + }, + { + "id": "specs_005_convert_json_markdown_tasks_tasks_convert_article_json_to_markdown", + "label": "Tasks: Convert Article JSON to Markdown", + "_origin": "ast", + "community": 105, + "community_name": "Tasks: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "tasks: convert article json to markdown", + "source_file": "specs/005-convert-json-markdown/tasks.md", "source_location": "L1" }, { - "id": "tests_test_adapters", - "label": "test_adapters.py", + "id": "specs_005_convert_json_markdown_tasks_tests_for_user_story_1_tdd", + "label": "Tests for User Story 1 (TDD) \u26a0\ufe0f", "_origin": "ast", "community": 105, - "community_name": "LocalEmbeddingsAdapter", - "file_type": "code", - "norm_label": "test_adapters.py", - "source_file": "tests/test_adapters.py", - "source_location": "L1" + "community_name": "Tasks: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "tests for user story 1 (tdd) \u26a0\ufe0f", + "source_file": "specs/005-convert-json-markdown/tasks.md", + "source_location": "L36" }, { - "id": "src_adapters_embeddings_rationale_1", - "label": "Optional local vector embeddings adapter (Tier 2). Disabled by default.\u2026", + "id": "specs_005_convert_json_markdown_tasks_tests_for_user_story_2_tdd", + "label": "Tests for User Story 2 (TDD) \u26a0\ufe0f", "_origin": "ast", "community": 105, - "community_name": "LocalEmbeddingsAdapter", - "file_type": "rationale", - "norm_label": "optional local vector embeddings adapter (tier 2). disabled by default....", - "source_file": "src/adapters/embeddings.py", - "source_location": "L1" + "community_name": "Tasks: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "tests for user story 2 (tdd) \u26a0\ufe0f", + "source_file": "specs/005-convert-json-markdown/tasks.md", + "source_location": "L56" }, { - "id": "src_adapters_embeddings_rationale_14", - "label": "Optional adapter for local multilingual semantic vector embeddings.", + "id": "specs_005_convert_json_markdown_tasks_tests_for_user_story_3_tdd", + "label": "Tests for User Story 3 (TDD) \u26a0\ufe0f", "_origin": "ast", "community": 105, - "community_name": "LocalEmbeddingsAdapter", - "file_type": "rationale", - "norm_label": "optional adapter for local multilingual semantic vector embeddings.", - "source_file": "src/adapters/embeddings.py", - "source_location": "L14" - }, - { - "id": "tests_test_adapters_rationale_1", - "label": "Unit tests for optional adapter interfaces (Tier 2 / Tier 3).", - "_origin": "ast", - "community": 105, - "community_name": "LocalEmbeddingsAdapter", - "file_type": "rationale", - "norm_label": "unit tests for optional adapter interfaces (tier 2 / tier 3).", - "source_file": "tests/test_adapters.py", - "source_location": "L1" + "community_name": "Tasks: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "tests for user story 3 (tdd) \u26a0\ufe0f", + "source_file": "specs/005-convert-json-markdown/tasks.md", + "source_location": "L79" }, { "id": "specs_003_article_content_extractor_plan", @@ -5355,7 +6007,7 @@ "source_location": "" }, { - "id": "scripts_select_article_extractor_rationale_212", + "id": "scripts_select_article_extractor_rationale_214", "label": "Forma o conjunto ativo de candidatos conforme PRD \u00a77.1: 1. Se existir pelo\u2026", "_origin": "ast", "community": 116, @@ -5363,10 +6015,10 @@ "file_type": "rationale", "norm_label": "forma o conjunto ativo de candidatos conforme prd \u00a77.1: 1. se existir pelo...", "source_file": "scripts/select_article_extractor.py", - "source_location": "L212" + "source_location": "L214" }, { - "id": "scripts_select_article_extractor_rationale_235", + "id": "scripts_select_article_extractor_rationale_239", "label": "Constr\u00f3i o conjunto de consenso (shingles presentes em >= 2 candidatos ativos)\u2026", "_origin": "ast", "community": 116, @@ -5374,10 +6026,10 @@ "file_type": "rationale", "norm_label": "constroi o conjunto de consenso (shingles presentes em >= 2 candidatos ativos)...", "source_file": "scripts/select_article_extractor.py", - "source_location": "L235" + "source_location": "L239" }, { - "id": "scripts_select_article_extractor_rationale_281", + "id": "scripts_select_article_extractor_rationale_285", "label": "Aplica a prioridade final estrita: newspaper4k > readability > trafilatura.", "_origin": "ast", "community": 116, @@ -5385,10 +6037,10 @@ "file_type": "rationale", "norm_label": "aplica a prioridade final estrita: newspaper4k > readability > trafilatura.", "source_file": "scripts/select_article_extractor.py", - "source_location": "L281" + "source_location": "L285" }, { - "id": "scripts_select_article_extractor_rationale_292", + "id": "scripts_select_article_extractor_rationale_296", "label": "Seleciona o melhor candidato quando existe consenso (PRD \u00a77.5): 1. Ordenar por\u2026", "_origin": "ast", "community": 116, @@ -5396,10 +6048,10 @@ "file_type": "rationale", "norm_label": "seleciona o melhor candidato quando existe consenso (prd \u00a77.5): 1. ordenar por...", "source_file": "scripts/select_article_extractor.py", - "source_location": "L292" + "source_location": "L296" }, { - "id": "scripts_select_article_extractor_rationale_323", + "id": "scripts_select_article_extractor_rationale_333", "label": "Seleciona o candidato quando N\u00c3O existe consenso (PRD \u00a77.6): - Com 3 candidatos\u2026", "_origin": "ast", "community": 116, @@ -5407,7 +6059,7 @@ "file_type": "rationale", "norm_label": "seleciona o candidato quando nao existe consenso (prd \u00a77.6): - com 3 candidatos...", "source_file": "scripts/select_article_extractor.py", - "source_location": "L323" + "source_location": "L333" }, { "id": "scripts_select_article_extractor_rationale_63", @@ -5420,6 +6072,17 @@ "source_file": "scripts/select_article_extractor.py", "source_location": "L63" }, + { + "id": "scripts_select_article_extractor_rationale_79", + "label": "Resultado detalhado da sele\u00e7\u00e3o para um artigo individual.", + "_origin": "ast", + "community": 116, + "community_name": "select_article_extractor.py", + "file_type": "rationale", + "norm_label": "resultado detalhado da selecao para um artigo individual.", + "source_file": "scripts/select_article_extractor.py", + "source_location": "L79" + }, { "id": "scripts_select_article_extractor_rationale_91", "label": "Resultado consolidado do processamento em lote.", @@ -5431,24 +6094,12 @@ "source_file": "scripts/select_article_extractor.py", "source_location": "L91" }, - { - "id": "specs_004_deterministic_content_selection_research_1_text_normalization_pipeline", - "label": "1. Text Normalization Pipeline", - "_origin": "ast", - "community": 117, - "community_name": "1. Text Normalization Pipeline", - "file_type": "document", - "node_kind": "heading", - "norm_label": "1. text normalization pipeline", - "source_file": "specs/004-deterministic-content-selection/research.md", - "source_location": "L7" - }, { "id": "specs_004_deterministic_content_selection_research_2_5_token_shingles_consensus_metrics", "label": "2. 5-Token Shingles & Consensus Metrics", "_origin": "ast", "community": 117, - "community_name": "1. Text Normalization Pipeline", + "community_name": "Research & Architectural Decisions: Deterministic Content Selection", "file_type": "document", "node_kind": "heading", "norm_label": "2. 5-token shingles & consensus metrics", @@ -5460,7 +6111,7 @@ "label": "3. Regras de Decis\u00e3o, Empate T\u00e9cnico e Desempate Hier\u00e1rquico", "_origin": "ast", "community": 117, - "community_name": "1. Text Normalization Pipeline", + "community_name": "Research & Architectural Decisions: Deterministic Content Selection", "file_type": "document", "node_kind": "heading", "norm_label": "3. regras de decisao, empate tecnico e desempate hierarquico", @@ -5472,43 +6123,19 @@ "label": "4. Estrat\u00e9gia de I/O N\u00e3o Destrutiva e Escrita At\u00f4mica", "_origin": "ast", "community": 117, - "community_name": "1. Text Normalization Pipeline", + "community_name": "Research & Architectural Decisions: Deterministic Content Selection", "file_type": "document", "node_kind": "heading", "norm_label": "4. estrategia de i/o nao destrutiva e escrita atomica", "source_file": "specs/004-deterministic-content-selection/research.md", "source_location": "L89" }, - { - "id": "specs_004_deterministic_content_selection_research_alternatives_considered", - "label": "Alternatives Considered", - "_origin": "ast", - "community": 117, - "community_name": "1. Text Normalization Pipeline", - "file_type": "document", - "node_kind": "heading", - "norm_label": "alternatives considered", - "source_file": "specs/004-deterministic-content-selection/research.md", - "source_location": "L26" - }, - { - "id": "specs_004_deterministic_content_selection_research_context", - "label": "Context", - "_origin": "ast", - "community": 117, - "community_name": "1. Text Normalization Pipeline", - "file_type": "document", - "node_kind": "heading", - "norm_label": "context", - "source_file": "specs/004-deterministic-content-selection/research.md", - "source_location": "L9" - }, { "id": "specs_004_deterministic_content_selection_research_context_34", "label": "Context", "_origin": "ast", "community": 117, - "community_name": "1. Text Normalization Pipeline", + "community_name": "Research & Architectural Decisions: Deterministic Content Selection", "file_type": "document", "node_kind": "heading", "norm_label": "context", @@ -5520,7 +6147,7 @@ "label": "Context", "_origin": "ast", "community": 117, - "community_name": "1. Text Normalization Pipeline", + "community_name": "Research & Architectural Decisions: Deterministic Content Selection", "file_type": "document", "node_kind": "heading", "norm_label": "context", @@ -5532,31 +6159,19 @@ "label": "Context", "_origin": "ast", "community": 117, - "community_name": "1. Text Normalization Pipeline", + "community_name": "Research & Architectural Decisions: Deterministic Content Selection", "file_type": "document", "node_kind": "heading", "norm_label": "context", "source_file": "specs/004-deterministic-content-selection/research.md", "source_location": "L91" }, - { - "id": "specs_004_deterministic_content_selection_research_decisions", - "label": "Decisions", - "_origin": "ast", - "community": 117, - "community_name": "1. Text Normalization Pipeline", - "file_type": "document", - "node_kind": "heading", - "norm_label": "decisions", - "source_file": "specs/004-deterministic-content-selection/research.md", - "source_location": "L12" - }, { "id": "specs_004_deterministic_content_selection_research_decisions_37", "label": "Decisions", "_origin": "ast", "community": 117, - "community_name": "1. Text Normalization Pipeline", + "community_name": "Research & Architectural Decisions: Deterministic Content Selection", "file_type": "document", "node_kind": "heading", "norm_label": "decisions", @@ -5568,7 +6183,7 @@ "label": "Decisions", "_origin": "ast", "community": 117, - "community_name": "1. Text Normalization Pipeline", + "community_name": "Research & Architectural Decisions: Deterministic Content Selection", "file_type": "document", "node_kind": "heading", "norm_label": "decisions", @@ -5580,31 +6195,19 @@ "label": "Decisions", "_origin": "ast", "community": 117, - "community_name": "1. Text Normalization Pipeline", + "community_name": "Research & Architectural Decisions: Deterministic Content Selection", "file_type": "document", "node_kind": "heading", "norm_label": "decisions", "source_file": "specs/004-deterministic-content-selection/research.md", "source_location": "L94" }, - { - "id": "specs_004_deterministic_content_selection_research_rationale", - "label": "Rationale", - "_origin": "ast", - "community": 117, - "community_name": "1. Text Normalization Pipeline", - "file_type": "document", - "node_kind": "heading", - "norm_label": "rationale", - "source_file": "specs/004-deterministic-content-selection/research.md", - "source_location": "L22" - }, { "id": "specs_004_deterministic_content_selection_research_rationale_106", "label": "Rationale", "_origin": "ast", "community": 117, - "community_name": "1. Text Normalization Pipeline", + "community_name": "Research & Architectural Decisions: Deterministic Content Selection", "file_type": "document", "node_kind": "heading", "norm_label": "rationale", @@ -5616,7 +6219,7 @@ "label": "Rationale", "_origin": "ast", "community": 117, - "community_name": "1. Text Normalization Pipeline", + "community_name": "Research & Architectural Decisions: Deterministic Content Selection", "file_type": "document", "node_kind": "heading", "norm_label": "rationale", @@ -5628,7 +6231,7 @@ "label": "Rationale", "_origin": "ast", "community": 117, - "community_name": "1. Text Normalization Pipeline", + "community_name": "Research & Architectural Decisions: Deterministic Content Selection", "file_type": "document", "node_kind": "heading", "norm_label": "rationale", @@ -5640,7 +6243,7 @@ "label": "Research & Architectural Decisions: Deterministic Content Selection", "_origin": "ast", "community": 117, - "community_name": "1. Text Normalization Pipeline", + "community_name": "Research & Architectural Decisions: Deterministic Content Selection", "file_type": "document", "node_kind": "heading", "norm_label": "research & architectural decisions: deterministic content selection", @@ -5919,7 +6522,7 @@ "source_location": "L34" }, { - "id": "scripts_select_article_extractor_rationale_374", + "id": "scripts_select_article_extractor_rationale_390", "label": "Orquestrador determin\u00edstico completo para um \u00fanico artigo. Classifica\u2026", "_origin": "ast", "community": 119, @@ -5927,7 +6530,7 @@ "file_type": "rationale", "norm_label": "orquestrador deterministico completo para um unico artigo. classifica...", "source_file": "scripts/select_article_extractor.py", - "source_location": "L374" + "source_location": "L390" }, { "id": "scripts_select_article_extractor_rationale_42", @@ -5941,18 +6544,7 @@ "source_location": "L42" }, { - "id": "scripts_select_article_extractor_rationale_79", - "label": "Resultado detalhado da sele\u00e7\u00e3o para um artigo individual.", - "_origin": "ast", - "community": 119, - "community_name": "select_article_extractor", - "file_type": "rationale", - "norm_label": "resultado detalhado da selecao para um artigo individual.", - "source_file": "scripts/select_article_extractor.py", - "source_location": "L79" - }, - { - "id": "tests_test_select_article_extractor_rationale_116", + "id": "tests_test_select_article_extractor_rationale_131", "label": "CT-001: Tr\u00eas candidatos com consenso e um vencedor claro -> Selecionar o maior\u2026", "_origin": "ast", "community": 119, @@ -5960,10 +6552,10 @@ "file_type": "rationale", "norm_label": "ct-001: tres candidatos com consenso e um vencedor claro -> selecionar o maior...", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L116" + "source_location": "L131" }, { - "id": "tests_test_select_article_extractor_rationale_129", + "id": "tests_test_select_article_extractor_rationale_147", "label": "CT-002: Dois ou mais candidatos dentro de 0,03 do maior score -> Selecionar o\u2026", "_origin": "ast", "community": 119, @@ -5971,10 +6563,10 @@ "file_type": "rationale", "norm_label": "ct-002: dois ou mais candidatos dentro de 0,03 do maior score -> selecionar o...", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L129" + "source_location": "L147" }, { - "id": "tests_test_select_article_extractor_rationale_141", + "id": "tests_test_select_article_extractor_rationale_164", "label": "CT-003: Empate t\u00e9cnico e mesma quantidade de shingles -> Aplicar prioridade\u2026", "_origin": "ast", "community": 119, @@ -5982,10 +6574,10 @@ "file_type": "rationale", "norm_label": "ct-003: empate tecnico e mesma quantidade de shingles -> aplicar prioridade...", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L141" + "source_location": "L164" }, { - "id": "tests_test_select_article_extractor_rationale_162", + "id": "tests_test_select_article_extractor_rationale_185", "label": "CT-004: Tr\u00eas candidatos sem consenso -> Selecionar a quantidade mediana de\u2026", "_origin": "ast", "community": 119, @@ -5993,10 +6585,10 @@ "file_type": "rationale", "norm_label": "ct-004: tres candidatos sem consenso -> selecionar a quantidade mediana de...", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L162" + "source_location": "L185" }, { - "id": "tests_test_select_article_extractor_rationale_177", + "id": "tests_test_select_article_extractor_rationale_200", "label": "CT-005: Dois candidatos sem consenso -> Selecionar a maior quantidade de\u2026", "_origin": "ast", "community": 119, @@ -6004,10 +6596,10 @@ "file_type": "rationale", "norm_label": "ct-005: dois candidatos sem consenso -> selecionar a maior quantidade de...", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L177" + "source_location": "L200" }, { - "id": "tests_test_select_article_extractor_rationale_191", + "id": "tests_test_select_article_extractor_rationale_216", "label": "CT-006: Somente um candidato utiliz\u00e1vel -> Selecionar esse candidato.", "_origin": "ast", "community": 119, @@ -6015,10 +6607,10 @@ "file_type": "rationale", "norm_label": "ct-006: somente um candidato utilizavel -> selecionar esse candidato.", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L191" + "source_location": "L216" }, { - "id": "tests_test_select_article_extractor_rationale_203", + "id": "tests_test_select_article_extractor_rationale_231", "label": "CT-007: Nenhum utiliz\u00e1vel, mas existe candidato degradado -> Executar o\u2026", "_origin": "ast", "community": 119, @@ -6026,10 +6618,10 @@ "file_type": "rationale", "norm_label": "ct-007: nenhum utilizavel, mas existe candidato degradado -> executar o...", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L203" + "source_location": "L231" }, { - "id": "tests_test_select_article_extractor_rationale_215", + "id": "tests_test_select_article_extractor_rationale_243", "label": "CT-008: Todos os candidatos indispon\u00edveis -> Selecionar newspaper4k.", "_origin": "ast", "community": 119, @@ -6037,10 +6629,10 @@ "file_type": "rationale", "norm_label": "ct-008: todos os candidatos indisponiveis -> selecionar newspaper4k.", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L215" + "source_location": "L243" }, { - "id": "tests_test_select_article_extractor_rationale_227", + "id": "tests_test_select_article_extractor_rationale_255", "label": "CT-009: Readability retorna apenas um fragmento pequeno enquanto os outros\u2026", "_origin": "ast", "community": 119, @@ -6048,10 +6640,10 @@ "file_type": "rationale", "norm_label": "ct-009: readability retorna apenas um fragmento pequeno enquanto os outros...", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L227" + "source_location": "L255" }, { - "id": "tests_test_select_article_extractor_rationale_244", + "id": "tests_test_select_article_extractor_rationale_272", "label": "CT-010: Um candidato cont\u00e9m o conte\u00fado comum e muito conte\u00fado excedente ->\u2026", "_origin": "ast", "community": 119, @@ -6059,10 +6651,10 @@ "file_type": "rationale", "norm_label": "ct-010: um candidato contem o conteudo comum e muito conteudo excedente ->...", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L244" + "source_location": "L272" }, { - "id": "tests_test_select_article_extractor_rationale_260", + "id": "tests_test_select_article_extractor_rationale_290", "label": "CT-011: Um candidato cont\u00e9m somente parte do conte\u00fado comum -> Perde cobertura\u2026", "_origin": "ast", "community": 119, @@ -6070,10 +6662,10 @@ "file_type": "rationale", "norm_label": "ct-011: um candidato contem somente parte do conteudo comum -> perde cobertura...", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L260" + "source_location": "L290" }, { - "id": "tests_test_select_article_extractor_rationale_364", + "id": "tests_test_select_article_extractor_rationale_402", "label": "Teste de regress\u00e3o para o Artigo 1 (Los puntajes de River vs. Independiente\u2026", "_origin": "ast", "community": 119, @@ -6081,7 +6673,7 @@ "file_type": "rationale", "norm_label": "teste de regressao para o artigo 1 (los puntajes de river vs. independiente...", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L364" + "source_location": "L402" }, { "id": "specify_templates_constitution_template", @@ -6238,7 +6830,7 @@ "source_location": "" }, { - "id": "scripts_select_article_extractor_rationale_431", + "id": "scripts_select_article_extractor_rationale_449", "label": "Salva dados em JSON de forma at\u00f4mica utilizando arquivo tempor\u00e1rio e rename.", "_origin": "ast", "community": 120, @@ -6246,10 +6838,10 @@ "file_type": "rationale", "norm_label": "salva dados em json de forma atomica utilizando arquivo temporario e rename.", "source_file": "scripts/select_article_extractor.py", - "source_location": "L431" + "source_location": "L449" }, { - "id": "scripts_select_article_extractor_rationale_455", + "id": "scripts_select_article_extractor_rationale_476", "label": "L\u00ea o JSON de entrada, valida a estrutura, processa todos os artigos e grava o\u2026", "_origin": "ast", "community": 120, @@ -6257,10 +6849,10 @@ "file_type": "rationale", "norm_label": "le o json de entrada, valida a estrutura, processa todos os artigos e grava o...", "source_file": "scripts/select_article_extractor.py", - "source_location": "L455" + "source_location": "L476" }, { - "id": "tests_test_select_article_extractor_rationale_273", + "id": "tests_test_select_article_extractor_rationale_303", "label": "CT-012: A entrada j\u00e1 cont\u00e9m selected_extractor -> Recalcular e substituir\u2026", "_origin": "ast", "community": 120, @@ -6268,10 +6860,10 @@ "file_type": "rationale", "norm_label": "ct-012: a entrada ja contem selected_extractor -> recalcular e substituir...", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L273" + "source_location": "L303" }, { - "id": "tests_test_select_article_extractor_rationale_299", + "id": "tests_test_select_article_extractor_rationale_335", "label": "CT-013: articles est\u00e1 vazio -> Gerar sa\u00edda v\u00e1lida com articles vazio.", "_origin": "ast", "community": 120, @@ -6279,10 +6871,10 @@ "file_type": "rationale", "norm_label": "ct-013: articles esta vazio -> gerar saida valida com articles vazio.", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L299" + "source_location": "L335" }, { - "id": "tests_test_select_article_extractor_rationale_318", + "id": "tests_test_select_article_extractor_rationale_354", "label": "CT-014: JSON inv\u00e1lido -> N\u00e3o gerar sa\u00edda.", "_origin": "ast", "community": 120, @@ -6290,10 +6882,10 @@ "file_type": "rationale", "norm_label": "ct-014: json invalido -> nao gerar saida.", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L318" + "source_location": "L354" }, { - "id": "tests_test_select_article_extractor_rationale_335", + "id": "tests_test_select_article_extractor_rationale_371", "label": "Testa o processamento em lote completo sobre o arquivo real\u2026", "_origin": "ast", "community": 120, @@ -6301,10 +6893,10 @@ "file_type": "rationale", "norm_label": "testa o processamento em lote completo sobre o arquivo real...", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L335" + "source_location": "L371" }, { - "id": "tests_test_select_article_extractor_rationale_398", + "id": "tests_test_select_article_extractor_rationale_436", "label": "Gera um lote de 100 artigos sint\u00e9ticos e verifica 100% de repetibilidade\u2026", "_origin": "ast", "community": 120, @@ -6312,10 +6904,10 @@ "file_type": "rationale", "norm_label": "gera um lote de 100 artigos sinteticos e verifica 100% de repetibilidade...", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L398" + "source_location": "L436" }, { - "id": "tests_test_select_article_extractor_rationale_447", + "id": "tests_test_select_article_extractor_rationale_494", "label": "Testa a integra\u00e7\u00e3o end-to-end do pipeline downstream: L\u00ea o JSON enriquecido com\u2026", "_origin": "ast", "community": 120, @@ -6323,21 +6915,10 @@ "file_type": "rationale", "norm_label": "testa a integracao end-to-end do pipeline downstream: le o json enriquecido com...", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L447" + "source_location": "L494" }, { - "id": "tests_test_select_article_extractor_rationale_484", - "label": "E2E: Executa scripts/select_article_extractor.py como subprocesso real na linha\u2026", - "_origin": "ast", - "community": 120, - "community_name": "process_batch", - "file_type": "rationale", - "norm_label": "e2e: executa scripts/select_article_extractor.py como subprocesso real na linha...", - "source_file": "tests/test_select_article_extractor.py", - "source_location": "L484" - }, - { - "id": "tests_test_select_article_extractor_rationale_521", + "id": "tests_test_select_article_extractor_rationale_568", "label": "E2E: Executa CLI sem a flag -o e valida cria\u00e7\u00e3o autom\u00e1tica de\u2026", "_origin": "ast", "community": 120, @@ -6345,10 +6926,10 @@ "file_type": "rationale", "norm_label": "e2e: executa cli sem a flag -o e valida criacao automatica de...", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L521" + "source_location": "L568" }, { - "id": "tests_test_select_article_extractor_rationale_549", + "id": "tests_test_select_article_extractor_rationale_596", "label": "E2E: Executa CLI com JSON inv\u00e1lido e valida c\u00f3digo de sa\u00edda e erro no stderr.", "_origin": "ast", "community": 120, @@ -6356,10 +6937,10 @@ "file_type": "rationale", "norm_label": "e2e: executa cli com json invalido e valida codigo de saida e erro no stderr.", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L549" + "source_location": "L596" }, { - "id": "tests_test_select_article_extractor_rationale_562", + "id": "tests_test_select_article_extractor_rationale_609", "label": "E2E: Executa CLI com arquivo inexistente e valida c\u00f3digo 1 e mensagem no stderr.", "_origin": "ast", "community": 120, @@ -6367,7 +6948,84 @@ "file_type": "rationale", "norm_label": "e2e: executa cli com arquivo inexistente e valida codigo 1 e mensagem no stderr.", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L562" + "source_location": "L609" + }, + { + "id": "src_language", + "label": "language.py", + "_origin": "ast", + "community": 121, + "community_name": "detect_language", + "file_type": "code", + "norm_label": "language.py", + "source_file": "src/language.py", + "source_location": "L1" + }, + { + "id": "tests_test_language", + "label": "test_language.py", + "_origin": "ast", + "community": 121, + "community_name": "detect_language", + "file_type": "code", + "norm_label": "test_language.py", + "source_file": "tests/test_language.py", + "source_location": "L1" + }, + { + "id": "src_language_rationale_1", + "label": "Lightweight multilingual language detection and text normalization.", + "_origin": "ast", + "community": 121, + "community_name": "detect_language", + "file_type": "rationale", + "norm_label": "lightweight multilingual language detection and text normalization.", + "source_file": "src/language.py", + "source_location": "L1" + }, + { + "id": "src_language_rationale_463", + "label": "Normalize text by converting to lowercase and stripping combining diacritical\u2026", + "_origin": "ast", + "community": 121, + "community_name": "detect_language", + "file_type": "rationale", + "norm_label": "normalize text by converting to lowercase and stripping combining diacritical...", + "source_file": "src/language.py", + "source_location": "L463" + }, + { + "id": "src_language_rationale_473", + "label": "Tokenize text into lowercase alphanumeric words.", + "_origin": "ast", + "community": 121, + "community_name": "detect_language", + "file_type": "rationale", + "norm_label": "tokenize text into lowercase alphanumeric words.", + "source_file": "src/language.py", + "source_location": "L473" + }, + { + "id": "src_language_rationale_478", + "label": "Detect the ISO-639-1 language code of text among supported languages (pt, en,\u2026", + "_origin": "ast", + "community": 121, + "community_name": "detect_language", + "file_type": "rationale", + "norm_label": "detect the iso-639-1 language code of text among supported languages (pt, en,...", + "source_file": "src/language.py", + "source_location": "L478" + }, + { + "id": "tests_test_language_rationale_1", + "label": "Unit tests for language detection and text normalization.", + "_origin": "ast", + "community": 121, + "community_name": "detect_language", + "file_type": "rationale", + "norm_label": "unit tests for language detection and text normalization.", + "source_file": "tests/test_language.py", + "source_location": "L1" }, { "id": "tests_test_select_article_extractor", @@ -6414,7 +7072,7 @@ "source_location": "L1" }, { - "id": "tests_test_select_article_extractor_rationale_60", + "id": "tests_test_select_article_extractor_rationale_50", "label": "Garante que marca\u00e7\u00e3o de imagem Markdown ![alt](url) seja descartada e link\u2026", "_origin": "ast", "community": 122, @@ -6422,7 +7080,18 @@ "file_type": "rationale", "norm_label": "garante que marcacao de imagem markdown ![alt](url) seja descartada e link...", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L60" + "source_location": "L50" + }, + { + "id": "tests_test_select_article_extractor_rationale_531", + "label": "E2E: Executa scripts/select_article_extractor.py como subprocesso real na linha\u2026", + "_origin": "ast", + "community": 122, + "community_name": "test_select_article_extractor.py", + "file_type": "rationale", + "norm_label": "e2e: executa scripts/select_article_extractor.py como subprocesso real na linha...", + "source_file": "tests/test_select_article_extractor.py", + "source_location": "L531" }, { "id": "specs_004_deterministic_content_selection_spec_assumptions", @@ -7264,6 +7933,54 @@ "source_file": ".agents/skills/graphify/references/exports.md", "source_location": "L79" }, + { + "id": "specs_004_deterministic_content_selection_contracts_json_schema", + "label": "004-deterministic-content-selection/contracts/json-schema.md", + "_origin": "ast", + "community": 130, + "community_name": "004-deterministic-content-selection/spec.md", + "file_type": "document", + "node_kind": "page", + "norm_label": "004-deterministic-content-selection/contracts/json-schema.md", + "source_file": "specs/004-deterministic-content-selection/contracts/json-schema.md", + "source_location": "L1" + }, + { + "id": "specs_004_deterministic_content_selection_contracts_json_schema_1_input_json_schema", + "label": "1. Input JSON Schema", + "_origin": "ast", + "community": 130, + "community_name": "004-deterministic-content-selection/spec.md", + "file_type": "document", + "node_kind": "heading", + "norm_label": "1. input json schema", + "source_file": "specs/004-deterministic-content-selection/contracts/json-schema.md", + "source_location": "L7" + }, + { + "id": "specs_004_deterministic_content_selection_contracts_json_schema_2_output_json_schema", + "label": "2. Output JSON Schema", + "_origin": "ast", + "community": 130, + "community_name": "004-deterministic-content-selection/spec.md", + "file_type": "document", + "node_kind": "heading", + "norm_label": "2. output json schema", + "source_file": "specs/004-deterministic-content-selection/contracts/json-schema.md", + "source_location": "L52" + }, + { + "id": "specs_004_deterministic_content_selection_contracts_json_schema_json_schema_contract_deterministic_article_content_selection", + "label": "JSON Schema Contract: Deterministic Article Content Selection", + "_origin": "ast", + "community": 130, + "community_name": "004-deterministic-content-selection/spec.md", + "file_type": "document", + "node_kind": "heading", + "norm_label": "json schema contract: deterministic article content selection", + "source_file": "specs/004-deterministic-content-selection/contracts/json-schema.md", + "source_location": "L1" + }, { "id": "specs_004_deterministic_content_selection_data_model", "label": "004-deterministic-content-selection/data-model.md", @@ -7337,53 +8054,1226 @@ "source_location": "L1" }, { - "id": "specs_004_deterministic_content_selection_contracts_json_schema", - "label": "004-deterministic-content-selection/contracts/json-schema.md", + "id": "scripts_convert_article_to_markdown", + "label": "convert_article_to_markdown.py", "_origin": "ast", "community": 131, - "community_name": "JSON Schema Contract: Deterministic Article Content Selection", + "community_name": "convert_article_to_markdown.py", + "file_type": "code", + "norm_label": "convert_article_to_markdown.py", + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L1" + }, + { + "id": "scripts_convert_article_to_markdown_py_any", + "label": "Any", + "_origin": "ast", + "community": 131, + "community_name": "convert_article_to_markdown.py", + "file_type": "code", + "norm_label": "any", + "source_file": "", + "source_location": "" + }, + { + "id": "scripts_convert_article_to_markdown_rationale_105", + "label": "Interpreta datas ISO 8601 e RFC 2822 preservando fuso hor\u00e1rio ou YYYY-MM-DD\u2026", + "_origin": "ast", + "community": 131, + "community_name": "convert_article_to_markdown.py", + "file_type": "rationale", + "norm_label": "interpreta datas iso 8601 e rfc 2822 preservando fuso horario ou yyyy-mm-dd...", + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L105" + }, + { + "id": "scripts_convert_article_to_markdown_rationale_136", + "label": "Valida se a URL \u00e9 absoluta com protocolo http ou https e hostname n\u00e3o vazio.", + "_origin": "ast", + "community": 131, + "community_name": "convert_article_to_markdown.py", + "file_type": "rationale", + "norm_label": "valida se a url e absoluta com protocolo http ou https e hostname nao vazio.", + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L136" + }, + { + "id": "scripts_convert_article_to_markdown_rationale_220", + "label": "Retorna o dicion\u00e1rio associado \u00e0 chave ou um dicion\u00e1rio vazio caso n\u00e3o seja\u2026", + "_origin": "ast", + "community": 131, + "community_name": "convert_article_to_markdown.py", + "file_type": "rationale", + "norm_label": "retorna o dicionario associado a chave ou um dicionario vazio caso nao seja...", + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L220" + }, + { + "id": "scripts_convert_article_to_markdown_rationale_226", + "label": "Resolve todos os metadados do artigo seguindo a matriz estrita de prioridades\u2026", + "_origin": "ast", + "community": 131, + "community_name": "convert_article_to_markdown.py", + "file_type": "rationale", + "norm_label": "resolve todos os metadados do artigo seguindo a matriz estrita de prioridades...", + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L226" + }, + { + "id": "scripts_convert_article_to_markdown_rationale_41", + "label": "Decodifica entidades HTML, remove espa\u00e7os no in\u00edcio/fim, colapsa espa\u00e7os\u2026", + "_origin": "ast", + "community": 131, + "community_name": "convert_article_to_markdown.py", + "file_type": "rationale", + "norm_label": "decodifica entidades html, remove espacos no inicio/fim, colapsa espacos...", + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L41" + }, + { + "id": "scripts_convert_article_to_markdown_rationale_57", + "label": "Normaliza listas ou strings separadas por ponto e v\u00edrgula, descartando\u2026", + "_origin": "ast", + "community": 131, + "community_name": "convert_article_to_markdown.py", + "file_type": "rationale", + "norm_label": "normaliza listas ou strings separadas por ponto e virgula, descartando...", + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L57" + }, + { + "id": "tests_test_convert_article_to_markdown_rationale_160", + "label": "Testa parsing de datas ISO 8601 e RFC 2822 preservando fuso hor\u00e1rio.", + "_origin": "ast", + "community": 131, + "community_name": "convert_article_to_markdown.py", + "file_type": "rationale", + "norm_label": "testa parsing de datas iso 8601 e rfc 2822 preservando fuso horario.", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L160" + }, + { + "id": "docs_prd_convert_json_markdown_8_regras_funcionais", + "label": "8. Regras funcionais", + "_origin": "ast", + "community": 132, + "community_name": "8. Regras funcionais", + "file_type": "document", + "node_kind": "heading", + "norm_label": "8. regras funcionais", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L142" + }, + { + "id": "docs_prd_convert_json_markdown_rf_001_receber_um_\u00fanico_artigo", + "label": "RF-001 \u2014 Receber um \u00fanico artigo", + "_origin": "ast", + "community": 132, + "community_name": "8. Regras funcionais", + "file_type": "document", + "node_kind": "heading", + "norm_label": "rf-001 \u2014 receber um unico artigo", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L144" + }, + { + "id": "docs_prd_convert_json_markdown_rf_002_respeitar_o_extrator_selecionado", + "label": "RF-002 \u2014 Respeitar o extrator selecionado", + "_origin": "ast", + "community": 132, + "community_name": "8. Regras funcionais", + "file_type": "document", + "node_kind": "heading", + "norm_label": "rf-002 \u2014 respeitar o extrator selecionado", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L148" + }, + { + "id": "docs_prd_convert_json_markdown_rf_003_resolver_o_corpo_dentro_do_extrator_selecionado", + "label": "RF-003 \u2014 Resolver o corpo dentro do extrator selecionado", + "_origin": "ast", + "community": 132, + "community_name": "8. Regras funcionais", + "file_type": "document", + "node_kind": "heading", + "norm_label": "rf-003 \u2014 resolver o corpo dentro do extrator selecionado", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L152" + }, + { + "id": "docs_prd_convert_json_markdown_rf_004_selecionar_metadados_deterministicamente", + "label": "RF-004 \u2014 Selecionar metadados deterministicamente", + "_origin": "ast", + "community": 132, + "community_name": "8. Regras funcionais", + "file_type": "document", + "node_kind": "heading", + "norm_label": "rf-004 \u2014 selecionar metadados deterministicamente", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L162" + }, + { + "id": "docs_prd_convert_json_markdown_rf_005_priorizar_metadados_por_campo", + "label": "RF-005 \u2014 Priorizar metadados por campo", + "_origin": "ast", + "community": 132, + "community_name": "8. Regras funcionais", + "file_type": "document", + "node_kind": "heading", + "norm_label": "rf-005 \u2014 priorizar metadados por campo", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L174" + }, + { + "id": "docs_prd_convert_json_markdown_rf_006_normalizar_valores_escalares", + "label": "RF-006 \u2014 Normalizar valores escalares", + "_origin": "ast", + "community": 132, + "community_name": "8. Regras funcionais", + "file_type": "document", + "node_kind": "heading", + "norm_label": "rf-006 \u2014 normalizar valores escalares", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L207" + }, + { + "id": "docs_prd_convert_json_markdown_rf_007_normalizar_listas", + "label": "RF-007 \u2014 Normalizar listas", + "_origin": "ast", + "community": 132, + "community_name": "8. Regras funcionais", + "file_type": "document", + "node_kind": "heading", + "norm_label": "rf-007 \u2014 normalizar listas", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L216" + }, + { + "id": "docs_prd_convert_json_markdown_rf_008_normalizar_datas", + "label": "RF-008 \u2014 Normalizar datas", + "_origin": "ast", + "community": 132, + "community_name": "8. Regras funcionais", + "file_type": "document", + "node_kind": "heading", + "norm_label": "rf-008 \u2014 normalizar datas", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L229" + }, + { + "id": "docs_prd_convert_json_markdown_rf_009_validar_urls", + "label": "RF-009 \u2014 Validar URLs", + "_origin": "ast", + "community": 132, + "community_name": "8. Regras funcionais", + "file_type": "document", + "node_kind": "heading", + "norm_label": "rf-009 \u2014 validar urls", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L237" + }, + { + "id": "docs_prd_convert_json_markdown_rf_010_converter_html_para_markdown", + "label": "RF-010 \u2014 Converter HTML para Markdown", + "_origin": "ast", + "community": 132, + "community_name": "8. Regras funcionais", + "file_type": "document", + "node_kind": "heading", + "norm_label": "rf-010 \u2014 converter html para markdown", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L243" + }, + { + "id": "docs_prd_convert_json_markdown_rf_011_tratar_imagens_do_corpo", + "label": "RF-011 \u2014 Tratar imagens do corpo", + "_origin": "ast", + "community": 132, + "community_name": "8. Regras funcionais", + "file_type": "document", + "node_kind": "heading", + "norm_label": "rf-011 \u2014 tratar imagens do corpo", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L261" + }, + { + "id": "docs_prd_convert_json_markdown_rf_012_evitar_t\u00edtulo_duplicado", + "label": "RF-012 \u2014 Evitar t\u00edtulo duplicado", + "_origin": "ast", + "community": 132, + "community_name": "8. Regras funcionais", + "file_type": "document", + "node_kind": "heading", + "norm_label": "rf-012 \u2014 evitar titulo duplicado", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L269" + }, + { + "id": "docs_prd_convert_json_markdown_rf_013_normalizar_o_markdown_final", + "label": "RF-013 \u2014 Normalizar o Markdown final", + "_origin": "ast", + "community": 132, + "community_name": "8. Regras funcionais", + "file_type": "document", + "node_kind": "heading", + "norm_label": "rf-013 \u2014 normalizar o markdown final", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L275" + }, + { + "id": "docs_prd_convert_json_markdown_rf_014_n\u00e3o_gerar_sa\u00edda_parcial", + "label": "RF-014 \u2014 N\u00e3o gerar sa\u00edda parcial", + "_origin": "ast", + "community": 132, + "community_name": "8. Regras funcionais", + "file_type": "document", + "node_kind": "heading", + "norm_label": "rf-014 \u2014 nao gerar saida parcial", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L286" + }, + { + "id": "docs_prd_convert_json_markdown_12_crit\u00e9rios_de_aceite", + "label": "12. Crit\u00e9rios de aceite", + "_origin": "ast", + "community": 133, + "community_name": "12. Crit\u00e9rios de aceite", + "file_type": "document", + "node_kind": "heading", + "norm_label": "12. criterios de aceite", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L374" + }, + { + "id": "docs_prd_convert_json_markdown_ca_001_trafilatura_selecionada", + "label": "CA-001 \u2014 Trafilatura selecionada", + "_origin": "ast", + "community": 133, + "community_name": "12. Crit\u00e9rios de aceite", + "file_type": "document", + "node_kind": "heading", + "norm_label": "ca-001 \u2014 trafilatura selecionada", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L376" + }, + { + "id": "docs_prd_convert_json_markdown_ca_002_newspaper4k_selecionado", + "label": "CA-002 \u2014 Newspaper4k selecionado", + "_origin": "ast", + "community": 133, + "community_name": "12. Crit\u00e9rios de aceite", + "file_type": "document", + "node_kind": "heading", + "norm_label": "ca-002 \u2014 newspaper4k selecionado", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L382" + }, + { + "id": "docs_prd_convert_json_markdown_ca_003_readability_selecionado", + "label": "CA-003 \u2014 Readability selecionado", + "_origin": "ast", + "community": 133, + "community_name": "12. Crit\u00e9rios de aceite", + "file_type": "document", + "node_kind": "heading", + "norm_label": "ca-003 \u2014 readability selecionado", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L388" + }, + { + "id": "docs_prd_convert_json_markdown_ca_004_fallback_dentro_do_extrator", + "label": "CA-004 \u2014 Fallback dentro do extrator", + "_origin": "ast", + "community": 133, + "community_name": "12. Crit\u00e9rios de aceite", + "file_type": "document", + "node_kind": "heading", + "norm_label": "ca-004 \u2014 fallback dentro do extrator", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L394" + }, + { + "id": "docs_prd_convert_json_markdown_ca_005_proibi\u00e7\u00e3o_de_fallback_de_corpo_entre_extratores", + "label": "CA-005 \u2014 Proibi\u00e7\u00e3o de fallback de corpo entre extratores", + "_origin": "ast", + "community": 133, + "community_name": "12. Crit\u00e9rios de aceite", + "file_type": "document", + "node_kind": "heading", + "norm_label": "ca-005 \u2014 proibicao de fallback de corpo entre extratores", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L400" + }, + { + "id": "docs_prd_convert_json_markdown_ca_006_metadado_vindo_de_outro_extrator", + "label": "CA-006 \u2014 Metadado vindo de outro extrator", + "_origin": "ast", + "community": 133, + "community_name": "12. Crit\u00e9rios de aceite", + "file_type": "document", + "node_kind": "heading", + "norm_label": "ca-006 \u2014 metadado vindo de outro extrator", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L406" + }, + { + "id": "docs_prd_convert_json_markdown_ca_007_obrigat\u00f3rios_presentes", + "label": "CA-007 \u2014 Obrigat\u00f3rios presentes", + "_origin": "ast", + "community": 133, + "community_name": "12. Crit\u00e9rios de aceite", + "file_type": "document", + "node_kind": "heading", + "norm_label": "ca-007 \u2014 obrigatorios presentes", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L412" + }, + { + "id": "docs_prd_convert_json_markdown_ca_008_opcionais_ausentes", + "label": "CA-008 \u2014 Opcionais ausentes", + "_origin": "ast", + "community": 133, + "community_name": "12. Crit\u00e9rios de aceite", + "file_type": "document", + "node_kind": "heading", + "norm_label": "ca-008 \u2014 opcionais ausentes", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L418" + }, + { + "id": "docs_prd_convert_json_markdown_ca_009_imagens_inv\u00e1lidas", + "label": "CA-009 \u2014 Imagens inv\u00e1lidas", + "_origin": "ast", + "community": 133, + "community_name": "12. Crit\u00e9rios de aceite", + "file_type": "document", + "node_kind": "heading", + "norm_label": "ca-009 \u2014 imagens invalidas", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L424" + }, + { + "id": "docs_prd_convert_json_markdown_ca_010_t\u00edtulo_repetido_no_corpo", + "label": "CA-010 \u2014 T\u00edtulo repetido no corpo", + "_origin": "ast", + "community": 133, + "community_name": "12. Crit\u00e9rios de aceite", + "file_type": "document", + "node_kind": "heading", + "norm_label": "ca-010 \u2014 titulo repetido no corpo", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L430" + }, + { + "id": "docs_prd_convert_json_markdown_ca_011_entrada_em_lote_rejeitada", + "label": "CA-011 \u2014 Entrada em lote rejeitada", + "_origin": "ast", + "community": 133, + "community_name": "12. Crit\u00e9rios de aceite", + "file_type": "document", + "node_kind": "heading", + "norm_label": "ca-011 \u2014 entrada em lote rejeitada", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L436" + }, + { + "id": "docs_prd_convert_json_markdown_ca_012_determinismo", + "label": "CA-012 \u2014 Determinismo", + "_origin": "ast", + "community": 133, + "community_name": "12. Crit\u00e9rios de aceite", + "file_type": "document", + "node_kind": "heading", + "norm_label": "ca-012 \u2014 determinismo", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L442" + }, + { + "id": "docs_prd_convert_json_markdown_ca_013_grava\u00e7\u00e3o_segura", + "label": "CA-013 \u2014 Grava\u00e7\u00e3o segura", + "_origin": "ast", + "community": 133, + "community_name": "12. Crit\u00e9rios de aceite", + "file_type": "document", + "node_kind": "heading", + "norm_label": "ca-013 \u2014 gravacao segura", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L448" + }, + { + "id": "docs_prd_convert_json_markdown", + "label": "prd_convert_json_markdown.md", + "_origin": "ast", + "community": 134, + "community_name": "PRD \u2014 Convers\u00e3o de artigo JSON para Markdown", "file_type": "document", "node_kind": "page", - "norm_label": "004-deterministic-content-selection/contracts/json-schema.md", - "source_file": "specs/004-deterministic-content-selection/contracts/json-schema.md", + "norm_label": "prd_convert_json_markdown.md", + "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L1" }, { - "id": "specs_004_deterministic_content_selection_contracts_json_schema_1_input_json_schema", - "label": "1. Input JSON Schema", + "id": "docs_prd_convert_json_markdown_10_tratamento_de_erros", + "label": "10. Tratamento de erros", "_origin": "ast", - "community": 131, - "community_name": "JSON Schema Contract: Deterministic Article Content Selection", + "community": 134, + "community_name": "PRD \u2014 Convers\u00e3o de artigo JSON para Markdown", "file_type": "document", "node_kind": "heading", - "norm_label": "1. input json schema", - "source_file": "specs/004-deterministic-content-selection/contracts/json-schema.md", - "source_location": "L7" + "norm_label": "10. tratamento de erros", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L327" }, { - "id": "specs_004_deterministic_content_selection_contracts_json_schema_2_output_json_schema", - "label": "2. Output JSON Schema", + "id": "docs_prd_convert_json_markdown_14_definition_of_done", + "label": "14. Definition of Done", "_origin": "ast", - "community": 131, - "community_name": "JSON Schema Contract: Deterministic Article Content Selection", + "community": 134, + "community_name": "PRD \u2014 Convers\u00e3o de artigo JSON para Markdown", "file_type": "document", "node_kind": "heading", - "norm_label": "2. output json schema", - "source_file": "specs/004-deterministic-content-selection/contracts/json-schema.md", - "source_location": "L52" + "norm_label": "14. definition of done", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L495" }, { - "id": "specs_004_deterministic_content_selection_contracts_json_schema_json_schema_contract_deterministic_article_content_selection", - "label": "JSON Schema Contract: Deterministic Article Content Selection", + "id": "docs_prd_convert_json_markdown_15_depend\u00eancia_t\u00e9cnica_escolhida", + "label": "15. Depend\u00eancia t\u00e9cnica escolhida", "_origin": "ast", - "community": 131, - "community_name": "JSON Schema Contract: Deterministic Article Content Selection", + "community": 134, + "community_name": "PRD \u2014 Convers\u00e3o de artigo JSON para Markdown", "file_type": "document", "node_kind": "heading", - "norm_label": "json schema contract: deterministic article content selection", - "source_file": "specs/004-deterministic-content-selection/contracts/json-schema.md", + "norm_label": "15. dependencia tecnica escolhida", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L511" + }, + { + "id": "docs_prd_convert_json_markdown_1_vis\u00e3o_geral", + "label": "1. Vis\u00e3o geral", + "_origin": "ast", + "community": 134, + "community_name": "PRD \u2014 Convers\u00e3o de artigo JSON para Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "1. visao geral", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L3" + }, + { + "id": "docs_prd_convert_json_markdown_2_problema", + "label": "2. Problema", + "_origin": "ast", + "community": 134, + "community_name": "PRD \u2014 Convers\u00e3o de artigo JSON para Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "2. problema", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L11" + }, + { + "id": "docs_prd_convert_json_markdown_3_objetivo", + "label": "3. Objetivo", + "_origin": "ast", + "community": 134, + "community_name": "PRD \u2014 Convers\u00e3o de artigo JSON para Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "3. objetivo", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L17" + }, + { + "id": "docs_prd_convert_json_markdown_4_hist\u00f3ria_do_usu\u00e1rio", + "label": "4. Hist\u00f3ria do usu\u00e1rio", + "_origin": "ast", + "community": 134, + "community_name": "PRD \u2014 Convers\u00e3o de artigo JSON para Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "4. historia do usuario", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L28" + }, + { + "id": "docs_prd_convert_json_markdown_7_1_arquivo", + "label": "7.1 Arquivo", + "_origin": "ast", + "community": 134, + "community_name": "PRD \u2014 Convers\u00e3o de artigo JSON para Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "7.1 arquivo", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L99" + }, + { + "id": "docs_prd_convert_json_markdown_7_2_estrutura_do_markdown", + "label": "7.2 Estrutura do Markdown", + "_origin": "ast", + "community": 134, + "community_name": "PRD \u2014 Convers\u00e3o de artigo JSON para Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "7.2 estrutura do markdown", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L107" + }, + { + "id": "docs_prd_convert_json_markdown_7_contrato_de_sa\u00edda", + "label": "7. Contrato de sa\u00edda", + "_origin": "ast", + "community": 134, + "community_name": "PRD \u2014 Convers\u00e3o de artigo JSON para Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "7. contrato de saida", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L97" + }, + { + "id": "docs_prd_convert_json_markdown_prd_convers\u00e3o_de_artigo_json_para_markdown", + "label": "PRD \u2014 Convers\u00e3o de artigo JSON para Markdown", + "_origin": "ast", + "community": 134, + "community_name": "PRD \u2014 Convers\u00e3o de artigo JSON para Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "prd \u2014 conversao de artigo json para markdown", + "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L1" }, + { + "id": "scripts_convert_article_to_markdown_rationale_162", + "label": "Obt\u00e9m o corpo do artigo exclusivamente do selected_extractor com fallback\u2026", + "_origin": "ast", + "community": 135, + "community_name": "resolve_article_body", + "file_type": "rationale", + "norm_label": "obtem o corpo do artigo exclusivamente do selected_extractor com fallback...", + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L162" + }, + { + "id": "tests_test_convert_article_to_markdown_rationale_103", + "label": "Garante que falhe se o corpo do extrator selecionado for vazio, sem usar outro\u2026", + "_origin": "ast", + "community": 135, + "community_name": "resolve_article_body", + "file_type": "rationale", + "norm_label": "garante que falhe se o corpo do extrator selecionado for vazio, sem usar outro...", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L103" + }, + { + "id": "tests_test_convert_article_to_markdown_rationale_48", + "label": "Garante que Trafilatura use diretamente o campo markdown.", + "_origin": "ast", + "community": 135, + "community_name": "resolve_article_body", + "file_type": "rationale", + "norm_label": "garante que trafilatura use diretamente o campo markdown.", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L48" + }, + { + "id": "tests_test_convert_article_to_markdown_rationale_61", + "label": "Garante que Trafilatura fa\u00e7a fallback para text se markdown estiver vazio.", + "_origin": "ast", + "community": 135, + "community_name": "resolve_article_body", + "file_type": "rationale", + "norm_label": "garante que trafilatura faca fallback para text se markdown estiver vazio.", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L61" + }, + { + "id": "tests_test_convert_article_to_markdown_rationale_74", + "label": "Garante convers\u00e3o de HTML para Markdown para Newspaper4k.", + "_origin": "ast", + "community": 135, + "community_name": "resolve_article_body", + "file_type": "rationale", + "norm_label": "garante conversao de html para markdown para newspaper4k.", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L74" + }, + { + "id": "tests_test_convert_article_to_markdown_rationale_89", + "label": "Garante convers\u00e3o de HTML para Markdown para Readability.", + "_origin": "ast", + "community": 135, + "community_name": "resolve_article_body", + "file_type": "rationale", + "norm_label": "garante conversao de html para markdown para readability.", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L89" + }, + { + "id": "specs_005_convert_json_markdown_plan_complexity_tracking", + "label": "Complexity Tracking", + "_origin": "ast", + "community": 136, + "community_name": "Implementation Plan: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "complexity tracking", + "source_file": "specs/005-convert-json-markdown/plan.md", + "source_location": "L111" + }, + { + "id": "specs_005_convert_json_markdown_plan_constitution_check", + "label": "Constitution Check", + "_origin": "ast", + "community": 136, + "community_name": "Implementation Plan: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "constitution check", + "source_file": "specs/005-convert-json-markdown/plan.md", + "source_location": "L30" + }, + { + "id": "specs_005_convert_json_markdown_plan_documentation_this_feature", + "label": "Documentation (this feature)", + "_origin": "ast", + "community": 136, + "community_name": "Implementation Plan: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "documentation (this feature)", + "source_file": "specs/005-convert-json-markdown/plan.md", + "source_location": "L46" + }, + { + "id": "specs_005_convert_json_markdown_plan_implementation_phases", + "label": "Implementation Phases", + "_origin": "ast", + "community": 136, + "community_name": "Implementation Plan: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "implementation phases", + "source_file": "specs/005-convert-json-markdown/plan.md", + "source_location": "L86" + }, + { + "id": "specs_005_convert_json_markdown_plan_implementation_plan_convert_article_json_to_markdown", + "label": "Implementation Plan: Convert Article JSON to Markdown", + "_origin": "ast", + "community": 136, + "community_name": "Implementation Plan: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "implementation plan: convert article json to markdown", + "source_file": "specs/005-convert-json-markdown/plan.md", + "source_location": "L1" + }, + { + "id": "specs_005_convert_json_markdown_plan_phase_0_outline_research_completed", + "label": "Phase 0: Outline & Research *(Completed)*", + "_origin": "ast", + "community": 136, + "community_name": "Implementation Plan: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "phase 0: outline & research *(completed)*", + "source_file": "specs/005-convert-json-markdown/plan.md", + "source_location": "L88" + }, + { + "id": "specs_005_convert_json_markdown_plan_phase_1_design_contracts_completed", + "label": "Phase 1: Design & Contracts *(Completed)*", + "_origin": "ast", + "community": 136, + "community_name": "Implementation Plan: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "phase 1: design & contracts *(completed)*", + "source_file": "specs/005-convert-json-markdown/plan.md", + "source_location": "L92" + }, + { + "id": "specs_005_convert_json_markdown_plan_phase_2_tasks_implementation_breakdown_next_speckit_tasks", + "label": "Phase 2: Tasks & Implementation Breakdown *(Next: `/speckit-tasks`)*", + "_origin": "ast", + "community": 136, + "community_name": "Implementation Plan: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "phase 2: tasks & implementation breakdown *(next: `/speckit-tasks`)*", + "source_file": "specs/005-convert-json-markdown/plan.md", + "source_location": "L98" + }, + { + "id": "specs_005_convert_json_markdown_plan_project_structure", + "label": "Project Structure", + "_origin": "ast", + "community": 136, + "community_name": "Implementation Plan: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "project structure", + "source_file": "specs/005-convert-json-markdown/plan.md", + "source_location": "L44" + }, + { + "id": "specs_005_convert_json_markdown_plan_source_code_test_layout", + "label": "Source Code & Test Layout", + "_origin": "ast", + "community": 136, + "community_name": "Implementation Plan: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "source code & test layout", + "source_file": "specs/005-convert-json-markdown/plan.md", + "source_location": "L62" + }, + { + "id": "specs_005_convert_json_markdown_plan_summary", + "label": "Summary", + "_origin": "ast", + "community": 136, + "community_name": "Implementation Plan: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "summary", + "source_file": "specs/005-convert-json-markdown/plan.md", + "source_location": "L9" + }, + { + "id": "specs_005_convert_json_markdown_plan_technical_context", + "label": "Technical Context", + "_origin": "ast", + "community": 136, + "community_name": "Implementation Plan: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "technical context", + "source_file": "specs/005-convert-json-markdown/plan.md", + "source_location": "L15" + }, + { + "id": "specs_005_convert_json_markdown_research", + "label": "005-convert-json-markdown/research.md", + "_origin": "ast", + "community": 137, + "community_name": "2. Technical Decisions & Research Findings", + "file_type": "document", + "node_kind": "page", + "norm_label": "005-convert-json-markdown/research.md", + "source_file": "specs/005-convert-json-markdown/research.md", + "source_location": "L1" + }, + { + "id": "specs_005_convert_json_markdown_research_1_executive_summary_goals", + "label": "1. Executive Summary & Goals", + "_origin": "ast", + "community": 137, + "community_name": "2. Technical Decisions & Research Findings", + "file_type": "document", + "node_kind": "heading", + "norm_label": "1. executive summary & goals", + "source_file": "specs/005-convert-json-markdown/research.md", + "source_location": "L5" + }, + { + "id": "specs_005_convert_json_markdown_research_2_technical_decisions_research_findings", + "label": "2. Technical Decisions & Research Findings", + "_origin": "ast", + "community": 137, + "community_name": "2. Technical Decisions & Research Findings", + "file_type": "document", + "node_kind": "heading", + "norm_label": "2. technical decisions & research findings", + "source_file": "specs/005-convert-json-markdown/research.md", + "source_location": "L11" + }, + { + "id": "specs_005_convert_json_markdown_research_3_technology_stack_dependencies", + "label": "3. Technology Stack & Dependencies", + "_origin": "ast", + "community": 137, + "community_name": "2. Technical Decisions & Research Findings", + "file_type": "document", + "node_kind": "heading", + "norm_label": "3. technology stack & dependencies", + "source_file": "specs/005-convert-json-markdown/research.md", + "source_location": "L95" + }, + { + "id": "specs_005_convert_json_markdown_research_decision_1_html_to_markdown_engine_selection", + "label": "Decision 1: HTML-to-Markdown Engine Selection", + "_origin": "ast", + "community": 137, + "community_name": "2. Technical Decisions & Research Findings", + "file_type": "document", + "node_kind": "heading", + "norm_label": "decision 1: html-to-markdown engine selection", + "source_file": "specs/005-convert-json-markdown/research.md", + "source_location": "L13" + }, + { + "id": "specs_005_convert_json_markdown_research_decision_2_direct_markdown_handling_for_trafilatura", + "label": "Decision 2: Direct Markdown Handling for Trafilatura", + "_origin": "ast", + "community": 137, + "community_name": "2. Technical Decisions & Research Findings", + "file_type": "document", + "node_kind": "heading", + "norm_label": "decision 2: direct markdown handling for trafilatura", + "source_file": "specs/005-convert-json-markdown/research.md", + "source_location": "L26" + }, + { + "id": "specs_005_convert_json_markdown_research_decision_3_metadata_normalization_priority_resolution_pipeline", + "label": "Decision 3: Metadata Normalization & Priority Resolution Pipeline", + "_origin": "ast", + "community": 137, + "community_name": "2. Technical Decisions & Research Findings", + "file_type": "document", + "node_kind": "heading", + "norm_label": "decision 3: metadata normalization & priority resolution pipeline", + "source_file": "specs/005-convert-json-markdown/research.md", + "source_location": "L37" + }, + { + "id": "specs_005_convert_json_markdown_research_decision_4_date_parsing_strategy_iso_8601_rfc_2822", + "label": "Decision 4: Date Parsing Strategy (ISO 8601 & RFC 2822)", + "_origin": "ast", + "community": 137, + "community_name": "2. Technical Decisions & Research Findings", + "file_type": "document", + "node_kind": "heading", + "norm_label": "decision 4: date parsing strategy (iso 8601 & rfc 2822)", + "source_file": "specs/005-convert-json-markdown/research.md", + "source_location": "L50" + }, + { + "id": "specs_005_convert_json_markdown_research_decision_5_url_validation_media_filtering", + "label": "Decision 5: URL Validation & Media Filtering", + "_origin": "ast", + "community": 137, + "community_name": "2. Technical Decisions & Research Findings", + "file_type": "document", + "node_kind": "heading", + "norm_label": "decision 5: url validation & media filtering", + "source_file": "specs/005-convert-json-markdown/research.md", + "source_location": "L63" + }, + { + "id": "specs_005_convert_json_markdown_research_decision_6_duplicate_title_heading_h1_stripping", + "label": "Decision 6: Duplicate Title Heading (H1) Stripping", + "_origin": "ast", + "community": 137, + "community_name": "2. Technical Decisions & Research Findings", + "file_type": "document", + "node_kind": "heading", + "norm_label": "decision 6: duplicate title heading (h1) stripping", + "source_file": "specs/005-convert-json-markdown/research.md", + "source_location": "L74" + }, + { + "id": "specs_005_convert_json_markdown_research_decision_7_atomic_file_writing_error_resilience", + "label": "Decision 7: Atomic File Writing & Error Resilience", + "_origin": "ast", + "community": 137, + "community_name": "2. Technical Decisions & Research Findings", + "file_type": "document", + "node_kind": "heading", + "norm_label": "decision 7: atomic file writing & error resilience", + "source_file": "specs/005-convert-json-markdown/research.md", + "source_location": "L85" + }, + { + "id": "specs_005_convert_json_markdown_research_research_convert_article_json_to_markdown", + "label": "Research: Convert Article JSON to Markdown", + "_origin": "ast", + "community": 137, + "community_name": "2. Technical Decisions & Research Findings", + "file_type": "document", + "node_kind": "heading", + "norm_label": "research: convert article json to markdown", + "source_file": "specs/005-convert-json-markdown/research.md", + "source_location": "L1" + }, + { + "id": "specs_005_convert_json_markdown_spec_assumptions", + "label": "Assumptions", + "_origin": "ast", + "community": 138, + "community_name": "Feature Specification: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "assumptions", + "source_file": "specs/005-convert-json-markdown/spec.md", + "source_location": "L131" + }, + { + "id": "specs_005_convert_json_markdown_spec_edge_cases", + "label": "Edge Cases", + "_origin": "ast", + "community": 138, + "community_name": "Feature Specification: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "edge cases", + "source_file": "specs/005-convert-json-markdown/spec.md", + "source_location": "L61" + }, + { + "id": "specs_005_convert_json_markdown_spec_feature_specification_convert_article_json_to_markdown", + "label": "Feature Specification: Convert Article JSON to Markdown", + "_origin": "ast", + "community": 138, + "community_name": "Feature Specification: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "feature specification: convert article json to markdown", + "source_file": "specs/005-convert-json-markdown/spec.md", + "source_location": "L1" + }, + { + "id": "specs_005_convert_json_markdown_spec_functional_requirements", + "label": "Functional Requirements", + "_origin": "ast", + "community": 138, + "community_name": "Feature Specification: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "functional requirements", + "source_file": "specs/005-convert-json-markdown/spec.md", + "source_location": "L73" + }, + { + "id": "specs_005_convert_json_markdown_spec_key_entities", + "label": "Key Entities", + "_origin": "ast", + "community": 138, + "community_name": "Feature Specification: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "key entities", + "source_file": "specs/005-convert-json-markdown/spec.md", + "source_location": "L114" + }, + { + "id": "specs_005_convert_json_markdown_spec_measurable_outcomes", + "label": "Measurable Outcomes", + "_origin": "ast", + "community": 138, + "community_name": "Feature Specification: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "measurable outcomes", + "source_file": "specs/005-convert-json-markdown/spec.md", + "source_location": "L122" + }, + { + "id": "specs_005_convert_json_markdown_spec_requirements_mandatory", + "label": "Requirements *(mandatory)*", + "_origin": "ast", + "community": 138, + "community_name": "Feature Specification: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "requirements *(mandatory)*", + "source_file": "specs/005-convert-json-markdown/spec.md", + "source_location": "L71" + }, + { + "id": "specs_005_convert_json_markdown_spec_success_criteria_mandatory", + "label": "Success Criteria *(mandatory)*", + "_origin": "ast", + "community": 138, + "community_name": "Feature Specification: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "success criteria *(mandatory)*", + "source_file": "specs/005-convert-json-markdown/spec.md", + "source_location": "L120" + }, + { + "id": "specs_005_convert_json_markdown_spec_user_scenarios_testing_mandatory", + "label": "User Scenarios & Testing *(mandatory)*", + "_origin": "ast", + "community": 138, + "community_name": "Feature Specification: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "user scenarios & testing *(mandatory)*", + "source_file": "specs/005-convert-json-markdown/spec.md", + "source_location": "L8" + }, + { + "id": "specs_005_convert_json_markdown_spec_user_story_1_single_article_json_to_clean_markdown_conversion_priority_p1", + "label": "User Story 1 - Single Article JSON to Clean Markdown Conversion (Priority: P1)", + "_origin": "ast", + "community": 138, + "community_name": "Feature Specification: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "user story 1 - single article json to clean markdown conversion (priority: p1)", + "source_file": "specs/005-convert-json-markdown/spec.md", + "source_location": "L10" + }, + { + "id": "specs_005_convert_json_markdown_spec_user_story_2_deterministic_metadata_resolution_and_fallback_priority_p2", + "label": "User Story 2 - Deterministic Metadata Resolution and Fallback (Priority: P2)", + "_origin": "ast", + "community": 138, + "community_name": "Feature Specification: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "user story 2 - deterministic metadata resolution and fallback (priority: p2)", + "source_file": "specs/005-convert-json-markdown/spec.md", + "source_location": "L27" + }, + { + "id": "specs_005_convert_json_markdown_spec_user_story_3_cli_usability_validation_and_atomic_output_priority_p3", + "label": "User Story 3 - CLI Usability, Validation, and Atomic Output (Priority: P3)", + "_origin": "ast", + "community": 138, + "community_name": "Feature Specification: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "user story 3 - cli usability, validation, and atomic output (priority: p3)", + "source_file": "specs/005-convert-json-markdown/spec.md", + "source_location": "L44" + }, + { + "id": "specs_005_convert_json_markdown_checklists_markdown_conversion_1_valida\u00e7\u00e3o_de_entrada_tipagem_isolamento_de_lotes", + "label": "1. Valida\u00e7\u00e3o de Entrada, Tipagem & Isolamento de Lotes", + "_origin": "ast", + "community": 139, + "community_name": "Markdown Conversion Checklist: End-to-End Requirements Quality", + "file_type": "document", + "node_kind": "heading", + "norm_label": "1. validacao de entrada, tipagem & isolamento de lotes", + "source_file": "specs/005-convert-json-markdown/checklists/markdown-conversion.md", + "source_location": "L13" + }, + { + "id": "specs_005_convert_json_markdown_checklists_markdown_conversion_2_isolamento_estrito_de_extrator_convers\u00e3o_de_conte\u00fado_html_md", + "label": "2. Isolamento Estrito de Extrator & Convers\u00e3o de Conte\u00fado (HTML/MD)", + "_origin": "ast", + "community": 139, + "community_name": "Markdown Conversion Checklist: End-to-End Requirements Quality", + "file_type": "document", + "node_kind": "heading", + "norm_label": "2. isolamento estrito de extrator & conversao de conteudo (html/md)", + "source_file": "specs/005-convert-json-markdown/checklists/markdown-conversion.md", + "source_location": "L21" + }, + { + "id": "specs_005_convert_json_markdown_checklists_markdown_conversion_3_resolu\u00e7\u00e3o_determin\u00edstica_de_metadados_mapeamento_de_selecionado", + "label": "3. Resolu\u00e7\u00e3o Determin\u00edstica de Metadados & Mapeamento de SELECIONADO", + "_origin": "ast", + "community": 139, + "community_name": "Markdown Conversion Checklist: End-to-End Requirements Quality", + "file_type": "document", + "node_kind": "heading", + "norm_label": "3. resolucao deterministica de metadados & mapeamento de selecionado", + "source_file": "specs/005-convert-json-markdown/checklists/markdown-conversion.md", + "source_location": "L29" + }, + { + "id": "specs_005_convert_json_markdown_checklists_markdown_conversion_4_normaliza\u00e7\u00e3o_de_escalares_placeholders_sanitiza\u00e7\u00e3o_de_listas", + "label": "4. Normaliza\u00e7\u00e3o de Escalares, Placeholders & Sanitiza\u00e7\u00e3o de Listas", + "_origin": "ast", + "community": 139, + "community_name": "Markdown Conversion Checklist: End-to-End Requirements Quality", + "file_type": "document", + "node_kind": "heading", + "norm_label": "4. normalizacao de escalares, placeholders & sanitizacao de listas", + "source_file": "specs/005-convert-json-markdown/checklists/markdown-conversion.md", + "source_location": "L36" + }, + { + "id": "specs_005_convert_json_markdown_checklists_markdown_conversion_5_normaliza\u00e7\u00e3o_de_datas_fusos_valida\u00e7\u00e3o_estrita_de_urls", + "label": "5. Normaliza\u00e7\u00e3o de Datas, Fusos & Valida\u00e7\u00e3o Estrita de URLs", + "_origin": "ast", + "community": 139, + "community_name": "Markdown Conversion Checklist: End-to-End Requirements Quality", + "file_type": "document", + "node_kind": "heading", + "norm_label": "5. normalizacao de datas, fusos & validacao estrita de urls", + "source_file": "specs/005-convert-json-markdown/checklists/markdown-conversion.md", + "source_location": "L44" + }, + { + "id": "specs_005_convert_json_markdown_checklists_markdown_conversion_6_sanitiza\u00e7\u00e3o_editorial_tratamento_de_imagens_t\u00edtulo_duplicado", + "label": "6. Sanitiza\u00e7\u00e3o Editorial, Tratamento de Imagens & T\u00edtulo Duplicado", + "_origin": "ast", + "community": 139, + "community_name": "Markdown Conversion Checklist: End-to-End Requirements Quality", + "file_type": "document", + "node_kind": "heading", + "norm_label": "6. sanitizacao editorial, tratamento de imagens & titulo duplicado", + "source_file": "specs/005-convert-json-markdown/checklists/markdown-conversion.md", + "source_location": "L50" + }, + { + "id": "specs_005_convert_json_markdown_checklists_markdown_conversion_7_estrutura_sintaxe_do_markdown_de_sa\u00edda_restri\u00e7\u00f5es", + "label": "7. Estrutura, Sintaxe do Markdown de Sa\u00edda & Restri\u00e7\u00f5es", + "_origin": "ast", + "community": 139, + "community_name": "Markdown Conversion Checklist: End-to-End Requirements Quality", + "file_type": "document", + "node_kind": "heading", + "norm_label": "7. estrutura, sintaxe do markdown de saida & restricoes", + "source_file": "specs/005-convert-json-markdown/checklists/markdown-conversion.md", + "source_location": "L57" + }, + { + "id": "specs_005_convert_json_markdown_checklists_markdown_conversion_8_interface_cli_tratamento_de_erros_atomicidade", + "label": "8. Interface CLI, Tratamento de Erros & Atomicidade", + "_origin": "ast", + "community": 139, + "community_name": "Markdown Conversion Checklist: End-to-End Requirements Quality", + "file_type": "document", + "node_kind": "heading", + "norm_label": "8. interface cli, tratamento de erros & atomicidade", + "source_file": "specs/005-convert-json-markdown/checklists/markdown-conversion.md", + "source_location": "L64" + }, + { + "id": "specs_005_convert_json_markdown_checklists_markdown_conversion_9_estrat\u00e9gia_de_testes_golden_fixtures_definition_of_done", + "label": "9. Estrat\u00e9gia de Testes, Golden Fixtures & Definition of Done", + "_origin": "ast", + "community": 139, + "community_name": "Markdown Conversion Checklist: End-to-End Requirements Quality", + "file_type": "document", + "node_kind": "heading", + "norm_label": "9. estrategia de testes, golden fixtures & definition of done", + "source_file": "specs/005-convert-json-markdown/checklists/markdown-conversion.md", + "source_location": "L72" + }, + { + "id": "specs_005_convert_json_markdown_checklists_markdown_conversion_markdown_conversion_checklist_end_to_end_requirements_quality", + "label": "Markdown Conversion Checklist: End-to-End Requirements Quality", + "_origin": "ast", + "community": 139, + "community_name": "Markdown Conversion Checklist: End-to-End Requirements Quality", + "file_type": "document", + "node_kind": "heading", + "norm_label": "markdown conversion checklist: end-to-end requirements quality", + "source_file": "specs/005-convert-json-markdown/checklists/markdown-conversion.md", + "source_location": "L1" + }, + { + "id": "specs_005_convert_json_markdown_checklists_markdown_conversion_notes", + "label": "Notes", + "_origin": "ast", + "community": 139, + "community_name": "Markdown Conversion Checklist: End-to-End Requirements Quality", + "file_type": "document", + "node_kind": "heading", + "norm_label": "notes", + "source_file": "specs/005-convert-json-markdown/checklists/markdown-conversion.md", + "source_location": "L81" + }, { "id": "agents_skills_ponytail_skill", "label": "ponytail/SKILL.md", @@ -7498,6 +9388,765 @@ "source_file": ".agents/skills/ponytail/SKILL.md", "source_location": "L90" }, + { + "id": "scripts_convert_article_to_markdown_py_path", + "label": "Path", + "_origin": "ast", + "community": 140, + "community_name": "convert_article", + "file_type": "code", + "norm_label": "path", + "source_file": "", + "source_location": "" + }, + { + "id": "scripts_convert_article_to_markdown_rationale_509", + "label": "Preserva imagens com URL absoluta http/https, remove relativas/data:/vazias e\u2026", + "_origin": "ast", + "community": 140, + "community_name": "convert_article", + "file_type": "rationale", + "norm_label": "preserva imagens com url absoluta http/https, remove relativas/data:/vazias e...", + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L509" + }, + { + "id": "scripts_convert_article_to_markdown_rationale_609", + "label": "Executa a leitura do JSON, valida\u00e7\u00e3o, convers\u00e3o e escrita at\u00f4mica do arquivo\u2026", + "_origin": "ast", + "community": 140, + "community_name": "convert_article", + "file_type": "rationale", + "norm_label": "executa a leitura do json, validacao, conversao e escrita atomica do arquivo...", + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L609" + }, + { + "id": "tests_test_convert_article_to_markdown_rationale_259", + "label": "Garante remo\u00e7\u00e3o de imagens relativas/data: e deduplica\u00e7\u00e3o de imagens id\u00eanticas.", + "_origin": "ast", + "community": 140, + "community_name": "convert_article", + "file_type": "rationale", + "norm_label": "garante remocao de imagens relativas/data: e deduplicacao de imagens identicas.", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L259" + }, + { + "id": "tests_test_convert_article_to_markdown_rationale_463", + "label": "Testa diretamente a fun\u00e7\u00e3o convert_article em Python.", + "_origin": "ast", + "community": 140, + "community_name": "convert_article", + "file_type": "rationale", + "norm_label": "testa diretamente a funcao convert_article em python.", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L463" + }, + { + "id": "specs_005_convert_json_markdown_checklists_markdown_conversion", + "label": "markdown-conversion.md", + "_origin": "ast", + "community": 141, + "community_name": "005-convert-json-markdown/plan.md", + "file_type": "document", + "node_kind": "page", + "norm_label": "markdown-conversion.md", + "source_file": "specs/005-convert-json-markdown/checklists/markdown-conversion.md", + "source_location": "L1" + }, + { + "id": "specs_005_convert_json_markdown_contracts_markdown_schema", + "label": "markdown-schema.md", + "_origin": "ast", + "community": 141, + "community_name": "005-convert-json-markdown/plan.md", + "file_type": "document", + "node_kind": "page", + "norm_label": "markdown-schema.md", + "source_file": "specs/005-convert-json-markdown/contracts/markdown-schema.md", + "source_location": "L1" + }, + { + "id": "specs_005_convert_json_markdown_contracts_markdown_schema_1_output_document_specification", + "label": "1. Output Document Specification", + "_origin": "ast", + "community": 141, + "community_name": "005-convert-json-markdown/plan.md", + "file_type": "document", + "node_kind": "heading", + "norm_label": "1. output document specification", + "source_file": "specs/005-convert-json-markdown/contracts/markdown-schema.md", + "source_location": "L5" + }, + { + "id": "specs_005_convert_json_markdown_contracts_markdown_schema_2_formatting_syntax_constraints", + "label": "2. Formatting & Syntax Constraints", + "_origin": "ast", + "community": 141, + "community_name": "005-convert-json-markdown/plan.md", + "file_type": "document", + "node_kind": "heading", + "norm_label": "2. formatting & syntax constraints", + "source_file": "specs/005-convert-json-markdown/contracts/markdown-schema.md", + "source_location": "L30" + }, + { + "id": "specs_005_convert_json_markdown_contracts_markdown_schema_markdown_schema_contract_output_article_markdown", + "label": "Markdown Schema Contract: Output Article Markdown", + "_origin": "ast", + "community": 141, + "community_name": "005-convert-json-markdown/plan.md", + "file_type": "document", + "node_kind": "heading", + "norm_label": "markdown schema contract: output article markdown", + "source_file": "specs/005-convert-json-markdown/contracts/markdown-schema.md", + "source_location": "L1" + }, + { + "id": "specs_005_convert_json_markdown_data_model", + "label": "005-convert-json-markdown/data-model.md", + "_origin": "ast", + "community": 141, + "community_name": "005-convert-json-markdown/plan.md", + "file_type": "document", + "node_kind": "page", + "norm_label": "005-convert-json-markdown/data-model.md", + "source_file": "specs/005-convert-json-markdown/data-model.md", + "source_location": "L1" + }, + { + "id": "specs_005_convert_json_markdown_plan", + "label": "005-convert-json-markdown/plan.md", + "_origin": "ast", + "community": 141, + "community_name": "005-convert-json-markdown/plan.md", + "file_type": "document", + "node_kind": "page", + "norm_label": "005-convert-json-markdown/plan.md", + "source_file": "specs/005-convert-json-markdown/plan.md", + "source_location": "L1" + }, + { + "id": "specs_005_convert_json_markdown_spec", + "label": "005-convert-json-markdown/spec.md", + "_origin": "ast", + "community": 141, + "community_name": "005-convert-json-markdown/plan.md", + "file_type": "document", + "node_kind": "page", + "norm_label": "005-convert-json-markdown/spec.md", + "source_file": "specs/005-convert-json-markdown/spec.md", + "source_location": "L1" + }, + { + "id": "specs_005_convert_json_markdown_tasks", + "label": "005-convert-json-markdown/tasks.md", + "_origin": "ast", + "community": 141, + "community_name": "005-convert-json-markdown/plan.md", + "file_type": "document", + "node_kind": "page", + "norm_label": "005-convert-json-markdown/tasks.md", + "source_file": "specs/005-convert-json-markdown/tasks.md", + "source_location": "L1" + }, + { + "id": "specs_005_convert_json_markdown_quickstart", + "label": "005-convert-json-markdown/quickstart.md", + "_origin": "ast", + "community": 142, + "community_name": "Quickstart: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "page", + "norm_label": "005-convert-json-markdown/quickstart.md", + "source_file": "specs/005-convert-json-markdown/quickstart.md", + "source_location": "L1" + }, + { + "id": "specs_005_convert_json_markdown_quickstart_1_prerequisites_setup", + "label": "1. Prerequisites & Setup", + "_origin": "ast", + "community": 142, + "community_name": "Quickstart: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "1. prerequisites & setup", + "source_file": "specs/005-convert-json-markdown/quickstart.md", + "source_location": "L5" + }, + { + "id": "specs_005_convert_json_markdown_quickstart_2_running_the_cli_tool", + "label": "2. Running the CLI Tool", + "_origin": "ast", + "community": 142, + "community_name": "Quickstart: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "2. running the cli tool", + "source_file": "specs/005-convert-json-markdown/quickstart.md", + "source_location": "L21" + }, + { + "id": "specs_005_convert_json_markdown_quickstart_3_verification_testing", + "label": "3. Verification & Testing", + "_origin": "ast", + "community": 142, + "community_name": "Quickstart: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "3. verification & testing", + "source_file": "specs/005-convert-json-markdown/quickstart.md", + "source_location": "L45" + }, + { + "id": "specs_005_convert_json_markdown_quickstart_basic_conversion_default_output_path", + "label": "Basic Conversion (Default Output Path)", + "_origin": "ast", + "community": 142, + "community_name": "Quickstart: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "basic conversion (default output path)", + "source_file": "specs/005-convert-json-markdown/quickstart.md", + "source_location": "L23" + }, + { + "id": "specs_005_convert_json_markdown_quickstart_custom_destination_path", + "label": "Custom Destination Path", + "_origin": "ast", + "community": 142, + "community_name": "Quickstart: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "custom destination path", + "source_file": "specs/005-convert-json-markdown/quickstart.md", + "source_location": "L33" + }, + { + "id": "specs_005_convert_json_markdown_quickstart_quickstart_convert_article_json_to_markdown", + "label": "Quickstart: Convert Article JSON to Markdown", + "_origin": "ast", + "community": 142, + "community_name": "Quickstart: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "quickstart: convert article json to markdown", + "source_file": "specs/005-convert-json-markdown/quickstart.md", + "source_location": "L1" + }, + { + "id": "specs_005_convert_json_markdown_quickstart_run_all_unit_integration_tests", + "label": "Run All Unit & Integration Tests", + "_origin": "ast", + "community": 142, + "community_name": "Quickstart: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "run all unit & integration tests", + "source_file": "specs/005-convert-json-markdown/quickstart.md", + "source_location": "L47" + }, + { + "id": "specs_005_convert_json_markdown_quickstart_run_linter_type_checker", + "label": "Run Linter & Type Checker", + "_origin": "ast", + "community": 142, + "community_name": "Quickstart: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "run linter & type checker", + "source_file": "specs/005-convert-json-markdown/quickstart.md", + "source_location": "L53" + }, + { + "id": "specs_005_convert_json_markdown_data_model_1_domain_entities_schemas", + "label": "1. Domain Entities & Schemas", + "_origin": "ast", + "community": 143, + "community_name": "1. Domain Entities & Schemas", + "file_type": "document", + "node_kind": "heading", + "norm_label": "1. domain entities & schemas", + "source_file": "specs/005-convert-json-markdown/data-model.md", + "source_location": "L5" + }, + { + "id": "specs_005_convert_json_markdown_data_model_2_priority_resolution_matrix", + "label": "2. Priority Resolution Matrix", + "_origin": "ast", + "community": 143, + "community_name": "1. Domain Entities & Schemas", + "file_type": "document", + "node_kind": "heading", + "norm_label": "2. priority resolution matrix", + "source_file": "specs/005-convert-json-markdown/data-model.md", + "source_location": "L90" + }, + { + "id": "specs_005_convert_json_markdown_data_model_data_model_convert_article_json_to_markdown", + "label": "Data Model: Convert Article JSON to Markdown", + "_origin": "ast", + "community": 143, + "community_name": "1. Domain Entities & Schemas", + "file_type": "document", + "node_kind": "heading", + "norm_label": "data model: convert article json to markdown", + "source_file": "specs/005-convert-json-markdown/data-model.md", + "source_location": "L1" + }, + { + "id": "specs_005_convert_json_markdown_data_model_entity_1_articleinput_source_json", + "label": "Entity 1: `ArticleInput` (Source JSON)", + "_origin": "ast", + "community": 143, + "community_name": "1. Domain Entities & Schemas", + "file_type": "document", + "node_kind": "heading", + "norm_label": "entity 1: `articleinput` (source json)", + "source_file": "specs/005-convert-json-markdown/data-model.md", + "source_location": "L7" + }, + { + "id": "specs_005_convert_json_markdown_data_model_entity_2_extractorblock_per_extractor_data", + "label": "Entity 2: `ExtractorBlock` (Per-Extractor Data)", + "_origin": "ast", + "community": 143, + "community_name": "1. Domain Entities & Schemas", + "file_type": "document", + "node_kind": "heading", + "norm_label": "entity 2: `extractorblock` (per-extractor data)", + "source_file": "specs/005-convert-json-markdown/data-model.md", + "source_location": "L34" + }, + { + "id": "specs_005_convert_json_markdown_data_model_entity_3_resolvedarticlemetadata", + "label": "Entity 3: `ResolvedArticleMetadata`", + "_origin": "ast", + "community": 143, + "community_name": "1. Domain Entities & Schemas", + "file_type": "document", + "node_kind": "heading", + "norm_label": "entity 3: `resolvedarticlemetadata`", + "source_file": "specs/005-convert-json-markdown/data-model.md", + "source_location": "L46" + }, + { + "id": "specs_005_convert_json_markdown_data_model_entity_4_markdowndocument", + "label": "Entity 4: `MarkdownDocument`", + "_origin": "ast", + "community": 143, + "community_name": "1. Domain Entities & Schemas", + "file_type": "document", + "node_kind": "heading", + "norm_label": "entity 4: `markdowndocument`", + "source_file": "specs/005-convert-json-markdown/data-model.md", + "source_location": "L66" + }, + { + "id": "specs_005_convert_json_markdown_data_model_validation_rules", + "label": "Validation Rules:", + "_origin": "ast", + "community": 143, + "community_name": "1. Domain Entities & Schemas", + "file_type": "document", + "node_kind": "heading", + "norm_label": "validation rules:", + "source_file": "specs/005-convert-json-markdown/data-model.md", + "source_location": "L26" + }, + { + "id": "docs_prd_convert_json_markdown_11_requisitos_n\u00e3o_funcionais", + "label": "11. Requisitos n\u00e3o funcionais", + "_origin": "ast", + "community": 144, + "community_name": "11. Requisitos n\u00e3o funcionais", + "file_type": "document", + "node_kind": "heading", + "norm_label": "11. requisitos nao funcionais", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L348" + }, + { + "id": "docs_prd_convert_json_markdown_rnf_001_determinismo", + "label": "RNF-001 \u2014 Determinismo", + "_origin": "ast", + "community": 144, + "community_name": "11. Requisitos n\u00e3o funcionais", + "file_type": "document", + "node_kind": "heading", + "norm_label": "rnf-001 \u2014 determinismo", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L350" + }, + { + "id": "docs_prd_convert_json_markdown_rnf_002_compatibilidade", + "label": "RNF-002 \u2014 Compatibilidade", + "_origin": "ast", + "community": 144, + "community_name": "11. Requisitos n\u00e3o funcionais", + "file_type": "document", + "node_kind": "heading", + "norm_label": "rnf-002 \u2014 compatibilidade", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L354" + }, + { + "id": "docs_prd_convert_json_markdown_rnf_003_execu\u00e7\u00e3o_local", + "label": "RNF-003 \u2014 Execu\u00e7\u00e3o local", + "_origin": "ast", + "community": 144, + "community_name": "11. Requisitos n\u00e3o funcionais", + "file_type": "document", + "node_kind": "heading", + "norm_label": "rnf-003 \u2014 execucao local", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L358" + }, + { + "id": "docs_prd_convert_json_markdown_rnf_004_integridade", + "label": "RNF-004 \u2014 Integridade", + "_origin": "ast", + "community": 144, + "community_name": "11. Requisitos n\u00e3o funcionais", + "file_type": "document", + "node_kind": "heading", + "norm_label": "rnf-004 \u2014 integridade", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L362" + }, + { + "id": "docs_prd_convert_json_markdown_rnf_005_manutenibilidade", + "label": "RNF-005 \u2014 Manutenibilidade", + "_origin": "ast", + "community": 144, + "community_name": "11. Requisitos n\u00e3o funcionais", + "file_type": "document", + "node_kind": "heading", + "norm_label": "rnf-005 \u2014 manutenibilidade", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L366" + }, + { + "id": "docs_prd_convert_json_markdown_rnf_006_qualidade", + "label": "RNF-006 \u2014 Qualidade", + "_origin": "ast", + "community": 144, + "community_name": "11. Requisitos n\u00e3o funcionais", + "file_type": "document", + "node_kind": "heading", + "norm_label": "rnf-006 \u2014 qualidade", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L370" + }, + { + "id": "scripts_convert_article_to_markdown_py_namespace", + "label": "Namespace", + "_origin": "ast", + "community": 145, + "community_name": "parse_arguments", + "file_type": "code", + "norm_label": "namespace", + "source_file": "", + "source_location": "" + }, + { + "id": "scripts_convert_article_to_markdown_rationale_668", + "label": "Configura o parser de argumentos do CLI.", + "_origin": "ast", + "community": 145, + "community_name": "parse_arguments", + "file_type": "rationale", + "norm_label": "configura o parser de argumentos do cli.", + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L668" + }, + { + "id": "scripts_convert_article_to_markdown_rationale_691", + "label": "Ponto de entrada do CLI.", + "_origin": "ast", + "community": 145, + "community_name": "parse_arguments", + "file_type": "rationale", + "norm_label": "ponto de entrada do cli.", + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L691" + }, + { + "id": "tests_test_convert_article_to_markdown_rationale_456", + "label": "Testa diretamente o parsing de argumentos.", + "_origin": "ast", + "community": 145, + "community_name": "parse_arguments", + "file_type": "rationale", + "norm_label": "testa diretamente o parsing de argumentos.", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L456" + }, + { + "id": "specs_005_convert_json_markdown_checklists_requirements", + "label": "005-convert-json-markdown/checklists/requirements.md", + "_origin": "ast", + "community": 146, + "community_name": "Specification Quality Checklist: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "page", + "norm_label": "005-convert-json-markdown/checklists/requirements.md", + "source_file": "specs/005-convert-json-markdown/checklists/requirements.md", + "source_location": "L1" + }, + { + "id": "specs_005_convert_json_markdown_checklists_requirements_content_quality", + "label": "Content Quality", + "_origin": "ast", + "community": 146, + "community_name": "Specification Quality Checklist: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "content quality", + "source_file": "specs/005-convert-json-markdown/checklists/requirements.md", + "source_location": "L7" + }, + { + "id": "specs_005_convert_json_markdown_checklists_requirements_feature_readiness", + "label": "Feature Readiness", + "_origin": "ast", + "community": 146, + "community_name": "Specification Quality Checklist: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "feature readiness", + "source_file": "specs/005-convert-json-markdown/checklists/requirements.md", + "source_location": "L25" + }, + { + "id": "specs_005_convert_json_markdown_checklists_requirements_notes", + "label": "Notes", + "_origin": "ast", + "community": 146, + "community_name": "Specification Quality Checklist: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "notes", + "source_file": "specs/005-convert-json-markdown/checklists/requirements.md", + "source_location": "L32" + }, + { + "id": "specs_005_convert_json_markdown_checklists_requirements_requirement_completeness", + "label": "Requirement Completeness", + "_origin": "ast", + "community": 146, + "community_name": "Specification Quality Checklist: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "requirement completeness", + "source_file": "specs/005-convert-json-markdown/checklists/requirements.md", + "source_location": "L14" + }, + { + "id": "specs_005_convert_json_markdown_checklists_requirements_specification_quality_checklist_convert_article_json_to_markdown", + "label": "Specification Quality Checklist: Convert Article JSON to Markdown", + "_origin": "ast", + "community": 146, + "community_name": "Specification Quality Checklist: Convert Article JSON to Markdown", + "file_type": "document", + "node_kind": "heading", + "norm_label": "specification quality checklist: convert article json to markdown", + "source_file": "specs/005-convert-json-markdown/checklists/requirements.md", + "source_location": "L1" + }, + { + "id": "specs_005_convert_json_markdown_contracts_cli_contract", + "label": "005-convert-json-markdown/contracts/cli-contract.md", + "_origin": "ast", + "community": 147, + "community_name": "CLI Contract: `convert_article_to_markdown.py`", + "file_type": "document", + "node_kind": "page", + "norm_label": "005-convert-json-markdown/contracts/cli-contract.md", + "source_file": "specs/005-convert-json-markdown/contracts/cli-contract.md", + "source_location": "L1" + }, + { + "id": "specs_005_convert_json_markdown_contracts_cli_contract_1_script_signature", + "label": "1. Script Signature", + "_origin": "ast", + "community": 147, + "community_name": "CLI Contract: `convert_article_to_markdown.py`", + "file_type": "document", + "node_kind": "heading", + "norm_label": "1. script signature", + "source_file": "specs/005-convert-json-markdown/contracts/cli-contract.md", + "source_location": "L5" + }, + { + "id": "specs_005_convert_json_markdown_contracts_cli_contract_2_command_line_arguments", + "label": "2. Command-Line Arguments", + "_origin": "ast", + "community": 147, + "community_name": "CLI Contract: `convert_article_to_markdown.py`", + "file_type": "document", + "node_kind": "heading", + "norm_label": "2. command-line arguments", + "source_file": "specs/005-convert-json-markdown/contracts/cli-contract.md", + "source_location": "L11" + }, + { + "id": "specs_005_convert_json_markdown_contracts_cli_contract_3_exit_codes", + "label": "3. Exit Codes", + "_origin": "ast", + "community": 147, + "community_name": "CLI Contract: `convert_article_to_markdown.py`", + "file_type": "document", + "node_kind": "heading", + "norm_label": "3. exit codes", + "source_file": "specs/005-convert-json-markdown/contracts/cli-contract.md", + "source_location": "L18" + }, + { + "id": "specs_005_convert_json_markdown_contracts_cli_contract_4_standard_stream_behavior", + "label": "4. Standard Stream Behavior", + "_origin": "ast", + "community": 147, + "community_name": "CLI Contract: `convert_article_to_markdown.py`", + "file_type": "document", + "node_kind": "heading", + "norm_label": "4. standard stream behavior", + "source_file": "specs/005-convert-json-markdown/contracts/cli-contract.md", + "source_location": "L26" + }, + { + "id": "specs_005_convert_json_markdown_contracts_cli_contract_cli_contract_convert_article_to_markdown_py", + "label": "CLI Contract: `convert_article_to_markdown.py`", + "_origin": "ast", + "community": 147, + "community_name": "CLI Contract: `convert_article_to_markdown.py`", + "file_type": "document", + "node_kind": "heading", + "norm_label": "cli contract: `convert_article_to_markdown.py`", + "source_file": "specs/005-convert-json-markdown/contracts/cli-contract.md", + "source_location": "L1" + }, + { + "id": "docs_prd_convert_json_markdown_9_1_script", + "label": "9.1 Script", + "_origin": "ast", + "community": 148, + "community_name": "9. Interface CLI", + "file_type": "document", + "node_kind": "heading", + "norm_label": "9.1 script", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L292" + }, + { + "id": "docs_prd_convert_json_markdown_9_2_argumentos", + "label": "9.2 Argumentos", + "_origin": "ast", + "community": 148, + "community_name": "9. Interface CLI", + "file_type": "document", + "node_kind": "heading", + "norm_label": "9.2 argumentos", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L296" + }, + { + "id": "docs_prd_convert_json_markdown_9_3_exemplos", + "label": "9.3 Exemplos", + "_origin": "ast", + "community": 148, + "community_name": "9. Interface CLI", + "file_type": "document", + "node_kind": "heading", + "norm_label": "9.3 exemplos", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L305" + }, + { + "id": "docs_prd_convert_json_markdown_9_4_sa\u00edda_do_processo", + "label": "9.4 Sa\u00edda do processo", + "_origin": "ast", + "community": 148, + "community_name": "9. Interface CLI", + "file_type": "document", + "node_kind": "heading", + "norm_label": "9.4 saida do processo", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L319" + }, + { + "id": "docs_prd_convert_json_markdown_9_interface_cli", + "label": "9. Interface CLI", + "_origin": "ast", + "community": 148, + "community_name": "9. Interface CLI", + "file_type": "document", + "node_kind": "heading", + "norm_label": "9. interface cli", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L290" + }, + { + "id": "specs_004_deterministic_content_selection_research_1_text_normalization_pipeline", + "label": "1. Text Normalization Pipeline", + "_origin": "ast", + "community": 149, + "community_name": "1. Text Normalization Pipeline", + "file_type": "document", + "node_kind": "heading", + "norm_label": "1. text normalization pipeline", + "source_file": "specs/004-deterministic-content-selection/research.md", + "source_location": "L7" + }, + { + "id": "specs_004_deterministic_content_selection_research_alternatives_considered", + "label": "Alternatives Considered", + "_origin": "ast", + "community": 149, + "community_name": "1. Text Normalization Pipeline", + "file_type": "document", + "node_kind": "heading", + "norm_label": "alternatives considered", + "source_file": "specs/004-deterministic-content-selection/research.md", + "source_location": "L26" + }, + { + "id": "specs_004_deterministic_content_selection_research_context", + "label": "Context", + "_origin": "ast", + "community": 149, + "community_name": "1. Text Normalization Pipeline", + "file_type": "document", + "node_kind": "heading", + "norm_label": "context", + "source_file": "specs/004-deterministic-content-selection/research.md", + "source_location": "L9" + }, + { + "id": "specs_004_deterministic_content_selection_research_decisions", + "label": "Decisions", + "_origin": "ast", + "community": 149, + "community_name": "1. Text Normalization Pipeline", + "file_type": "document", + "node_kind": "heading", + "norm_label": "decisions", + "source_file": "specs/004-deterministic-content-selection/research.md", + "source_location": "L12" + }, + { + "id": "specs_004_deterministic_content_selection_research_rationale", + "label": "Rationale", + "_origin": "ast", + "community": 149, + "community_name": "1. Text Normalization Pipeline", + "file_type": "document", + "node_kind": "heading", + "norm_label": "rationale", + "source_file": "specs/004-deterministic-content-selection/research.md", + "source_location": "L22" + }, { "id": "specify_templates_plan_template", "label": "plan-template.md", @@ -7606,6 +10255,299 @@ "source_file": ".specify/templates/plan-template.md", "source_location": "L13" }, + { + "id": "docs_prd_convert_json_markdown_13_1_testes_unit\u00e1rios", + "label": "13.1 Testes unit\u00e1rios", + "_origin": "ast", + "community": 150, + "community_name": "13. Estrat\u00e9gia de testes", + "file_type": "document", + "node_kind": "heading", + "norm_label": "13.1 testes unitarios", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L456" + }, + { + "id": "docs_prd_convert_json_markdown_13_2_testes_de_integra\u00e7\u00e3o_do_cli", + "label": "13.2 Testes de integra\u00e7\u00e3o do CLI", + "_origin": "ast", + "community": 150, + "community_name": "13. Estrat\u00e9gia de testes", + "file_type": "document", + "node_kind": "heading", + "norm_label": "13.2 testes de integracao do cli", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L471" + }, + { + "id": "docs_prd_convert_json_markdown_13_3_casos_de_resultado_esperado", + "label": "13.3 Casos de resultado esperado", + "_origin": "ast", + "community": 150, + "community_name": "13. Estrat\u00e9gia de testes", + "file_type": "document", + "node_kind": "heading", + "norm_label": "13.3 casos de resultado esperado", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L481" + }, + { + "id": "docs_prd_convert_json_markdown_13_estrat\u00e9gia_de_testes", + "label": "13. Estrat\u00e9gia de testes", + "_origin": "ast", + "community": 150, + "community_name": "13. Estrat\u00e9gia de testes", + "file_type": "document", + "node_kind": "heading", + "norm_label": "13. estrategia de testes", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L454" + }, + { + "id": "docs_prd_convert_json_markdown_6_1_formato", + "label": "6.1 Formato", + "_origin": "ast", + "community": 151, + "community_name": "6. Contrato de entrada", + "file_type": "document", + "node_kind": "heading", + "norm_label": "6.1 formato", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L63" + }, + { + "id": "docs_prd_convert_json_markdown_6_2_valores_aceitos_para_selected_extractor", + "label": "6.2 Valores aceitos para `selected_extractor`", + "_origin": "ast", + "community": 151, + "community_name": "6. Contrato de entrada", + "file_type": "document", + "node_kind": "heading", + "norm_label": "6.2 valores aceitos para `selected_extractor`", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L79" + }, + { + "id": "docs_prd_convert_json_markdown_6_3_campos_obrigat\u00f3rios_ap\u00f3s_a_resolu\u00e7\u00e3o", + "label": "6.3 Campos obrigat\u00f3rios ap\u00f3s a resolu\u00e7\u00e3o", + "_origin": "ast", + "community": 151, + "community_name": "6. Contrato de entrada", + "file_type": "document", + "node_kind": "heading", + "norm_label": "6.3 campos obrigatorios apos a resolucao", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L87" + }, + { + "id": "docs_prd_convert_json_markdown_6_contrato_de_entrada", + "label": "6. Contrato de entrada", + "_origin": "ast", + "community": 151, + "community_name": "6. Contrato de entrada", + "file_type": "document", + "node_kind": "heading", + "norm_label": "6. contrato de entrada", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L61" + }, + { + "id": "scripts_convert_article_to_markdown_rationale_541", + "label": "Monta a estrutura final do documento Markdown respeitando a ordem estrita do\u2026", + "_origin": "ast", + "community": 152, + "community_name": "assemble_markdown_document", + "file_type": "rationale", + "norm_label": "monta a estrutura final do documento markdown respeitando a ordem estrita do...", + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L541" + }, + { + "id": "tests_test_convert_article_to_markdown_rationale_275", + "label": "Testa a montagem completa da estrutura de se\u00e7\u00f5es do documento Markdown.", + "_origin": "ast", + "community": 152, + "community_name": "assemble_markdown_document", + "file_type": "rationale", + "norm_label": "testa a montagem completa da estrutura de secoes do documento markdown.", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L275" + }, + { + "id": "scripts_convert_article_to_markdown_rationale_150", + "label": "Converte HTML para Markdown usando t\u00edtulos ATX.", + "_origin": "ast", + "community": 153, + "community_name": "convert_html_to_markdown", + "file_type": "rationale", + "norm_label": "converte html para markdown usando titulos atx.", + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L150" + }, + { + "id": "tests_test_convert_article_to_markdown_rationale_448", + "label": "Testa diretamente a fun\u00e7\u00e3o convert_html_to_markdown.", + "_origin": "ast", + "community": 153, + "community_name": "convert_html_to_markdown", + "file_type": "rationale", + "norm_label": "testa diretamente a funcao convert_html_to_markdown.", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L448" + }, + { + "id": "scripts_convert_article_to_markdown_rationale_474", + "label": "Remove o primeiro t\u00edtulo H1 do corpo somente quando ele for igual ao t\u00edtulo\u2026", + "_origin": "ast", + "community": 154, + "community_name": "remove_duplicate_initial_h1", + "file_type": "rationale", + "norm_label": "remove o primeiro titulo h1 do corpo somente quando ele for igual ao titulo...", + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L474" + }, + { + "id": "tests_test_convert_article_to_markdown_rationale_250", + "label": "Garante remo\u00e7\u00e3o apenas do H1 inicial que for id\u00eantico ao t\u00edtulo.", + "_origin": "ast", + "community": 154, + "community_name": "remove_duplicate_initial_h1", + "file_type": "rationale", + "norm_label": "garante remocao apenas do h1 inicial que for identico ao titulo.", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L250" + }, + { + "id": "docs_prd_convert_json_markdown_5_1_inclu\u00eddo", + "label": "5.1 Inclu\u00eddo", + "_origin": "ast", + "community": 155, + "community_name": "5. Escopo", + "file_type": "document", + "node_kind": "heading", + "norm_label": "5.1 incluido", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L34" + }, + { + "id": "docs_prd_convert_json_markdown_5_2_fora_do_escopo", + "label": "5.2 Fora do escopo", + "_origin": "ast", + "community": 155, + "community_name": "5. Escopo", + "file_type": "document", + "node_kind": "heading", + "norm_label": "5.2 fora do escopo", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L47" + }, + { + "id": "docs_prd_convert_json_markdown_5_escopo", + "label": "5. Escopo", + "_origin": "ast", + "community": 155, + "community_name": "5. Escopo", + "file_type": "document", + "node_kind": "heading", + "norm_label": "5. escopo", + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L32" + }, + { + "id": "tests_fixtures_markdown_conversion_valid_trafilatura", + "label": "valid_trafilatura.md", + "_origin": "ast", + "community": 156, + "community_name": "Los puntajes de River vs. Independiente Santa Fe, por la Copa Sudamericana - TyC Sports", + "file_type": "document", + "node_kind": "page", + "norm_label": "valid_trafilatura.md", + "source_file": "tests/fixtures/markdown_conversion/valid_trafilatura.md", + "source_location": "L1" + }, + { + "id": "tests_fixtures_markdown_conversion_valid_trafilatura_los_puntajes_de_river_vs_independiente_santa_fe_por_la_copa_sudamericana_tyc_sports", + "label": "Los puntajes de River vs. Independiente Santa Fe, por la Copa Sudamericana - TyC Sports", + "_origin": "ast", + "community": 156, + "community_name": "Los puntajes de River vs. Independiente Santa Fe, por la Copa Sudamericana - TyC Sports", + "file_type": "document", + "node_kind": "heading", + "norm_label": "los puntajes de river vs. independiente santa fe, por la copa sudamericana - tyc sports", + "source_file": "tests/fixtures/markdown_conversion/valid_trafilatura.md", + "source_location": "L1" + }, + { + "id": "tests_fixtures_markdown_conversion_valid_trafilatura_santiago_beltr\u00e1n_6", + "label": "SANTIAGO BELTR\u00c1N - 6", + "_origin": "ast", + "community": 156, + "community_name": "Los puntajes de River vs. Independiente Santa Fe, por la Copa Sudamericana - TyC Sports", + "file_type": "document", + "node_kind": "heading", + "norm_label": "santiago beltran - 6", + "source_file": "tests/fixtures/markdown_conversion/valid_trafilatura.md", + "source_location": "L19" + }, + { + "id": "tests_fixtures_markdown_conversion_valid_newspaper4k", + "label": "valid_newspaper4k.md", + "_origin": "ast", + "community": 157, + "community_name": "valid_newspaper4k.md", + "file_type": "document", + "node_kind": "page", + "norm_label": "valid_newspaper4k.md", + "source_file": "tests/fixtures/markdown_conversion/valid_newspaper4k.md", + "source_location": "L1" + }, + { + "id": "tests_fixtures_markdown_conversion_valid_newspaper4k_qui\u00e9n_es_paz_zubiri_la_relatora_de_fox_sports", + "label": "Qui\u00e9n es Paz Zubiri, la relatora de Fox Sports", + "_origin": "ast", + "community": 157, + "community_name": "valid_newspaper4k.md", + "file_type": "document", + "node_kind": "heading", + "norm_label": "quien es paz zubiri, la relatora de fox sports", + "source_file": "tests/fixtures/markdown_conversion/valid_newspaper4k.md", + "source_location": "L1" + }, + { + "id": "tests_fixtures_markdown_conversion_valid_readability", + "label": "valid_readability.md", + "_origin": "ast", + "community": 158, + "community_name": "valid_readability.md", + "file_type": "document", + "node_kind": "page", + "norm_label": "valid_readability.md", + "source_file": "tests/fixtures/markdown_conversion/valid_readability.md", + "source_location": "L1" + }, + { + "id": "tests_fixtures_markdown_conversion_valid_readability_an\u00e1lisis_t\u00e1ctico_del_partido_de_river_en_bogot\u00e1", + "label": "An\u00e1lisis t\u00e1ctico del partido de River en Bogot\u00e1", + "_origin": "ast", + "community": 158, + "community_name": "valid_readability.md", + "file_type": "document", + "node_kind": "heading", + "norm_label": "analisis tactico del partido de river en bogota", + "source_file": "tests/fixtures/markdown_conversion/valid_readability.md", + "source_location": "L1" + }, + { + "id": "tests_test_convert_article_to_markdown_rationale_140", + "label": "Testa normaliza\u00e7\u00e3o de listas, separa\u00e7\u00e3o por ponto e v\u00edrgula, deduplica\u00e7\u00e3o e\u2026", + "_origin": "ast", + "community": 159, + "community_name": "test_normalize_list_strings_and_deduplication", + "file_type": "rationale", + "norm_label": "testa normalizacao de listas, separacao por ponto e virgula, deduplicacao e...", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L140" + }, { "id": "agents_skills_ponytail_help_skill", "label": "ponytail-help/SKILL.md", @@ -7706,6 +10648,17 @@ "source_file": ".agents/skills/ponytail-help/SKILL.md", "source_location": "L63" }, + { + "id": "tests_test_convert_article_to_markdown_rationale_176", + "label": "Testa valida\u00e7\u00e3o estrita de URLs absolutas com http/https.", + "_origin": "ast", + "community": 160, + "community_name": "test_validate_url_schemes", + "file_type": "rationale", + "norm_label": "testa validacao estrita de urls absolutas com http/https.", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L176" + }, { "id": "agents_skills_speckit_checklist_skill", "label": "speckit-checklist/SKILL.md", @@ -10194,6 +13147,17 @@ "source_file": "src/adapters/base.py", "source_location": "L1" }, + { + "id": "src_adapters_embeddings", + "label": "embeddings.py", + "_origin": "ast", + "community": 45, + "community_name": "ClassificationResult", + "file_type": "code", + "norm_label": "embeddings.py", + "source_file": "src/adapters/embeddings.py", + "source_location": "L1" + }, { "id": "src_adapters_llm", "label": "llm.py", @@ -10205,6 +13169,17 @@ "source_file": "src/adapters/llm.py", "source_location": "L1" }, + { + "id": "tests_test_adapters", + "label": "test_adapters.py", + "_origin": "ast", + "community": 45, + "community_name": "ClassificationResult", + "file_type": "code", + "norm_label": "test_adapters.py", + "source_file": "tests/test_adapters.py", + "source_location": "L1" + }, { "id": "src_adapters_base_rationale_1", "label": "Base abstract adapter interface for optional Tier 2 / Tier 3 NLP enhancers.", @@ -10260,6 +13235,28 @@ "source_file": "src/adapters/base.py", "source_location": "L28" }, + { + "id": "src_adapters_embeddings_rationale_1", + "label": "Optional local vector embeddings adapter (Tier 2). Disabled by default.\u2026", + "_origin": "ast", + "community": 45, + "community_name": "ClassificationResult", + "file_type": "rationale", + "norm_label": "optional local vector embeddings adapter (tier 2). disabled by default....", + "source_file": "src/adapters/embeddings.py", + "source_location": "L1" + }, + { + "id": "src_adapters_embeddings_rationale_14", + "label": "Optional adapter for local multilingual semantic vector embeddings.", + "_origin": "ast", + "community": 45, + "community_name": "ClassificationResult", + "file_type": "rationale", + "norm_label": "optional adapter for local multilingual semantic vector embeddings.", + "source_file": "src/adapters/embeddings.py", + "source_location": "L14" + }, { "id": "src_adapters_llm_rationale_1", "label": "Optional LLM fallback adapter (Tier 3). Disabled by default. Provides fallback\u2026", @@ -10282,6 +13279,17 @@ "source_file": "src/adapters/llm.py", "source_location": "L16" }, + { + "id": "tests_test_adapters_rationale_1", + "label": "Unit tests for optional adapter interfaces (Tier 2 / Tier 3).", + "_origin": "ast", + "community": 45, + "community_name": "ClassificationResult", + "file_type": "rationale", + "norm_label": "unit tests for optional adapter interfaces (tier 2 / tier 3).", + "source_file": "tests/test_adapters.py", + "source_location": "L1" + }, { "id": "tests_test_adversarial", "label": "test_adversarial.py", @@ -10436,17 +13444,6 @@ "source_file": "src/classifier.py", "source_location": "L1" }, - { - "id": "src_language", - "label": "language.py", - "_origin": "ast", - "community": 47, - "community_name": "classifier.py", - "file_type": "code", - "norm_label": "language.py", - "source_file": "src/language.py", - "source_location": "L1" - }, { "id": "src_parser", "label": "parser.py", @@ -10459,14 +13456,14 @@ "source_location": "L1" }, { - "id": "tests_test_language", - "label": "test_language.py", + "id": "tests_test_models", + "label": "test_models.py", "_origin": "ast", "community": 47, "community_name": "classifier.py", "file_type": "code", - "norm_label": "test_language.py", - "source_file": "tests/test_language.py", + "norm_label": "test_models.py", + "source_file": "tests/test_models.py", "source_location": "L1" }, { @@ -10513,50 +13510,6 @@ "source_file": "src/classifier.py", "source_location": "L61" }, - { - "id": "src_language_rationale_1", - "label": "Lightweight multilingual language detection and text normalization.", - "_origin": "ast", - "community": 47, - "community_name": "classifier.py", - "file_type": "rationale", - "norm_label": "lightweight multilingual language detection and text normalization.", - "source_file": "src/language.py", - "source_location": "L1" - }, - { - "id": "src_language_rationale_463", - "label": "Normalize text by converting to lowercase and stripping combining diacritical\u2026", - "_origin": "ast", - "community": 47, - "community_name": "classifier.py", - "file_type": "rationale", - "norm_label": "normalize text by converting to lowercase and stripping combining diacritical...", - "source_file": "src/language.py", - "source_location": "L463" - }, - { - "id": "src_language_rationale_473", - "label": "Tokenize text into lowercase alphanumeric words.", - "_origin": "ast", - "community": 47, - "community_name": "classifier.py", - "file_type": "rationale", - "norm_label": "tokenize text into lowercase alphanumeric words.", - "source_file": "src/language.py", - "source_location": "L473" - }, - { - "id": "src_language_rationale_478", - "label": "Detect the ISO-639-1 language code of text among supported languages (pt, en,\u2026", - "_origin": "ast", - "community": 47, - "community_name": "classifier.py", - "file_type": "rationale", - "norm_label": "detect the iso-639-1 language code of text among supported languages (pt, en,...", - "source_file": "src/language.py", - "source_location": "L478" - }, { "id": "src_parser_rationale_1", "label": "Markdown content parser and excerpt extraction utilities.", @@ -10602,49 +13555,159 @@ "source_location": "L9" }, { - "id": "tests_test_language_rationale_1", - "label": "Unit tests for language detection and text normalization.", + "id": "tests_test_models_rationale_1", + "label": "Unit tests for ECP models, schema validation, and structured error handling.", "_origin": "ast", "community": 47, "community_name": "classifier.py", "file_type": "rationale", - "norm_label": "unit tests for language detection and text normalization.", - "source_file": "tests/test_language.py", + "norm_label": "unit tests for ecp models, schema validation, and structured error handling.", + "source_file": "tests/test_models.py", "source_location": "L1" }, { - "id": "classify_py_namespace", - "label": "Namespace", + "id": "tests_test_convert_article_to_markdown", + "label": "test_convert_article_to_markdown.py", "_origin": "ast", "community": 48, - "community_name": "main", + "community_name": "test_convert_article_to_markdown.py", "file_type": "code", - "norm_label": "namespace", - "source_file": "", - "source_location": "" - }, - { - "id": "tests_test_cli", - "label": "test_cli.py", - "_origin": "ast", - "community": 48, - "community_name": "main", - "file_type": "code", - "norm_label": "test_cli.py", - "source_file": "tests/test_cli.py", + "norm_label": "test_convert_article_to_markdown.py", + "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L1" }, { - "id": "tests_test_cli_rationale_1", - "label": "CLI execution tests covering flags, arguments, stdout, and error handling.", + "id": "tests_test_convert_article_to_markdown_rationale_1", + "label": "Su\u00edte de Testes Automatizados para Convers\u00e3o de Artigo JSON para Markdown.\u2026", "_origin": "ast", "community": 48, - "community_name": "main", + "community_name": "test_convert_article_to_markdown.py", "file_type": "rationale", - "norm_label": "cli execution tests covering flags, arguments, stdout, and error handling.", - "source_file": "tests/test_cli.py", + "norm_label": "suite de testes automatizados para conversao de artigo json para markdown....", + "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L1" }, + { + "id": "tests_test_convert_article_to_markdown_rationale_125", + "label": "Testa decodifica\u00e7\u00e3o de entidades HTML, colapso de espa\u00e7os e filtro de\u2026", + "_origin": "ast", + "community": 48, + "community_name": "test_convert_article_to_markdown.py", + "file_type": "rationale", + "norm_label": "testa decodificacao de entidades html, colapso de espacos e filtro de...", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L125" + }, + { + "id": "tests_test_convert_article_to_markdown_rationale_188", + "label": "Testa a matriz determin\u00edstica de prioridades dos metadados.", + "_origin": "ast", + "community": 48, + "community_name": "test_convert_article_to_markdown.py", + "file_type": "rationale", + "norm_label": "testa a matriz deterministica de prioridades dos metadados.", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L188" + }, + { + "id": "tests_test_convert_article_to_markdown_rationale_314", + "label": "Valida\u00e7\u00e3o exata byte a byte da Golden Fixture de Trafilatura.", + "_origin": "ast", + "community": 48, + "community_name": "test_convert_article_to_markdown.py", + "file_type": "rationale", + "norm_label": "validacao exata byte a byte da golden fixture de trafilatura.", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L314" + }, + { + "id": "tests_test_convert_article_to_markdown_rationale_330", + "label": "Valida\u00e7\u00e3o exata byte a byte da Golden Fixture de Newspaper4k.", + "_origin": "ast", + "community": 48, + "community_name": "test_convert_article_to_markdown.py", + "file_type": "rationale", + "norm_label": "validacao exata byte a byte da golden fixture de newspaper4k.", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L330" + }, + { + "id": "tests_test_convert_article_to_markdown_rationale_346", + "label": "Valida\u00e7\u00e3o exata byte a byte da Golden Fixture de Readability.", + "_origin": "ast", + "community": 48, + "community_name": "test_convert_article_to_markdown.py", + "file_type": "rationale", + "norm_label": "validacao exata byte a byte da golden fixture de readability.", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L346" + }, + { + "id": "tests_test_convert_article_to_markdown_rationale_362", + "label": "Testa gera\u00e7\u00e3o do arquivo de sa\u00edda padr\u00e3o .md.", + "_origin": "ast", + "community": 48, + "community_name": "test_convert_article_to_markdown.py", + "file_type": "rationale", + "norm_label": "testa geracao do arquivo de saida padrao .md.", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L362" + }, + { + "id": "tests_test_convert_article_to_markdown_rationale_387", + "label": "Testa rejei\u00e7\u00e3o com c\u00f3digo 1 quando a entrada cont\u00e9m a chave articles.", + "_origin": "ast", + "community": 48, + "community_name": "test_convert_article_to_markdown.py", + "file_type": "rationale", + "norm_label": "testa rejeicao com codigo 1 quando a entrada contem a chave articles.", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L387" + }, + { + "id": "tests_test_convert_article_to_markdown_rationale_399", + "label": "Testa encerramento com c\u00f3digo 1 para JSON corrompido.", + "_origin": "ast", + "community": 48, + "community_name": "test_convert_article_to_markdown.py", + "file_type": "rationale", + "norm_label": "testa encerramento com codigo 1 para json corrompido.", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L399" + }, + { + "id": "tests_test_convert_article_to_markdown_rationale_411", + "label": "Testa falhas com c\u00f3digo 1 para campos obrigat\u00f3rios ausentes.", + "_origin": "ast", + "community": 48, + "community_name": "test_convert_article_to_markdown.py", + "file_type": "rationale", + "norm_label": "testa falhas com codigo 1 para campos obrigatorios ausentes.", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L411" + }, + { + "id": "tests_test_convert_article_to_markdown_rationale_438", + "label": "Testa erro de argumentos do argparse (c\u00f3digo 2).", + "_origin": "ast", + "community": 48, + "community_name": "test_convert_article_to_markdown.py", + "file_type": "rationale", + "norm_label": "testa erro de argumentos do argparse (codigo 2).", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L438" + }, + { + "id": "tests_test_convert_article_to_markdown_rationale_484", + "label": "Garante que uma falha durante o processamento n\u00e3o altere o arquivo de destino\u2026", + "_origin": "ast", + "community": 48, + "community_name": "test_convert_article_to_markdown.py", + "file_type": "rationale", + "norm_label": "garante que uma falha durante o processamento nao altere o arquivo de destino...", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L484" + }, { "id": "examples_content_northvolt_de", "label": "content_northvolt_de.md", @@ -13853,7 +16916,7 @@ "node_kind": "heading", "norm_label": "1. \ud83e\udde0 classificador de conteudo e inerencia (nlp / llm / ecp)", "source_file": "README.md", - "source_location": "L86" + "source_location": "L94" }, { "id": "readme_1_clonar_o_reposit\u00f3rio_e_criar_ambiente_virtual", @@ -13865,7 +16928,19 @@ "node_kind": "heading", "norm_label": "1. clonar o repositorio e criar ambiente virtual", "source_file": "README.md", - "source_location": "L57" + "source_location": "L65" + }, + { + "id": "readme_1_convers\u00e3o_padr\u00e3o", + "label": "1. Convers\u00e3o Padr\u00e3o", + "_origin": "ast", + "community": 97, + "community_name": "\ud83e\udde0 TextNLPClassifierApp", + "file_type": "document", + "node_kind": "heading", + "norm_label": "1. conversao padrao", + "source_file": "README.md", + "source_location": "L434" }, { "id": "readme_1_execu\u00e7\u00e3o_padr\u00e3o_autom\u00e1tica", @@ -13877,7 +16952,19 @@ "node_kind": "heading", "norm_label": "1. execucao padrao automatica", "source_file": "README.md", - "source_location": "L309" + "source_location": "L317" + }, + { + "id": "readme_2_convers\u00e3o_com_caminho_de_destino_personalizado", + "label": "2. Convers\u00e3o com Caminho de Destino Personalizado", + "_origin": "ast", + "community": 97, + "community_name": "\ud83e\udde0 TextNLPClassifierApp", + "file_type": "document", + "node_kind": "heading", + "norm_label": "2. conversao com caminho de destino personalizado", + "source_file": "README.md", + "source_location": "L440" }, { "id": "readme_2_execu\u00e7\u00e3o_com_modo_verboso", @@ -13889,7 +16976,7 @@ "node_kind": "heading", "norm_label": "2. execucao com modo verboso", "source_file": "README.md", - "source_location": "L315" + "source_location": "L323" }, { "id": "readme_2_extrator_de_manchetes_do_google_news", @@ -13901,7 +16988,7 @@ "node_kind": "heading", "norm_label": "2. \ud83d\udcf0 extrator de manchetes do google news", "source_file": "README.md", - "source_location": "L163" + "source_location": "L171" }, { "id": "readme_2_instalar_depend\u00eancias", @@ -13913,7 +17000,7 @@ "node_kind": "heading", "norm_label": "2. instalar dependencias", "source_file": "README.md", - "source_location": "L70" + "source_location": "L78" }, { "id": "readme_3_baixar_bin\u00e1rios_do_navegador_stealth_camoufox", @@ -13925,7 +17012,7 @@ "node_kind": "heading", "norm_label": "3. baixar binarios do navegador stealth (camoufox)", "source_file": "README.md", - "source_location": "L76" + "source_location": "L84" }, { "id": "readme_3_extrator_e_parser_multimotor_de_artigos", @@ -13937,7 +17024,7 @@ "node_kind": "heading", "norm_label": "3. \ud83d\udcc4 extrator e parser multimotor de artigos", "source_file": "README.md", - "source_location": "L205" + "source_location": "L213" }, { "id": "readme_3_uso_program\u00e1tico_como_m\u00f3dulo_python", @@ -13949,7 +17036,19 @@ "node_kind": "heading", "norm_label": "3. uso programatico como modulo python", "source_file": "README.md", - "source_location": "L339" + "source_location": "L347" + }, + { + "id": "readme_3_uso_program\u00e1tico_em_python", + "label": "3. Uso Program\u00e1tico em Python", + "_origin": "ast", + "community": 97, + "community_name": "\ud83e\udde0 TextNLPClassifierApp", + "file_type": "document", + "node_kind": "heading", + "norm_label": "3. uso programatico em python", + "source_file": "README.md", + "source_location": "L447" }, { "id": "readme_4_seletor_determin\u00edstico_de_conte\u00fado_de_artigos", @@ -13961,7 +17060,19 @@ "node_kind": "heading", "norm_label": "4. \ud83c\udfaf seletor deterministico de conteudo de artigos", "source_file": "README.md", - "source_location": "L243" + "source_location": "L251" + }, + { + "id": "readme_5_conversor_de_artigo_json_para_markdown", + "label": "5. \ud83d\udcdd Conversor de Artigo JSON para Markdown", + "_origin": "ast", + "community": 97, + "community_name": "\ud83e\udde0 TextNLPClassifierApp", + "file_type": "document", + "node_kind": "heading", + "norm_label": "5. \ud83d\udcdd conversor de artigo json para markdown", + "source_file": "README.md", + "source_location": "L364" }, { "id": "readme_argumentos_e_flags_cli", @@ -13973,10 +17084,10 @@ "node_kind": "heading", "norm_label": "argumentos e flags cli", "source_file": "README.md", - "source_location": "L217" + "source_location": "L225" }, { - "id": "readme_argumentos_e_flags_cli_298", + "id": "readme_argumentos_e_flags_cli_306", "label": "Argumentos e Flags CLI", "_origin": "ast", "community": 97, @@ -13985,7 +17096,19 @@ "node_kind": "heading", "norm_label": "argumentos e flags cli", "source_file": "README.md", - "source_location": "L298" + "source_location": "L306" + }, + { + "id": "readme_argumentos_e_flags_cli_425", + "label": "Argumentos e Flags CLI", + "_origin": "ast", + "community": 97, + "community_name": "\ud83e\udde0 TextNLPClassifierApp", + "file_type": "document", + "node_kind": "heading", + "norm_label": "argumentos e flags cli", + "source_file": "README.md", + "source_location": "L425" }, { "id": "readme_argumentos_e_flags_de_linha_de_comando", @@ -13997,7 +17120,7 @@ "node_kind": "heading", "norm_label": "argumentos e flags de linha de comando", "source_file": "README.md", - "source_location": "L177" + "source_location": "L185" }, { "id": "readme_arquitetura_de_classifica\u00e7\u00e3o_em_3_tiers", @@ -14009,7 +17132,7 @@ "node_kind": "heading", "norm_label": "arquitetura de classificacao em 3 tiers", "source_file": "README.md", - "source_location": "L94" + "source_location": "L102" }, { "id": "readme_categorias_de_decis\u00e3o", @@ -14021,7 +17144,7 @@ "node_kind": "heading", "norm_label": "categorias de decisao", "source_file": "README.md", - "source_location": "L115" + "source_location": "L123" }, { "id": "readme_crit\u00e9rios_de_desempate_t\u00e9cnico_e_resili\u00eancia", @@ -14033,7 +17156,7 @@ "node_kind": "heading", "norm_label": "criterios de desempate tecnico e resiliencia", "source_file": "README.md", - "source_location": "L286" + "source_location": "L294" }, { "id": "readme_diferenciais_t\u00e9cnicos", @@ -14045,7 +17168,7 @@ "node_kind": "heading", "norm_label": "diferenciais tecnicos", "source_file": "README.md", - "source_location": "L169" + "source_location": "L177" }, { "id": "readme_estrutura_do_projeto", @@ -14057,7 +17180,7 @@ "node_kind": "heading", "norm_label": "\ud83d\udcc1 estrutura do projeto", "source_file": "README.md", - "source_location": "L356" + "source_location": "L458" }, { "id": "readme_exemplo_de_ecp_snapshot_ecp_sample_json", @@ -14069,7 +17192,7 @@ "node_kind": "heading", "norm_label": "exemplo de ecp snapshot (`ecp_sample.json`):", "source_file": "README.md", - "source_location": "L126" + "source_location": "L134" }, { "id": "readme_exemplos_de_uso", @@ -14081,7 +17204,7 @@ "node_kind": "heading", "norm_label": "exemplos de uso", "source_file": "README.md", - "source_location": "L228" + "source_location": "L236" }, { "id": "readme_exemplos_de_uso_cli", @@ -14093,7 +17216,7 @@ "node_kind": "heading", "norm_label": "exemplos de uso cli", "source_file": "README.md", - "source_location": "L148" + "source_location": "L156" }, { "id": "readme_exemplos_pr\u00e1ticos_de_uso", @@ -14105,10 +17228,10 @@ "node_kind": "heading", "norm_label": "exemplos praticos de uso", "source_file": "README.md", - "source_location": "L190" + "source_location": "L198" }, { - "id": "readme_exemplos_pr\u00e1ticos_de_uso_307", + "id": "readme_exemplos_pr\u00e1ticos_de_uso_315", "label": "Exemplos Pr\u00e1ticos de Uso", "_origin": "ast", "community": 97, @@ -14117,7 +17240,19 @@ "node_kind": "heading", "norm_label": "exemplos praticos de uso", "source_file": "README.md", - "source_location": "L307" + "source_location": "L315" + }, + { + "id": "readme_exemplos_pr\u00e1ticos_de_uso_432", + "label": "Exemplos Pr\u00e1ticos de Uso", + "_origin": "ast", + "community": 97, + "community_name": "\ud83e\udde0 TextNLPClassifierApp", + "file_type": "document", + "node_kind": "heading", + "norm_label": "exemplos praticos de uso", + "source_file": "README.md", + "source_location": "L432" }, { "id": "readme_formato_do_ecp_snapshot_e_markdown", @@ -14129,7 +17264,7 @@ "node_kind": "heading", "norm_label": "formato do ecp snapshot e markdown", "source_file": "README.md", - "source_location": "L124" + "source_location": "L132" }, { "id": "readme_instala\u00e7\u00e3o_e_setup", @@ -14141,7 +17276,19 @@ "node_kind": "heading", "norm_label": "\u2699\ufe0f instalacao e setup", "source_file": "README.md", - "source_location": "L55" + "source_location": "L63" + }, + { + "id": "readme_isolamento_estrito_de_extratores_e_fallback", + "label": "Isolamento Estrito de Extratores e Fallback", + "_origin": "ast", + "community": 97, + "community_name": "\ud83e\udde0 TextNLPClassifierApp", + "file_type": "document", + "node_kind": "heading", + "norm_label": "isolamento estrito de extratores e fallback", + "source_file": "README.md", + "source_location": "L393" }, { "id": "readme_licen\u00e7a", @@ -14153,7 +17300,19 @@ "node_kind": "heading", "norm_label": "\ud83d\udcc4 licenca", "source_file": "README.md", - "source_location": "L415" + "source_location": "L522" + }, + { + "id": "readme_matriz_determin\u00edstica_de_metadados", + "label": "Matriz Determin\u00edstica de Metadados", + "_origin": "ast", + "community": 97, + "community_name": "\ud83e\udde0 TextNLPClassifierApp", + "file_type": "document", + "node_kind": "heading", + "norm_label": "matriz deterministica de metadados", + "source_file": "README.md", + "source_location": "L402" }, { "id": "readme_o_que_\u00e9_e_como_funciona", @@ -14165,10 +17324,10 @@ "node_kind": "heading", "norm_label": "o que e e como funciona", "source_file": "README.md", - "source_location": "L88" + "source_location": "L96" }, { - "id": "readme_o_que_\u00e9_e_como_funciona_165", + "id": "readme_o_que_\u00e9_e_como_funciona_173", "label": "O que \u00e9 e Como Funciona", "_origin": "ast", "community": 97, @@ -14177,7 +17336,7 @@ "node_kind": "heading", "norm_label": "o que e e como funciona", "source_file": "README.md", - "source_location": "L165" + "source_location": "L173" }, { "id": "readme_pipeline_de_normaliza\u00e7\u00e3o_e_shingles", @@ -14189,7 +17348,19 @@ "node_kind": "heading", "norm_label": "pipeline de normalizacao e shingles", "source_file": "README.md", - "source_location": "L274" + "source_location": "L282" + }, + { + "id": "readme_sanitiza\u00e7\u00e3o_editorial_e_deduplica\u00e7\u00e3o", + "label": "Sanitiza\u00e7\u00e3o Editorial e Deduplica\u00e7\u00e3o", + "_origin": "ast", + "community": 97, + "community_name": "\ud83e\udde0 TextNLPClassifierApp", + "file_type": "document", + "node_kind": "heading", + "norm_label": "sanitizacao editorial e deduplicacao", + "source_file": "README.md", + "source_location": "L418" }, { "id": "readme_tabela_de_conte\u00fados", @@ -14213,7 +17384,7 @@ "node_kind": "heading", "norm_label": "\ud83e\uddea testes e qualidade de codigo", "source_file": "README.md", - "source_location": "L388" + "source_location": "L493" }, { "id": "readme_textnlpclassifierapp", @@ -14237,7 +17408,7 @@ "node_kind": "heading", "norm_label": "\ud83c\udf1f visao geral", "source_file": "README.md", - "source_location": "L44" + "source_location": "L51" }, { "id": "readme_vis\u00e3o_geral_e_algoritmo_de_consenso_f_1", @@ -14249,7 +17420,19 @@ "node_kind": "heading", "norm_label": "visao geral e algoritmo de consenso ($f_1$)", "source_file": "README.md", - "source_location": "L245" + "source_location": "L253" + }, + { + "id": "readme_vis\u00e3o_geral_e_estrutura_do_documento", + "label": "Vis\u00e3o Geral e Estrutura do Documento", + "_origin": "ast", + "community": 97, + "community_name": "\ud83e\udde0 TextNLPClassifierApp", + "file_type": "document", + "node_kind": "heading", + "norm_label": "visao geral e estrutura do documento", + "source_file": "README.md", + "source_location": "L366" }, { "id": "readme_vis\u00e3o_geral_e_tr\u00edplice_extra\u00e7\u00e3o", @@ -14261,7 +17444,7 @@ "node_kind": "heading", "norm_label": "visao geral e triplice extracao", "source_file": "README.md", - "source_location": "L207" + "source_location": "L215" }, { "id": "specs_003_article_content_extractor_checklists_extraction", @@ -14803,6 +17986,198 @@ "source_location": "L99", "weight": 1.0 }, + { + "source": "scripts_convert_article_to_markdown_convert_article", + "target": "scripts_convert_article_to_markdown_resolve_article_body", + "relation": "calls", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "call", + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L632", + "weight": 1.0 + }, + { + "source": "scripts_convert_article_to_markdown_convert_article", + "target": "scripts_convert_article_to_markdown_resolve_article_metadata", + "relation": "calls", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "call", + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L633", + "weight": 1.0 + }, + { + "source": "scripts_convert_article_to_markdown_convert_article", + "target": "scripts_convert_article_to_markdown_remove_duplicate_initial_h1", + "relation": "calls", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "call", + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L636", + "weight": 1.0 + }, + { + "source": "scripts_convert_article_to_markdown_convert_article", + "target": "scripts_convert_article_to_markdown_clean_body_images", + "relation": "calls", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "call", + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L637", + "weight": 1.0 + }, + { + "source": "scripts_convert_article_to_markdown_convert_article", + "target": "scripts_convert_article_to_markdown_assemble_markdown_document", + "relation": "calls", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "call", + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L640", + "weight": 1.0 + }, + { + "source": "scripts_convert_article_to_markdown_main", + "target": "scripts_convert_article_to_markdown_parse_arguments", + "relation": "calls", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "call", + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L693", + "weight": 1.0 + }, + { + "source": "scripts_convert_article_to_markdown_main", + "target": "scripts_convert_article_to_markdown_convert_article", + "relation": "calls", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "call", + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L698", + "weight": 1.0 + }, + { + "source": "scripts_convert_article_to_markdown_normalize_list", + "target": "scripts_convert_article_to_markdown_normalize_scalar", + "relation": "calls", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "call", + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L85", + "weight": 1.0 + }, + { + "source": "scripts_convert_article_to_markdown_remove_duplicate_initial_h1", + "target": "scripts_convert_article_to_markdown_normalize_scalar", + "relation": "calls", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "call", + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L490", + "weight": 1.0 + }, + { + "source": "scripts_convert_article_to_markdown_resolve_article_body", + "target": "scripts_convert_article_to_markdown_convert_html_to_markdown", + "relation": "calls", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "call", + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L191", + "weight": 1.0 + }, + { + "source": "scripts_convert_article_to_markdown_resolve_article_metadata", + "target": "scripts_convert_article_to_markdown_get_dict", + "relation": "calls", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "call", + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L230", + "weight": 1.0 + }, + { + "source": "scripts_convert_article_to_markdown_resolve_article_metadata", + "target": "scripts_convert_article_to_markdown_normalize_scalar", + "relation": "calls", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "call", + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L251", + "weight": 1.0 + }, + { + "source": "scripts_convert_article_to_markdown_resolve_article_metadata", + "target": "scripts_convert_article_to_markdown_validate_url", + "relation": "calls", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "call", + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L276", + "weight": 1.0 + }, + { + "source": "scripts_convert_article_to_markdown_resolve_article_metadata", + "target": "scripts_convert_article_to_markdown_normalize_list", + "relation": "calls", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "call", + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L325", + "weight": 1.0 + }, + { + "source": "scripts_convert_article_to_markdown_resolve_article_metadata", + "target": "scripts_convert_article_to_markdown_normalize_date", + "relation": "calls", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "call", + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L346", + "weight": 1.0 + }, + { + "source": "scripts_convert_article_to_markdown_validate_url", + "target": "scripts_convert_article_to_markdown_normalize_scalar", + "relation": "calls", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "call", + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L137", + "weight": 1.0 + }, { "source": "scripts_extract_article_contents_articlecrawler_crawl", "target": "scripts_extract_article_contents_articlecrawler_start", @@ -15208,7 +18583,7 @@ "confidence_score": 1.0, "context": "call", "source_file": "scripts/select_article_extractor.py", - "source_location": "L432", + "source_location": "L450", "weight": 1.0 }, { @@ -15256,7 +18631,7 @@ "confidence_score": 1.0, "context": "call", "source_file": "scripts/select_article_extractor.py", - "source_location": "L545", + "source_location": "L571", "weight": 1.0 }, { @@ -15268,7 +18643,7 @@ "confidence_score": 1.0, "context": "call", "source_file": "scripts/select_article_extractor.py", - "source_location": "L547", + "source_location": "L573", "weight": 1.0 }, { @@ -15280,7 +18655,7 @@ "confidence_score": 1.0, "context": "call", "source_file": "scripts/select_article_extractor.py", - "source_location": "L459", + "source_location": "L480", "weight": 1.0 }, { @@ -15292,7 +18667,7 @@ "confidence_score": 1.0, "context": "call", "source_file": "scripts/select_article_extractor.py", - "source_location": "L491", + "source_location": "L512", "weight": 1.0 }, { @@ -15304,7 +18679,7 @@ "confidence_score": 1.0, "context": "call", "source_file": "scripts/select_article_extractor.py", - "source_location": "L506", + "source_location": "L527", "weight": 1.0 }, { @@ -15316,7 +18691,7 @@ "confidence_score": 1.0, "context": "call", "source_file": "scripts/select_article_extractor.py", - "source_location": "L508", + "source_location": "L529", "weight": 1.0 }, { @@ -15328,7 +18703,7 @@ "confidence_score": 1.0, "context": "call", "source_file": "scripts/select_article_extractor.py", - "source_location": "L379", + "source_location": "L395", "weight": 1.0 }, { @@ -15340,7 +18715,7 @@ "confidence_score": 1.0, "context": "call", "source_file": "scripts/select_article_extractor.py", - "source_location": "L382", + "source_location": "L398", "weight": 1.0 }, { @@ -15352,7 +18727,7 @@ "confidence_score": 1.0, "context": "call", "source_file": "scripts/select_article_extractor.py", - "source_location": "L386", + "source_location": "L402", "weight": 1.0 }, { @@ -15364,7 +18739,7 @@ "confidence_score": 1.0, "context": "call", "source_file": "scripts/select_article_extractor.py", - "source_location": "L408", + "source_location": "L426", "weight": 1.0 }, { @@ -15376,7 +18751,7 @@ "confidence_score": 1.0, "context": "call", "source_file": "scripts/select_article_extractor.py", - "source_location": "L411", + "source_location": "L429", "weight": 1.0 }, { @@ -15388,7 +18763,7 @@ "confidence_score": 1.0, "context": "call", "source_file": "scripts/select_article_extractor.py", - "source_location": "L413", + "source_location": "L431", "weight": 1.0 }, { @@ -15400,7 +18775,7 @@ "confidence_score": 1.0, "context": "call", "source_file": "scripts/select_article_extractor.py", - "source_location": "L318", + "source_location": "L326", "weight": 1.0 }, { @@ -15412,7 +18787,7 @@ "confidence_score": 1.0, "context": "call", "source_file": "scripts/select_article_extractor.py", - "source_location": "L344", + "source_location": "L354", "weight": 1.0 }, { @@ -15931,6 +19306,198 @@ "source_location": "L29", "weight": 1.0 }, + { + "source": "tests_test_convert_article_to_markdown_test_assemble_markdown_document", + "target": "scripts_convert_article_to_markdown_assemble_markdown_document", + "relation": "calls", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "call", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L290", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown_test_clean_body_images_and_deduplicate", + "target": "scripts_convert_article_to_markdown_clean_body_images", + "relation": "calls", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "call", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L267", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown_test_convert_article_direct", + "target": "scripts_convert_article_to_markdown_convert_article", + "relation": "calls", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "call", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L477", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown_test_convert_html_to_markdown_basic", + "target": "scripts_convert_article_to_markdown_convert_html_to_markdown", + "relation": "calls", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "call", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L450", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown_test_normalize_date_iso_and_rfc2822", + "target": "scripts_convert_article_to_markdown_normalize_date", + "relation": "calls", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "call", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L162", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown_test_normalize_list_strings_and_deduplication", + "target": "scripts_convert_article_to_markdown_normalize_list", + "relation": "calls", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "call", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L143", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown_test_normalize_scalar_string_and_placeholders", + "target": "scripts_convert_article_to_markdown_normalize_scalar", + "relation": "calls", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "call", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L126", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown_test_parse_arguments_direct", + "target": "scripts_convert_article_to_markdown_parse_arguments", + "relation": "calls", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "call", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L457", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown_test_remove_duplicate_initial_h1", + "target": "scripts_convert_article_to_markdown_remove_duplicate_initial_h1", + "relation": "calls", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "call", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L253", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown_test_resolve_article_body_newspaper4k_html_conversion", + "target": "scripts_convert_article_to_markdown_resolve_article_body", + "relation": "calls", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "call", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L82", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown_test_resolve_article_body_readability_html_conversion", + "target": "scripts_convert_article_to_markdown_resolve_article_body", + "relation": "calls", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "call", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L97", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown_test_resolve_article_body_strict_isolation_prohibits_cross_fallback", + "target": "scripts_convert_article_to_markdown_resolve_article_body", + "relation": "calls", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "call", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L116", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown_test_resolve_article_body_trafilatura_fallback_text", + "target": "scripts_convert_article_to_markdown_resolve_article_body", + "relation": "calls", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "call", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L69", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown_test_resolve_article_body_trafilatura_markdown", + "target": "scripts_convert_article_to_markdown_resolve_article_body", + "relation": "calls", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "call", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L56", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown_test_resolve_article_metadata_priority", + "target": "scripts_convert_article_to_markdown_resolve_article_metadata", + "relation": "calls", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "call", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L224", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown_test_validate_url_schemes", + "target": "scripts_convert_article_to_markdown_validate_url", + "relation": "calls", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "call", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L177", + "weight": 1.0 + }, { "source": "tests_test_extract_article_contents_test_cli_main_missing_input_file", "target": "scripts_extract_article_contents_main", @@ -16624,7 +20191,7 @@ "confidence_score": 1.0, "context": "call", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L370", + "source_location": "L408", "weight": 1.0 }, { @@ -16636,7 +20203,7 @@ "confidence_score": 1.0, "context": "call", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L378", + "source_location": "L416", "weight": 1.0 }, { @@ -16648,7 +20215,7 @@ "confidence_score": 1.0, "context": "call", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L123", + "source_location": "L141", "weight": 1.0 }, { @@ -16660,7 +20227,7 @@ "confidence_score": 1.0, "context": "call", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L136", + "source_location": "L159", "weight": 1.0 }, { @@ -16672,7 +20239,7 @@ "confidence_score": 1.0, "context": "call", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L148", + "source_location": "L171", "weight": 1.0 }, { @@ -16684,7 +20251,7 @@ "confidence_score": 1.0, "context": "call", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L171", + "source_location": "L194", "weight": 1.0 }, { @@ -16696,7 +20263,7 @@ "confidence_score": 1.0, "context": "call", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L185", + "source_location": "L210", "weight": 1.0 }, { @@ -16708,7 +20275,7 @@ "confidence_score": 1.0, "context": "call", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L197", + "source_location": "L225", "weight": 1.0 }, { @@ -16720,7 +20287,7 @@ "confidence_score": 1.0, "context": "call", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L210", + "source_location": "L238", "weight": 1.0 }, { @@ -16732,7 +20299,7 @@ "confidence_score": 1.0, "context": "call", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L221", + "source_location": "L249", "weight": 1.0 }, { @@ -16744,7 +20311,7 @@ "confidence_score": 1.0, "context": "call", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L238", + "source_location": "L266", "weight": 1.0 }, { @@ -16756,7 +20323,7 @@ "confidence_score": 1.0, "context": "call", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L255", + "source_location": "L285", "weight": 1.0 }, { @@ -16768,7 +20335,7 @@ "confidence_score": 1.0, "context": "call", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L268", + "source_location": "L298", "weight": 1.0 }, { @@ -16780,57 +20347,57 @@ "confidence_score": 1.0, "context": "call", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L288", - "weight": 1.0 - }, - { - "source": "tests_test_select_article_extractor_test_ct_012_recalculate_existing_selected_extractor", - "target": "tests_test_select_article_extractor_py_path", - "relation": "calls", - "_origin": "ast", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "context": "call", - "source_file": "tests/test_select_article_extractor.py", - "source_location": "L289", - "weight": 1.0 - }, - { - "source": "tests_test_select_article_extractor_test_ct_013_empty_articles_list", - "target": "scripts_select_article_extractor_process_batch", - "relation": "calls", - "_origin": "ast", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "context": "call", - "source_file": "tests/test_select_article_extractor.py", - "source_location": "L304", - "weight": 1.0 - }, - { - "source": "tests_test_select_article_extractor_test_ct_013_empty_articles_list", - "target": "tests_test_select_article_extractor_py_path", - "relation": "calls", - "_origin": "ast", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "context": "call", - "source_file": "tests/test_select_article_extractor.py", - "source_location": "L305", - "weight": 1.0 - }, - { - "source": "tests_test_select_article_extractor_test_ct_014_invalid_json_fails_atomically", - "target": "scripts_select_article_extractor_process_batch", - "relation": "calls", - "_origin": "ast", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "context": "call", - "source_file": "tests/test_select_article_extractor.py", "source_location": "L324", "weight": 1.0 }, + { + "source": "tests_test_select_article_extractor_test_ct_012_recalculate_existing_selected_extractor", + "target": "tests_test_select_article_extractor_py_path", + "relation": "calls", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "call", + "source_file": "tests/test_select_article_extractor.py", + "source_location": "L325", + "weight": 1.0 + }, + { + "source": "tests_test_select_article_extractor_test_ct_013_empty_articles_list", + "target": "scripts_select_article_extractor_process_batch", + "relation": "calls", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "call", + "source_file": "tests/test_select_article_extractor.py", + "source_location": "L340", + "weight": 1.0 + }, + { + "source": "tests_test_select_article_extractor_test_ct_013_empty_articles_list", + "target": "tests_test_select_article_extractor_py_path", + "relation": "calls", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "call", + "source_file": "tests/test_select_article_extractor.py", + "source_location": "L341", + "weight": 1.0 + }, + { + "source": "tests_test_select_article_extractor_test_ct_014_invalid_json_fails_atomically", + "target": "scripts_select_article_extractor_process_batch", + "relation": "calls", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "call", + "source_file": "tests/test_select_article_extractor.py", + "source_location": "L360", + "weight": 1.0 + }, { "source": "tests_test_select_article_extractor_test_e2e_cli_subprocess_default_naming", "target": "tests_test_select_article_extractor_py_path", @@ -16840,7 +20407,7 @@ "confidence_score": 1.0, "context": "call", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L536", + "source_location": "L583", "weight": 1.0 }, { @@ -16852,7 +20419,7 @@ "confidence_score": 1.0, "context": "call", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L553", + "source_location": "L600", "weight": 1.0 }, { @@ -16864,7 +20431,7 @@ "confidence_score": 1.0, "context": "call", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L563", + "source_location": "L610", "weight": 1.0 }, { @@ -16876,7 +20443,7 @@ "confidence_score": 1.0, "context": "call", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L485", + "source_location": "L532", "weight": 1.0 }, { @@ -16888,7 +20455,7 @@ "confidence_score": 1.0, "context": "call", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L107", + "source_location": "L122", "weight": 1.0 }, { @@ -16900,7 +20467,7 @@ "confidence_score": 1.0, "context": "call", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L101", + "source_location": "L116", "weight": 1.0 }, { @@ -16912,7 +20479,7 @@ "confidence_score": 1.0, "context": "call", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L92", + "source_location": "L107", "weight": 1.0 }, { @@ -16924,7 +20491,7 @@ "confidence_score": 1.0, "context": "call", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L434", + "source_location": "L481", "weight": 1.0 }, { @@ -16936,7 +20503,7 @@ "confidence_score": 1.0, "context": "call", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L452", + "source_location": "L499", "weight": 1.0 }, { @@ -16948,7 +20515,7 @@ "confidence_score": 1.0, "context": "call", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L457", + "source_location": "L504", "weight": 1.0 }, { @@ -16960,7 +20527,7 @@ "confidence_score": 1.0, "context": "call", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L336", + "source_location": "L372", "weight": 1.0 }, { @@ -16972,7 +20539,7 @@ "confidence_score": 1.0, "context": "call", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L341", + "source_location": "L379", "weight": 1.0 }, { @@ -16984,7 +20551,7 @@ "confidence_score": 1.0, "context": "call", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L41", + "source_location": "L31", "weight": 1.0 }, { @@ -16996,7 +20563,7 @@ "confidence_score": 1.0, "context": "call", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L49", + "source_location": "L39", "weight": 1.0 }, { @@ -17008,7 +20575,7 @@ "confidence_score": 1.0, "context": "call", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L67", + "source_location": "L57", "weight": 1.0 }, { @@ -17020,7 +20587,7 @@ "confidence_score": 1.0, "context": "call", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L55", + "source_location": "L45", "weight": 1.0 }, { @@ -17032,7 +20599,7 @@ "confidence_score": 1.0, "context": "call", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L81", + "source_location": "L82", "weight": 1.0 }, { @@ -17095,6 +20662,54 @@ "source_location": "L31", "weight": 1.0 }, + { + "source": "scripts_convert_article_to_markdown_assemble_markdown_document", + "target": "scripts_convert_article_to_markdown_py_any", + "relation": "references", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "generic_arg", + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L540", + "weight": 1.0 + }, + { + "source": "scripts_convert_article_to_markdown_get_dict", + "target": "scripts_convert_article_to_markdown_py_any", + "relation": "references", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "generic_arg", + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L219", + "weight": 1.0 + }, + { + "source": "scripts_convert_article_to_markdown_resolve_article_body", + "target": "scripts_convert_article_to_markdown_py_any", + "relation": "references", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "generic_arg", + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L161", + "weight": 1.0 + }, + { + "source": "scripts_convert_article_to_markdown_resolve_article_metadata", + "target": "scripts_convert_article_to_markdown_py_any", + "relation": "references", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "generic_arg", + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L225", + "weight": 1.0 + }, { "source": "scripts_extract_article_contents_extractedarticle_to_dict", "target": "scripts_extract_article_contents_py_any", @@ -17212,7 +20827,7 @@ "confidence_score": 1.0, "context": "generic_arg", "source_file": "scripts/select_article_extractor.py", - "source_location": "L234", + "source_location": "L236", "weight": 1.0 }, { @@ -17260,7 +20875,7 @@ "confidence_score": 1.0, "context": "generic_arg", "source_file": "scripts/select_article_extractor.py", - "source_location": "L373", + "source_location": "L387", "weight": 1.0 }, { @@ -17272,7 +20887,7 @@ "confidence_score": 1.0, "context": "generic_arg", "source_file": "scripts/select_article_extractor.py", - "source_location": "L289", + "source_location": "L293", "weight": 1.0 }, { @@ -17284,7 +20899,7 @@ "confidence_score": 1.0, "context": "generic_arg", "source_file": "scripts/select_article_extractor.py", - "source_location": "L289", + "source_location": "L293", "weight": 1.0 }, { @@ -17296,7 +20911,7 @@ "confidence_score": 1.0, "context": "generic_arg", "source_file": "scripts/select_article_extractor.py", - "source_location": "L322", + "source_location": "L330", "weight": 1.0 }, { @@ -17308,7 +20923,7 @@ "confidence_score": 1.0, "context": "generic_arg", "source_file": "scripts/select_article_extractor.py", - "source_location": "L322", + "source_location": "L330", "weight": 1.0 }, { @@ -17827,6 +21442,150 @@ "source_location": "L5", "weight": 1.0 }, + { + "source": "tests_test_convert_article_to_markdown", + "target": "scripts_convert_article_to_markdown_assemble_markdown_document", + "relation": "imports", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "import", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L23", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown", + "target": "scripts_convert_article_to_markdown_clean_body_images", + "relation": "imports", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "import", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L23", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown", + "target": "scripts_convert_article_to_markdown_convert_article", + "relation": "imports", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "import", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L23", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown", + "target": "scripts_convert_article_to_markdown_convert_html_to_markdown", + "relation": "imports", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "import", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L23", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown", + "target": "scripts_convert_article_to_markdown_normalize_date", + "relation": "imports", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "import", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L23", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown", + "target": "scripts_convert_article_to_markdown_normalize_list", + "relation": "imports", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "import", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L23", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown", + "target": "scripts_convert_article_to_markdown_normalize_scalar", + "relation": "imports", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "import", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L23", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown", + "target": "scripts_convert_article_to_markdown_parse_arguments", + "relation": "imports", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "import", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L23", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown", + "target": "scripts_convert_article_to_markdown_remove_duplicate_initial_h1", + "relation": "imports", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "import", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L23", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown", + "target": "scripts_convert_article_to_markdown_resolve_article_body", + "relation": "imports", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "import", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L23", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown", + "target": "scripts_convert_article_to_markdown_resolve_article_metadata", + "relation": "imports", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "import", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L23", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown", + "target": "scripts_convert_article_to_markdown_validate_url", + "relation": "imports", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "import", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L23", + "weight": 1.0 + }, { "source": "tests_test_extract_article_contents", "target": "scripts_extract_article_contents_articlecrawler", @@ -18223,42 +21982,6 @@ "source_location": "L5", "weight": 1.0 }, - { - "source": "tests_test_select_article_extractor", - "target": "scripts_select_article_extractor_calculate_consensus_metrics", - "relation": "imports", - "_origin": "ast", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "context": "import", - "source_file": "tests/test_select_article_extractor.py", - "source_location": "L20", - "weight": 1.0 - }, - { - "source": "tests_test_select_article_extractor", - "target": "scripts_select_article_extractor_candidatestatus", - "relation": "imports", - "_origin": "ast", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "context": "import", - "source_file": "tests/test_select_article_extractor.py", - "source_location": "L20", - "weight": 1.0 - }, - { - "source": "tests_test_select_article_extractor", - "target": "scripts_select_article_extractor_extractorcandidate", - "relation": "imports", - "_origin": "ast", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "context": "import", - "source_file": "tests/test_select_article_extractor.py", - "source_location": "L20", - "weight": 1.0 - }, { "source": "tests_test_select_article_extractor", "target": "scripts_select_article_extractor_extractorname", @@ -18268,19 +21991,7 @@ "confidence_score": 1.0, "context": "import", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L20", - "weight": 1.0 - }, - { - "source": "tests_test_select_article_extractor", - "target": "scripts_select_article_extractor_form_active_set", - "relation": "imports", - "_origin": "ast", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "context": "import", - "source_file": "tests/test_select_article_extractor.py", - "source_location": "L20", + "source_location": "L17", "weight": 1.0 }, { @@ -18292,19 +22003,7 @@ "confidence_score": 1.0, "context": "import", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L20", - "weight": 1.0 - }, - { - "source": "tests_test_select_article_extractor", - "target": "scripts_select_article_extractor_main", - "relation": "imports", - "_origin": "ast", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "context": "import", - "source_file": "tests/test_select_article_extractor.py", - "source_location": "L20", + "source_location": "L17", "weight": 1.0 }, { @@ -18316,7 +22015,7 @@ "confidence_score": 1.0, "context": "import", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L20", + "source_location": "L17", "weight": 1.0 }, { @@ -18328,7 +22027,7 @@ "confidence_score": 1.0, "context": "import", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L20", + "source_location": "L17", "weight": 1.0 }, { @@ -18340,31 +22039,7 @@ "confidence_score": 1.0, "context": "import", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L20", - "weight": 1.0 - }, - { - "source": "tests_test_select_article_extractor", - "target": "scripts_select_article_extractor_select_with_consensus", - "relation": "imports", - "_origin": "ast", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "context": "import", - "source_file": "tests/test_select_article_extractor.py", - "source_location": "L20", - "weight": 1.0 - }, - { - "source": "tests_test_select_article_extractor", - "target": "scripts_select_article_extractor_select_without_consensus", - "relation": "imports", - "_origin": "ast", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "context": "import", - "source_file": "tests/test_select_article_extractor.py", - "source_location": "L20", + "source_location": "L17", "weight": 1.0 }, { @@ -18643,6 +22318,18 @@ "source_location": "L5", "weight": 1.0 }, + { + "source": "tests_test_convert_article_to_markdown", + "target": "scripts_convert_article_to_markdown", + "relation": "imports_from", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "import", + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L23", + "weight": 1.0 + }, { "source": "tests_test_extract_article_contents", "target": "scripts_extract_article_contents", @@ -18712,7 +22399,55 @@ "confidence_score": 1.0, "context": "import", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L20", + "source_location": "L17", + "weight": 1.0 + }, + { + "source": "scripts_convert_article_to_markdown_normalize_date", + "target": "scripts_convert_article_to_markdown_py_any", + "relation": "references", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "parameter_type", + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L104", + "weight": 1.0 + }, + { + "source": "scripts_convert_article_to_markdown_normalize_list", + "target": "scripts_convert_article_to_markdown_py_any", + "relation": "references", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "parameter_type", + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L56", + "weight": 1.0 + }, + { + "source": "scripts_convert_article_to_markdown_normalize_scalar", + "target": "scripts_convert_article_to_markdown_py_any", + "relation": "references", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "parameter_type", + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L40", + "weight": 1.0 + }, + { + "source": "scripts_convert_article_to_markdown_validate_url", + "target": "scripts_convert_article_to_markdown_py_any", + "relation": "references", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "parameter_type", + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L135", "weight": 1.0 }, { @@ -18796,7 +22531,7 @@ "confidence_score": 1.0, "context": "parameter_type", "source_file": "scripts/select_article_extractor.py", - "source_location": "L430", + "source_location": "L448", "weight": 1.0 }, { @@ -18988,7 +22723,7 @@ "confidence_score": 1.0, "context": "parameter_type", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L317", + "source_location": "L353", "weight": 1.0 }, { @@ -19000,7 +22735,7 @@ "confidence_score": 1.0, "context": "parameter_type", "source_file": "tests/test_select_article_extractor.py", - "source_location": "L397", + "source_location": "L435", "weight": 1.0 }, { @@ -19015,6 +22750,30 @@ "source_location": "L27", "weight": 1.0 }, + { + "source": "scripts_convert_article_to_markdown_convert_article", + "target": "scripts_convert_article_to_markdown_py_path", + "relation": "references", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "return_type", + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L608", + "weight": 1.0 + }, + { + "source": "scripts_convert_article_to_markdown_parse_arguments", + "target": "scripts_convert_article_to_markdown_py_namespace", + "relation": "references", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "context": "return_type", + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L667", + "weight": 1.0 + }, { "source": "scripts_extract_article_contents_parse_arguments", "target": "scripts_extract_article_contents_py_namespace", @@ -19048,7 +22807,7 @@ "confidence_score": 1.0, "context": "return_type", "source_file": "scripts/select_article_extractor.py", - "source_location": "L280", + "source_location": "L284", "weight": 1.0 }, { @@ -19060,7 +22819,7 @@ "confidence_score": 1.0, "context": "return_type", "source_file": "scripts/select_article_extractor.py", - "source_location": "L523", + "source_location": "L544", "weight": 1.0 }, { @@ -21542,6 +25301,699 @@ "source_location": "L9", "weight": 1.0 }, + { + "source": "docs_prd_convert_json_markdown", + "target": "docs_prd_convert_json_markdown_prd_convers\u00e3o_de_artigo_json_para_markdown", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L1", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_11_requisitos_n\u00e3o_funcionais", + "target": "docs_prd_convert_json_markdown_rnf_001_determinismo", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L350", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_11_requisitos_n\u00e3o_funcionais", + "target": "docs_prd_convert_json_markdown_rnf_002_compatibilidade", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L354", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_11_requisitos_n\u00e3o_funcionais", + "target": "docs_prd_convert_json_markdown_rnf_003_execu\u00e7\u00e3o_local", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L358", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_11_requisitos_n\u00e3o_funcionais", + "target": "docs_prd_convert_json_markdown_rnf_004_integridade", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L362", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_11_requisitos_n\u00e3o_funcionais", + "target": "docs_prd_convert_json_markdown_rnf_005_manutenibilidade", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L366", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_11_requisitos_n\u00e3o_funcionais", + "target": "docs_prd_convert_json_markdown_rnf_006_qualidade", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L370", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_12_crit\u00e9rios_de_aceite", + "target": "docs_prd_convert_json_markdown_ca_001_trafilatura_selecionada", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L376", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_12_crit\u00e9rios_de_aceite", + "target": "docs_prd_convert_json_markdown_ca_002_newspaper4k_selecionado", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L382", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_12_crit\u00e9rios_de_aceite", + "target": "docs_prd_convert_json_markdown_ca_003_readability_selecionado", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L388", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_12_crit\u00e9rios_de_aceite", + "target": "docs_prd_convert_json_markdown_ca_004_fallback_dentro_do_extrator", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L394", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_12_crit\u00e9rios_de_aceite", + "target": "docs_prd_convert_json_markdown_ca_005_proibi\u00e7\u00e3o_de_fallback_de_corpo_entre_extratores", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L400", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_12_crit\u00e9rios_de_aceite", + "target": "docs_prd_convert_json_markdown_ca_006_metadado_vindo_de_outro_extrator", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L406", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_12_crit\u00e9rios_de_aceite", + "target": "docs_prd_convert_json_markdown_ca_007_obrigat\u00f3rios_presentes", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L412", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_12_crit\u00e9rios_de_aceite", + "target": "docs_prd_convert_json_markdown_ca_008_opcionais_ausentes", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L418", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_12_crit\u00e9rios_de_aceite", + "target": "docs_prd_convert_json_markdown_ca_009_imagens_inv\u00e1lidas", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L424", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_12_crit\u00e9rios_de_aceite", + "target": "docs_prd_convert_json_markdown_ca_010_t\u00edtulo_repetido_no_corpo", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L430", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_12_crit\u00e9rios_de_aceite", + "target": "docs_prd_convert_json_markdown_ca_011_entrada_em_lote_rejeitada", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L436", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_12_crit\u00e9rios_de_aceite", + "target": "docs_prd_convert_json_markdown_ca_012_determinismo", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L442", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_12_crit\u00e9rios_de_aceite", + "target": "docs_prd_convert_json_markdown_ca_013_grava\u00e7\u00e3o_segura", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L448", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_13_estrat\u00e9gia_de_testes", + "target": "docs_prd_convert_json_markdown_13_1_testes_unit\u00e1rios", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L456", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_13_estrat\u00e9gia_de_testes", + "target": "docs_prd_convert_json_markdown_13_2_testes_de_integra\u00e7\u00e3o_do_cli", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L471", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_13_estrat\u00e9gia_de_testes", + "target": "docs_prd_convert_json_markdown_13_3_casos_de_resultado_esperado", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L481", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_5_escopo", + "target": "docs_prd_convert_json_markdown_5_1_inclu\u00eddo", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L34", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_5_escopo", + "target": "docs_prd_convert_json_markdown_5_2_fora_do_escopo", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L47", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_6_contrato_de_entrada", + "target": "docs_prd_convert_json_markdown_6_1_formato", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L63", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_6_contrato_de_entrada", + "target": "docs_prd_convert_json_markdown_6_2_valores_aceitos_para_selected_extractor", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L79", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_6_contrato_de_entrada", + "target": "docs_prd_convert_json_markdown_6_3_campos_obrigat\u00f3rios_ap\u00f3s_a_resolu\u00e7\u00e3o", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L87", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_7_contrato_de_sa\u00edda", + "target": "docs_prd_convert_json_markdown_7_2_estrutura_do_markdown", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L107", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_7_contrato_de_sa\u00edda", + "target": "docs_prd_convert_json_markdown_7_1_arquivo", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L99", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_8_regras_funcionais", + "target": "docs_prd_convert_json_markdown_rf_001_receber_um_\u00fanico_artigo", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L144", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_8_regras_funcionais", + "target": "docs_prd_convert_json_markdown_rf_002_respeitar_o_extrator_selecionado", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L148", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_8_regras_funcionais", + "target": "docs_prd_convert_json_markdown_rf_003_resolver_o_corpo_dentro_do_extrator_selecionado", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L152", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_8_regras_funcionais", + "target": "docs_prd_convert_json_markdown_rf_004_selecionar_metadados_deterministicamente", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L162", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_8_regras_funcionais", + "target": "docs_prd_convert_json_markdown_rf_005_priorizar_metadados_por_campo", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L174", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_8_regras_funcionais", + "target": "docs_prd_convert_json_markdown_rf_006_normalizar_valores_escalares", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L207", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_8_regras_funcionais", + "target": "docs_prd_convert_json_markdown_rf_007_normalizar_listas", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L216", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_8_regras_funcionais", + "target": "docs_prd_convert_json_markdown_rf_008_normalizar_datas", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L229", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_8_regras_funcionais", + "target": "docs_prd_convert_json_markdown_rf_009_validar_urls", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L237", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_8_regras_funcionais", + "target": "docs_prd_convert_json_markdown_rf_010_converter_html_para_markdown", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L243", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_8_regras_funcionais", + "target": "docs_prd_convert_json_markdown_rf_011_tratar_imagens_do_corpo", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L261", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_8_regras_funcionais", + "target": "docs_prd_convert_json_markdown_rf_012_evitar_t\u00edtulo_duplicado", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L269", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_8_regras_funcionais", + "target": "docs_prd_convert_json_markdown_rf_013_normalizar_o_markdown_final", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L275", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_8_regras_funcionais", + "target": "docs_prd_convert_json_markdown_rf_014_n\u00e3o_gerar_sa\u00edda_parcial", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L286", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_9_interface_cli", + "target": "docs_prd_convert_json_markdown_9_1_script", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L292", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_9_interface_cli", + "target": "docs_prd_convert_json_markdown_9_2_argumentos", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L296", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_9_interface_cli", + "target": "docs_prd_convert_json_markdown_9_3_exemplos", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L305", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_9_interface_cli", + "target": "docs_prd_convert_json_markdown_9_4_sa\u00edda_do_processo", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L319", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_prd_convers\u00e3o_de_artigo_json_para_markdown", + "target": "docs_prd_convert_json_markdown_2_problema", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L11", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_prd_convers\u00e3o_de_artigo_json_para_markdown", + "target": "docs_prd_convert_json_markdown_8_regras_funcionais", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L142", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_prd_convers\u00e3o_de_artigo_json_para_markdown", + "target": "docs_prd_convert_json_markdown_3_objetivo", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L17", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_prd_convers\u00e3o_de_artigo_json_para_markdown", + "target": "docs_prd_convert_json_markdown_4_hist\u00f3ria_do_usu\u00e1rio", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L28", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_prd_convers\u00e3o_de_artigo_json_para_markdown", + "target": "docs_prd_convert_json_markdown_9_interface_cli", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L290", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_prd_convers\u00e3o_de_artigo_json_para_markdown", + "target": "docs_prd_convert_json_markdown_1_vis\u00e3o_geral", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L3", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_prd_convers\u00e3o_de_artigo_json_para_markdown", + "target": "docs_prd_convert_json_markdown_5_escopo", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L32", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_prd_convers\u00e3o_de_artigo_json_para_markdown", + "target": "docs_prd_convert_json_markdown_10_tratamento_de_erros", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L327", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_prd_convers\u00e3o_de_artigo_json_para_markdown", + "target": "docs_prd_convert_json_markdown_11_requisitos_n\u00e3o_funcionais", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L348", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_prd_convers\u00e3o_de_artigo_json_para_markdown", + "target": "docs_prd_convert_json_markdown_12_crit\u00e9rios_de_aceite", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L374", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_prd_convers\u00e3o_de_artigo_json_para_markdown", + "target": "docs_prd_convert_json_markdown_13_estrat\u00e9gia_de_testes", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L454", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_prd_convers\u00e3o_de_artigo_json_para_markdown", + "target": "docs_prd_convert_json_markdown_14_definition_of_done", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L495", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_prd_convers\u00e3o_de_artigo_json_para_markdown", + "target": "docs_prd_convert_json_markdown_15_depend\u00eancia_t\u00e9cnica_escolhida", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L511", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_prd_convers\u00e3o_de_artigo_json_para_markdown", + "target": "docs_prd_convert_json_markdown_6_contrato_de_entrada", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L61", + "weight": 1.0 + }, + { + "source": "docs_prd_convert_json_markdown_prd_convers\u00e3o_de_artigo_json_para_markdown", + "target": "docs_prd_convert_json_markdown_7_contrato_de_sa\u00edda", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "docs/prd_convert_json_markdown.md", + "source_location": "L97", + "weight": 1.0 + }, { "source": "docs_prd_deterministic_content_selection", "target": "docs_prd_deterministic_content_selection_prd_sele\u00e7\u00e3o_determin\u00edstica_da_biblioteca_de_extra\u00e7\u00e3o_de_conte\u00fado", @@ -22125,6 +26577,17 @@ "source_location": "L1", "weight": 1.0 }, + { + "source": "readme_1_classificador_de_conte\u00fado_e_iner\u00eancia_nlp_llm_ecp", + "target": "readme_arquitetura_de_classifica\u00e7\u00e3o_em_3_tiers", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "README.md", + "source_location": "L102", + "weight": 1.0 + }, { "source": "readme_1_classificador_de_conte\u00fado_e_iner\u00eancia_nlp_llm_ecp", "target": "readme_categorias_de_decis\u00e3o", @@ -22133,7 +26596,7 @@ "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "README.md", - "source_location": "L115", + "source_location": "L123", "weight": 1.0 }, { @@ -22144,7 +26607,7 @@ "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "README.md", - "source_location": "L124", + "source_location": "L132", "weight": 1.0 }, { @@ -22155,7 +26618,7 @@ "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "README.md", - "source_location": "L148", + "source_location": "L156", "weight": 1.0 }, { @@ -22166,29 +26629,18 @@ "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "README.md", - "source_location": "L88", - "weight": 1.0 - }, - { - "source": "readme_1_classificador_de_conte\u00fado_e_iner\u00eancia_nlp_llm_ecp", - "target": "readme_arquitetura_de_classifica\u00e7\u00e3o_em_3_tiers", - "relation": "contains", - "_origin": "ast", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "README.md", - "source_location": "L94", + "source_location": "L96", "weight": 1.0 }, { "source": "readme_2_extrator_de_manchetes_do_google_news", - "target": "readme_o_que_\u00e9_e_como_funciona_165", + "target": "readme_o_que_\u00e9_e_como_funciona_173", "relation": "contains", "_origin": "ast", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "README.md", - "source_location": "L165", + "source_location": "L173", "weight": 1.0 }, { @@ -22199,7 +26651,7 @@ "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "README.md", - "source_location": "L169", + "source_location": "L177", "weight": 1.0 }, { @@ -22210,7 +26662,7 @@ "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "README.md", - "source_location": "L177", + "source_location": "L185", "weight": 1.0 }, { @@ -22221,7 +26673,7 @@ "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "README.md", - "source_location": "L190", + "source_location": "L198", "weight": 1.0 }, { @@ -22232,7 +26684,7 @@ "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "README.md", - "source_location": "L207", + "source_location": "L215", "weight": 1.0 }, { @@ -22243,7 +26695,7 @@ "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "README.md", - "source_location": "L217", + "source_location": "L225", "weight": 1.0 }, { @@ -22254,7 +26706,7 @@ "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "README.md", - "source_location": "L228", + "source_location": "L236", "weight": 1.0 }, { @@ -22265,7 +26717,7 @@ "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "README.md", - "source_location": "L245", + "source_location": "L253", "weight": 1.0 }, { @@ -22276,7 +26728,7 @@ "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "README.md", - "source_location": "L274", + "source_location": "L282", "weight": 1.0 }, { @@ -22287,45 +26739,23 @@ "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "README.md", - "source_location": "L286", + "source_location": "L294", "weight": 1.0 }, { "source": "readme_4_seletor_determin\u00edstico_de_conte\u00fado_de_artigos", - "target": "readme_argumentos_e_flags_cli_298", + "target": "readme_argumentos_e_flags_cli_306", "relation": "contains", "_origin": "ast", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "README.md", - "source_location": "L298", + "source_location": "L306", "weight": 1.0 }, { "source": "readme_4_seletor_determin\u00edstico_de_conte\u00fado_de_artigos", - "target": "readme_exemplos_pr\u00e1ticos_de_uso_307", - "relation": "contains", - "_origin": "ast", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "README.md", - "source_location": "L307", - "weight": 1.0 - }, - { - "source": "readme_exemplos_pr\u00e1ticos_de_uso_307", - "target": "readme_1_execu\u00e7\u00e3o_padr\u00e3o_autom\u00e1tica", - "relation": "contains", - "_origin": "ast", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "README.md", - "source_location": "L309", - "weight": 1.0 - }, - { - "source": "readme_exemplos_pr\u00e1ticos_de_uso_307", - "target": "readme_2_execu\u00e7\u00e3o_com_modo_verboso", + "target": "readme_exemplos_pr\u00e1ticos_de_uso_315", "relation": "contains", "_origin": "ast", "confidence": "EXTRACTED", @@ -22335,14 +26765,135 @@ "weight": 1.0 }, { - "source": "readme_exemplos_pr\u00e1ticos_de_uso_307", + "source": "readme_5_conversor_de_artigo_json_para_markdown", + "target": "readme_vis\u00e3o_geral_e_estrutura_do_documento", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "README.md", + "source_location": "L366", + "weight": 1.0 + }, + { + "source": "readme_5_conversor_de_artigo_json_para_markdown", + "target": "readme_isolamento_estrito_de_extratores_e_fallback", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "README.md", + "source_location": "L393", + "weight": 1.0 + }, + { + "source": "readme_5_conversor_de_artigo_json_para_markdown", + "target": "readme_matriz_determin\u00edstica_de_metadados", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "README.md", + "source_location": "L402", + "weight": 1.0 + }, + { + "source": "readme_5_conversor_de_artigo_json_para_markdown", + "target": "readme_sanitiza\u00e7\u00e3o_editorial_e_deduplica\u00e7\u00e3o", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "README.md", + "source_location": "L418", + "weight": 1.0 + }, + { + "source": "readme_5_conversor_de_artigo_json_para_markdown", + "target": "readme_argumentos_e_flags_cli_425", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "README.md", + "source_location": "L425", + "weight": 1.0 + }, + { + "source": "readme_5_conversor_de_artigo_json_para_markdown", + "target": "readme_exemplos_pr\u00e1ticos_de_uso_432", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "README.md", + "source_location": "L432", + "weight": 1.0 + }, + { + "source": "readme_exemplos_pr\u00e1ticos_de_uso_315", + "target": "readme_1_execu\u00e7\u00e3o_padr\u00e3o_autom\u00e1tica", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "README.md", + "source_location": "L317", + "weight": 1.0 + }, + { + "source": "readme_exemplos_pr\u00e1ticos_de_uso_315", + "target": "readme_2_execu\u00e7\u00e3o_com_modo_verboso", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "README.md", + "source_location": "L323", + "weight": 1.0 + }, + { + "source": "readme_exemplos_pr\u00e1ticos_de_uso_315", "target": "readme_3_uso_program\u00e1tico_como_m\u00f3dulo_python", "relation": "contains", "_origin": "ast", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "README.md", - "source_location": "L339", + "source_location": "L347", + "weight": 1.0 + }, + { + "source": "readme_exemplos_pr\u00e1ticos_de_uso_432", + "target": "readme_1_convers\u00e3o_padr\u00e3o", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "README.md", + "source_location": "L434", + "weight": 1.0 + }, + { + "source": "readme_exemplos_pr\u00e1ticos_de_uso_432", + "target": "readme_2_convers\u00e3o_com_caminho_de_destino_personalizado", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "README.md", + "source_location": "L440", + "weight": 1.0 + }, + { + "source": "readme_exemplos_pr\u00e1ticos_de_uso_432", + "target": "readme_3_uso_program\u00e1tico_em_python", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "README.md", + "source_location": "L447", "weight": 1.0 }, { @@ -22353,7 +26904,7 @@ "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "README.md", - "source_location": "L126", + "source_location": "L134", "weight": 1.0 }, { @@ -22364,7 +26915,7 @@ "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "README.md", - "source_location": "L57", + "source_location": "L65", "weight": 1.0 }, { @@ -22375,7 +26926,7 @@ "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "README.md", - "source_location": "L70", + "source_location": "L78", "weight": 1.0 }, { @@ -22386,7 +26937,7 @@ "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "README.md", - "source_location": "L76", + "source_location": "L84", "weight": 1.0 }, { @@ -22408,7 +26959,7 @@ "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "README.md", - "source_location": "L163", + "source_location": "L171", "weight": 1.0 }, { @@ -22419,7 +26970,7 @@ "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "README.md", - "source_location": "L205", + "source_location": "L213", "weight": 1.0 }, { @@ -22430,7 +26981,18 @@ "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "README.md", - "source_location": "L243", + "source_location": "L251", + "weight": 1.0 + }, + { + "source": "readme_textnlpclassifierapp", + "target": "readme_5_conversor_de_artigo_json_para_markdown", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "README.md", + "source_location": "L364", "weight": 1.0 }, { @@ -22441,7 +27003,7 @@ "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "README.md", - "source_location": "L356", + "source_location": "L458", "weight": 1.0 }, { @@ -22452,18 +27014,7 @@ "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "README.md", - "source_location": "L388", - "weight": 1.0 - }, - { - "source": "readme_textnlpclassifierapp", - "target": "readme_licen\u00e7a", - "relation": "contains", - "_origin": "ast", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "README.md", - "source_location": "L415", + "source_location": "L493", "weight": 1.0 }, { @@ -22474,7 +27025,18 @@ "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "README.md", - "source_location": "L44", + "source_location": "L51", + "weight": 1.0 + }, + { + "source": "readme_textnlpclassifierapp", + "target": "readme_licen\u00e7a", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "README.md", + "source_location": "L522", "weight": 1.0 }, { @@ -22485,7 +27047,7 @@ "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "README.md", - "source_location": "L55", + "source_location": "L63", "weight": 1.0 }, { @@ -22496,7 +27058,161 @@ "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "README.md", - "source_location": "L86", + "source_location": "L94", + "weight": 1.0 + }, + { + "source": "scripts_convert_article_to_markdown", + "target": "scripts_convert_article_to_markdown_normalize_date", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L104", + "weight": 1.0 + }, + { + "source": "scripts_convert_article_to_markdown", + "target": "scripts_convert_article_to_markdown_validate_url", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L135", + "weight": 1.0 + }, + { + "source": "scripts_convert_article_to_markdown", + "target": "scripts_convert_article_to_markdown_convert_html_to_markdown", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L149", + "weight": 1.0 + }, + { + "source": "scripts_convert_article_to_markdown", + "target": "scripts_convert_article_to_markdown_resolve_article_body", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L161", + "weight": 1.0 + }, + { + "source": "scripts_convert_article_to_markdown", + "target": "scripts_convert_article_to_markdown_get_dict", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L219", + "weight": 1.0 + }, + { + "source": "scripts_convert_article_to_markdown", + "target": "scripts_convert_article_to_markdown_resolve_article_metadata", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L225", + "weight": 1.0 + }, + { + "source": "scripts_convert_article_to_markdown", + "target": "scripts_convert_article_to_markdown_normalize_scalar", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L40", + "weight": 1.0 + }, + { + "source": "scripts_convert_article_to_markdown", + "target": "scripts_convert_article_to_markdown_remove_duplicate_initial_h1", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L473", + "weight": 1.0 + }, + { + "source": "scripts_convert_article_to_markdown", + "target": "scripts_convert_article_to_markdown_clean_body_images", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L508", + "weight": 1.0 + }, + { + "source": "scripts_convert_article_to_markdown", + "target": "scripts_convert_article_to_markdown_assemble_markdown_document", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L540", + "weight": 1.0 + }, + { + "source": "scripts_convert_article_to_markdown", + "target": "scripts_convert_article_to_markdown_normalize_list", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L56", + "weight": 1.0 + }, + { + "source": "scripts_convert_article_to_markdown", + "target": "scripts_convert_article_to_markdown_convert_article", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L608", + "weight": 1.0 + }, + { + "source": "scripts_convert_article_to_markdown", + "target": "scripts_convert_article_to_markdown_parse_arguments", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L667", + "weight": 1.0 + }, + { + "source": "scripts_convert_article_to_markdown", + "target": "scripts_convert_article_to_markdown_main", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L690", "weight": 1.0 }, { @@ -22870,7 +27586,7 @@ "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "scripts/select_article_extractor.py", - "source_location": "L234", + "source_location": "L236", "weight": 1.0 }, { @@ -22881,7 +27597,7 @@ "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "scripts/select_article_extractor.py", - "source_location": "L280", + "source_location": "L284", "weight": 1.0 }, { @@ -22892,18 +27608,7 @@ "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "scripts/select_article_extractor.py", - "source_location": "L289", - "weight": 1.0 - }, - { - "source": "scripts_select_article_extractor", - "target": "scripts_select_article_extractor_select_without_consensus", - "relation": "contains", - "_origin": "ast", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "scripts/select_article_extractor.py", - "source_location": "L322", + "source_location": "L293", "weight": 1.0 }, { @@ -22917,6 +27622,17 @@ "source_location": "L33", "weight": 1.0 }, + { + "source": "scripts_select_article_extractor", + "target": "scripts_select_article_extractor_select_without_consensus", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "scripts/select_article_extractor.py", + "source_location": "L330", + "weight": 1.0 + }, { "source": "scripts_select_article_extractor", "target": "scripts_select_article_extractor_select_article_extractor", @@ -22925,7 +27641,7 @@ "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "scripts/select_article_extractor.py", - "source_location": "L373", + "source_location": "L387", "weight": 1.0 }, { @@ -22947,7 +27663,7 @@ "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "scripts/select_article_extractor.py", - "source_location": "L430", + "source_location": "L448", "weight": 1.0 }, { @@ -22958,7 +27674,7 @@ "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "scripts/select_article_extractor.py", - "source_location": "L452", + "source_location": "L470", "weight": 1.0 }, { @@ -22969,7 +27685,7 @@ "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "scripts/select_article_extractor.py", - "source_location": "L523", + "source_location": "L544", "weight": 1.0 }, { @@ -22980,7 +27696,7 @@ "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "scripts/select_article_extractor.py", - "source_location": "L544", + "source_location": "L570", "weight": 1.0 }, { @@ -27647,6 +32363,1040 @@ "source_location": "L91", "weight": 1.0 }, + { + "source": "specs_005_convert_json_markdown_checklists_markdown_conversion", + "target": "specs_005_convert_json_markdown_checklists_markdown_conversion_markdown_conversion_checklist_end_to_end_requirements_quality", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/checklists/markdown-conversion.md", + "source_location": "L1", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_checklists_markdown_conversion_markdown_conversion_checklist_end_to_end_requirements_quality", + "target": "specs_005_convert_json_markdown_checklists_markdown_conversion_1_valida\u00e7\u00e3o_de_entrada_tipagem_isolamento_de_lotes", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/checklists/markdown-conversion.md", + "source_location": "L13", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_checklists_markdown_conversion_markdown_conversion_checklist_end_to_end_requirements_quality", + "target": "specs_005_convert_json_markdown_checklists_markdown_conversion_2_isolamento_estrito_de_extrator_convers\u00e3o_de_conte\u00fado_html_md", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/checklists/markdown-conversion.md", + "source_location": "L21", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_checklists_markdown_conversion_markdown_conversion_checklist_end_to_end_requirements_quality", + "target": "specs_005_convert_json_markdown_checklists_markdown_conversion_3_resolu\u00e7\u00e3o_determin\u00edstica_de_metadados_mapeamento_de_selecionado", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/checklists/markdown-conversion.md", + "source_location": "L29", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_checklists_markdown_conversion_markdown_conversion_checklist_end_to_end_requirements_quality", + "target": "specs_005_convert_json_markdown_checklists_markdown_conversion_4_normaliza\u00e7\u00e3o_de_escalares_placeholders_sanitiza\u00e7\u00e3o_de_listas", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/checklists/markdown-conversion.md", + "source_location": "L36", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_checklists_markdown_conversion_markdown_conversion_checklist_end_to_end_requirements_quality", + "target": "specs_005_convert_json_markdown_checklists_markdown_conversion_5_normaliza\u00e7\u00e3o_de_datas_fusos_valida\u00e7\u00e3o_estrita_de_urls", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/checklists/markdown-conversion.md", + "source_location": "L44", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_checklists_markdown_conversion_markdown_conversion_checklist_end_to_end_requirements_quality", + "target": "specs_005_convert_json_markdown_checklists_markdown_conversion_6_sanitiza\u00e7\u00e3o_editorial_tratamento_de_imagens_t\u00edtulo_duplicado", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/checklists/markdown-conversion.md", + "source_location": "L50", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_checklists_markdown_conversion_markdown_conversion_checklist_end_to_end_requirements_quality", + "target": "specs_005_convert_json_markdown_checklists_markdown_conversion_7_estrutura_sintaxe_do_markdown_de_sa\u00edda_restri\u00e7\u00f5es", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/checklists/markdown-conversion.md", + "source_location": "L57", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_checklists_markdown_conversion_markdown_conversion_checklist_end_to_end_requirements_quality", + "target": "specs_005_convert_json_markdown_checklists_markdown_conversion_8_interface_cli_tratamento_de_erros_atomicidade", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/checklists/markdown-conversion.md", + "source_location": "L64", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_checklists_markdown_conversion_markdown_conversion_checklist_end_to_end_requirements_quality", + "target": "specs_005_convert_json_markdown_checklists_markdown_conversion_9_estrat\u00e9gia_de_testes_golden_fixtures_definition_of_done", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/checklists/markdown-conversion.md", + "source_location": "L72", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_checklists_markdown_conversion_markdown_conversion_checklist_end_to_end_requirements_quality", + "target": "specs_005_convert_json_markdown_checklists_markdown_conversion_notes", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/checklists/markdown-conversion.md", + "source_location": "L81", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_checklists_requirements", + "target": "specs_005_convert_json_markdown_checklists_requirements_specification_quality_checklist_convert_article_json_to_markdown", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/checklists/requirements.md", + "source_location": "L1", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_checklists_requirements_specification_quality_checklist_convert_article_json_to_markdown", + "target": "specs_005_convert_json_markdown_checklists_requirements_requirement_completeness", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/checklists/requirements.md", + "source_location": "L14", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_checklists_requirements_specification_quality_checklist_convert_article_json_to_markdown", + "target": "specs_005_convert_json_markdown_checklists_requirements_feature_readiness", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/checklists/requirements.md", + "source_location": "L25", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_checklists_requirements_specification_quality_checklist_convert_article_json_to_markdown", + "target": "specs_005_convert_json_markdown_checklists_requirements_notes", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/checklists/requirements.md", + "source_location": "L32", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_checklists_requirements_specification_quality_checklist_convert_article_json_to_markdown", + "target": "specs_005_convert_json_markdown_checklists_requirements_content_quality", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/checklists/requirements.md", + "source_location": "L7", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_contracts_cli_contract", + "target": "specs_005_convert_json_markdown_contracts_cli_contract_cli_contract_convert_article_to_markdown_py", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/contracts/cli-contract.md", + "source_location": "L1", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_contracts_cli_contract_cli_contract_convert_article_to_markdown_py", + "target": "specs_005_convert_json_markdown_contracts_cli_contract_2_command_line_arguments", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/contracts/cli-contract.md", + "source_location": "L11", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_contracts_cli_contract_cli_contract_convert_article_to_markdown_py", + "target": "specs_005_convert_json_markdown_contracts_cli_contract_3_exit_codes", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/contracts/cli-contract.md", + "source_location": "L18", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_contracts_cli_contract_cli_contract_convert_article_to_markdown_py", + "target": "specs_005_convert_json_markdown_contracts_cli_contract_4_standard_stream_behavior", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/contracts/cli-contract.md", + "source_location": "L26", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_contracts_cli_contract_cli_contract_convert_article_to_markdown_py", + "target": "specs_005_convert_json_markdown_contracts_cli_contract_1_script_signature", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/contracts/cli-contract.md", + "source_location": "L5", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_contracts_markdown_schema", + "target": "specs_005_convert_json_markdown_contracts_markdown_schema_markdown_schema_contract_output_article_markdown", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/contracts/markdown-schema.md", + "source_location": "L1", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_contracts_markdown_schema_markdown_schema_contract_output_article_markdown", + "target": "specs_005_convert_json_markdown_contracts_markdown_schema_2_formatting_syntax_constraints", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/contracts/markdown-schema.md", + "source_location": "L30", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_contracts_markdown_schema_markdown_schema_contract_output_article_markdown", + "target": "specs_005_convert_json_markdown_contracts_markdown_schema_1_output_document_specification", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/contracts/markdown-schema.md", + "source_location": "L5", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_data_model", + "target": "specs_005_convert_json_markdown_data_model_data_model_convert_article_json_to_markdown", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/data-model.md", + "source_location": "L1", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_data_model_1_domain_entities_schemas", + "target": "specs_005_convert_json_markdown_data_model_entity_2_extractorblock_per_extractor_data", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/data-model.md", + "source_location": "L34", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_data_model_1_domain_entities_schemas", + "target": "specs_005_convert_json_markdown_data_model_entity_3_resolvedarticlemetadata", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/data-model.md", + "source_location": "L46", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_data_model_1_domain_entities_schemas", + "target": "specs_005_convert_json_markdown_data_model_entity_4_markdowndocument", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/data-model.md", + "source_location": "L66", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_data_model_1_domain_entities_schemas", + "target": "specs_005_convert_json_markdown_data_model_entity_1_articleinput_source_json", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/data-model.md", + "source_location": "L7", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_data_model_data_model_convert_article_json_to_markdown", + "target": "specs_005_convert_json_markdown_data_model_1_domain_entities_schemas", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/data-model.md", + "source_location": "L5", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_data_model_data_model_convert_article_json_to_markdown", + "target": "specs_005_convert_json_markdown_data_model_2_priority_resolution_matrix", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/data-model.md", + "source_location": "L90", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_data_model_entity_1_articleinput_source_json", + "target": "specs_005_convert_json_markdown_data_model_validation_rules", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/data-model.md", + "source_location": "L26", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_plan", + "target": "specs_005_convert_json_markdown_plan_implementation_plan_convert_article_json_to_markdown", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/plan.md", + "source_location": "L1", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_plan_implementation_phases", + "target": "specs_005_convert_json_markdown_plan_phase_0_outline_research_completed", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/plan.md", + "source_location": "L88", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_plan_implementation_phases", + "target": "specs_005_convert_json_markdown_plan_phase_1_design_contracts_completed", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/plan.md", + "source_location": "L92", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_plan_implementation_phases", + "target": "specs_005_convert_json_markdown_plan_phase_2_tasks_implementation_breakdown_next_speckit_tasks", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/plan.md", + "source_location": "L98", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_plan_implementation_plan_convert_article_json_to_markdown", + "target": "specs_005_convert_json_markdown_plan_complexity_tracking", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/plan.md", + "source_location": "L111", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_plan_implementation_plan_convert_article_json_to_markdown", + "target": "specs_005_convert_json_markdown_plan_technical_context", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/plan.md", + "source_location": "L15", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_plan_implementation_plan_convert_article_json_to_markdown", + "target": "specs_005_convert_json_markdown_plan_constitution_check", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/plan.md", + "source_location": "L30", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_plan_implementation_plan_convert_article_json_to_markdown", + "target": "specs_005_convert_json_markdown_plan_project_structure", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/plan.md", + "source_location": "L44", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_plan_implementation_plan_convert_article_json_to_markdown", + "target": "specs_005_convert_json_markdown_plan_implementation_phases", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/plan.md", + "source_location": "L86", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_plan_implementation_plan_convert_article_json_to_markdown", + "target": "specs_005_convert_json_markdown_plan_summary", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/plan.md", + "source_location": "L9", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_plan_project_structure", + "target": "specs_005_convert_json_markdown_plan_documentation_this_feature", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/plan.md", + "source_location": "L46", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_plan_project_structure", + "target": "specs_005_convert_json_markdown_plan_source_code_test_layout", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/plan.md", + "source_location": "L62", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_quickstart", + "target": "specs_005_convert_json_markdown_quickstart_quickstart_convert_article_json_to_markdown", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/quickstart.md", + "source_location": "L1", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_quickstart_2_running_the_cli_tool", + "target": "specs_005_convert_json_markdown_quickstart_basic_conversion_default_output_path", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/quickstart.md", + "source_location": "L23", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_quickstart_2_running_the_cli_tool", + "target": "specs_005_convert_json_markdown_quickstart_custom_destination_path", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/quickstart.md", + "source_location": "L33", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_quickstart_3_verification_testing", + "target": "specs_005_convert_json_markdown_quickstart_run_all_unit_integration_tests", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/quickstart.md", + "source_location": "L47", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_quickstart_3_verification_testing", + "target": "specs_005_convert_json_markdown_quickstart_run_linter_type_checker", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/quickstart.md", + "source_location": "L53", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_quickstart_quickstart_convert_article_json_to_markdown", + "target": "specs_005_convert_json_markdown_quickstart_2_running_the_cli_tool", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/quickstart.md", + "source_location": "L21", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_quickstart_quickstart_convert_article_json_to_markdown", + "target": "specs_005_convert_json_markdown_quickstart_3_verification_testing", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/quickstart.md", + "source_location": "L45", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_quickstart_quickstart_convert_article_json_to_markdown", + "target": "specs_005_convert_json_markdown_quickstart_1_prerequisites_setup", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/quickstart.md", + "source_location": "L5", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_research", + "target": "specs_005_convert_json_markdown_research_research_convert_article_json_to_markdown", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/research.md", + "source_location": "L1", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_research_2_technical_decisions_research_findings", + "target": "specs_005_convert_json_markdown_research_decision_1_html_to_markdown_engine_selection", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/research.md", + "source_location": "L13", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_research_2_technical_decisions_research_findings", + "target": "specs_005_convert_json_markdown_research_decision_2_direct_markdown_handling_for_trafilatura", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/research.md", + "source_location": "L26", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_research_2_technical_decisions_research_findings", + "target": "specs_005_convert_json_markdown_research_decision_3_metadata_normalization_priority_resolution_pipeline", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/research.md", + "source_location": "L37", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_research_2_technical_decisions_research_findings", + "target": "specs_005_convert_json_markdown_research_decision_4_date_parsing_strategy_iso_8601_rfc_2822", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/research.md", + "source_location": "L50", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_research_2_technical_decisions_research_findings", + "target": "specs_005_convert_json_markdown_research_decision_5_url_validation_media_filtering", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/research.md", + "source_location": "L63", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_research_2_technical_decisions_research_findings", + "target": "specs_005_convert_json_markdown_research_decision_6_duplicate_title_heading_h1_stripping", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/research.md", + "source_location": "L74", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_research_2_technical_decisions_research_findings", + "target": "specs_005_convert_json_markdown_research_decision_7_atomic_file_writing_error_resilience", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/research.md", + "source_location": "L85", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_research_research_convert_article_json_to_markdown", + "target": "specs_005_convert_json_markdown_research_2_technical_decisions_research_findings", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/research.md", + "source_location": "L11", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_research_research_convert_article_json_to_markdown", + "target": "specs_005_convert_json_markdown_research_1_executive_summary_goals", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/research.md", + "source_location": "L5", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_research_research_convert_article_json_to_markdown", + "target": "specs_005_convert_json_markdown_research_3_technology_stack_dependencies", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/research.md", + "source_location": "L95", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_spec", + "target": "specs_005_convert_json_markdown_spec_feature_specification_convert_article_json_to_markdown", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/spec.md", + "source_location": "L1", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_spec_feature_specification_convert_article_json_to_markdown", + "target": "specs_005_convert_json_markdown_spec_success_criteria_mandatory", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/spec.md", + "source_location": "L120", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_spec_feature_specification_convert_article_json_to_markdown", + "target": "specs_005_convert_json_markdown_spec_assumptions", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/spec.md", + "source_location": "L131", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_spec_feature_specification_convert_article_json_to_markdown", + "target": "specs_005_convert_json_markdown_spec_requirements_mandatory", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/spec.md", + "source_location": "L71", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_spec_feature_specification_convert_article_json_to_markdown", + "target": "specs_005_convert_json_markdown_spec_user_scenarios_testing_mandatory", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/spec.md", + "source_location": "L8", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_spec_requirements_mandatory", + "target": "specs_005_convert_json_markdown_spec_key_entities", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/spec.md", + "source_location": "L114", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_spec_requirements_mandatory", + "target": "specs_005_convert_json_markdown_spec_functional_requirements", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/spec.md", + "source_location": "L73", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_spec_success_criteria_mandatory", + "target": "specs_005_convert_json_markdown_spec_measurable_outcomes", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/spec.md", + "source_location": "L122", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_spec_user_scenarios_testing_mandatory", + "target": "specs_005_convert_json_markdown_spec_user_story_1_single_article_json_to_clean_markdown_conversion_priority_p1", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/spec.md", + "source_location": "L10", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_spec_user_scenarios_testing_mandatory", + "target": "specs_005_convert_json_markdown_spec_user_story_2_deterministic_metadata_resolution_and_fallback_priority_p2", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/spec.md", + "source_location": "L27", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_spec_user_scenarios_testing_mandatory", + "target": "specs_005_convert_json_markdown_spec_user_story_3_cli_usability_validation_and_atomic_output_priority_p3", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/spec.md", + "source_location": "L44", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_spec_user_scenarios_testing_mandatory", + "target": "specs_005_convert_json_markdown_spec_edge_cases", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/spec.md", + "source_location": "L61", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_tasks", + "target": "specs_005_convert_json_markdown_tasks_tasks_convert_article_json_to_markdown", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/tasks.md", + "source_location": "L1", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_tasks_dependencies_execution_order", + "target": "specs_005_convert_json_markdown_tasks_phase_dependencies", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/tasks.md", + "source_location": "L106", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_tasks_implementation_strategy", + "target": "specs_005_convert_json_markdown_tasks_mvp_first_user_story_1_only", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/tasks.md", + "source_location": "L130", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_tasks_implementation_strategy", + "target": "specs_005_convert_json_markdown_tasks_incremental_delivery", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/tasks.md", + "source_location": "L135", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_tasks_phase_3_user_story_1_single_article_json_to_clean_markdown_conversion_priority_p1_mvp", + "target": "specs_005_convert_json_markdown_tasks_tests_for_user_story_1_tdd", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/tasks.md", + "source_location": "L36", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_tasks_phase_3_user_story_1_single_article_json_to_clean_markdown_conversion_priority_p1_mvp", + "target": "specs_005_convert_json_markdown_tasks_implementation_for_user_story_1", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/tasks.md", + "source_location": "L41", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_tasks_phase_4_user_story_2_deterministic_metadata_resolution_and_fallback_priority_p2", + "target": "specs_005_convert_json_markdown_tasks_tests_for_user_story_2_tdd", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/tasks.md", + "source_location": "L56", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_tasks_phase_4_user_story_2_deterministic_metadata_resolution_and_fallback_priority_p2", + "target": "specs_005_convert_json_markdown_tasks_implementation_for_user_story_2", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/tasks.md", + "source_location": "L61", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_tasks_phase_5_user_story_3_cli_usability_validation_and_atomic_output_priority_p3", + "target": "specs_005_convert_json_markdown_tasks_tests_for_user_story_3_tdd", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/tasks.md", + "source_location": "L79", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_tasks_phase_5_user_story_3_cli_usability_validation_and_atomic_output_priority_p3", + "target": "specs_005_convert_json_markdown_tasks_implementation_for_user_story_3", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/tasks.md", + "source_location": "L84", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_tasks_tasks_convert_article_json_to_markdown", + "target": "specs_005_convert_json_markdown_tasks_dependencies_execution_order", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/tasks.md", + "source_location": "L104", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_tasks_tasks_convert_article_json_to_markdown", + "target": "specs_005_convert_json_markdown_tasks_parallel_opportunities", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/tasks.md", + "source_location": "L117", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_tasks_tasks_convert_article_json_to_markdown", + "target": "specs_005_convert_json_markdown_tasks_implementation_strategy", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/tasks.md", + "source_location": "L128", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_tasks_tasks_convert_article_json_to_markdown", + "target": "specs_005_convert_json_markdown_tasks_phase_2_foundational_blocking_prerequisites", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/tasks.md", + "source_location": "L17", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_tasks_tasks_convert_article_json_to_markdown", + "target": "specs_005_convert_json_markdown_tasks_phase_3_user_story_1_single_article_json_to_clean_markdown_conversion_priority_p1_mvp", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/tasks.md", + "source_location": "L30", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_tasks_tasks_convert_article_json_to_markdown", + "target": "specs_005_convert_json_markdown_tasks_phase_4_user_story_2_deterministic_metadata_resolution_and_fallback_priority_p2", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/tasks.md", + "source_location": "L50", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_tasks_tasks_convert_article_json_to_markdown", + "target": "specs_005_convert_json_markdown_tasks_phase_5_user_story_3_cli_usability_validation_and_atomic_output_priority_p3", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/tasks.md", + "source_location": "L73", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_tasks_tasks_convert_article_json_to_markdown", + "target": "specs_005_convert_json_markdown_tasks_phase_1_setup_shared_infrastructure", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/tasks.md", + "source_location": "L8", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_tasks_tasks_convert_article_json_to_markdown", + "target": "specs_005_convert_json_markdown_tasks_phase_6_polish_cross_cutting_concerns", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/tasks.md", + "source_location": "L93", + "weight": 1.0 + }, { "source": "src_adapters_base", "target": "src_adapters_base_basenlpadapter", @@ -28120,6 +33870,50 @@ "source_location": "L1", "weight": 1.0 }, + { + "source": "tests_fixtures_markdown_conversion_valid_newspaper4k", + "target": "tests_fixtures_markdown_conversion_valid_newspaper4k_qui\u00e9n_es_paz_zubiri_la_relatora_de_fox_sports", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/fixtures/markdown_conversion/valid_newspaper4k.md", + "source_location": "L1", + "weight": 1.0 + }, + { + "source": "tests_fixtures_markdown_conversion_valid_readability", + "target": "tests_fixtures_markdown_conversion_valid_readability_an\u00e1lisis_t\u00e1ctico_del_partido_de_river_en_bogot\u00e1", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/fixtures/markdown_conversion/valid_readability.md", + "source_location": "L1", + "weight": 1.0 + }, + { + "source": "tests_fixtures_markdown_conversion_valid_trafilatura", + "target": "tests_fixtures_markdown_conversion_valid_trafilatura_los_puntajes_de_river_vs_independiente_santa_fe_por_la_copa_sudamericana_tyc_sports", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/fixtures/markdown_conversion/valid_trafilatura.md", + "source_location": "L1", + "weight": 1.0 + }, + { + "source": "tests_fixtures_markdown_conversion_valid_trafilatura_los_puntajes_de_river_vs_independiente_santa_fe_por_la_copa_sudamericana_tyc_sports", + "target": "tests_fixtures_markdown_conversion_valid_trafilatura_santiago_beltr\u00e1n_6", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/fixtures/markdown_conversion/valid_trafilatura.md", + "source_location": "L19", + "weight": 1.0 + }, { "source": "tests_test_adapters", "target": "tests_test_adapters_test_llm_adapter_interface", @@ -28373,6 +34167,281 @@ "source_location": "L85", "weight": 1.0 }, + { + "source": "tests_test_convert_article_to_markdown", + "target": "tests_test_convert_article_to_markdown_test_resolve_article_body_strict_isolation_prohibits_cross_fallback", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L102", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown", + "target": "tests_test_convert_article_to_markdown_test_normalize_scalar_string_and_placeholders", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L124", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown", + "target": "tests_test_convert_article_to_markdown_test_normalize_list_strings_and_deduplication", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L139", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown", + "target": "tests_test_convert_article_to_markdown_test_normalize_date_iso_and_rfc2822", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L159", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown", + "target": "tests_test_convert_article_to_markdown_test_validate_url_schemes", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L175", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown", + "target": "tests_test_convert_article_to_markdown_test_resolve_article_metadata_priority", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L187", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown", + "target": "tests_test_convert_article_to_markdown_test_remove_duplicate_initial_h1", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L249", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown", + "target": "tests_test_convert_article_to_markdown_test_clean_body_images_and_deduplicate", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L258", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown", + "target": "tests_test_convert_article_to_markdown_test_assemble_markdown_document", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L274", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown", + "target": "tests_test_convert_article_to_markdown_test_golden_fixture_trafilatura", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L313", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown", + "target": "tests_test_convert_article_to_markdown_test_golden_fixture_newspaper4k", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L329", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown", + "target": "tests_test_convert_article_to_markdown_test_golden_fixture_readability", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L345", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown", + "target": "tests_test_convert_article_to_markdown_test_cli_default_output_path", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L361", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown", + "target": "tests_test_convert_article_to_markdown_test_cli_rejection_of_batch_articles_json", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L386", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown", + "target": "tests_test_convert_article_to_markdown_test_cli_corrupt_json", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L398", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown", + "target": "tests_test_convert_article_to_markdown_test_cli_missing_required_fields", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L410", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown", + "target": "tests_test_convert_article_to_markdown_test_cli_argument_errors", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L437", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown", + "target": "tests_test_convert_article_to_markdown_test_convert_html_to_markdown_basic", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L447", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown", + "target": "tests_test_convert_article_to_markdown_test_parse_arguments_direct", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L455", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown", + "target": "tests_test_convert_article_to_markdown_test_convert_article_direct", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L462", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown", + "target": "tests_test_convert_article_to_markdown_test_resolve_article_body_trafilatura_markdown", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L47", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown", + "target": "tests_test_convert_article_to_markdown_test_cli_atomic_write_preserves_target_on_failure", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L483", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown", + "target": "tests_test_convert_article_to_markdown_test_resolve_article_body_trafilatura_fallback_text", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L60", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown", + "target": "tests_test_convert_article_to_markdown_test_resolve_article_body_newspaper4k_html_conversion", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L73", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown", + "target": "tests_test_convert_article_to_markdown_test_resolve_article_body_readability_html_conversion", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L88", + "weight": 1.0 + }, { "source": "tests_test_extract_article_contents", "target": "tests_test_extract_article_contents_test_load_search_json_valid", @@ -28901,314 +34970,6 @@ "source_location": "L88", "weight": 1.0 }, - { - "source": "tests_test_select_article_extractor", - "target": "tests_test_select_article_extractor_test_generate_shingles_empty", - "relation": "contains", - "_origin": "ast", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "tests/test_select_article_extractor.py", - "source_location": "L106", - "weight": 1.0 - }, - { - "source": "tests_test_select_article_extractor", - "target": "tests_test_select_article_extractor_test_ct_001_three_candidates_clear_winner", - "relation": "contains", - "_origin": "ast", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "tests/test_select_article_extractor.py", - "source_location": "L115", - "weight": 1.0 - }, - { - "source": "tests_test_select_article_extractor", - "target": "tests_test_select_article_extractor_test_ct_002_technical_tie_smallest_shingles", - "relation": "contains", - "_origin": "ast", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "tests/test_select_article_extractor.py", - "source_location": "L128", - "weight": 1.0 - }, - { - "source": "tests_test_select_article_extractor", - "target": "tests_test_select_article_extractor_test_ct_003_technical_tie_priority_fallback", - "relation": "contains", - "_origin": "ast", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "tests/test_select_article_extractor.py", - "source_location": "L140", - "weight": 1.0 - }, - { - "source": "tests_test_select_article_extractor", - "target": "tests_test_select_article_extractor_test_ct_004_three_candidates_no_consensus", - "relation": "contains", - "_origin": "ast", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "tests/test_select_article_extractor.py", - "source_location": "L161", - "weight": 1.0 - }, - { - "source": "tests_test_select_article_extractor", - "target": "tests_test_select_article_extractor_test_ct_005_two_candidates_no_consensus", - "relation": "contains", - "_origin": "ast", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "tests/test_select_article_extractor.py", - "source_location": "L176", - "weight": 1.0 - }, - { - "source": "tests_test_select_article_extractor", - "target": "tests_test_select_article_extractor_test_ct_006_single_usable_candidate", - "relation": "contains", - "_origin": "ast", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "tests/test_select_article_extractor.py", - "source_location": "L190", - "weight": 1.0 - }, - { - "source": "tests_test_select_article_extractor", - "target": "tests_test_select_article_extractor_test_ct_007_degraded_candidates_only", - "relation": "contains", - "_origin": "ast", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "tests/test_select_article_extractor.py", - "source_location": "L202", - "weight": 1.0 - }, - { - "source": "tests_test_select_article_extractor", - "target": "tests_test_select_article_extractor_test_ct_008_all_candidates_unavailable", - "relation": "contains", - "_origin": "ast", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "tests/test_select_article_extractor.py", - "source_location": "L214", - "weight": 1.0 - }, - { - "source": "tests_test_select_article_extractor", - "target": "tests_test_select_article_extractor_test_ct_009_small_fragment_loses_due_to_low_coverage", - "relation": "contains", - "_origin": "ast", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "tests/test_select_article_extractor.py", - "source_location": "L226", - "weight": 1.0 - }, - { - "source": "tests_test_select_article_extractor", - "target": "tests_test_select_article_extractor_test_ct_010_excessive_boilerplate_loses_due_to_low_support", - "relation": "contains", - "_origin": "ast", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "tests/test_select_article_extractor.py", - "source_location": "L243", - "weight": 1.0 - }, - { - "source": "tests_test_select_article_extractor", - "target": "tests_test_select_article_extractor_test_ct_011_partial_content_loses_due_to_low_coverage", - "relation": "contains", - "_origin": "ast", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "tests/test_select_article_extractor.py", - "source_location": "L259", - "weight": 1.0 - }, - { - "source": "tests_test_select_article_extractor", - "target": "tests_test_select_article_extractor_test_ct_012_recalculate_existing_selected_extractor", - "relation": "contains", - "_origin": "ast", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "tests/test_select_article_extractor.py", - "source_location": "L272", - "weight": 1.0 - }, - { - "source": "tests_test_select_article_extractor", - "target": "tests_test_select_article_extractor_test_ct_013_empty_articles_list", - "relation": "contains", - "_origin": "ast", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "tests/test_select_article_extractor.py", - "source_location": "L298", - "weight": 1.0 - }, - { - "source": "tests_test_select_article_extractor", - "target": "tests_test_select_article_extractor_test_ct_014_invalid_json_fails_atomically", - "relation": "contains", - "_origin": "ast", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "tests/test_select_article_extractor.py", - "source_location": "L317", - "weight": 1.0 - }, - { - "source": "tests_test_select_article_extractor", - "target": "tests_test_select_article_extractor_test_integration_reference_file", - "relation": "contains", - "_origin": "ast", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "tests/test_select_article_extractor.py", - "source_location": "L334", - "weight": 1.0 - }, - { - "source": "tests_test_select_article_extractor", - "target": "tests_test_select_article_extractor_test_article_1_regression_technical_tie_markdown_images", - "relation": "contains", - "_origin": "ast", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "tests/test_select_article_extractor.py", - "source_location": "L363", - "weight": 1.0 - }, - { - "source": "tests_test_select_article_extractor", - "target": "tests_test_select_article_extractor_test_integration_large_batch_determinism", - "relation": "contains", - "_origin": "ast", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "tests/test_select_article_extractor.py", - "source_location": "L397", - "weight": 1.0 - }, - { - "source": "tests_test_select_article_extractor", - "target": "tests_test_select_article_extractor_test_normalize_text_empty_and_invalid", - "relation": "contains", - "_origin": "ast", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "tests/test_select_article_extractor.py", - "source_location": "L40", - "weight": 1.0 - }, - { - "source": "tests_test_select_article_extractor", - "target": "tests_test_select_article_extractor_test_integration_pipeline_downstream_consumer", - "relation": "contains", - "_origin": "ast", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "tests/test_select_article_extractor.py", - "source_location": "L446", - "weight": 1.0 - }, - { - "source": "tests_test_select_article_extractor", - "target": "tests_test_select_article_extractor_test_normalize_text_html_entities_and_tags", - "relation": "contains", - "_origin": "ast", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "tests/test_select_article_extractor.py", - "source_location": "L47", - "weight": 1.0 - }, - { - "source": "tests_test_select_article_extractor", - "target": "tests_test_select_article_extractor_test_e2e_cli_subprocess_real_execution", - "relation": "contains", - "_origin": "ast", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "tests/test_select_article_extractor.py", - "source_location": "L483", - "weight": 1.0 - }, - { - "source": "tests_test_select_article_extractor", - "target": "tests_test_select_article_extractor_test_e2e_cli_subprocess_default_naming", - "relation": "contains", - "_origin": "ast", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "tests/test_select_article_extractor.py", - "source_location": "L520", - "weight": 1.0 - }, - { - "source": "tests_test_select_article_extractor", - "target": "tests_test_select_article_extractor_test_normalize_text_markdown_links", - "relation": "contains", - "_origin": "ast", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "tests/test_select_article_extractor.py", - "source_location": "L53", - "weight": 1.0 - }, - { - "source": "tests_test_select_article_extractor", - "target": "tests_test_select_article_extractor_test_e2e_cli_subprocess_invalid_input", - "relation": "contains", - "_origin": "ast", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "tests/test_select_article_extractor.py", - "source_location": "L548", - "weight": 1.0 - }, - { - "source": "tests_test_select_article_extractor", - "target": "tests_test_select_article_extractor_test_e2e_cli_subprocess_missing_file", - "relation": "contains", - "_origin": "ast", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "tests/test_select_article_extractor.py", - "source_location": "L561", - "weight": 1.0 - }, - { - "source": "tests_test_select_article_extractor", - "target": "tests_test_select_article_extractor_test_normalize_text_markdown_images_stripped_while_links_preserved", - "relation": "contains", - "_origin": "ast", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "tests/test_select_article_extractor.py", - "source_location": "L59", - "weight": 1.0 - }, - { - "source": "tests_test_select_article_extractor", - "target": "tests_test_select_article_extractor_test_normalize_text_nfkc_unicode_and_punctuation", - "relation": "contains", - "_origin": "ast", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "tests/test_select_article_extractor.py", - "source_location": "L78", - "weight": 1.0 - }, { "source": "tests_test_select_article_extractor", "target": "tests_test_select_article_extractor_test_generate_shingles_sliding_window", @@ -29217,7 +34978,7 @@ "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "tests/test_select_article_extractor.py", - "source_location": "L90", + "source_location": "L105", "weight": 1.0 }, { @@ -29228,7 +34989,315 @@ "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "tests/test_select_article_extractor.py", - "source_location": "L98", + "source_location": "L113", + "weight": 1.0 + }, + { + "source": "tests_test_select_article_extractor", + "target": "tests_test_select_article_extractor_test_generate_shingles_empty", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_select_article_extractor.py", + "source_location": "L121", + "weight": 1.0 + }, + { + "source": "tests_test_select_article_extractor", + "target": "tests_test_select_article_extractor_test_ct_001_three_candidates_clear_winner", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_select_article_extractor.py", + "source_location": "L130", + "weight": 1.0 + }, + { + "source": "tests_test_select_article_extractor", + "target": "tests_test_select_article_extractor_test_ct_002_technical_tie_smallest_shingles", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_select_article_extractor.py", + "source_location": "L146", + "weight": 1.0 + }, + { + "source": "tests_test_select_article_extractor", + "target": "tests_test_select_article_extractor_test_ct_003_technical_tie_priority_fallback", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_select_article_extractor.py", + "source_location": "L163", + "weight": 1.0 + }, + { + "source": "tests_test_select_article_extractor", + "target": "tests_test_select_article_extractor_test_ct_004_three_candidates_no_consensus", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_select_article_extractor.py", + "source_location": "L184", + "weight": 1.0 + }, + { + "source": "tests_test_select_article_extractor", + "target": "tests_test_select_article_extractor_test_ct_005_two_candidates_no_consensus", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_select_article_extractor.py", + "source_location": "L199", + "weight": 1.0 + }, + { + "source": "tests_test_select_article_extractor", + "target": "tests_test_select_article_extractor_test_ct_006_single_usable_candidate", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_select_article_extractor.py", + "source_location": "L215", + "weight": 1.0 + }, + { + "source": "tests_test_select_article_extractor", + "target": "tests_test_select_article_extractor_test_ct_007_degraded_candidates_only", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_select_article_extractor.py", + "source_location": "L230", + "weight": 1.0 + }, + { + "source": "tests_test_select_article_extractor", + "target": "tests_test_select_article_extractor_test_ct_008_all_candidates_unavailable", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_select_article_extractor.py", + "source_location": "L242", + "weight": 1.0 + }, + { + "source": "tests_test_select_article_extractor", + "target": "tests_test_select_article_extractor_test_ct_009_small_fragment_loses_due_to_low_coverage", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_select_article_extractor.py", + "source_location": "L254", + "weight": 1.0 + }, + { + "source": "tests_test_select_article_extractor", + "target": "tests_test_select_article_extractor_test_ct_010_excessive_boilerplate_loses_due_to_low_support", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_select_article_extractor.py", + "source_location": "L271", + "weight": 1.0 + }, + { + "source": "tests_test_select_article_extractor", + "target": "tests_test_select_article_extractor_test_ct_011_partial_content_loses_due_to_low_coverage", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_select_article_extractor.py", + "source_location": "L289", + "weight": 1.0 + }, + { + "source": "tests_test_select_article_extractor", + "target": "tests_test_select_article_extractor_test_normalize_text_empty_and_invalid", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_select_article_extractor.py", + "source_location": "L30", + "weight": 1.0 + }, + { + "source": "tests_test_select_article_extractor", + "target": "tests_test_select_article_extractor_test_ct_012_recalculate_existing_selected_extractor", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_select_article_extractor.py", + "source_location": "L302", + "weight": 1.0 + }, + { + "source": "tests_test_select_article_extractor", + "target": "tests_test_select_article_extractor_test_ct_013_empty_articles_list", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_select_article_extractor.py", + "source_location": "L334", + "weight": 1.0 + }, + { + "source": "tests_test_select_article_extractor", + "target": "tests_test_select_article_extractor_test_ct_014_invalid_json_fails_atomically", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_select_article_extractor.py", + "source_location": "L353", + "weight": 1.0 + }, + { + "source": "tests_test_select_article_extractor", + "target": "tests_test_select_article_extractor_test_normalize_text_html_entities_and_tags", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_select_article_extractor.py", + "source_location": "L37", + "weight": 1.0 + }, + { + "source": "tests_test_select_article_extractor", + "target": "tests_test_select_article_extractor_test_integration_reference_file", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_select_article_extractor.py", + "source_location": "L370", + "weight": 1.0 + }, + { + "source": "tests_test_select_article_extractor", + "target": "tests_test_select_article_extractor_test_article_1_regression_technical_tie_markdown_images", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_select_article_extractor.py", + "source_location": "L401", + "weight": 1.0 + }, + { + "source": "tests_test_select_article_extractor", + "target": "tests_test_select_article_extractor_test_normalize_text_markdown_links", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_select_article_extractor.py", + "source_location": "L43", + "weight": 1.0 + }, + { + "source": "tests_test_select_article_extractor", + "target": "tests_test_select_article_extractor_test_integration_large_batch_determinism", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_select_article_extractor.py", + "source_location": "L435", + "weight": 1.0 + }, + { + "source": "tests_test_select_article_extractor", + "target": "tests_test_select_article_extractor_test_normalize_text_markdown_images_stripped_while_links_preserved", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_select_article_extractor.py", + "source_location": "L49", + "weight": 1.0 + }, + { + "source": "tests_test_select_article_extractor", + "target": "tests_test_select_article_extractor_test_integration_pipeline_downstream_consumer", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_select_article_extractor.py", + "source_location": "L493", + "weight": 1.0 + }, + { + "source": "tests_test_select_article_extractor", + "target": "tests_test_select_article_extractor_test_e2e_cli_subprocess_real_execution", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_select_article_extractor.py", + "source_location": "L530", + "weight": 1.0 + }, + { + "source": "tests_test_select_article_extractor", + "target": "tests_test_select_article_extractor_test_e2e_cli_subprocess_default_naming", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_select_article_extractor.py", + "source_location": "L567", + "weight": 1.0 + }, + { + "source": "tests_test_select_article_extractor", + "target": "tests_test_select_article_extractor_test_e2e_cli_subprocess_invalid_input", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_select_article_extractor.py", + "source_location": "L595", + "weight": 1.0 + }, + { + "source": "tests_test_select_article_extractor", + "target": "tests_test_select_article_extractor_test_e2e_cli_subprocess_missing_file", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_select_article_extractor.py", + "source_location": "L608", + "weight": 1.0 + }, + { + "source": "tests_test_select_article_extractor", + "target": "tests_test_select_article_extractor_test_normalize_text_nfkc_unicode_and_punctuation", + "relation": "contains", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_select_article_extractor.py", + "source_location": "L79", "weight": 1.0 }, { @@ -29803,6 +35872,160 @@ "source_location": "L37", "weight": 1.0 }, + { + "source": "scripts_convert_article_to_markdown_rationale_105", + "target": "scripts_convert_article_to_markdown_normalize_date", + "relation": "rationale_for", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L105", + "weight": 1.0 + }, + { + "source": "scripts_convert_article_to_markdown_rationale_136", + "target": "scripts_convert_article_to_markdown_validate_url", + "relation": "rationale_for", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L136", + "weight": 1.0 + }, + { + "source": "scripts_convert_article_to_markdown_rationale_150", + "target": "scripts_convert_article_to_markdown_convert_html_to_markdown", + "relation": "rationale_for", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L150", + "weight": 1.0 + }, + { + "source": "scripts_convert_article_to_markdown_rationale_162", + "target": "scripts_convert_article_to_markdown_resolve_article_body", + "relation": "rationale_for", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L162", + "weight": 1.0 + }, + { + "source": "scripts_convert_article_to_markdown_rationale_220", + "target": "scripts_convert_article_to_markdown_get_dict", + "relation": "rationale_for", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L220", + "weight": 1.0 + }, + { + "source": "scripts_convert_article_to_markdown_rationale_226", + "target": "scripts_convert_article_to_markdown_resolve_article_metadata", + "relation": "rationale_for", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L226", + "weight": 1.0 + }, + { + "source": "scripts_convert_article_to_markdown_rationale_41", + "target": "scripts_convert_article_to_markdown_normalize_scalar", + "relation": "rationale_for", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L41", + "weight": 1.0 + }, + { + "source": "scripts_convert_article_to_markdown_rationale_474", + "target": "scripts_convert_article_to_markdown_remove_duplicate_initial_h1", + "relation": "rationale_for", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L474", + "weight": 1.0 + }, + { + "source": "scripts_convert_article_to_markdown_rationale_509", + "target": "scripts_convert_article_to_markdown_clean_body_images", + "relation": "rationale_for", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L509", + "weight": 1.0 + }, + { + "source": "scripts_convert_article_to_markdown_rationale_541", + "target": "scripts_convert_article_to_markdown_assemble_markdown_document", + "relation": "rationale_for", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L541", + "weight": 1.0 + }, + { + "source": "scripts_convert_article_to_markdown_rationale_57", + "target": "scripts_convert_article_to_markdown_normalize_list", + "relation": "rationale_for", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L57", + "weight": 1.0 + }, + { + "source": "scripts_convert_article_to_markdown_rationale_609", + "target": "scripts_convert_article_to_markdown_convert_article", + "relation": "rationale_for", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L609", + "weight": 1.0 + }, + { + "source": "scripts_convert_article_to_markdown_rationale_668", + "target": "scripts_convert_article_to_markdown_parse_arguments", + "relation": "rationale_for", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L668", + "weight": 1.0 + }, + { + "source": "scripts_convert_article_to_markdown_rationale_691", + "target": "scripts_convert_article_to_markdown_main", + "relation": "rationale_for", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "scripts/convert_article_to_markdown.py", + "source_location": "L691", + "weight": 1.0 + }, { "source": "scripts_extract_article_contents_rationale_103", "target": "scripts_extract_article_contents_newspaperdata", @@ -30156,58 +36379,58 @@ "weight": 1.0 }, { - "source": "scripts_select_article_extractor_rationale_212", + "source": "scripts_select_article_extractor_rationale_214", "target": "scripts_select_article_extractor_form_active_set", "relation": "rationale_for", "_origin": "ast", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "scripts/select_article_extractor.py", - "source_location": "L212", + "source_location": "L214", "weight": 1.0 }, { - "source": "scripts_select_article_extractor_rationale_235", + "source": "scripts_select_article_extractor_rationale_239", "target": "scripts_select_article_extractor_calculate_consensus_metrics", "relation": "rationale_for", "_origin": "ast", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "scripts/select_article_extractor.py", - "source_location": "L235", + "source_location": "L239", "weight": 1.0 }, { - "source": "scripts_select_article_extractor_rationale_281", + "source": "scripts_select_article_extractor_rationale_285", "target": "scripts_select_article_extractor_break_priority_tie", "relation": "rationale_for", "_origin": "ast", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "scripts/select_article_extractor.py", - "source_location": "L281", + "source_location": "L285", "weight": 1.0 }, { - "source": "scripts_select_article_extractor_rationale_292", + "source": "scripts_select_article_extractor_rationale_296", "target": "scripts_select_article_extractor_select_with_consensus", "relation": "rationale_for", "_origin": "ast", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "scripts/select_article_extractor.py", - "source_location": "L292", + "source_location": "L296", "weight": 1.0 }, { - "source": "scripts_select_article_extractor_rationale_323", + "source": "scripts_select_article_extractor_rationale_333", "target": "scripts_select_article_extractor_select_without_consensus", "relation": "rationale_for", "_origin": "ast", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "scripts/select_article_extractor.py", - "source_location": "L323", + "source_location": "L333", "weight": 1.0 }, { @@ -30222,14 +36445,14 @@ "weight": 1.0 }, { - "source": "scripts_select_article_extractor_rationale_374", + "source": "scripts_select_article_extractor_rationale_390", "target": "scripts_select_article_extractor_select_article_extractor", "relation": "rationale_for", "_origin": "ast", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "scripts/select_article_extractor.py", - "source_location": "L374", + "source_location": "L390", "weight": 1.0 }, { @@ -30244,25 +36467,25 @@ "weight": 1.0 }, { - "source": "scripts_select_article_extractor_rationale_431", + "source": "scripts_select_article_extractor_rationale_449", "target": "scripts_select_article_extractor_atomic_save_json", "relation": "rationale_for", "_origin": "ast", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "scripts/select_article_extractor.py", - "source_location": "L431", + "source_location": "L449", "weight": 1.0 }, { - "source": "scripts_select_article_extractor_rationale_455", + "source": "scripts_select_article_extractor_rationale_476", "target": "scripts_select_article_extractor_process_batch", "relation": "rationale_for", "_origin": "ast", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "scripts/select_article_extractor.py", - "source_location": "L455", + "source_location": "L476", "weight": 1.0 }, { @@ -30716,6 +36939,292 @@ "source_location": "L1", "weight": 1.0 }, + { + "source": "tests_test_convert_article_to_markdown_rationale_1", + "target": "tests_test_convert_article_to_markdown", + "relation": "rationale_for", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L1", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown_rationale_103", + "target": "tests_test_convert_article_to_markdown_test_resolve_article_body_strict_isolation_prohibits_cross_fallback", + "relation": "rationale_for", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L103", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown_rationale_125", + "target": "tests_test_convert_article_to_markdown_test_normalize_scalar_string_and_placeholders", + "relation": "rationale_for", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L125", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown_rationale_140", + "target": "tests_test_convert_article_to_markdown_test_normalize_list_strings_and_deduplication", + "relation": "rationale_for", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L140", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown_rationale_160", + "target": "tests_test_convert_article_to_markdown_test_normalize_date_iso_and_rfc2822", + "relation": "rationale_for", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L160", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown_rationale_176", + "target": "tests_test_convert_article_to_markdown_test_validate_url_schemes", + "relation": "rationale_for", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L176", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown_rationale_188", + "target": "tests_test_convert_article_to_markdown_test_resolve_article_metadata_priority", + "relation": "rationale_for", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L188", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown_rationale_250", + "target": "tests_test_convert_article_to_markdown_test_remove_duplicate_initial_h1", + "relation": "rationale_for", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L250", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown_rationale_259", + "target": "tests_test_convert_article_to_markdown_test_clean_body_images_and_deduplicate", + "relation": "rationale_for", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L259", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown_rationale_275", + "target": "tests_test_convert_article_to_markdown_test_assemble_markdown_document", + "relation": "rationale_for", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L275", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown_rationale_314", + "target": "tests_test_convert_article_to_markdown_test_golden_fixture_trafilatura", + "relation": "rationale_for", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L314", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown_rationale_330", + "target": "tests_test_convert_article_to_markdown_test_golden_fixture_newspaper4k", + "relation": "rationale_for", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L330", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown_rationale_346", + "target": "tests_test_convert_article_to_markdown_test_golden_fixture_readability", + "relation": "rationale_for", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L346", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown_rationale_362", + "target": "tests_test_convert_article_to_markdown_test_cli_default_output_path", + "relation": "rationale_for", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L362", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown_rationale_387", + "target": "tests_test_convert_article_to_markdown_test_cli_rejection_of_batch_articles_json", + "relation": "rationale_for", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L387", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown_rationale_399", + "target": "tests_test_convert_article_to_markdown_test_cli_corrupt_json", + "relation": "rationale_for", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L399", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown_rationale_411", + "target": "tests_test_convert_article_to_markdown_test_cli_missing_required_fields", + "relation": "rationale_for", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L411", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown_rationale_438", + "target": "tests_test_convert_article_to_markdown_test_cli_argument_errors", + "relation": "rationale_for", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L438", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown_rationale_448", + "target": "tests_test_convert_article_to_markdown_test_convert_html_to_markdown_basic", + "relation": "rationale_for", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L448", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown_rationale_456", + "target": "tests_test_convert_article_to_markdown_test_parse_arguments_direct", + "relation": "rationale_for", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L456", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown_rationale_463", + "target": "tests_test_convert_article_to_markdown_test_convert_article_direct", + "relation": "rationale_for", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L463", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown_rationale_48", + "target": "tests_test_convert_article_to_markdown_test_resolve_article_body_trafilatura_markdown", + "relation": "rationale_for", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L48", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown_rationale_484", + "target": "tests_test_convert_article_to_markdown_test_cli_atomic_write_preserves_target_on_failure", + "relation": "rationale_for", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L484", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown_rationale_61", + "target": "tests_test_convert_article_to_markdown_test_resolve_article_body_trafilatura_fallback_text", + "relation": "rationale_for", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L61", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown_rationale_74", + "target": "tests_test_convert_article_to_markdown_test_resolve_article_body_newspaper4k_html_conversion", + "relation": "rationale_for", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L74", + "weight": 1.0 + }, + { + "source": "tests_test_convert_article_to_markdown_rationale_89", + "target": "tests_test_convert_article_to_markdown_test_resolve_article_body_readability_html_conversion", + "relation": "rationale_for", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_convert_article_to_markdown.py", + "source_location": "L89", + "weight": 1.0 + }, { "source": "tests_test_extract_article_contents_rationale_317", "target": "tests_test_extract_article_contents_test_e2e_live_article_extraction", @@ -30970,162 +37479,140 @@ "weight": 1.0 }, { - "source": "tests_test_select_article_extractor_rationale_116", + "source": "tests_test_select_article_extractor_rationale_131", "target": "tests_test_select_article_extractor_test_ct_001_three_candidates_clear_winner", "relation": "rationale_for", "_origin": "ast", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "tests/test_select_article_extractor.py", - "source_location": "L116", + "source_location": "L131", "weight": 1.0 }, { - "source": "tests_test_select_article_extractor_rationale_129", + "source": "tests_test_select_article_extractor_rationale_147", "target": "tests_test_select_article_extractor_test_ct_002_technical_tie_smallest_shingles", "relation": "rationale_for", "_origin": "ast", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "tests/test_select_article_extractor.py", - "source_location": "L129", + "source_location": "L147", "weight": 1.0 }, { - "source": "tests_test_select_article_extractor_rationale_141", + "source": "tests_test_select_article_extractor_rationale_164", "target": "tests_test_select_article_extractor_test_ct_003_technical_tie_priority_fallback", "relation": "rationale_for", "_origin": "ast", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "tests/test_select_article_extractor.py", - "source_location": "L141", + "source_location": "L164", "weight": 1.0 }, { - "source": "tests_test_select_article_extractor_rationale_162", + "source": "tests_test_select_article_extractor_rationale_185", "target": "tests_test_select_article_extractor_test_ct_004_three_candidates_no_consensus", "relation": "rationale_for", "_origin": "ast", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "tests/test_select_article_extractor.py", - "source_location": "L162", + "source_location": "L185", "weight": 1.0 }, { - "source": "tests_test_select_article_extractor_rationale_177", + "source": "tests_test_select_article_extractor_rationale_200", "target": "tests_test_select_article_extractor_test_ct_005_two_candidates_no_consensus", "relation": "rationale_for", "_origin": "ast", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "tests/test_select_article_extractor.py", - "source_location": "L177", + "source_location": "L200", "weight": 1.0 }, { - "source": "tests_test_select_article_extractor_rationale_191", + "source": "tests_test_select_article_extractor_rationale_216", "target": "tests_test_select_article_extractor_test_ct_006_single_usable_candidate", "relation": "rationale_for", "_origin": "ast", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "tests/test_select_article_extractor.py", - "source_location": "L191", + "source_location": "L216", "weight": 1.0 }, { - "source": "tests_test_select_article_extractor_rationale_203", + "source": "tests_test_select_article_extractor_rationale_231", "target": "tests_test_select_article_extractor_test_ct_007_degraded_candidates_only", "relation": "rationale_for", "_origin": "ast", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "tests/test_select_article_extractor.py", - "source_location": "L203", + "source_location": "L231", "weight": 1.0 }, { - "source": "tests_test_select_article_extractor_rationale_215", + "source": "tests_test_select_article_extractor_rationale_243", "target": "tests_test_select_article_extractor_test_ct_008_all_candidates_unavailable", "relation": "rationale_for", "_origin": "ast", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "tests/test_select_article_extractor.py", - "source_location": "L215", + "source_location": "L243", "weight": 1.0 }, { - "source": "tests_test_select_article_extractor_rationale_227", + "source": "tests_test_select_article_extractor_rationale_255", "target": "tests_test_select_article_extractor_test_ct_009_small_fragment_loses_due_to_low_coverage", "relation": "rationale_for", "_origin": "ast", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "tests/test_select_article_extractor.py", - "source_location": "L227", + "source_location": "L255", "weight": 1.0 }, { - "source": "tests_test_select_article_extractor_rationale_244", + "source": "tests_test_select_article_extractor_rationale_272", "target": "tests_test_select_article_extractor_test_ct_010_excessive_boilerplate_loses_due_to_low_support", "relation": "rationale_for", "_origin": "ast", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "tests/test_select_article_extractor.py", - "source_location": "L244", + "source_location": "L272", "weight": 1.0 }, { - "source": "tests_test_select_article_extractor_rationale_260", + "source": "tests_test_select_article_extractor_rationale_290", "target": "tests_test_select_article_extractor_test_ct_011_partial_content_loses_due_to_low_coverage", "relation": "rationale_for", "_origin": "ast", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "tests/test_select_article_extractor.py", - "source_location": "L260", + "source_location": "L290", "weight": 1.0 }, { - "source": "tests_test_select_article_extractor_rationale_273", + "source": "tests_test_select_article_extractor_rationale_303", "target": "tests_test_select_article_extractor_test_ct_012_recalculate_existing_selected_extractor", "relation": "rationale_for", "_origin": "ast", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "tests/test_select_article_extractor.py", - "source_location": "L273", - "weight": 1.0 - }, - { - "source": "tests_test_select_article_extractor_rationale_299", - "target": "tests_test_select_article_extractor_test_ct_013_empty_articles_list", - "relation": "rationale_for", - "_origin": "ast", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "tests/test_select_article_extractor.py", - "source_location": "L299", - "weight": 1.0 - }, - { - "source": "tests_test_select_article_extractor_rationale_318", - "target": "tests_test_select_article_extractor_test_ct_014_invalid_json_fails_atomically", - "relation": "rationale_for", - "_origin": "ast", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "tests/test_select_article_extractor.py", - "source_location": "L318", + "source_location": "L303", "weight": 1.0 }, { "source": "tests_test_select_article_extractor_rationale_335", - "target": "tests_test_select_article_extractor_test_integration_reference_file", + "target": "tests_test_select_article_extractor_test_ct_013_empty_articles_list", "relation": "rationale_for", "_origin": "ast", "confidence": "EXTRACTED", @@ -31135,91 +37622,113 @@ "weight": 1.0 }, { - "source": "tests_test_select_article_extractor_rationale_364", + "source": "tests_test_select_article_extractor_rationale_354", + "target": "tests_test_select_article_extractor_test_ct_014_invalid_json_fails_atomically", + "relation": "rationale_for", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_select_article_extractor.py", + "source_location": "L354", + "weight": 1.0 + }, + { + "source": "tests_test_select_article_extractor_rationale_371", + "target": "tests_test_select_article_extractor_test_integration_reference_file", + "relation": "rationale_for", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_select_article_extractor.py", + "source_location": "L371", + "weight": 1.0 + }, + { + "source": "tests_test_select_article_extractor_rationale_402", "target": "tests_test_select_article_extractor_test_article_1_regression_technical_tie_markdown_images", "relation": "rationale_for", "_origin": "ast", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "tests/test_select_article_extractor.py", - "source_location": "L364", + "source_location": "L402", "weight": 1.0 }, { - "source": "tests_test_select_article_extractor_rationale_398", + "source": "tests_test_select_article_extractor_rationale_436", "target": "tests_test_select_article_extractor_test_integration_large_batch_determinism", "relation": "rationale_for", "_origin": "ast", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "tests/test_select_article_extractor.py", - "source_location": "L398", + "source_location": "L436", "weight": 1.0 }, { - "source": "tests_test_select_article_extractor_rationale_447", + "source": "tests_test_select_article_extractor_rationale_494", "target": "tests_test_select_article_extractor_test_integration_pipeline_downstream_consumer", "relation": "rationale_for", "_origin": "ast", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "tests/test_select_article_extractor.py", - "source_location": "L447", + "source_location": "L494", "weight": 1.0 }, { - "source": "tests_test_select_article_extractor_rationale_484", - "target": "tests_test_select_article_extractor_test_e2e_cli_subprocess_real_execution", - "relation": "rationale_for", - "_origin": "ast", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "tests/test_select_article_extractor.py", - "source_location": "L484", - "weight": 1.0 - }, - { - "source": "tests_test_select_article_extractor_rationale_521", - "target": "tests_test_select_article_extractor_test_e2e_cli_subprocess_default_naming", - "relation": "rationale_for", - "_origin": "ast", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "tests/test_select_article_extractor.py", - "source_location": "L521", - "weight": 1.0 - }, - { - "source": "tests_test_select_article_extractor_rationale_549", - "target": "tests_test_select_article_extractor_test_e2e_cli_subprocess_invalid_input", - "relation": "rationale_for", - "_origin": "ast", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "tests/test_select_article_extractor.py", - "source_location": "L549", - "weight": 1.0 - }, - { - "source": "tests_test_select_article_extractor_rationale_562", - "target": "tests_test_select_article_extractor_test_e2e_cli_subprocess_missing_file", - "relation": "rationale_for", - "_origin": "ast", - "confidence": "EXTRACTED", - "confidence_score": 1.0, - "source_file": "tests/test_select_article_extractor.py", - "source_location": "L562", - "weight": 1.0 - }, - { - "source": "tests_test_select_article_extractor_rationale_60", + "source": "tests_test_select_article_extractor_rationale_50", "target": "tests_test_select_article_extractor_test_normalize_text_markdown_images_stripped_while_links_preserved", "relation": "rationale_for", "_origin": "ast", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "tests/test_select_article_extractor.py", - "source_location": "L60", + "source_location": "L50", + "weight": 1.0 + }, + { + "source": "tests_test_select_article_extractor_rationale_531", + "target": "tests_test_select_article_extractor_test_e2e_cli_subprocess_real_execution", + "relation": "rationale_for", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_select_article_extractor.py", + "source_location": "L531", + "weight": 1.0 + }, + { + "source": "tests_test_select_article_extractor_rationale_568", + "target": "tests_test_select_article_extractor_test_e2e_cli_subprocess_default_naming", + "relation": "rationale_for", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_select_article_extractor.py", + "source_location": "L568", + "weight": 1.0 + }, + { + "source": "tests_test_select_article_extractor_rationale_596", + "target": "tests_test_select_article_extractor_test_e2e_cli_subprocess_invalid_input", + "relation": "rationale_for", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_select_article_extractor.py", + "source_location": "L596", + "weight": 1.0 + }, + { + "source": "tests_test_select_article_extractor_rationale_609", + "target": "tests_test_select_article_extractor_test_e2e_cli_subprocess_missing_file", + "relation": "rationale_for", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "tests/test_select_article_extractor.py", + "source_location": "L609", "weight": 1.0 }, { @@ -31574,6 +38083,160 @@ "source_location": "L3", "weight": 1.0 }, + { + "source": "specs_005_convert_json_markdown_checklists_markdown_conversion", + "target": "docs_prd_convert_json_markdown", + "relation": "references", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/checklists/markdown-conversion.md", + "source_location": "L5", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_checklists_markdown_conversion", + "target": "specs_005_convert_json_markdown_data_model", + "relation": "references", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/checklists/markdown-conversion.md", + "source_location": "L5", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_checklists_markdown_conversion", + "target": "specs_005_convert_json_markdown_plan", + "relation": "references", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/checklists/markdown-conversion.md", + "source_location": "L5", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_checklists_markdown_conversion", + "target": "specs_005_convert_json_markdown_spec", + "relation": "references", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/checklists/markdown-conversion.md", + "source_location": "L5", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_checklists_requirements", + "target": "specs_005_convert_json_markdown_spec", + "relation": "references", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/checklists/requirements.md", + "source_location": "L5", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_plan", + "target": "specs_005_convert_json_markdown_spec", + "relation": "references", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/plan.md", + "source_location": "L3", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_plan", + "target": "specs_005_convert_json_markdown_research", + "relation": "references", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/plan.md", + "source_location": "L89", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_plan", + "target": "specs_005_convert_json_markdown_data_model", + "relation": "references", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/plan.md", + "source_location": "L93", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_plan", + "target": "specs_005_convert_json_markdown_contracts_cli_contract", + "relation": "references", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/plan.md", + "source_location": "L94", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_plan", + "target": "specs_005_convert_json_markdown_contracts_markdown_schema", + "relation": "references", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/plan.md", + "source_location": "L95", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_plan", + "target": "specs_005_convert_json_markdown_quickstart", + "relation": "references", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/plan.md", + "source_location": "L96", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_tasks", + "target": "specs_005_convert_json_markdown_data_model", + "relation": "references", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/tasks.md", + "source_location": "L4", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_tasks", + "target": "specs_005_convert_json_markdown_plan", + "relation": "references", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/tasks.md", + "source_location": "L4", + "weight": 1.0 + }, + { + "source": "specs_005_convert_json_markdown_tasks", + "target": "specs_005_convert_json_markdown_spec", + "relation": "references", + "_origin": "ast", + "confidence": "EXTRACTED", + "confidence_score": 1.0, + "source_file": "specs/005-convert-json-markdown/tasks.md", + "source_location": "L4", + "weight": 1.0 + }, { "source": "classify_emit_error", "target": "src_models_errorcode", @@ -32012,7 +38675,7 @@ "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "tests/test_select_article_extractor.py", - "source_location": "L380", + "source_location": "L418", "weight": 0.8 }, { @@ -32023,7 +38686,7 @@ "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "tests/test_select_article_extractor.py", - "source_location": "L124", + "source_location": "L142", "weight": 0.8 }, { @@ -32034,7 +38697,7 @@ "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "tests/test_select_article_extractor.py", - "source_location": "L137", + "source_location": "L160", "weight": 0.8 }, { @@ -32045,7 +38708,7 @@ "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "tests/test_select_article_extractor.py", - "source_location": "L149", + "source_location": "L172", "weight": 0.8 }, { @@ -32056,7 +38719,7 @@ "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "tests/test_select_article_extractor.py", - "source_location": "L172", + "source_location": "L195", "weight": 0.8 }, { @@ -32067,7 +38730,7 @@ "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "tests/test_select_article_extractor.py", - "source_location": "L186", + "source_location": "L211", "weight": 0.8 }, { @@ -32078,7 +38741,7 @@ "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "tests/test_select_article_extractor.py", - "source_location": "L198", + "source_location": "L226", "weight": 0.8 }, { @@ -32089,7 +38752,7 @@ "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "tests/test_select_article_extractor.py", - "source_location": "L211", + "source_location": "L239", "weight": 0.8 }, { @@ -32100,7 +38763,7 @@ "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "tests/test_select_article_extractor.py", - "source_location": "L222", + "source_location": "L250", "weight": 0.8 }, { @@ -32111,7 +38774,7 @@ "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "tests/test_select_article_extractor.py", - "source_location": "L239", + "source_location": "L267", "weight": 0.8 }, { @@ -32122,7 +38785,7 @@ "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "tests/test_select_article_extractor.py", - "source_location": "L256", + "source_location": "L286", "weight": 0.8 }, { @@ -32133,10 +38796,10 @@ "confidence": "INFERRED", "confidence_score": 0.95, "source_file": "tests/test_select_article_extractor.py", - "source_location": "L269", + "source_location": "L299", "weight": 0.8 } ], "hyperedges": [], - "built_at_commit": "6a45368cb0061020764a5dd31edf6f7eb0e54475" + "built_at_commit": "64dfd842de80916bec38f69ba41ab3f730e52425" } \ No newline at end of file diff --git a/graphify-out/2026-08-21/manifest.json b/graphify-out/2026-08-21/manifest.json index 30f9a3e..6eb3764 100644 --- a/graphify-out/2026-08-21/manifest.json +++ b/graphify-out/2026-08-21/manifest.json @@ -420,9 +420,9 @@ "semantic_hash": "" }, "requirements.txt": { - "mtime": 1787240110.13472, - "seen": 1787240516.5993943, - "ast_hash": "f5d99630fa9c93c5fbaa44814f107e70", + "mtime": 1787317345.9253972, + "seen": 1787317712.8213654, + "ast_hash": "f3f8ea2b8cc995de218d81679ec35231", "semantic_hash": "" }, "tests/fixtures/benchmark_24/de/contextual.md": { @@ -654,9 +654,9 @@ "semantic_hash": "" }, "README.md": { - "mtime": 1787274445.4631622, - "seen": 1787274455.3244681, - "ast_hash": "5270e11cfba31a235ba379effb2db0d5", + "mtime": 1787317667.2516665, + "seen": 1787317712.8207479, + "ast_hash": "73b6e2e7ff33db1b991b8470f29ee40f", "semantic_hash": "" }, "scripts/extract_article_contents.py": { @@ -738,15 +738,15 @@ "semantic_hash": "" }, "scripts/select_article_extractor.py": { - "mtime": 1787273522.903319, - "seen": 1787273548.728257, - "ast_hash": "3e6938964c7e4549051cb1637207698d", + "mtime": 1787274502.4801269, + "seen": 1787310813.8455508, + "ast_hash": "4037eda779d5fc81527d0698a8fc07d6", "semantic_hash": "" }, "tests/test_select_article_extractor.py": { - "mtime": 1787274189.7777488, - "seen": 1787274207.7989414, - "ast_hash": "9f91e09d47f06140b243b6f516d14c60", + "mtime": 1787274502.4801269, + "seen": 1787310813.8470025, + "ast_hash": "2cd19eb0c5204a8c22b7727e259db885", "semantic_hash": "" }, "docs/prd_deterministic_content_selection.md": { @@ -792,9 +792,9 @@ "semantic_hash": "" }, "specs/004-deterministic-content-selection/quickstart.md": { - "mtime": 1787274324.1467915, - "seen": 1787274402.0946271, - "ast_hash": "a7886ca618af43f33971213e2255b3c6", + "mtime": 1787274502.478128, + "seen": 1787310813.854652, + "ast_hash": "60453533ee75a4f0a894dca634e0c96c", "semantic_hash": "" }, "specs/004-deterministic-content-selection/research.md": { @@ -814,5 +814,101 @@ "seen": 1787272611.6714194, "ast_hash": "3a2617478f44c6400ed57088d2039f93", "semantic_hash": "" + }, + "scripts/convert_article_to_markdown.py": { + "mtime": 1787317631.1342402, + "seen": 1787317712.814934, + "ast_hash": "f2550126b7ff9de09bbbe0ae03acbbca", + "semantic_hash": "" + }, + "tests/test_convert_article_to_markdown.py": { + "mtime": 1787317613.930905, + "seen": 1787317712.8166668, + "ast_hash": "fc7d1b6d08037a85cf014fa4e8c70a70", + "semantic_hash": "" + }, + "docs/prd_convert_json_markdown.md": { + "mtime": 1787315400.452784, + "seen": 1787317712.8208659, + "ast_hash": "1fc73d15d4f4d5c1e74f299040b040f2", + "semantic_hash": "" + }, + "specs/005-convert-json-markdown/checklists/markdown-conversion.md": { + "mtime": 1787315812.9198053, + "seen": 1787317712.8255877, + "ast_hash": "4cc2161c66aa34dc8540c48322b6eaaa", + "semantic_hash": "" + }, + "specs/005-convert-json-markdown/checklists/requirements.md": { + "mtime": 1787315513.450848, + "seen": 1787317712.8255897, + "ast_hash": "a14c648defdfb7c2ad77601249d44a66", + "semantic_hash": "" + }, + "specs/005-convert-json-markdown/contracts/cli-contract.md": { + "mtime": 1787315656.382816, + "seen": 1787317712.8255913, + "ast_hash": "bba24a6fcd59b265d11242b4b09d2537", + "semantic_hash": "" + }, + "specs/005-convert-json-markdown/contracts/markdown-schema.md": { + "mtime": 1787315662.3060155, + "seen": 1787317712.8255925, + "ast_hash": "4dd6023205dcc49447bf3c78f0419c52", + "semantic_hash": "" + }, + "specs/005-convert-json-markdown/data-model.md": { + "mtime": 1787315648.195198, + "seen": 1787317712.8255942, + "ast_hash": "31de71b9fa43fb1b257f76ae2de33044", + "semantic_hash": "" + }, + "specs/005-convert-json-markdown/plan.md": { + "mtime": 1787315676.826685, + "seen": 1787317712.8255954, + "ast_hash": "44e3074130dadf889bf3830e6139b91a", + "semantic_hash": "" + }, + "specs/005-convert-json-markdown/quickstart.md": { + "mtime": 1787315668.269243, + "seen": 1787317712.8255966, + "ast_hash": "6086387edc574ed31202ff05eaa3fb54", + "semantic_hash": "" + }, + "specs/005-convert-json-markdown/research.md": { + "mtime": 1787315639.7204154, + "seen": 1787317712.825598, + "ast_hash": "3ffedbbf7e61245b86119f41a5f8af2d", + "semantic_hash": "" + }, + "specs/005-convert-json-markdown/spec.md": { + "mtime": 1787315504.210701, + "seen": 1787317712.825599, + "ast_hash": "9f78ac1c71853dcf4e364c66973dfcbc", + "semantic_hash": "" + }, + "specs/005-convert-json-markdown/tasks.md": { + "mtime": 1787317701.507181, + "seen": 1787317712.8256, + "ast_hash": "1287da802887af5e0dd3a6a2685f5fc0", + "semantic_hash": "" + }, + "tests/fixtures/markdown_conversion/valid_newspaper4k.md": { + "mtime": 1787317400.9745035, + "seen": 1787317712.8280056, + "ast_hash": "3bfb28bbde97c16635de39bbbe6fbd8b", + "semantic_hash": "" + }, + "tests/fixtures/markdown_conversion/valid_readability.md": { + "mtime": 1787317419.4019263, + "seen": 1787317712.8280075, + "ast_hash": "49fdc6bedd7585eda33e2c502337e01a", + "semantic_hash": "" + }, + "tests/fixtures/markdown_conversion/valid_trafilatura.md": { + "mtime": 1787317383.5058665, + "seen": 1787317712.8280091, + "ast_hash": "c63c1c39e34e08a239aa8bea3c264756", + "semantic_hash": "" } } \ No newline at end of file diff --git a/graphify-out/GRAPH_REPORT.md b/graphify-out/GRAPH_REPORT.md index 0a64ccc..f1fc712 100644 --- a/graphify-out/GRAPH_REPORT.md +++ b/graphify-out/GRAPH_REPORT.md @@ -1,16 +1,16 @@ # Graph Report - TextNLPClassifierApp (2026-08-21) ## Corpus Check -- 174 files · ~91,990 words +- 199 files · ~108,365 words - Verdict: corpus is large enough that graph structure adds value. ## Summary -- 1235 nodes · 1541 edges · 131 communities (93 shown, 38 thin omitted) +- 1527 nodes · 1899 edges · 165 communities (118 shown, 47 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: `ff7a50e0` +- Built from commit: `64dfd842` - Run `git rev-parse HEAD` and compare to check if the graph is stale. - Run `graphify update .` after code changes (no API cost). @@ -59,7 +59,7 @@ - ClassificationResult - InherenceClassifier - classifier.py -- main +- test_convert_article_to_markdown.py - content_northvolt_de.md - content_presal_pt.md - content_tangential_es.md @@ -109,13 +109,13 @@ - CLI Contract: Google News Headlines Extractor - 🧠 TextNLPClassifierApp - Extraction Pipeline Checklist: Article Content Multi-Engine Extractor -- sample_rss_xml +- parametrize - models.py - ECPSnapshot - Feature Specification: Multilingual NLP Entity Inherence Classifier (POC) - 4. Requisitos Funcionais (FR) - Tasks: Article Content Multi-Engine Extractor -- LocalEmbeddingsAdapter +- Tasks: Convert Article JSON to Markdown - Implementation Plan: Article Content Multi-Engine Extractor - 2. Cenários de Validação - 1. Technical Decisions & Tradeoffs @@ -130,6 +130,7 @@ - Tasks: Deterministic Article Content Selection - select_article_extractor - process_batch +- detect_language - test_select_article_extractor.py - Feature Specification: Deterministic Content Selection - 2. Entity Descriptions & Fields @@ -138,7 +139,40 @@ - Quickstart: Deterministic Article Content Selection - Specification Quality Checklist: Deterministic Content Selection - CLI Interface Contract: Deterministic Article Content Selection +- convert_article_to_markdown.py +- 8. Regras funcionais +- 12. Critérios de aceite +- PRD — Conversão de artigo JSON para Markdown +- resolve_article_body +- Implementation Plan: Convert Article JSON to Markdown +- 2. Technical Decisions & Research Findings +- Feature Specification: Convert Article JSON to Markdown +- Markdown Conversion Checklist: End-to-End Requirements Quality +- convert_article +- 005-convert-json-markdown/plan.md +- Quickstart: Convert Article JSON to Markdown +- 1. Domain Entities & Schemas +- 11. Requisitos não funcionais +- parse_arguments +- Specification Quality Checklist: Convert Article JSON to Markdown +- CLI Contract: `convert_article_to_markdown.py` +- 9. Interface CLI +- get_hl_gl_ceid +- 13. Estratégia de testes +- 6. Contrato de entrada +- assemble_markdown_document +- convert_html_to_markdown - JSON Schema Contract: Deterministic Article Content Selection +- 5. Escopo +- Los puntajes de River vs. Independiente Santa Fe, por la Copa Sudamericana - TyC Sports +- valid_newspaper4k.md +- valid_readability.md +- test_normalize_date_rfc_2822_variants +- test_normalize_date_invalid_and_placeholders +- test_metadata_priority_title_all_fallbacks +- test_metadata_priority_subtitle_omitted_when_equal_to_title +- test_metadata_priority_first_valid_source_no_cross_merging +- test_normalize_scalar_non_string_types ## God Nodes (most connected - your core abstractions) 1. `ECPSnapshot` - 31 edges @@ -147,27 +181,27 @@ 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 +7. `PRD — Conversão de artigo JSON para Markdown` - 16 edges +8. `process_batch()` - 15 edges +9. `8. Regras funcionais` - 15 edges +10. `resolve_article_metadata()` - 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] +- `test_e2e_extract_google_news_live_pipeline()` --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 +- `petrobras_ecp()` --uses--> `ECPSnapshot` [INFERRED] + tests/test_classifier.py → src/models.py ## Import Cycles - None detected. -## Communities (131 total, 38 thin omitted) +## Communities (165 total, 47 thin omitted) ### Community 0 - "Task Planning" Cohesion: 0.07 @@ -310,20 +344,20 @@ 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 - "ClassificationResult" -Cohesion: 0.14 -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) +Cohesion: 0.09 +Nodes (19): 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., LocalEmbeddingsAdapter (+11 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 - "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) +Cohesion: 0.16 +Nodes (16): 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., extract_evidence_snippets(), extract_sentences() (+8 more) -### 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 48 - "test_convert_article_to_markdown.py" +Cohesion: 0.07 +Nodes (27): Suíte de Testes Automatizados para Conversão de Artigo JSON para Markdown.…, Testa deduplicação case-insensitive preservando a grafia e ordem da primeira…, Valida parsing de datas ISO 8601 em múltiplos formatos e fusos., Valida a cadeia de fallback completa para a URL ORIGINAL (5 níveis)., Valida decodificação de entidades HTML nomeadas e numéricas., Valida colapso de tabs, quebras de linha e espaços múltiplos em um único espaço., Garante correspondência exata byte a byte para Trafilatura, Newspaper4k e…, Garante que múltiplas execuções no mesmo arquivo produzam hashes SHA-256… (+19 more) ### Community 80 - "test_extract_article_contents.py" Cohesion: 0.06 @@ -334,16 +368,16 @@ Cohesion: 0.08 Nodes (24): 1. Visão geral (arquitetura), 2.1 DTO de entrada (`googlenews_etl/application/dtos/extract_news_dto.py`), 2.2 Value Object de validação (`googlenews_etl/domain/entities/search_query.py`), 2. Entrada, 3.1 O caso de uso (`googlenews_etl/application/use_cases/extract_news_use_case.py`), 3.2 A porta (`googlenews_etl/domain/ports/news_extractor_port.py`), 3.3.1 Inicialização: sessão HTTP com impersonação de browser, 3.3.2 Mapeamento idioma → parâmetros `hl`/`gl` (`_get_hl_gl`) (+16 more) ### Community 82 - "extract_google_news.py" -Cohesion: 0.15 -Nodes (18): extract_google_news(), _fetch_rss_content(), get_hl_gl_ceid(), NewsArticle, _normalize_text_for_comparison(), parse_google_news_rss(), Mapeia idioma e locale para os parâmetros hl, gl e ceid do Google News., Remove pontuação e espaços extras para comparação de redundância. (+10 more) +Cohesion: 0.20 +Nodes (14): extract_google_news(), _fetch_rss_content(), NewsArticle, _normalize_text_for_comparison(), parse_google_news_rss(), Remove pontuação e espaços extras para comparação de redundância., Parseia o XML do RSS do Google News e extrai os itens estruturados., Resolve em paralelo as URLs intermediárias do Google News para os links finais… (+6 more) ### Community 83 - "ExtractionResult" Cohesion: 0.29 -Nodes (5): ExtractionResult, Any, Resultado consolidado da extração., Valida E2E o fluxo completo de busca, parsing e resolução de URLs reais ao vivo., test_e2e_extract_google_news_live_pipeline() +Nodes (5): ExtractionResult, Any, Resultado consolidado da extração., Valida a consolidação do ExtractionResult a partir da busca mockada com URLs…, test_extract_google_news_orchestration_mocked() ### Community 84 - "test_extract_google_news.py" -Cohesion: 0.15 -Nodes (15): Resolve a URL intermediária do Google News para a URL real do veículo., resolve_article_url(), Testes unitários e de integração para o Extrator de Manchetes do Google News.…, Valida fallback gracioso de URL quando não é link do Google News ou em erro., Valida resolução bem-sucedida de URL do Google News para o portal destino., Valida E2E que o decodificador resolve uma URL real do Google News para o…, Valida o mapeamento padrão de idiomas para pares (hl, gl, ceid)., Valida a sobrescrita geográfica quando o argumento locale é especificado. (+7 more) +Cohesion: 0.16 +Nodes (14): Resolve a URL intermediária do Google News para a URL real do veículo., resolve_article_url(), fixture, Testes unitários e de integração para o Extrator de Manchetes do Google News.…, Valida o parsing do feed RSS, higienização de tags HTML e deduplicação., Valida fallback gracioso de URL quando não é link do Google News ou em erro., Valida resolução bem-sucedida de URL do Google News para o portal destino., Valida E2E que o decodificador resolve uma URL real do Google News para o… (+6 more) ### Community 85 - "Implementation Tasks: Google News Headlines Extractor" Cohesion: 0.14 @@ -363,7 +397,7 @@ Nodes (7): Architecture & Pipeline, Documentation (this feature), Implementation ### Community 90 - "SearchQuery" Cohesion: 0.20 -Nodes (6): Value Object com parâmetros de busca validados., SearchQuery, Valida a consolidação do ExtractionResult a partir da busca mockada com URLs…, Valida as regras de negócio e limites de SearchQuery., test_extract_google_news_orchestration_mocked(), test_search_query_validation() +Nodes (6): Value Object com parâmetros de busca validados., SearchQuery, Valida E2E o fluxo completo de busca, parsing e resolução de URLs reais ao vivo., Valida as regras de negócio e limites de SearchQuery., test_e2e_extract_google_news_live_pipeline(), test_search_query_validation() ### Community 91 - "1. Technical Decisions & Tradeoffs" Cohesion: 0.25 @@ -386,24 +420,24 @@ Cohesion: 0.33 Nodes (6): 1. Comando e Argumentos, 2. Códigos de Saída (Exit Codes), 3. Protocolo de Streams (Stdout / Stderr), Argumentos de Linha de Comando, CLI Contract: Google News Headlines Extractor, Sintaxe ### Community 97 - "🧠 TextNLPClassifierApp" -Cohesion: 0.06 -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) +Cohesion: 0.04 +Nodes (45): 1. 🧠 Classificador de Conteúdo e Inerência (NLP / LLM / ECP), 1. Clonar o Repositório e Criar Ambiente Virtual, 1. Conversão Padrão, 1. Execução Padrão Automática, 2. Conversão com Caminho de Destino Personalizado, 2. Execução com Modo Verboso, 2. 📰 Extrator de Manchetes do Google News, 2. Instalar Dependências (+37 more) ### Community 98 - "Extraction Pipeline Checklist: Article Content Multi-Engine Extractor" Cohesion: 0.05 Nodes (34): 1. Requirement Completeness, 2. Requirement Clarity & Non-Ambiguity, 3. Requirement Consistency & Data Contracts, 4. Scenario & Edge Case Coverage, 5. Non-Functional & Operational Readiness, Extraction Pipeline Checklist: Article Content Multi-Engine Extractor, Notes, Content Quality (+26 more) -### Community 99 - "sample_rss_xml" -Cohesion: 0.67 -Nodes (3): fixture, Fixture que fornece o conteúdo do XML de exemplo para testes offline., sample_rss_xml() +### Community 99 - "parametrize" +Cohesion: 0.22 +Nodes (9): parametrize, Garante aceitação de URLs absolutas com esquema HTTP e HTTPS válidos., Garante rejeição de esquemas não permitidos, URLs relativas e strings vazias., Garante que a ausência de corpo no extrator selecionado NUNCA faça fallback…, Garante que todos os placeholders documentados no PRD sejam descartados…, test_normalize_scalar_placeholders_discarded(), test_resolve_article_body_strict_isolation_all_extractors(), test_validate_url_invalid_schemes() (+1 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() +Cohesion: 0.15 +Nodes (17): emit_error(), main(), parse_args(), Namespace, ClassificationError, ErrorCode, MatchedGraphEntity, Enum (+9 more) ### Community 101 - "ECPSnapshot" -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) +Cohesion: 0.20 +Nodes (10): ECPSnapshot, Any, classifier(), fixture, parametrize, Controlled 24-case benchmark suite for Multilingual NLP Entity Inherence…, test_benchmark_case(), test_ecp_snapshot_defaults() (+2 more) ### Community 102 - "Feature Specification: Multilingual NLP Entity Inherence Classifier (POC)" Cohesion: 0.14 @@ -417,9 +451,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 - "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 105 - "Tasks: Convert Article JSON to Markdown" +Cohesion: 0.11 +Nodes (19): Dependencies & Execution Order, Implementation for User Story 1, Implementation for User Story 2, Implementation for User Story 3, Implementation Strategy, Incremental Delivery, MVP First (User Story 1 Only), Parallel Opportunities (+11 more) ### Community 106 - "Implementation Plan: Article Content Multi-Engine Extractor" Cohesion: 0.17 @@ -477,6 +511,10 @@ Nodes (35): CandidateStatus, extract_candidate_data(), ExtractorName, Any, Enum, Cohesion: 0.11 Nodes (24): 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. (+16 more) +### Community 121 - "detect_language" +Cohesion: 0.19 +Nodes (16): detect_language(), extract_words(), normalize_text(), Lightweight multilingual language detection and text normalization., Normalize text by converting to lowercase and stripping combining diacritical…, Tokenize text into lowercase alphanumeric words., Detect the ISO-639-1 language code of text among supported languages (pt, en,…, Unit tests for language detection and text normalization. (+8 more) + ### Community 122 - "test_select_article_extractor.py" Cohesion: 0.18 Nodes (16): 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…, E2E: Executa scripts/select_article_extractor.py como subprocesso real na linha…, test_e2e_cli_subprocess_real_execution() (+8 more) @@ -509,24 +547,116 @@ Nodes (5): Content Quality, Feature Readiness, Notes, Requirement Completeness, 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" +### Community 131 - "convert_article_to_markdown.py" +Cohesion: 0.19 +Nodes (17): _get_dict(), normalize_date(), normalize_list(), normalize_scalar(), Any, Interpreta datas ISO 8601 e RFC 2822 preservando fuso horário ou YYYY-MM-DD…, Valida se a URL é absoluta com protocolo http ou https e hostname não vazio., Retorna o dicionário associado à chave ou um dicionário vazio caso não seja… (+9 more) + +### Community 132 - "8. Regras funcionais" +Cohesion: 0.13 +Nodes (15): 8. Regras funcionais, RF-001 — Receber um único artigo, RF-002 — Respeitar o extrator selecionado, RF-003 — Resolver o corpo dentro do extrator selecionado, RF-004 — Selecionar metadados deterministicamente, RF-005 — Priorizar metadados por campo, RF-006 — Normalizar valores escalares, RF-007 — Normalizar listas (+7 more) + +### Community 133 - "12. Critérios de aceite" +Cohesion: 0.14 +Nodes (14): 12. Critérios de aceite, CA-001 — Trafilatura selecionada, CA-002 — Newspaper4k selecionado, CA-003 — Readability selecionado, CA-004 — Fallback dentro do extrator, CA-005 — Proibição de fallback de corpo entre extratores, CA-006 — Metadado vindo de outro extrator, CA-007 — Obrigatórios presentes (+6 more) + +### Community 134 - "PRD — Conversão de artigo JSON para Markdown" +Cohesion: 0.17 +Nodes (11): 10. Tratamento de erros, 14. Definition of Done, 15. Dependência técnica escolhida, 1. Visão geral, 2. Problema, 3. Objetivo, 4. História do usuário, 7.1 Arquivo (+3 more) + +### Community 135 - "resolve_article_body" +Cohesion: 0.20 +Nodes (10): Obtém o corpo do artigo exclusivamente do selected_extractor com fallback…, resolve_article_body(), Testa prioridade trafilatura.markdown sobre trafilatura.text., Testa prioridade newspaper4k.article_html sobre newspaper4k.text., Testa prioridade readability.cleaned_html sobre readability.cleaned_text., Garante erro ao receber selected_extractor ausente ou não reconhecido., test_resolve_article_body_invalid_selected_extractor(), test_resolve_article_body_newspaper4k_primary_and_fallback() (+2 more) + +### Community 136 - "Implementation Plan: Convert Article JSON to Markdown" +Cohesion: 0.17 +Nodes (12): Complexity Tracking, Constitution Check, Documentation (this feature), Implementation Phases, Implementation Plan: Convert Article JSON to Markdown, Phase 0: Outline & Research *(Completed)*, Phase 1: Design & Contracts *(Completed)*, Phase 2: Tasks & Implementation Breakdown *(Next: `/speckit-tasks`)* (+4 more) + +### Community 137 - "2. Technical Decisions & Research Findings" +Cohesion: 0.17 +Nodes (11): 1. Executive Summary & Goals, 2. Technical Decisions & Research Findings, 3. Technology Stack & Dependencies, Decision 1: HTML-to-Markdown Engine Selection, Decision 2: Direct Markdown Handling for Trafilatura, Decision 3: Metadata Normalization & Priority Resolution Pipeline, Decision 4: Date Parsing Strategy (ISO 8601 & RFC 2822), Decision 5: URL Validation & Media Filtering (+3 more) + +### Community 138 - "Feature Specification: Convert Article JSON to Markdown" +Cohesion: 0.17 +Nodes (12): Assumptions, Edge Cases, Feature Specification: Convert Article JSON to Markdown, Functional Requirements, Key Entities, Measurable Outcomes, Requirements *(mandatory)*, Success Criteria *(mandatory)* (+4 more) + +### Community 139 - "Markdown Conversion Checklist: End-to-End Requirements Quality" +Cohesion: 0.18 +Nodes (11): 1. Validação de Entrada, Tipagem & Isolamento de Lotes, 2. Isolamento Estrito de Extrator & Conversão de Conteúdo (HTML/MD), 3. Resolução Determinística de Metadados & Mapeamento de SELECIONADO, 4. Normalização de Escalares, Placeholders & Sanitização de Listas, 5. Normalização de Datas, Fusos & Validação Estrita de URLs, 6. Sanitização Editorial, Tratamento de Imagens & Título Duplicado, 7. Estrutura, Sintaxe do Markdown de Saída & Restrições, 8. Interface CLI, Tratamento de Erros & Atomicidade (+3 more) + +### Community 140 - "convert_article" +Cohesion: 0.15 +Nodes (13): clean_body_images(), convert_article(), Path, Remove o primeiro título H1 do corpo somente quando ele for igual ao título…, Preserva imagens com URL absoluta http/https, remove relativas/data:/vazias e…, Executa a leitura do JSON, validação, conversão e escrita atômica do arquivo…, remove_duplicate_initial_h1(), Testa remoção de H1 inicial coincidente com título com variações de espaços e… (+5 more) + +### Community 141 - "005-convert-json-markdown/plan.md" +Cohesion: 0.33 +Nodes (3): 1. Output Document Specification, 2. Formatting & Syntax Constraints, Markdown Schema Contract: Output Article Markdown + +### Community 142 - "Quickstart: Convert Article JSON to Markdown" +Cohesion: 0.22 +Nodes (8): 1. Prerequisites & Setup, 2. Running the CLI Tool, 3. Verification & Testing, Basic Conversion (Default Output Path), Custom Destination Path, Quickstart: Convert Article JSON to Markdown, Run All Unit & Integration Tests, Run Linter & Type Checker + +### Community 143 - "1. Domain Entities & Schemas" +Cohesion: 0.25 +Nodes (8): 1. Domain Entities & Schemas, 2. Priority Resolution Matrix, Data Model: Convert Article JSON to Markdown, Entity 1: `ArticleInput` (Source JSON), Entity 2: `ExtractorBlock` (Per-Extractor Data), Entity 3: `ResolvedArticleMetadata`, Entity 4: `MarkdownDocument`, Validation Rules: + +### Community 144 - "11. Requisitos não funcionais" +Cohesion: 0.29 +Nodes (7): 11. Requisitos não funcionais, RNF-001 — Determinismo, RNF-002 — Compatibilidade, RNF-003 — Execução local, RNF-004 — Integridade, RNF-005 — Manutenibilidade, RNF-006 — Qualidade + +### Community 145 - "parse_arguments" +Cohesion: 0.29 +Nodes (7): main(), parse_arguments(), Namespace, Configura o parser de argumentos do CLI., Ponto de entrada do CLI., Testa a chamada direta do parse_arguments., test_parse_arguments_api_direct() + +### Community 146 - "Specification Quality Checklist: Convert Article JSON to Markdown" +Cohesion: 0.33 +Nodes (5): Content Quality, Feature Readiness, Notes, Requirement Completeness, Specification Quality Checklist: Convert Article JSON to Markdown + +### Community 147 - "CLI Contract: `convert_article_to_markdown.py`" +Cohesion: 0.33 +Nodes (5): 1. Script Signature, 2. Command-Line Arguments, 3. Exit Codes, 4. Standard Stream Behavior, CLI Contract: `convert_article_to_markdown.py` + +### Community 148 - "9. Interface CLI" +Cohesion: 0.40 +Nodes (5): 9.1 Script, 9.2 Argumentos, 9.3 Exemplos, 9.4 Saída do processo, 9. Interface CLI + +### Community 149 - "get_hl_gl_ceid" +Cohesion: 0.25 +Nodes (8): get_hl_gl_ceid(), Mapeia idioma e locale para os parâmetros hl, gl e ceid do Google News., Valida o mapeamento padrão de idiomas para pares (hl, gl, ceid)., Valida a sobrescrita geográfica quando o argumento locale é especificado., Valida fallback dinâmico para idiomas regionais não listados explicitamente., test_get_hl_gl_ceid_default_mappings(), test_get_hl_gl_ceid_dynamic_fallback(), test_get_hl_gl_ceid_with_custom_locale() + +### Community 150 - "13. Estratégia de testes" +Cohesion: 0.50 +Nodes (4): 13.1 Testes unitários, 13.2 Testes de integração do CLI, 13.3 Casos de resultado esperado, 13. Estratégia de testes + +### Community 151 - "6. Contrato de entrada" +Cohesion: 0.50 +Nodes (4): 6.1 Formato, 6.2 Valores aceitos para `selected_extractor`, 6.3 Campos obrigatórios após a resolução, 6. Contrato de entrada + +### Community 152 - "assemble_markdown_document" +Cohesion: 0.50 +Nodes (4): assemble_markdown_document(), Monta a estrutura final do documento Markdown respeitando a ordem estrita do…, Testa montagem com todos os campos e apenas com campos obrigatórios., test_assemble_markdown_document_full_and_minimal() + +### Community 153 - "convert_html_to_markdown" +Cohesion: 0.33 +Nodes (6): convert_html_to_markdown(), Converte HTML para Markdown usando títulos ATX, removendo scripts e estilos., Valida conversão de elementos HTML estruturados para Markdown com títulos ATX., Testa conversão de HTML vazio retornando string vazia., test_convert_html_to_markdown_empty_or_whitespace(), test_convert_html_to_markdown_rich_formatting() + +### Community 154 - "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 +### Community 155 - "5. Escopo" +Cohesion: 0.67 +Nodes (3): 5.1 Incluído, 5.2 Fora do escopo, 5. Escopo + ## Knowledge Gaps -- **562 isolated node(s):** `text-nlp-classifier`, `MatchedGraphEntity`, `graphify`, `Usage`, `What graphify is for` (+557 more) +- **696 isolated node(s):** `text-nlp-classifier`, `MatchedGraphEntity`, `graphify`, `Usage`, `What graphify is for` (+691 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. +- **47 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`, `LocalEmbeddingsAdapter`, `ClassificationResult`, `InherenceClassifier`, `classifier.py`, `main`?** - _High betweenness centrality (0.003) - this node is a cross-community bridge._ -- **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._ +- **Why does `PRD — Conversão de artigo JSON para Markdown` connect `PRD — Conversão de artigo JSON para Markdown` to `8. Regras funcionais`, `12. Critérios de aceite`, `11. Requisitos não funcionais`, `9. Interface CLI`, `13. Estratégia de testes`, `6. Contrato de entrada`, `5. Escopo`?** + _High betweenness centrality (0.007) - 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?** @@ -534,4 +664,8 @@ _Questions this graph is uniquely positioned to answer:_ - **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._ \ No newline at end of file + _`DecisionCategory` has 10 INFERRED edges - model-reasoned connections that need verification._ +- **What connects `text-nlp-classifier`, `MatchedGraphEntity`, `graphify` to the rest of the system?** + _696 weakly-connected nodes found - possible documentation gaps or missing edges._ +- **Should `Task Planning` be split into smaller, more focused modules?** + _Cohesion score 0.07407407407407407 - nodes in this community are weakly interconnected._ \ No newline at end of file diff --git a/graphify-out/cache/ast/v0.9.47-s2/024ca5b2b269152ed2e7afbc719589d6f005d3dd4a50d1a6303c426415313326.json b/graphify-out/cache/ast/v0.9.47-s2/024ca5b2b269152ed2e7afbc719589d6f005d3dd4a50d1a6303c426415313326.json new file mode 100644 index 0000000..4508c01 --- /dev/null +++ b/graphify-out/cache/ast/v0.9.47-s2/024ca5b2b269152ed2e7afbc719589d6f005d3dd4a50d1a6303c426415313326.json @@ -0,0 +1 @@ +{"nodes": [{"id": "$graphify-root$_tests_fixtures_markdown_conversion_valid_trafilatura_md", "label": "valid_trafilatura.md", "file_type": "document", "node_kind": "page", "source_file": "tests/fixtures/markdown_conversion/valid_trafilatura.md", "source_location": "L1"}, {"id": "$graphify-root$_tests_fixtures_markdown_conversion_valid_trafilatura_los_puntajes_de_river_vs_independiente_santa_fe_por_la_copa_sudamericana_tyc_sports", "label": "Los puntajes de River vs. Independiente Santa Fe, por la Copa Sudamericana - TyC Sports", "file_type": "document", "node_kind": "heading", "source_file": "tests/fixtures/markdown_conversion/valid_trafilatura.md", "source_location": "L1"}, {"id": "$graphify-root$_tests_fixtures_markdown_conversion_valid_trafilatura_santiago_beltr\u00e1n_6", "label": "SANTIAGO BELTR\u00c1N - 6", "file_type": "document", "node_kind": "heading", "source_file": "tests/fixtures/markdown_conversion/valid_trafilatura.md", "source_location": "L19"}], "edges": [{"source": "$graphify-root$_tests_fixtures_markdown_conversion_valid_trafilatura_md", "target": "$graphify-root$_tests_fixtures_markdown_conversion_valid_trafilatura_los_puntajes_de_river_vs_independiente_santa_fe_por_la_copa_sudamericana_tyc_sports", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/fixtures/markdown_conversion/valid_trafilatura.md", "source_location": "L1", "weight": 1.0}, {"source": "$graphify-root$_tests_fixtures_markdown_conversion_valid_trafilatura_los_puntajes_de_river_vs_independiente_santa_fe_por_la_copa_sudamericana_tyc_sports", "target": "$graphify-root$_tests_fixtures_markdown_conversion_valid_trafilatura_santiago_beltr\u00e1n_6", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/fixtures/markdown_conversion/valid_trafilatura.md", "source_location": "L19", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/graphify-out/cache/ast/v0.9.47-s2/05c37379ff5c24c9c875a806c74f362759127986c834a2f069ed4fa64ab1cd30.json b/graphify-out/cache/ast/v0.9.47-s2/05c37379ff5c24c9c875a806c74f362759127986c834a2f069ed4fa64ab1cd30.json new file mode 100644 index 0000000..d7be579 --- /dev/null +++ b/graphify-out/cache/ast/v0.9.47-s2/05c37379ff5c24c9c875a806c74f362759127986c834a2f069ed4fa64ab1cd30.json @@ -0,0 +1 @@ +{"nodes": [{"id": "$graphify-root$_tests_fixtures_markdown_conversion_valid_readability_md", "label": "valid_readability.md", "file_type": "document", "node_kind": "page", "source_file": "tests/fixtures/markdown_conversion/valid_readability.md", "source_location": "L1"}, {"id": "$graphify-root$_tests_fixtures_markdown_conversion_valid_readability_an\u00e1lisis_t\u00e1ctico_del_partido_de_river_en_bogot\u00e1", "label": "An\u00e1lisis t\u00e1ctico del partido de River en Bogot\u00e1", "file_type": "document", "node_kind": "heading", "source_file": "tests/fixtures/markdown_conversion/valid_readability.md", "source_location": "L1"}], "edges": [{"source": "$graphify-root$_tests_fixtures_markdown_conversion_valid_readability_md", "target": "$graphify-root$_tests_fixtures_markdown_conversion_valid_readability_an\u00e1lisis_t\u00e1ctico_del_partido_de_river_en_bogot\u00e1", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/fixtures/markdown_conversion/valid_readability.md", "source_location": "L1", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/graphify-out/cache/ast/v0.9.47-s2/1481575738d29705da2fb1db54f53a744cdc90a79f00331dde7c351619b4036e.json b/graphify-out/cache/ast/v0.9.47-s2/1481575738d29705da2fb1db54f53a744cdc90a79f00331dde7c351619b4036e.json new file mode 100644 index 0000000..3ab31a8 --- /dev/null +++ b/graphify-out/cache/ast/v0.9.47-s2/1481575738d29705da2fb1db54f53a744cdc90a79f00331dde7c351619b4036e.json @@ -0,0 +1 @@ +{"nodes": [{"id": "$graphify-root$_specs_005_convert_json_markdown_quickstart_md", "label": "quickstart.md", "file_type": "document", "node_kind": "page", "source_file": "specs/005-convert-json-markdown/quickstart.md", "source_location": "L1"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_quickstart_quickstart_convert_article_json_to_markdown", "label": "Quickstart: Convert Article JSON to Markdown", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/quickstart.md", "source_location": "L1"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_quickstart_1_prerequisites_setup", "label": "1. Prerequisites & Setup", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/quickstart.md", "source_location": "L5"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_quickstart_2_running_the_cli_tool", "label": "2. Running the CLI Tool", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/quickstart.md", "source_location": "L21"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_quickstart_basic_conversion_default_output_path", "label": "Basic Conversion (Default Output Path)", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/quickstart.md", "source_location": "L23"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_quickstart_custom_destination_path", "label": "Custom Destination Path", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/quickstart.md", "source_location": "L33"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_quickstart_3_verification_testing", "label": "3. Verification & Testing", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/quickstart.md", "source_location": "L45"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_quickstart_run_all_unit_integration_tests", "label": "Run All Unit & Integration Tests", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/quickstart.md", "source_location": "L47"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_quickstart_run_linter_type_checker", "label": "Run Linter & Type Checker", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/quickstart.md", "source_location": "L53"}], "edges": [{"source": "$graphify-root$_specs_005_convert_json_markdown_quickstart_md", "target": "$graphify-root$_specs_005_convert_json_markdown_quickstart_quickstart_convert_article_json_to_markdown", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/quickstart.md", "source_location": "L1", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_quickstart_quickstart_convert_article_json_to_markdown", "target": "$graphify-root$_specs_005_convert_json_markdown_quickstart_1_prerequisites_setup", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/quickstart.md", "source_location": "L5", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_quickstart_quickstart_convert_article_json_to_markdown", "target": "$graphify-root$_specs_005_convert_json_markdown_quickstart_2_running_the_cli_tool", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/quickstart.md", "source_location": "L21", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_quickstart_2_running_the_cli_tool", "target": "$graphify-root$_specs_005_convert_json_markdown_quickstart_basic_conversion_default_output_path", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/quickstart.md", "source_location": "L23", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_quickstart_2_running_the_cli_tool", "target": "$graphify-root$_specs_005_convert_json_markdown_quickstart_custom_destination_path", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/quickstart.md", "source_location": "L33", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_quickstart_quickstart_convert_article_json_to_markdown", "target": "$graphify-root$_specs_005_convert_json_markdown_quickstart_3_verification_testing", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/quickstart.md", "source_location": "L45", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_quickstart_3_verification_testing", "target": "$graphify-root$_specs_005_convert_json_markdown_quickstart_run_all_unit_integration_tests", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/quickstart.md", "source_location": "L47", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_quickstart_3_verification_testing", "target": "$graphify-root$_specs_005_convert_json_markdown_quickstart_run_linter_type_checker", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/quickstart.md", "source_location": "L53", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/graphify-out/cache/ast/v0.9.47-s2/2eb414a927cb0f39ba466d0870792afd73b719c8baa2fb5fe47020a024f93520.json b/graphify-out/cache/ast/v0.9.47-s2/2eb414a927cb0f39ba466d0870792afd73b719c8baa2fb5fe47020a024f93520.json new file mode 100644 index 0000000..3f78808 --- /dev/null +++ b/graphify-out/cache/ast/v0.9.47-s2/2eb414a927cb0f39ba466d0870792afd73b719c8baa2fb5fe47020a024f93520.json @@ -0,0 +1 @@ +{"nodes": [{"id": "$graphify-root$_specs_005_convert_json_markdown_data_model_md", "label": "data-model.md", "file_type": "document", "node_kind": "page", "source_file": "specs/005-convert-json-markdown/data-model.md", "source_location": "L1"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_data_model_data_model_convert_article_json_to_markdown", "label": "Data Model: Convert Article JSON to Markdown", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/data-model.md", "source_location": "L1"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_data_model_1_domain_entities_schemas", "label": "1. Domain Entities & Schemas", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/data-model.md", "source_location": "L5"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_data_model_entity_1_articleinput_source_json", "label": "Entity 1: `ArticleInput` (Source JSON)", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/data-model.md", "source_location": "L7"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_data_model_validation_rules", "label": "Validation Rules:", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/data-model.md", "source_location": "L26"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_data_model_entity_2_extractorblock_per_extractor_data", "label": "Entity 2: `ExtractorBlock` (Per-Extractor Data)", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/data-model.md", "source_location": "L34"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_data_model_entity_3_resolvedarticlemetadata", "label": "Entity 3: `ResolvedArticleMetadata`", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/data-model.md", "source_location": "L46"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_data_model_entity_4_markdowndocument", "label": "Entity 4: `MarkdownDocument`", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/data-model.md", "source_location": "L66"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_data_model_2_priority_resolution_matrix", "label": "2. Priority Resolution Matrix", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/data-model.md", "source_location": "L90"}], "edges": [{"source": "$graphify-root$_specs_005_convert_json_markdown_data_model_md", "target": "$graphify-root$_specs_005_convert_json_markdown_data_model_data_model_convert_article_json_to_markdown", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/data-model.md", "source_location": "L1", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_data_model_data_model_convert_article_json_to_markdown", "target": "$graphify-root$_specs_005_convert_json_markdown_data_model_1_domain_entities_schemas", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/data-model.md", "source_location": "L5", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_data_model_1_domain_entities_schemas", "target": "$graphify-root$_specs_005_convert_json_markdown_data_model_entity_1_articleinput_source_json", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/data-model.md", "source_location": "L7", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_data_model_entity_1_articleinput_source_json", "target": "$graphify-root$_specs_005_convert_json_markdown_data_model_validation_rules", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/data-model.md", "source_location": "L26", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_data_model_1_domain_entities_schemas", "target": "$graphify-root$_specs_005_convert_json_markdown_data_model_entity_2_extractorblock_per_extractor_data", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/data-model.md", "source_location": "L34", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_data_model_1_domain_entities_schemas", "target": "$graphify-root$_specs_005_convert_json_markdown_data_model_entity_3_resolvedarticlemetadata", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/data-model.md", "source_location": "L46", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_data_model_1_domain_entities_schemas", "target": "$graphify-root$_specs_005_convert_json_markdown_data_model_entity_4_markdowndocument", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/data-model.md", "source_location": "L66", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_data_model_data_model_convert_article_json_to_markdown", "target": "$graphify-root$_specs_005_convert_json_markdown_data_model_2_priority_resolution_matrix", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/data-model.md", "source_location": "L90", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/graphify-out/cache/ast/v0.9.47-s2/32a5e4fac2616b5d9ff8859c4e14a76f243c48ce6eedffde51cac9e97b5cd57c.json b/graphify-out/cache/ast/v0.9.47-s2/32a5e4fac2616b5d9ff8859c4e14a76f243c48ce6eedffde51cac9e97b5cd57c.json new file mode 100644 index 0000000..b69b9c4 --- /dev/null +++ b/graphify-out/cache/ast/v0.9.47-s2/32a5e4fac2616b5d9ff8859c4e14a76f243c48ce6eedffde51cac9e97b5cd57c.json @@ -0,0 +1 @@ +{"nodes": [{"id": "$graphify-root$_tests_fixtures_markdown_conversion_valid_newspaper4k_md", "label": "valid_newspaper4k.md", "file_type": "document", "node_kind": "page", "source_file": "tests/fixtures/markdown_conversion/valid_newspaper4k.md", "source_location": "L1"}, {"id": "$graphify-root$_tests_fixtures_markdown_conversion_valid_newspaper4k_qui\u00e9n_es_paz_zubiri_la_relatora_de_fox_sports", "label": "Qui\u00e9n es Paz Zubiri, la relatora de Fox Sports", "file_type": "document", "node_kind": "heading", "source_file": "tests/fixtures/markdown_conversion/valid_newspaper4k.md", "source_location": "L1"}], "edges": [{"source": "$graphify-root$_tests_fixtures_markdown_conversion_valid_newspaper4k_md", "target": "$graphify-root$_tests_fixtures_markdown_conversion_valid_newspaper4k_qui\u00e9n_es_paz_zubiri_la_relatora_de_fox_sports", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/fixtures/markdown_conversion/valid_newspaper4k.md", "source_location": "L1", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/graphify-out/cache/ast/v0.9.47-s2/36cde38c040c6fbfb15792ad8479c502c6b89b63070bf17120f39dafd6b27475.json b/graphify-out/cache/ast/v0.9.47-s2/36cde38c040c6fbfb15792ad8479c502c6b89b63070bf17120f39dafd6b27475.json new file mode 100644 index 0000000..643930e --- /dev/null +++ b/graphify-out/cache/ast/v0.9.47-s2/36cde38c040c6fbfb15792ad8479c502c6b89b63070bf17120f39dafd6b27475.json @@ -0,0 +1 @@ +{"nodes": [{"id": "$graphify-root$_scripts_convert_article_to_markdown_py", "label": "convert_article_to_markdown.py", "file_type": "code", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L1"}, {"id": "$graphify-root$_scripts_convert_article_to_markdown_normalize_scalar", "label": "normalize_scalar()", "file_type": "code", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L40", "_callable": true}, {"id": "any", "label": "Any", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "$graphify-root$/scripts/convert_article_to_markdown.py"}, {"id": "$graphify-root$_scripts_convert_article_to_markdown_normalize_list", "label": "normalize_list()", "file_type": "code", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L56", "_callable": true}, {"id": "$graphify-root$_scripts_convert_article_to_markdown_normalize_date", "label": "normalize_date()", "file_type": "code", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L104", "_callable": true}, {"id": "$graphify-root$_scripts_convert_article_to_markdown_validate_url", "label": "validate_url()", "file_type": "code", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L135", "_callable": true}, {"id": "$graphify-root$_scripts_convert_article_to_markdown_convert_html_to_markdown", "label": "convert_html_to_markdown()", "file_type": "code", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L149", "_callable": true}, {"id": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "label": "resolve_article_body()", "file_type": "code", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L167", "_callable": true}, {"id": "$graphify-root$_scripts_convert_article_to_markdown_get_dict", "label": "_get_dict()", "file_type": "code", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L225", "_callable": true}, {"id": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "label": "resolve_article_metadata()", "file_type": "code", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L231", "_callable": true}, {"id": "$graphify-root$_scripts_convert_article_to_markdown_remove_duplicate_initial_h1", "label": "remove_duplicate_initial_h1()", "file_type": "code", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L479", "_callable": true}, {"id": "$graphify-root$_scripts_convert_article_to_markdown_clean_body_images", "label": "clean_body_images()", "file_type": "code", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L514", "_callable": true}, {"id": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "label": "assemble_markdown_document()", "file_type": "code", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L546", "_callable": true}, {"id": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "label": "convert_article()", "file_type": "code", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L614", "_callable": true}, {"id": "path", "label": "Path", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "$graphify-root$/scripts/convert_article_to_markdown.py"}, {"id": "$graphify-root$_scripts_convert_article_to_markdown_parse_arguments", "label": "parse_arguments()", "file_type": "code", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L673", "_callable": true}, {"id": "namespace", "label": "Namespace", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "$graphify-root$/scripts/convert_article_to_markdown.py"}, {"id": "$graphify-root$_scripts_convert_article_to_markdown_main", "label": "main()", "file_type": "code", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L696", "_callable": true}, {"id": "$graphify-root$_scripts_convert_article_to_markdown_rationale_41", "label": "Decodifica entidades HTML, remove espa\u00e7os no in\u00edcio/fim, colapsa espa\u00e7os\u2026", "file_type": "rationale", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L41"}, {"id": "$graphify-root$_scripts_convert_article_to_markdown_rationale_57", "label": "Normaliza listas ou strings separadas por ponto e v\u00edrgula, descartando\u2026", "file_type": "rationale", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L57"}, {"id": "$graphify-root$_scripts_convert_article_to_markdown_rationale_105", "label": "Interpreta datas ISO 8601 e RFC 2822 preservando fuso hor\u00e1rio ou YYYY-MM-DD\u2026", "file_type": "rationale", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L105"}, {"id": "$graphify-root$_scripts_convert_article_to_markdown_rationale_136", "label": "Valida se a URL \u00e9 absoluta com protocolo http ou https e hostname n\u00e3o vazio.", "file_type": "rationale", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L136"}, {"id": "$graphify-root$_scripts_convert_article_to_markdown_rationale_150", "label": "Converte HTML para Markdown usando t\u00edtulos ATX, removendo scripts e estilos.", "file_type": "rationale", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L150"}, {"id": "$graphify-root$_scripts_convert_article_to_markdown_rationale_168", "label": "Obt\u00e9m o corpo do artigo exclusivamente do selected_extractor com fallback\u2026", "file_type": "rationale", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L168"}, {"id": "$graphify-root$_scripts_convert_article_to_markdown_rationale_226", "label": "Retorna o dicion\u00e1rio associado \u00e0 chave ou um dicion\u00e1rio vazio caso n\u00e3o seja\u2026", "file_type": "rationale", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L226"}, {"id": "$graphify-root$_scripts_convert_article_to_markdown_rationale_232", "label": "Resolve todos os metadados do artigo seguindo a matriz estrita de prioridades\u2026", "file_type": "rationale", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L232"}, {"id": "$graphify-root$_scripts_convert_article_to_markdown_rationale_480", "label": "Remove o primeiro t\u00edtulo H1 do corpo somente quando ele for igual ao t\u00edtulo\u2026", "file_type": "rationale", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L480"}, {"id": "$graphify-root$_scripts_convert_article_to_markdown_rationale_515", "label": "Preserva imagens com URL absoluta http/https, remove relativas/data:/vazias e\u2026", "file_type": "rationale", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L515"}, {"id": "$graphify-root$_scripts_convert_article_to_markdown_rationale_547", "label": "Monta a estrutura final do documento Markdown respeitando a ordem estrita do\u2026", "file_type": "rationale", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L547"}, {"id": "$graphify-root$_scripts_convert_article_to_markdown_rationale_615", "label": "Executa a leitura do JSON, valida\u00e7\u00e3o, convers\u00e3o e escrita at\u00f4mica do arquivo\u2026", "file_type": "rationale", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L615"}, {"id": "$graphify-root$_scripts_convert_article_to_markdown_rationale_674", "label": "Configura o parser de argumentos do CLI.", "file_type": "rationale", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L674"}, {"id": "$graphify-root$_scripts_convert_article_to_markdown_rationale_697", "label": "Ponto de entrada do CLI.", "file_type": "rationale", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L697"}], "edges": [{"source": "$graphify-root$_scripts_convert_article_to_markdown_py", "target": "argparse", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L11", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_py", "target": "datetime", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L12", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_py", "target": "email_utils", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L13", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_py", "target": "html", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L14", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_py", "target": "json", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L15", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_py", "target": "re", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L16", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_py", "target": "sys", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L17", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_py", "target": "urllib_parse", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L18", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_py", "target": "pathlib", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L19", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_py", "target": "typing", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L20", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_py", "target": "markdownify", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L22", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_py", "target": "$graphify-root$_scripts_convert_article_to_markdown_normalize_scalar", "relation": "contains", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L40", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_normalize_scalar", "target": "any", "relation": "references", "context": "parameter_type", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L40", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_py", "target": "$graphify-root$_scripts_convert_article_to_markdown_normalize_list", "relation": "contains", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L56", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_normalize_list", "target": "any", "relation": "references", "context": "parameter_type", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L56", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_py", "target": "$graphify-root$_scripts_convert_article_to_markdown_normalize_date", "relation": "contains", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L104", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_normalize_date", "target": "any", "relation": "references", "context": "parameter_type", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L104", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_py", "target": "$graphify-root$_scripts_convert_article_to_markdown_validate_url", "relation": "contains", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L135", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_validate_url", "target": "any", "relation": "references", "context": "parameter_type", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L135", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_py", "target": "$graphify-root$_scripts_convert_article_to_markdown_convert_html_to_markdown", "relation": "contains", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L149", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_py", "target": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "relation": "contains", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L167", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "target": "any", "relation": "references", "context": "generic_arg", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L167", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_py", "target": "$graphify-root$_scripts_convert_article_to_markdown_get_dict", "relation": "contains", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L225", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_get_dict", "target": "any", "relation": "references", "context": "generic_arg", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L225", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_get_dict", "target": "any", "relation": "references", "context": "generic_arg", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L225", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_py", "target": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "relation": "contains", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L231", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "target": "any", "relation": "references", "context": "generic_arg", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L231", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "target": "any", "relation": "references", "context": "generic_arg", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L231", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_py", "target": "$graphify-root$_scripts_convert_article_to_markdown_remove_duplicate_initial_h1", "relation": "contains", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L479", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_py", "target": "$graphify-root$_scripts_convert_article_to_markdown_clean_body_images", "relation": "contains", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L514", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_py", "target": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "relation": "contains", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L546", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "target": "any", "relation": "references", "context": "generic_arg", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L546", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_py", "target": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "relation": "contains", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L614", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "target": "path", "relation": "references", "context": "parameter_type", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L614", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "target": "path", "relation": "references", "context": "generic_arg", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L614", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "target": "path", "relation": "references", "context": "return_type", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L614", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_py", "target": "$graphify-root$_scripts_convert_article_to_markdown_parse_arguments", "relation": "contains", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L673", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_parse_arguments", "target": "namespace", "relation": "references", "context": "return_type", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L673", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_py", "target": "$graphify-root$_scripts_convert_article_to_markdown_main", "relation": "contains", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L696", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_normalize_list", "target": "$graphify-root$_scripts_convert_article_to_markdown_normalize_scalar", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L85", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_validate_url", "target": "$graphify-root$_scripts_convert_article_to_markdown_normalize_scalar", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L137", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "target": "$graphify-root$_scripts_convert_article_to_markdown_convert_html_to_markdown", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L197", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "target": "$graphify-root$_scripts_convert_article_to_markdown_get_dict", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L236", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "target": "$graphify-root$_scripts_convert_article_to_markdown_normalize_scalar", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L257", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "target": "$graphify-root$_scripts_convert_article_to_markdown_validate_url", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L282", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "target": "$graphify-root$_scripts_convert_article_to_markdown_normalize_list", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L331", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "target": "$graphify-root$_scripts_convert_article_to_markdown_normalize_date", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L352", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_remove_duplicate_initial_h1", "target": "$graphify-root$_scripts_convert_article_to_markdown_normalize_scalar", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L496", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "target": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L638", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "target": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L639", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "target": "$graphify-root$_scripts_convert_article_to_markdown_remove_duplicate_initial_h1", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L642", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "target": "$graphify-root$_scripts_convert_article_to_markdown_clean_body_images", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L643", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "target": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L646", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_main", "target": "$graphify-root$_scripts_convert_article_to_markdown_parse_arguments", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L699", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_main", "target": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L704", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_rationale_41", "target": "$graphify-root$_scripts_convert_article_to_markdown_normalize_scalar", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L41", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_rationale_57", "target": "$graphify-root$_scripts_convert_article_to_markdown_normalize_list", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L57", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_rationale_105", "target": "$graphify-root$_scripts_convert_article_to_markdown_normalize_date", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L105", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_rationale_136", "target": "$graphify-root$_scripts_convert_article_to_markdown_validate_url", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L136", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_rationale_150", "target": "$graphify-root$_scripts_convert_article_to_markdown_convert_html_to_markdown", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L150", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_rationale_168", "target": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L168", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_rationale_226", "target": "$graphify-root$_scripts_convert_article_to_markdown_get_dict", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L226", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_rationale_232", "target": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L232", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_rationale_480", "target": "$graphify-root$_scripts_convert_article_to_markdown_remove_duplicate_initial_h1", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L480", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_rationale_515", "target": "$graphify-root$_scripts_convert_article_to_markdown_clean_body_images", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L515", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_rationale_547", "target": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L547", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_rationale_615", "target": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L615", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_rationale_674", "target": "$graphify-root$_scripts_convert_article_to_markdown_parse_arguments", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L674", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_rationale_697", "target": "$graphify-root$_scripts_convert_article_to_markdown_main", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L697", "weight": 1.0}], "raw_calls": [{"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_scalar", "callee": "str", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L45"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_scalar", "callee": "strip", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L47", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_scalar", "callee": "unescape", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L47", "receiver": "html"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_scalar", "callee": "sub", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L50", "receiver": "re"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_scalar", "callee": "lower", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L51", "receiver": "collapsed"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_list", "callee": "list", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L65"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_list", "callee": "str", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L67"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_list", "callee": "extend", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L70", "receiver": "raw_items"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_list", "callee": "split", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L70", "receiver": "item"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_list", "callee": "extend", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L73", "receiver": "raw_items"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_list", "callee": "split", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L73", "receiver": "item"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_list", "callee": "append", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L75", "receiver": "raw_items"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_list", "callee": "str", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L76"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_list", "callee": "extend", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L77", "receiver": "raw_items"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_list", "callee": "split", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L77", "receiver": "value"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_list", "callee": "lower", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L89", "receiver": "norm"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_list", "callee": "startswith", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L91", "receiver": "norm_lower"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_list", "callee": "startswith", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L92", "receiver": "norm_lower"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_list", "callee": "startswith", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L93", "receiver": "norm_lower"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_list", "callee": "lower", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L96", "receiver": "norm"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_list", "callee": "add", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L98", "receiver": "seen_lower"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_list", "callee": "append", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L99", "receiver": "normalized_items"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_date", "callee": "str", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L108"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_date", "callee": "strip", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L110", "receiver": "value"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_date", "callee": "lower", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L111", "receiver": "s"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_date", "callee": "match", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L115", "receiver": "re"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_date", "callee": "fromisoformat", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L120", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_date", "callee": "isoformat", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L121", "receiver": "dt"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_date", "callee": "ValueError", "is_member_call": false, "indirect": true, "context": "collection", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L122"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_date", "callee": "TypeError", "is_member_call": false, "indirect": true, "context": "collection", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L122"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_date", "callee": "parsedate_to_datetime", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L127", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_date", "callee": "isoformat", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L128", "receiver": "dt"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_date", "callee": "ValueError", "is_member_call": false, "indirect": true, "context": "collection", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L129"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_date", "callee": "TypeError", "is_member_call": false, "indirect": true, "context": "collection", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L129"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_validate_url", "callee": "urlparse", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L141", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_validate_url", "callee": "lower", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L142", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_convert_html_to_markdown", "callee": "str", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L151"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_convert_html_to_markdown", "callee": "strip", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L151", "receiver": "html_content"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_convert_html_to_markdown", "callee": "sub", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L154", "receiver": "re"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_convert_html_to_markdown", "callee": "markdownify", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L160", "receiver": "markdownify"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_convert_html_to_markdown", "callee": "strip", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L164", "receiver": "md"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L172", "receiver": "article"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "ValueError", "is_member_call": false, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L174", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "join", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L176", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "VALID_EXTRACTORS", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L176"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L179", "receiver": "article"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "dict", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L180"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "ValueError", "is_member_call": false, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L181", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L186", "receiver": "extractor_data"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "str", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L187"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "strip", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L187", "receiver": "primary"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "strip", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L188", "receiver": "primary"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L190", "receiver": "extractor_data"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "str", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L191"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "strip", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L191", "receiver": "fallback"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "strip", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L192", "receiver": "fallback"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L195", "receiver": "extractor_data"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "str", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L196"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "strip", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L196", "receiver": "primary"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L201", "receiver": "extractor_data"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "str", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L202"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "strip", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L202", "receiver": "fallback"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "strip", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L203", "receiver": "fallback"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L206", "receiver": "extractor_data"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "str", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L207"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "strip", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L207", "receiver": "primary"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L212", "receiver": "extractor_data"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "str", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L213"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "strip", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L213", "receiver": "fallback"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "strip", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L214", "receiver": "fallback"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "strip", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L216", "receiver": "body"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "ValueError", "is_member_call": false, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L217", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "strip", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L222", "receiver": "body"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_get_dict", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L227", "receiver": "data"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_get_dict", "callee": "dict", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L228"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L235", "receiver": "article"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "append", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L245", "receiver": "title_candidates"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L245", "receiver": "sel_data"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "extend", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L247", "receiver": "title_candidates"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L248", "receiver": "input_meta"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L249", "receiver": "article"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L250", "receiver": "newspaper"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L251", "receiver": "trafilatura"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L252", "receiver": "readability"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "ValueError", "is_member_call": false, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L263", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L268", "receiver": "sel_data"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L270", "receiver": "sel_data"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L273", "receiver": "input_meta"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L274", "receiver": "article"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L276", "receiver": "trafilatura"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L277", "receiver": "newspaper"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "ValueError", "is_member_call": false, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L288", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L293", "receiver": "sel_data"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L295", "receiver": "sel_data"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L299", "receiver": "trafilatura"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L300", "receiver": "newspaper"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L301", "receiver": "input_meta"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "lower", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L309", "receiver": "val"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "lower", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L309", "receiver": "resolved_title"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L316", "receiver": "sel_data"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L318", "receiver": "sel_data"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L320", "receiver": "sel_data"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L324", "receiver": "newspaper"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L325", "receiver": "trafilatura"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L326", "receiver": "readability"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L339", "receiver": "sel_data"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L341", "receiver": "sel_data"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L345", "receiver": "newspaper"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L346", "receiver": "trafilatura"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L347", "receiver": "input_meta"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L360", "receiver": "sel_data"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L362", "receiver": "sel_data"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "urlparse", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L364", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L368", "receiver": "trafilatura"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L369", "receiver": "newspaper"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L370", "receiver": "trafilatura"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L382", "receiver": "sel_data"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L385", "receiver": "trafilatura"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L397", "receiver": "sel_data"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L399", "receiver": "sel_data"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L403", "receiver": "trafilatura"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L404", "receiver": "newspaper"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L405", "receiver": "newspaper"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L416", "receiver": "newspaper"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L417", "receiver": "newspaper"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L429", "receiver": "sel_data"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L431", "receiver": "sel_data"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L435", "receiver": "trafilatura"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L436", "receiver": "newspaper"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L448", "receiver": "sel_data"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L450", "receiver": "sel_data"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L454", "receiver": "newspaper"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L455", "receiver": "trafilatura"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_remove_duplicate_initial_h1", "callee": "splitlines", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L487", "receiver": "body"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_remove_duplicate_initial_h1", "callee": "strip", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L491", "receiver": "line"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_remove_duplicate_initial_h1", "callee": "startswith", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L494", "receiver": "stripped"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_remove_duplicate_initial_h1", "callee": "strip", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L495", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_remove_duplicate_initial_h1", "callee": "lower", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L498", "receiver": "norm_h1"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_remove_duplicate_initial_h1", "callee": "lower", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L498", "receiver": "norm_title"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_remove_duplicate_initial_h1", "callee": "pop", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L506", "receiver": "lines"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_remove_duplicate_initial_h1", "callee": "strip", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L508", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_remove_duplicate_initial_h1", "callee": "pop", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L509", "receiver": "lines"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_remove_duplicate_initial_h1", "callee": "join", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L511", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_clean_body_images", "callee": "sub", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L542", "receiver": "re"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_clean_body_images", "callee": "replace_image", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L542"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "append", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L559", "receiver": "sections"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L562", "receiver": "meta"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "append", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L563", "receiver": "sections"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L567", "receiver": "meta"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "append", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L568", "receiver": "meta_lines"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "join", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L568", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L569", "receiver": "meta"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "append", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L570", "receiver": "meta_lines"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L571", "receiver": "meta"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "append", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L572", "receiver": "meta_lines"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L573", "receiver": "meta"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "append", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L574", "receiver": "meta_lines"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "join", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L574", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L575", "receiver": "meta"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "append", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L576", "receiver": "meta_lines"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "join", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L576", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L577", "receiver": "meta"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "append", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L578", "receiver": "meta_lines"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "join", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L578", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L579", "receiver": "meta"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "append", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L580", "receiver": "meta_lines"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L581", "receiver": "meta"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "append", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L582", "receiver": "meta_lines"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "append", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L585", "receiver": "sections"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "join", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L585", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L588", "receiver": "meta"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "append", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L589", "receiver": "sections"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "append", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L592", "receiver": "sections"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "append", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L595", "receiver": "sections"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "strip", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L595", "receiver": "body"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "join", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L598", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "replace", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L602", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "replace", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L602", "receiver": "raw_doc"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "rstrip", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L604", "receiver": "line"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "split", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L604", "receiver": "raw_doc"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "join", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L605", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "sub", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L607", "receiver": "re"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "strip", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L609", "receiver": "formatted_doc"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "callee": "exists", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L618", "receiver": "input_path"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "callee": "is_file", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L618", "receiver": "input_path"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "callee": "FileNotFoundError", "is_member_call": false, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L619", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "callee": "read_text", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L622", "receiver": "input_path"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "callee": "loads", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L623", "receiver": "json"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "callee": "ValueError", "is_member_call": false, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L625", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "callee": "ValueError", "is_member_call": false, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L627", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "callee": "dict", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L629"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "callee": "ValueError", "is_member_call": false, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L630", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "callee": "ValueError", "is_member_call": false, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L633", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "callee": "with_suffix", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L650", "receiver": "input_path"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "callee": "mkdir", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L655", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "callee": "write_text", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L660", "receiver": "temp_file"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "callee": "replace", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L661", "receiver": "temp_file"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "callee": "exists", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L663", "receiver": "temp_file"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "callee": "unlink", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L665", "receiver": "temp_file"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "callee": "IOError", "is_member_call": false, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L668", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_parse_arguments", "callee": "ArgumentParser", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L675", "receiver": "argparse"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_parse_arguments", "callee": "add_argument", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L678", "receiver": "parser"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_parse_arguments", "callee": "Path", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L682"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_parse_arguments", "callee": "add_argument", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L685", "receiver": "parser"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_parse_arguments", "callee": "Path", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L689"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_parse_arguments", "callee": "parse_args", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L693", "receiver": "parser"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_main", "callee": "int", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L701"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_main", "callee": "write", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L705", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_main", "callee": "FileNotFoundError", "is_member_call": false, "indirect": true, "context": "collection", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L707"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_main", "callee": "ValueError", "is_member_call": false, "indirect": true, "context": "collection", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L707"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_main", "callee": "IOError", "is_member_call": false, "indirect": true, "context": "collection", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L707"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_main", "callee": "write", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L708", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_main", "callee": "write", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L711", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_main", "callee": "e", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L711"}]} \ No newline at end of file diff --git a/graphify-out/cache/ast/v0.9.47-s2/657df7e7174eb6dbe8846045ab0b790fa7c297002154eabfabbab737cf2e1eae.json b/graphify-out/cache/ast/v0.9.47-s2/657df7e7174eb6dbe8846045ab0b790fa7c297002154eabfabbab737cf2e1eae.json new file mode 100644 index 0000000..cc84c85 --- /dev/null +++ b/graphify-out/cache/ast/v0.9.47-s2/657df7e7174eb6dbe8846045ab0b790fa7c297002154eabfabbab737cf2e1eae.json @@ -0,0 +1 @@ +{"nodes": [{"id": "$graphify-root$_tests_test_convert_article_to_markdown_py", "label": "test_convert_article_to_markdown.py", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L1"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_body_trafilatura_markdown", "label": "test_resolve_article_body_trafilatura_markdown()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L47", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_body_trafilatura_fallback_text", "label": "test_resolve_article_body_trafilatura_fallback_text()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L60", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_body_newspaper4k_html_conversion", "label": "test_resolve_article_body_newspaper4k_html_conversion()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L73", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_body_readability_html_conversion", "label": "test_resolve_article_body_readability_html_conversion()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L88", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_body_strict_isolation_prohibits_cross_fallback", "label": "test_resolve_article_body_strict_isolation_prohibits_cross_fallback()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L102", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_scalar_string_and_placeholders", "label": "test_normalize_scalar_string_and_placeholders()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L124", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_list_strings_and_deduplication", "label": "test_normalize_list_strings_and_deduplication()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L139", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_date_iso_and_rfc2822", "label": "test_normalize_date_iso_and_rfc2822()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L159", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_validate_url_schemes", "label": "test_validate_url_schemes()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L175", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_metadata_priority", "label": "test_resolve_article_metadata_priority()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L187", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_remove_duplicate_initial_h1", "label": "test_remove_duplicate_initial_h1()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L249", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_clean_body_images_and_deduplicate", "label": "test_clean_body_images_and_deduplicate()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L258", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_assemble_markdown_document", "label": "test_assemble_markdown_document()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L274", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_golden_fixture_trafilatura", "label": "test_golden_fixture_trafilatura()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L313", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_golden_fixture_newspaper4k", "label": "test_golden_fixture_newspaper4k()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L329", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_golden_fixture_readability", "label": "test_golden_fixture_readability()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L345", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_default_output_path", "label": "test_cli_default_output_path()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L361", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_rejection_of_batch_articles_json", "label": "test_cli_rejection_of_batch_articles_json()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L386", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_corrupt_json", "label": "test_cli_corrupt_json()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L398", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_missing_required_fields", "label": "test_cli_missing_required_fields()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L410", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_argument_errors", "label": "test_cli_argument_errors()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L437", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_convert_html_to_markdown_basic", "label": "test_convert_html_to_markdown_basic()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L447", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_parse_arguments_direct", "label": "test_parse_arguments_direct()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L455", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_convert_article_direct", "label": "test_convert_article_direct()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L462", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_atomic_write_preserves_target_on_failure", "label": "test_cli_atomic_write_preserves_target_on_failure()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L483", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_1", "label": "Su\u00edte de Testes Automatizados para Convers\u00e3o de Artigo JSON para Markdown.\u2026", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L1"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_48", "label": "Garante que Trafilatura use diretamente o campo markdown.", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L48"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_61", "label": "Garante que Trafilatura fa\u00e7a fallback para text se markdown estiver vazio.", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L61"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_74", "label": "Garante convers\u00e3o de HTML para Markdown para Newspaper4k.", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L74"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_89", "label": "Garante convers\u00e3o de HTML para Markdown para Readability.", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L89"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_103", "label": "Garante que falhe se o corpo do extrator selecionado for vazio, sem usar outro\u2026", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L103"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_125", "label": "Testa decodifica\u00e7\u00e3o de entidades HTML, colapso de espa\u00e7os e filtro de\u2026", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L125"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_140", "label": "Testa normaliza\u00e7\u00e3o de listas, separa\u00e7\u00e3o por ponto e v\u00edrgula, deduplica\u00e7\u00e3o e\u2026", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L140"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_160", "label": "Testa parsing de datas ISO 8601 e RFC 2822 preservando fuso hor\u00e1rio.", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L160"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_176", "label": "Testa valida\u00e7\u00e3o estrita de URLs absolutas com http/https.", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L176"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_188", "label": "Testa a matriz determin\u00edstica de prioridades dos metadados.", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L188"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_250", "label": "Garante remo\u00e7\u00e3o apenas do H1 inicial que for id\u00eantico ao t\u00edtulo.", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L250"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_259", "label": "Garante remo\u00e7\u00e3o de imagens relativas/data: e deduplica\u00e7\u00e3o de imagens id\u00eanticas.", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L259"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_275", "label": "Testa a montagem completa da estrutura de se\u00e7\u00f5es do documento Markdown.", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L275"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_314", "label": "Valida\u00e7\u00e3o exata byte a byte da Golden Fixture de Trafilatura.", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L314"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_330", "label": "Valida\u00e7\u00e3o exata byte a byte da Golden Fixture de Newspaper4k.", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L330"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_346", "label": "Valida\u00e7\u00e3o exata byte a byte da Golden Fixture de Readability.", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L346"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_362", "label": "Testa gera\u00e7\u00e3o do arquivo de sa\u00edda padr\u00e3o .md.", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L362"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_387", "label": "Testa rejei\u00e7\u00e3o com c\u00f3digo 1 quando a entrada cont\u00e9m a chave articles.", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L387"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_399", "label": "Testa encerramento com c\u00f3digo 1 para JSON corrompido.", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L399"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_411", "label": "Testa falhas com c\u00f3digo 1 para campos obrigat\u00f3rios ausentes.", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L411"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_438", "label": "Testa erro de argumentos do argparse (c\u00f3digo 2).", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L438"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_448", "label": "Testa diretamente a fun\u00e7\u00e3o convert_html_to_markdown.", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L448"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_456", "label": "Testa diretamente o parsing de argumentos.", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L456"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_463", "label": "Testa diretamente a fun\u00e7\u00e3o convert_article em Python.", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L463"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_484", "label": "Garante que uma falha durante o processamento n\u00e3o altere o arquivo de destino\u2026", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L484"}], "edges": [{"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "json", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L10", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "subprocess", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L11", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "sys", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L12", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "pathlib", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L13", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "pytest", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L15", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "scripts_convert_article_to_markdown", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L23", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_body_trafilatura_markdown", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L47", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_body_trafilatura_fallback_text", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L60", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_body_newspaper4k_html_conversion", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L73", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_body_readability_html_conversion", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L88", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_body_strict_isolation_prohibits_cross_fallback", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L102", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_scalar_string_and_placeholders", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L124", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_list_strings_and_deduplication", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L139", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_date_iso_and_rfc2822", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L159", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_validate_url_schemes", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L175", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_metadata_priority", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L187", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_remove_duplicate_initial_h1", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L249", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_clean_body_images_and_deduplicate", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L258", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_assemble_markdown_document", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L274", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_golden_fixture_trafilatura", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L313", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_golden_fixture_newspaper4k", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L329", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_golden_fixture_readability", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L345", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_default_output_path", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L361", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_rejection_of_batch_articles_json", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L386", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_corrupt_json", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L398", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_missing_required_fields", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L410", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_argument_errors", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L437", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_convert_html_to_markdown_basic", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L447", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_parse_arguments_direct", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L455", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_convert_article_direct", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L462", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_atomic_write_preserves_target_on_failure", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L483", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_1", "target": "$graphify-root$_tests_test_convert_article_to_markdown_py", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L1", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_48", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_body_trafilatura_markdown", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L48", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_61", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_body_trafilatura_fallback_text", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L61", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_74", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_body_newspaper4k_html_conversion", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L74", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_89", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_body_readability_html_conversion", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L89", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_103", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_body_strict_isolation_prohibits_cross_fallback", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L103", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_125", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_scalar_string_and_placeholders", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L125", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_140", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_list_strings_and_deduplication", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L140", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_160", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_date_iso_and_rfc2822", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L160", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_176", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_validate_url_schemes", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L176", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_188", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_metadata_priority", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L188", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_250", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_remove_duplicate_initial_h1", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L250", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_259", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_clean_body_images_and_deduplicate", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L259", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_275", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_assemble_markdown_document", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L275", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_314", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_golden_fixture_trafilatura", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L314", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_330", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_golden_fixture_newspaper4k", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L330", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_346", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_golden_fixture_readability", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L346", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_362", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_default_output_path", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L362", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_387", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_rejection_of_batch_articles_json", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L387", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_399", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_corrupt_json", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L399", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_411", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_missing_required_fields", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L411", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_438", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_argument_errors", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L438", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_448", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_convert_html_to_markdown_basic", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L448", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_456", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_parse_arguments_direct", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L456", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_463", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_convert_article_direct", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L463", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_484", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_atomic_write_preserves_target_on_failure", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L484", "weight": 1.0}], "raw_calls": [{"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_body_trafilatura_markdown", "callee": "resolve_article_body", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L56", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_body_trafilatura_fallback_text", "callee": "resolve_article_body", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L69", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_body_newspaper4k_html_conversion", "callee": "resolve_article_body", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L82", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_body_readability_html_conversion", "callee": "resolve_article_body", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L97", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_body_strict_isolation_prohibits_cross_fallback", "callee": "raises", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L115", "receiver": "pytest"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_body_strict_isolation_prohibits_cross_fallback", "callee": "ValueError", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L115"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_body_strict_isolation_prohibits_cross_fallback", "callee": "resolve_article_body", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L116", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_scalar_string_and_placeholders", "callee": "normalize_scalar", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L126", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_scalar_string_and_placeholders", "callee": "normalize_scalar", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L127", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_scalar_string_and_placeholders", "callee": "normalize_scalar", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L128", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_scalar_string_and_placeholders", "callee": "normalize_scalar", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L129", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_scalar_string_and_placeholders", "callee": "normalize_scalar", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L130", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_scalar_string_and_placeholders", "callee": "normalize_scalar", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L131", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_scalar_string_and_placeholders", "callee": "normalize_scalar", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L132", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_scalar_string_and_placeholders", "callee": "normalize_scalar", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L133", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_scalar_string_and_placeholders", "callee": "normalize_scalar", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L134", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_scalar_string_and_placeholders", "callee": "normalize_scalar", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L135", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_scalar_string_and_placeholders", "callee": "normalize_scalar", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L136", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_list_strings_and_deduplication", "callee": "normalize_list", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L143", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_list_strings_and_deduplication", "callee": "normalize_list", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L147", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_list_strings_and_deduplication", "callee": "normalize_list", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L151", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_list_strings_and_deduplication", "callee": "normalize_list", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L154", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_list_strings_and_deduplication", "callee": "normalize_list", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L155", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_list_strings_and_deduplication", "callee": "normalize_list", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L156", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_date_iso_and_rfc2822", "callee": "normalize_date", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L162", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_date_iso_and_rfc2822", "callee": "normalize_date", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L164", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_date_iso_and_rfc2822", "callee": "normalize_date", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L164", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_date_iso_and_rfc2822", "callee": "normalize_date", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L166", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_date_iso_and_rfc2822", "callee": "normalize_date", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L168", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_date_iso_and_rfc2822", "callee": "normalize_date", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L171", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_date_iso_and_rfc2822", "callee": "normalize_date", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L172", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_validate_url_schemes", "callee": "validate_url", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L177", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_validate_url_schemes", "callee": "validate_url", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L178", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_validate_url_schemes", "callee": "validate_url", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L179", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_validate_url_schemes", "callee": "validate_url", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L180", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_validate_url_schemes", "callee": "validate_url", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L181", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_validate_url_schemes", "callee": "validate_url", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L182", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_validate_url_schemes", "callee": "validate_url", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L183", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_validate_url_schemes", "callee": "validate_url", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L184", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_metadata_priority", "callee": "resolve_article_metadata", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L224", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_remove_duplicate_initial_h1", "callee": "remove_duplicate_initial_h1", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L253", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_remove_duplicate_initial_h1", "callee": "startswith", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L254", "receiver": "cleaned"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_clean_body_images_and_deduplicate", "callee": "clean_body_images", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L267", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_clean_body_images_and_deduplicate", "callee": "count", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L268", "receiver": "cleaned"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_assemble_markdown_document", "callee": "assemble_markdown_document", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L290", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_assemble_markdown_document", "callee": "startswith", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L292", "receiver": "doc"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_assemble_markdown_document", "callee": "endswith", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L303", "receiver": "doc"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_assemble_markdown_document", "callee": "endswith", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L305", "receiver": "doc"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_golden_fixture_trafilatura", "callee": "read_text", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L316", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_golden_fixture_trafilatura", "callee": "run", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L319", "receiver": "subprocess"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_golden_fixture_trafilatura", "callee": "SCRIPT_PATH", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L320"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_golden_fixture_trafilatura", "callee": "read_text", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L325", "receiver": "output_md"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_golden_fixture_newspaper4k", "callee": "read_text", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L332", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_golden_fixture_newspaper4k", "callee": "run", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L335", "receiver": "subprocess"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_golden_fixture_newspaper4k", "callee": "SCRIPT_PATH", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L336"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_golden_fixture_newspaper4k", "callee": "read_text", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L341", "receiver": "output_md"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_golden_fixture_readability", "callee": "read_text", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L348", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_golden_fixture_readability", "callee": "run", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L351", "receiver": "subprocess"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_golden_fixture_readability", "callee": "SCRIPT_PATH", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L352"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_golden_fixture_readability", "callee": "read_text", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L357", "receiver": "output_md"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_default_output_path", "callee": "write_text", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L364", "receiver": "input_json"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_default_output_path", "callee": "dumps", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L365", "receiver": "json"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_default_output_path", "callee": "run", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L375", "receiver": "subprocess"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_default_output_path", "callee": "SCRIPT_PATH", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L376"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_default_output_path", "callee": "exists", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L382", "receiver": "expected_output"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_default_output_path", "callee": "read_text", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L383", "receiver": "expected_output"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_rejection_of_batch_articles_json", "callee": "run", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L389", "receiver": "subprocess"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_rejection_of_batch_articles_json", "callee": "SCRIPT_PATH", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L390"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_rejection_of_batch_articles_json", "callee": "lower", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L395", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_rejection_of_batch_articles_json", "callee": "lower", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L395", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_rejection_of_batch_articles_json", "callee": "lower", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L395", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_corrupt_json", "callee": "run", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L401", "receiver": "subprocess"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_corrupt_json", "callee": "SCRIPT_PATH", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L402"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_corrupt_json", "callee": "lower", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L407", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_missing_required_fields", "callee": "run", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L413", "receiver": "subprocess"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_missing_required_fields", "callee": "SCRIPT_PATH", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L414"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_missing_required_fields", "callee": "run", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L421", "receiver": "subprocess"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_missing_required_fields", "callee": "SCRIPT_PATH", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L422"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_missing_required_fields", "callee": "run", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L429", "receiver": "subprocess"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_missing_required_fields", "callee": "SCRIPT_PATH", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L430"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_argument_errors", "callee": "run", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L439", "receiver": "subprocess"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_argument_errors", "callee": "SCRIPT_PATH", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L440"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_convert_html_to_markdown_basic", "callee": "convert_html_to_markdown", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L450", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_parse_arguments_direct", "callee": "parse_arguments", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L457", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_parse_arguments_direct", "callee": "Path", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L458", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_parse_arguments_direct", "callee": "Path", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L459", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_convert_article_direct", "callee": "write_text", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L465", "receiver": "input_json"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_convert_article_direct", "callee": "dumps", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L466", "receiver": "json"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_convert_article_direct", "callee": "convert_article", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L477", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_convert_article_direct", "callee": "exists", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L479", "receiver": "output_md"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_convert_article_direct", "callee": "read_text", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L480", "receiver": "output_md"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_atomic_write_preserves_target_on_failure", "callee": "write_text", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L486", "receiver": "target_md"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_atomic_write_preserves_target_on_failure", "callee": "run", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L489", "receiver": "subprocess"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_atomic_write_preserves_target_on_failure", "callee": "SCRIPT_PATH", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L492"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_atomic_write_preserves_target_on_failure", "callee": "read_text", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L503", "receiver": "target_md"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_atomic_write_preserves_target_on_failure", "callee": "glob", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L505", "receiver": "tmp_path"}]} \ No newline at end of file diff --git a/graphify-out/cache/ast/v0.9.47-s2/66f816e6bda19ec162a55f35d16d5cc230e031e9002d434d69cdf79ca6fcea77.json b/graphify-out/cache/ast/v0.9.47-s2/66f816e6bda19ec162a55f35d16d5cc230e031e9002d434d69cdf79ca6fcea77.json new file mode 100644 index 0000000..5b3f6b4 --- /dev/null +++ b/graphify-out/cache/ast/v0.9.47-s2/66f816e6bda19ec162a55f35d16d5cc230e031e9002d434d69cdf79ca6fcea77.json @@ -0,0 +1 @@ +{"nodes": [{"id": "$graphify-root$_specs_005_convert_json_markdown_research_md", "label": "research.md", "file_type": "document", "node_kind": "page", "source_file": "specs/005-convert-json-markdown/research.md", "source_location": "L1"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_research_research_convert_article_json_to_markdown", "label": "Research: Convert Article JSON to Markdown", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/research.md", "source_location": "L1"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_research_1_executive_summary_goals", "label": "1. Executive Summary & Goals", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/research.md", "source_location": "L5"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_research_2_technical_decisions_research_findings", "label": "2. Technical Decisions & Research Findings", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/research.md", "source_location": "L11"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_research_decision_1_html_to_markdown_engine_selection", "label": "Decision 1: HTML-to-Markdown Engine Selection", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/research.md", "source_location": "L13"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_research_decision_2_direct_markdown_handling_for_trafilatura", "label": "Decision 2: Direct Markdown Handling for Trafilatura", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/research.md", "source_location": "L26"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_research_decision_3_metadata_normalization_priority_resolution_pipeline", "label": "Decision 3: Metadata Normalization & Priority Resolution Pipeline", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/research.md", "source_location": "L37"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_research_decision_4_date_parsing_strategy_iso_8601_rfc_2822", "label": "Decision 4: Date Parsing Strategy (ISO 8601 & RFC 2822)", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/research.md", "source_location": "L50"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_research_decision_5_url_validation_media_filtering", "label": "Decision 5: URL Validation & Media Filtering", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/research.md", "source_location": "L63"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_research_decision_6_duplicate_title_heading_h1_stripping", "label": "Decision 6: Duplicate Title Heading (H1) Stripping", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/research.md", "source_location": "L74"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_research_decision_7_atomic_file_writing_error_resilience", "label": "Decision 7: Atomic File Writing & Error Resilience", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/research.md", "source_location": "L85"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_research_3_technology_stack_dependencies", "label": "3. Technology Stack & Dependencies", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/research.md", "source_location": "L95"}], "edges": [{"source": "$graphify-root$_specs_005_convert_json_markdown_research_md", "target": "$graphify-root$_specs_005_convert_json_markdown_research_research_convert_article_json_to_markdown", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/research.md", "source_location": "L1", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_research_research_convert_article_json_to_markdown", "target": "$graphify-root$_specs_005_convert_json_markdown_research_1_executive_summary_goals", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/research.md", "source_location": "L5", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_research_research_convert_article_json_to_markdown", "target": "$graphify-root$_specs_005_convert_json_markdown_research_2_technical_decisions_research_findings", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/research.md", "source_location": "L11", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_research_2_technical_decisions_research_findings", "target": "$graphify-root$_specs_005_convert_json_markdown_research_decision_1_html_to_markdown_engine_selection", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/research.md", "source_location": "L13", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_research_2_technical_decisions_research_findings", "target": "$graphify-root$_specs_005_convert_json_markdown_research_decision_2_direct_markdown_handling_for_trafilatura", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/research.md", "source_location": "L26", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_research_2_technical_decisions_research_findings", "target": "$graphify-root$_specs_005_convert_json_markdown_research_decision_3_metadata_normalization_priority_resolution_pipeline", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/research.md", "source_location": "L37", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_research_2_technical_decisions_research_findings", "target": "$graphify-root$_specs_005_convert_json_markdown_research_decision_4_date_parsing_strategy_iso_8601_rfc_2822", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/research.md", "source_location": "L50", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_research_2_technical_decisions_research_findings", "target": "$graphify-root$_specs_005_convert_json_markdown_research_decision_5_url_validation_media_filtering", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/research.md", "source_location": "L63", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_research_2_technical_decisions_research_findings", "target": "$graphify-root$_specs_005_convert_json_markdown_research_decision_6_duplicate_title_heading_h1_stripping", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/research.md", "source_location": "L74", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_research_2_technical_decisions_research_findings", "target": "$graphify-root$_specs_005_convert_json_markdown_research_decision_7_atomic_file_writing_error_resilience", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/research.md", "source_location": "L85", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_research_research_convert_article_json_to_markdown", "target": "$graphify-root$_specs_005_convert_json_markdown_research_3_technology_stack_dependencies", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/research.md", "source_location": "L95", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/graphify-out/cache/ast/v0.9.47-s2/6e7faebc853323fb40729b8ea0b0719017c3387e69b4433fc9e4a2448d3efb9c.json b/graphify-out/cache/ast/v0.9.47-s2/6e7faebc853323fb40729b8ea0b0719017c3387e69b4433fc9e4a2448d3efb9c.json new file mode 100644 index 0000000..1b68448 --- /dev/null +++ b/graphify-out/cache/ast/v0.9.47-s2/6e7faebc853323fb40729b8ea0b0719017c3387e69b4433fc9e4a2448d3efb9c.json @@ -0,0 +1 @@ +{"nodes": [{"id": "$graphify-root$_specs_005_convert_json_markdown_spec_md", "label": "spec.md", "file_type": "document", "node_kind": "page", "source_file": "specs/005-convert-json-markdown/spec.md", "source_location": "L1"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_spec_feature_specification_convert_article_json_to_markdown", "label": "Feature Specification: Convert Article JSON to Markdown", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/spec.md", "source_location": "L1"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_spec_user_scenarios_testing_mandatory", "label": "User Scenarios & Testing *(mandatory)*", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/spec.md", "source_location": "L8"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_spec_user_story_1_single_article_json_to_clean_markdown_conversion_priority_p1", "label": "User Story 1 - Single Article JSON to Clean Markdown Conversion (Priority: P1)", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/spec.md", "source_location": "L10"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_spec_user_story_2_deterministic_metadata_resolution_and_fallback_priority_p2", "label": "User Story 2 - Deterministic Metadata Resolution and Fallback (Priority: P2)", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/spec.md", "source_location": "L27"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_spec_user_story_3_cli_usability_validation_and_atomic_output_priority_p3", "label": "User Story 3 - CLI Usability, Validation, and Atomic Output (Priority: P3)", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/spec.md", "source_location": "L44"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_spec_edge_cases", "label": "Edge Cases", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/spec.md", "source_location": "L61"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_spec_requirements_mandatory", "label": "Requirements *(mandatory)*", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/spec.md", "source_location": "L71"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_spec_functional_requirements", "label": "Functional Requirements", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/spec.md", "source_location": "L73"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_spec_key_entities", "label": "Key Entities", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/spec.md", "source_location": "L114"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_spec_success_criteria_mandatory", "label": "Success Criteria *(mandatory)*", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/spec.md", "source_location": "L120"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_spec_measurable_outcomes", "label": "Measurable Outcomes", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/spec.md", "source_location": "L122"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_spec_assumptions", "label": "Assumptions", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/spec.md", "source_location": "L131"}], "edges": [{"source": "$graphify-root$_specs_005_convert_json_markdown_spec_md", "target": "$graphify-root$_specs_005_convert_json_markdown_spec_feature_specification_convert_article_json_to_markdown", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/spec.md", "source_location": "L1", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_spec_feature_specification_convert_article_json_to_markdown", "target": "$graphify-root$_specs_005_convert_json_markdown_spec_user_scenarios_testing_mandatory", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/spec.md", "source_location": "L8", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_spec_user_scenarios_testing_mandatory", "target": "$graphify-root$_specs_005_convert_json_markdown_spec_user_story_1_single_article_json_to_clean_markdown_conversion_priority_p1", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/spec.md", "source_location": "L10", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_spec_user_scenarios_testing_mandatory", "target": "$graphify-root$_specs_005_convert_json_markdown_spec_user_story_2_deterministic_metadata_resolution_and_fallback_priority_p2", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/spec.md", "source_location": "L27", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_spec_user_scenarios_testing_mandatory", "target": "$graphify-root$_specs_005_convert_json_markdown_spec_user_story_3_cli_usability_validation_and_atomic_output_priority_p3", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/spec.md", "source_location": "L44", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_spec_user_scenarios_testing_mandatory", "target": "$graphify-root$_specs_005_convert_json_markdown_spec_edge_cases", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/spec.md", "source_location": "L61", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_spec_feature_specification_convert_article_json_to_markdown", "target": "$graphify-root$_specs_005_convert_json_markdown_spec_requirements_mandatory", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/spec.md", "source_location": "L71", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_spec_requirements_mandatory", "target": "$graphify-root$_specs_005_convert_json_markdown_spec_functional_requirements", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/spec.md", "source_location": "L73", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_spec_md", "target": "$graphify-root$_specs_005_convert_json_markdown_url_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/spec.md", "source_location": "L106", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_spec_requirements_mandatory", "target": "$graphify-root$_specs_005_convert_json_markdown_spec_key_entities", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/spec.md", "source_location": "L114", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_spec_feature_specification_convert_article_json_to_markdown", "target": "$graphify-root$_specs_005_convert_json_markdown_spec_success_criteria_mandatory", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/spec.md", "source_location": "L120", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_spec_success_criteria_mandatory", "target": "$graphify-root$_specs_005_convert_json_markdown_spec_measurable_outcomes", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/spec.md", "source_location": "L122", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_spec_feature_specification_convert_article_json_to_markdown", "target": "$graphify-root$_specs_005_convert_json_markdown_spec_assumptions", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/spec.md", "source_location": "L131", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/graphify-out/cache/ast/v0.9.47-s2/702ba88fb2e7c9740d4c83a0c1fd434d5c348b7691f12688a1c00c0ee4956afd.json b/graphify-out/cache/ast/v0.9.47-s2/702ba88fb2e7c9740d4c83a0c1fd434d5c348b7691f12688a1c00c0ee4956afd.json new file mode 100644 index 0000000..ab2bd78 --- /dev/null +++ b/graphify-out/cache/ast/v0.9.47-s2/702ba88fb2e7c9740d4c83a0c1fd434d5c348b7691f12688a1c00c0ee4956afd.json @@ -0,0 +1 @@ +{"nodes": [{"id": "$graphify-root$_specs_005_convert_json_markdown_checklists_requirements_md", "label": "requirements.md", "file_type": "document", "node_kind": "page", "source_file": "specs/005-convert-json-markdown/checklists/requirements.md", "source_location": "L1"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_checklists_requirements_specification_quality_checklist_convert_article_json_to_markdown", "label": "Specification Quality Checklist: Convert Article JSON to Markdown", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/checklists/requirements.md", "source_location": "L1"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_checklists_requirements_content_quality", "label": "Content Quality", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/checklists/requirements.md", "source_location": "L7"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_checklists_requirements_requirement_completeness", "label": "Requirement Completeness", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/checklists/requirements.md", "source_location": "L14"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_checklists_requirements_feature_readiness", "label": "Feature Readiness", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/checklists/requirements.md", "source_location": "L25"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_checklists_requirements_notes", "label": "Notes", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/checklists/requirements.md", "source_location": "L32"}], "edges": [{"source": "$graphify-root$_specs_005_convert_json_markdown_checklists_requirements_md", "target": "$graphify-root$_specs_005_convert_json_markdown_checklists_requirements_specification_quality_checklist_convert_article_json_to_markdown", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/checklists/requirements.md", "source_location": "L1", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_checklists_requirements_md", "target": "$graphify-root$_specs_005_convert_json_markdown_spec_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/checklists/requirements.md", "source_location": "L5", "weight": 1.0, "target_file": "$graphify-root$/specs/005-convert-json-markdown/spec.md"}, {"source": "$graphify-root$_specs_005_convert_json_markdown_checklists_requirements_specification_quality_checklist_convert_article_json_to_markdown", "target": "$graphify-root$_specs_005_convert_json_markdown_checklists_requirements_content_quality", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/checklists/requirements.md", "source_location": "L7", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_checklists_requirements_specification_quality_checklist_convert_article_json_to_markdown", "target": "$graphify-root$_specs_005_convert_json_markdown_checklists_requirements_requirement_completeness", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/checklists/requirements.md", "source_location": "L14", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_checklists_requirements_specification_quality_checklist_convert_article_json_to_markdown", "target": "$graphify-root$_specs_005_convert_json_markdown_checklists_requirements_feature_readiness", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/checklists/requirements.md", "source_location": "L25", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_checklists_requirements_specification_quality_checklist_convert_article_json_to_markdown", "target": "$graphify-root$_specs_005_convert_json_markdown_checklists_requirements_notes", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/checklists/requirements.md", "source_location": "L32", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/graphify-out/cache/ast/v0.9.47-s2/91fdcde7bf9404ff4fc8abd6b093352f7482ee8ab7e10177b227b213c8eb53e9.json b/graphify-out/cache/ast/v0.9.47-s2/91fdcde7bf9404ff4fc8abd6b093352f7482ee8ab7e10177b227b213c8eb53e9.json new file mode 100644 index 0000000..31d2e97 --- /dev/null +++ b/graphify-out/cache/ast/v0.9.47-s2/91fdcde7bf9404ff4fc8abd6b093352f7482ee8ab7e10177b227b213c8eb53e9.json @@ -0,0 +1 @@ +{"nodes": [{"id": "$graphify-root$_readme_md", "label": "README.md", "file_type": "document", "node_kind": "page", "source_file": "README.md", "source_location": "L1"}, {"id": "$graphify-root$_readme_textnlpclassifierapp", "label": "\ud83e\udde0 TextNLPClassifierApp", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L1"}, {"id": "$graphify-root$_readme_tabela_de_conte\u00fados", "label": "\ud83d\udcd1 Tabela de Conte\u00fados", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L13"}, {"id": "$graphify-root$_readme_vis\u00e3o_geral", "label": "\ud83c\udf1f Vis\u00e3o Geral", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L51"}, {"id": "$graphify-root$_readme_instala\u00e7\u00e3o_e_setup", "label": "\u2699\ufe0f Instala\u00e7\u00e3o e Setup", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L63"}, {"id": "$graphify-root$_readme_1_clonar_o_reposit\u00f3rio_e_criar_ambiente_virtual", "label": "1. Clonar o Reposit\u00f3rio e Criar Ambiente Virtual", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L65"}, {"id": "$graphify-root$_readme_2_instalar_depend\u00eancias", "label": "2. Instalar Depend\u00eancias", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L78"}, {"id": "$graphify-root$_readme_3_baixar_bin\u00e1rios_do_navegador_stealth_camoufox", "label": "3. Baixar Bin\u00e1rios do Navegador Stealth (Camoufox)", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L84"}, {"id": "$graphify-root$_readme_1_classificador_de_conte\u00fado_e_iner\u00eancia_nlp_llm_ecp", "label": "1. \ud83e\udde0 Classificador de Conte\u00fado e Iner\u00eancia (NLP / LLM / ECP)", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L94"}, {"id": "$graphify-root$_readme_o_que_\u00e9_e_como_funciona", "label": "O que \u00e9 e Como Funciona", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L96"}, {"id": "$graphify-root$_readme_arquitetura_de_classifica\u00e7\u00e3o_em_3_tiers", "label": "Arquitetura de Classifica\u00e7\u00e3o em 3 Tiers", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L102"}, {"id": "$graphify-root$_readme_categorias_de_decis\u00e3o", "label": "Categorias de Decis\u00e3o", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L123"}, {"id": "$graphify-root$_readme_formato_do_ecp_snapshot_e_markdown", "label": "Formato do ECP Snapshot e Markdown", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L132"}, {"id": "$graphify-root$_readme_exemplo_de_ecp_snapshot_ecp_sample_json", "label": "Exemplo de ECP Snapshot (`ecp_sample.json`):", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L134"}, {"id": "$graphify-root$_readme_exemplos_de_uso_cli", "label": "Exemplos de Uso CLI", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L156"}, {"id": "$graphify-root$_readme_2_extrator_de_manchetes_do_google_news", "label": "2. \ud83d\udcf0 Extrator de Manchetes do Google News", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L171"}, {"id": "$graphify-root$_readme_o_que_\u00e9_e_como_funciona_173", "label": "O que \u00e9 e Como Funciona", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L173"}, {"id": "$graphify-root$_readme_diferenciais_t\u00e9cnicos", "label": "Diferenciais T\u00e9cnicos", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L177"}, {"id": "$graphify-root$_readme_argumentos_e_flags_de_linha_de_comando", "label": "Argumentos e Flags de Linha de Comando", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L185"}, {"id": "$graphify-root$_readme_exemplos_pr\u00e1ticos_de_uso", "label": "Exemplos Pr\u00e1ticos de Uso", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L198"}, {"id": "$graphify-root$_readme_3_extrator_e_parser_multimotor_de_artigos", "label": "3. \ud83d\udcc4 Extrator e Parser Multimotor de Artigos", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L213"}, {"id": "$graphify-root$_readme_vis\u00e3o_geral_e_tr\u00edplice_extra\u00e7\u00e3o", "label": "Vis\u00e3o Geral e Tr\u00edplice Extra\u00e7\u00e3o", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L215"}, {"id": "$graphify-root$_readme_argumentos_e_flags_cli", "label": "Argumentos e Flags CLI", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L225"}, {"id": "$graphify-root$_readme_exemplos_de_uso", "label": "Exemplos de Uso", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L236"}, {"id": "$graphify-root$_readme_4_seletor_determin\u00edstico_de_conte\u00fado_de_artigos", "label": "4. \ud83c\udfaf Seletor Determin\u00edstico de Conte\u00fado de Artigos", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L251"}, {"id": "$graphify-root$_readme_vis\u00e3o_geral_e_algoritmo_de_consenso_f_1", "label": "Vis\u00e3o Geral e Algoritmo de Consenso ($F_1$)", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L253"}, {"id": "$graphify-root$_readme_pipeline_de_normaliza\u00e7\u00e3o_e_shingles", "label": "Pipeline de Normaliza\u00e7\u00e3o e Shingles", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L282"}, {"id": "$graphify-root$_readme_crit\u00e9rios_de_desempate_t\u00e9cnico_e_resili\u00eancia", "label": "Crit\u00e9rios de Desempate T\u00e9cnico e Resili\u00eancia", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L294"}, {"id": "$graphify-root$_readme_argumentos_e_flags_cli_306", "label": "Argumentos e Flags CLI", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L306"}, {"id": "$graphify-root$_readme_exemplos_pr\u00e1ticos_de_uso_315", "label": "Exemplos Pr\u00e1ticos de Uso", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L315"}, {"id": "$graphify-root$_readme_1_execu\u00e7\u00e3o_padr\u00e3o_autom\u00e1tica", "label": "1. Execu\u00e7\u00e3o Padr\u00e3o Autom\u00e1tica", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L317"}, {"id": "$graphify-root$_readme_2_execu\u00e7\u00e3o_com_modo_verboso", "label": "2. Execu\u00e7\u00e3o com Modo Verboso", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L323"}, {"id": "$graphify-root$_readme_3_uso_program\u00e1tico_como_m\u00f3dulo_python", "label": "3. Uso Program\u00e1tico como M\u00f3dulo Python", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L347"}, {"id": "$graphify-root$_readme_5_conversor_de_artigo_json_para_markdown", "label": "5. \ud83d\udcdd Conversor de Artigo JSON para Markdown", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L364"}, {"id": "$graphify-root$_readme_vis\u00e3o_geral_e_estrutura_do_documento", "label": "Vis\u00e3o Geral e Estrutura do Documento", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L366"}, {"id": "$graphify-root$_readme_isolamento_estrito_de_extratores_e_fallback", "label": "Isolamento Estrito de Extratores e Fallback", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L393"}, {"id": "$graphify-root$_readme_matriz_determin\u00edstica_de_metadados", "label": "Matriz Determin\u00edstica de Metadados", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L402"}, {"id": "$graphify-root$_readme_sanitiza\u00e7\u00e3o_editorial_e_deduplica\u00e7\u00e3o", "label": "Sanitiza\u00e7\u00e3o Editorial e Deduplica\u00e7\u00e3o", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L418"}, {"id": "$graphify-root$_readme_argumentos_e_flags_cli_425", "label": "Argumentos e Flags CLI", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L425"}, {"id": "$graphify-root$_readme_exemplos_pr\u00e1ticos_de_uso_432", "label": "Exemplos Pr\u00e1ticos de Uso", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L432"}, {"id": "$graphify-root$_readme_1_convers\u00e3o_padr\u00e3o", "label": "1. Convers\u00e3o Padr\u00e3o", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L434"}, {"id": "$graphify-root$_readme_2_convers\u00e3o_com_caminho_de_destino_personalizado", "label": "2. Convers\u00e3o com Caminho de Destino Personalizado", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L440"}, {"id": "$graphify-root$_readme_3_uso_program\u00e1tico_em_python", "label": "3. Uso Program\u00e1tico em Python", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L447"}, {"id": "$graphify-root$_readme_estrutura_do_projeto", "label": "\ud83d\udcc1 Estrutura do Projeto", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L458"}, {"id": "$graphify-root$_readme_testes_e_qualidade_de_c\u00f3digo", "label": "\ud83e\uddea Testes e Qualidade de C\u00f3digo", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L493"}, {"id": "$graphify-root$_readme_licen\u00e7a", "label": "\ud83d\udcc4 Licen\u00e7a", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L522"}], "edges": [{"source": "$graphify-root$_readme_md", "target": "$graphify-root$_readme_textnlpclassifierapp", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L1", "weight": 1.0}, {"source": "$graphify-root$_readme_textnlpclassifierapp", "target": "$graphify-root$_readme_tabela_de_conte\u00fados", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L13", "weight": 1.0}, {"source": "$graphify-root$_readme_textnlpclassifierapp", "target": "$graphify-root$_readme_vis\u00e3o_geral", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L51", "weight": 1.0}, {"source": "$graphify-root$_readme_textnlpclassifierapp", "target": "$graphify-root$_readme_instala\u00e7\u00e3o_e_setup", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L63", "weight": 1.0}, {"source": "$graphify-root$_readme_instala\u00e7\u00e3o_e_setup", "target": "$graphify-root$_readme_1_clonar_o_reposit\u00f3rio_e_criar_ambiente_virtual", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L65", "weight": 1.0}, {"source": "$graphify-root$_readme_instala\u00e7\u00e3o_e_setup", "target": "$graphify-root$_readme_2_instalar_depend\u00eancias", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L78", "weight": 1.0}, {"source": "$graphify-root$_readme_instala\u00e7\u00e3o_e_setup", "target": "$graphify-root$_readme_3_baixar_bin\u00e1rios_do_navegador_stealth_camoufox", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L84", "weight": 1.0}, {"source": "$graphify-root$_readme_textnlpclassifierapp", "target": "$graphify-root$_readme_1_classificador_de_conte\u00fado_e_iner\u00eancia_nlp_llm_ecp", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L94", "weight": 1.0}, {"source": "$graphify-root$_readme_1_classificador_de_conte\u00fado_e_iner\u00eancia_nlp_llm_ecp", "target": "$graphify-root$_readme_o_que_\u00e9_e_como_funciona", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L96", "weight": 1.0}, {"source": "$graphify-root$_readme_1_classificador_de_conte\u00fado_e_iner\u00eancia_nlp_llm_ecp", "target": "$graphify-root$_readme_arquitetura_de_classifica\u00e7\u00e3o_em_3_tiers", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L102", "weight": 1.0}, {"source": "$graphify-root$_readme_1_classificador_de_conte\u00fado_e_iner\u00eancia_nlp_llm_ecp", "target": "$graphify-root$_readme_categorias_de_decis\u00e3o", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L123", "weight": 1.0}, {"source": "$graphify-root$_readme_1_classificador_de_conte\u00fado_e_iner\u00eancia_nlp_llm_ecp", "target": "$graphify-root$_readme_formato_do_ecp_snapshot_e_markdown", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L132", "weight": 1.0}, {"source": "$graphify-root$_readme_formato_do_ecp_snapshot_e_markdown", "target": "$graphify-root$_readme_exemplo_de_ecp_snapshot_ecp_sample_json", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L134", "weight": 1.0}, {"source": "$graphify-root$_readme_1_classificador_de_conte\u00fado_e_iner\u00eancia_nlp_llm_ecp", "target": "$graphify-root$_readme_exemplos_de_uso_cli", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L156", "weight": 1.0}, {"source": "$graphify-root$_readme_textnlpclassifierapp", "target": "$graphify-root$_readme_2_extrator_de_manchetes_do_google_news", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L171", "weight": 1.0}, {"source": "$graphify-root$_readme_2_extrator_de_manchetes_do_google_news", "target": "$graphify-root$_readme_o_que_\u00e9_e_como_funciona_173", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L173", "weight": 1.0}, {"source": "$graphify-root$_readme_2_extrator_de_manchetes_do_google_news", "target": "$graphify-root$_readme_diferenciais_t\u00e9cnicos", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L177", "weight": 1.0}, {"source": "$graphify-root$_readme_2_extrator_de_manchetes_do_google_news", "target": "$graphify-root$_readme_argumentos_e_flags_de_linha_de_comando", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L185", "weight": 1.0}, {"source": "$graphify-root$_readme_2_extrator_de_manchetes_do_google_news", "target": "$graphify-root$_readme_exemplos_pr\u00e1ticos_de_uso", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L198", "weight": 1.0}, {"source": "$graphify-root$_readme_textnlpclassifierapp", "target": "$graphify-root$_readme_3_extrator_e_parser_multimotor_de_artigos", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L213", "weight": 1.0}, {"source": "$graphify-root$_readme_3_extrator_e_parser_multimotor_de_artigos", "target": "$graphify-root$_readme_vis\u00e3o_geral_e_tr\u00edplice_extra\u00e7\u00e3o", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L215", "weight": 1.0}, {"source": "$graphify-root$_readme_3_extrator_e_parser_multimotor_de_artigos", "target": "$graphify-root$_readme_argumentos_e_flags_cli", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L225", "weight": 1.0}, {"source": "$graphify-root$_readme_3_extrator_e_parser_multimotor_de_artigos", "target": "$graphify-root$_readme_exemplos_de_uso", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L236", "weight": 1.0}, {"source": "$graphify-root$_readme_textnlpclassifierapp", "target": "$graphify-root$_readme_4_seletor_determin\u00edstico_de_conte\u00fado_de_artigos", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L251", "weight": 1.0}, {"source": "$graphify-root$_readme_4_seletor_determin\u00edstico_de_conte\u00fado_de_artigos", "target": "$graphify-root$_readme_vis\u00e3o_geral_e_algoritmo_de_consenso_f_1", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L253", "weight": 1.0}, {"source": "$graphify-root$_readme_4_seletor_determin\u00edstico_de_conte\u00fado_de_artigos", "target": "$graphify-root$_readme_pipeline_de_normaliza\u00e7\u00e3o_e_shingles", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L282", "weight": 1.0}, {"source": "$graphify-root$_readme_md", "target": "$graphify-root$_url_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L287", "weight": 1.0}, {"source": "$graphify-root$_readme_4_seletor_determin\u00edstico_de_conte\u00fado_de_artigos", "target": "$graphify-root$_readme_crit\u00e9rios_de_desempate_t\u00e9cnico_e_resili\u00eancia", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L294", "weight": 1.0}, {"source": "$graphify-root$_readme_4_seletor_determin\u00edstico_de_conte\u00fado_de_artigos", "target": "$graphify-root$_readme_argumentos_e_flags_cli_306", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L306", "weight": 1.0}, {"source": "$graphify-root$_readme_4_seletor_determin\u00edstico_de_conte\u00fado_de_artigos", "target": "$graphify-root$_readme_exemplos_pr\u00e1ticos_de_uso_315", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L315", "weight": 1.0}, {"source": "$graphify-root$_readme_exemplos_pr\u00e1ticos_de_uso_315", "target": "$graphify-root$_readme_1_execu\u00e7\u00e3o_padr\u00e3o_autom\u00e1tica", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L317", "weight": 1.0}, {"source": "$graphify-root$_readme_exemplos_pr\u00e1ticos_de_uso_315", "target": "$graphify-root$_readme_2_execu\u00e7\u00e3o_com_modo_verboso", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L323", "weight": 1.0}, {"source": "$graphify-root$_readme_exemplos_pr\u00e1ticos_de_uso_315", "target": "$graphify-root$_readme_3_uso_program\u00e1tico_como_m\u00f3dulo_python", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L347", "weight": 1.0}, {"source": "$graphify-root$_readme_textnlpclassifierapp", "target": "$graphify-root$_readme_5_conversor_de_artigo_json_para_markdown", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L364", "weight": 1.0}, {"source": "$graphify-root$_readme_5_conversor_de_artigo_json_para_markdown", "target": "$graphify-root$_readme_vis\u00e3o_geral_e_estrutura_do_documento", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L366", "weight": 1.0}, {"source": "$graphify-root$_readme_5_conversor_de_artigo_json_para_markdown", "target": "$graphify-root$_readme_isolamento_estrito_de_extratores_e_fallback", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L393", "weight": 1.0}, {"source": "$graphify-root$_readme_5_conversor_de_artigo_json_para_markdown", "target": "$graphify-root$_readme_matriz_determin\u00edstica_de_metadados", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L402", "weight": 1.0}, {"source": "$graphify-root$_readme_5_conversor_de_artigo_json_para_markdown", "target": "$graphify-root$_readme_sanitiza\u00e7\u00e3o_editorial_e_deduplica\u00e7\u00e3o", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L418", "weight": 1.0}, {"source": "$graphify-root$_readme_5_conversor_de_artigo_json_para_markdown", "target": "$graphify-root$_readme_argumentos_e_flags_cli_425", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L425", "weight": 1.0}, {"source": "$graphify-root$_readme_5_conversor_de_artigo_json_para_markdown", "target": "$graphify-root$_readme_exemplos_pr\u00e1ticos_de_uso_432", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L432", "weight": 1.0}, {"source": "$graphify-root$_readme_exemplos_pr\u00e1ticos_de_uso_432", "target": "$graphify-root$_readme_1_convers\u00e3o_padr\u00e3o", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L434", "weight": 1.0}, {"source": "$graphify-root$_readme_exemplos_pr\u00e1ticos_de_uso_432", "target": "$graphify-root$_readme_2_convers\u00e3o_com_caminho_de_destino_personalizado", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L440", "weight": 1.0}, {"source": "$graphify-root$_readme_exemplos_pr\u00e1ticos_de_uso_432", "target": "$graphify-root$_readme_3_uso_program\u00e1tico_em_python", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L447", "weight": 1.0}, {"source": "$graphify-root$_readme_textnlpclassifierapp", "target": "$graphify-root$_readme_estrutura_do_projeto", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L458", "weight": 1.0}, {"source": "$graphify-root$_readme_textnlpclassifierapp", "target": "$graphify-root$_readme_testes_e_qualidade_de_c\u00f3digo", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L493", "weight": 1.0}, {"source": "$graphify-root$_readme_textnlpclassifierapp", "target": "$graphify-root$_readme_licen\u00e7a", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L522", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/graphify-out/cache/ast/v0.9.47-s2/93b93b8fe832e887faa7acf1dcd7f8121e7492213ffb20398af13ae520acb58d.json b/graphify-out/cache/ast/v0.9.47-s2/93b93b8fe832e887faa7acf1dcd7f8121e7492213ffb20398af13ae520acb58d.json new file mode 100644 index 0000000..0defd1b --- /dev/null +++ b/graphify-out/cache/ast/v0.9.47-s2/93b93b8fe832e887faa7acf1dcd7f8121e7492213ffb20398af13ae520acb58d.json @@ -0,0 +1 @@ +{"nodes": [{"id": "$graphify-root$_tests_test_convert_article_to_markdown_py", "label": "test_convert_article_to_markdown.py", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L1"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_scalar_complex_html_entities", "label": "test_normalize_scalar_complex_html_entities()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L44", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_scalar_whitespace_collapsing", "label": "test_normalize_scalar_whitespace_collapsing()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L50", "_callable": true}, {"id": "parametrize", "label": "parametrize", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "$graphify-root$/tests/test_convert_article_to_markdown.py"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_scalar_placeholders_discarded", "label": "test_normalize_scalar_placeholders_discarded()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L66", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_scalar_non_string_types", "label": "test_normalize_scalar_non_string_types()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L72", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_list_semicolon_and_comma_split", "label": "test_normalize_list_semicolon_and_comma_split()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L85", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_list_author_url_filtering", "label": "test_normalize_list_author_url_filtering()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L96", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_list_deduplication_preserves_case_and_order", "label": "test_normalize_list_deduplication_preserves_case_and_order()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L109", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_list_empty_and_invalid", "label": "test_normalize_list_empty_and_invalid()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L115", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_date_iso_8601_variants", "label": "test_normalize_date_iso_8601_variants()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L127", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_date_rfc_2822_variants", "label": "test_normalize_date_rfc_2822_variants()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L135", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_date_invalid_and_placeholders", "label": "test_normalize_date_invalid_and_placeholders()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L144", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_validate_url_valid_schemes", "label": "test_validate_url_valid_schemes()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L167", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_validate_url_invalid_schemes", "label": "test_validate_url_invalid_schemes()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L187", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_convert_html_to_markdown_rich_formatting", "label": "test_convert_html_to_markdown_rich_formatting()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L197", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_convert_html_to_markdown_empty_or_whitespace", "label": "test_convert_html_to_markdown_empty_or_whitespace()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L227", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_body_trafilatura_primary_and_fallback", "label": "test_resolve_article_body_trafilatura_primary_and_fallback()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L239", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_body_newspaper4k_primary_and_fallback", "label": "test_resolve_article_body_newspaper4k_primary_and_fallback()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L256", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_body_readability_primary_and_fallback", "label": "test_resolve_article_body_readability_primary_and_fallback()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L276", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_body_strict_isolation_all_extractors", "label": "test_resolve_article_body_strict_isolation_all_extractors()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L298", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_body_invalid_selected_extractor", "label": "test_resolve_article_body_invalid_selected_extractor()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L318", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_metadata_priority_title_all_fallbacks", "label": "test_metadata_priority_title_all_fallbacks()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L332", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_metadata_priority_original_url_all_fallbacks", "label": "test_metadata_priority_original_url_all_fallbacks()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L371", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_metadata_priority_subtitle_omitted_when_equal_to_title", "label": "test_metadata_priority_subtitle_omitted_when_equal_to_title()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L406", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_metadata_priority_first_valid_source_no_cross_merging", "label": "test_metadata_priority_first_valid_source_no_cross_merging()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L421", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_remove_duplicate_initial_h1_exact_and_variations", "label": "test_remove_duplicate_initial_h1_exact_and_variations()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L439", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_clean_body_images_removes_invalid_and_deduplicates", "label": "test_clean_body_images_removes_invalid_and_deduplicates()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L456", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_assemble_markdown_document_full_and_minimal", "label": "test_assemble_markdown_document_full_and_minimal()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L478", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_golden_fixtures_byte_level_precision", "label": "test_golden_fixtures_byte_level_precision()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L511", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_conversion_determinism_sha256_repeatability", "label": "test_conversion_determinism_sha256_repeatability()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L528", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_exit_codes_and_error_handling", "label": "test_cli_exit_codes_and_error_handling()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L552", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_json_root_must_be_object", "label": "test_cli_json_root_must_be_object()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L586", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_no_stdout_pollution_and_atomic_preservation", "label": "test_cli_no_stdout_pollution_and_atomic_preservation()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L601", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_default_output_naming", "label": "test_cli_default_output_naming()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L645", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_e2e_pipeline_with_real_extracted_selected_json", "label": "test_e2e_pipeline_with_real_extracted_selected_json()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L672", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_convert_article_api_direct", "label": "test_convert_article_api_direct()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L701", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_test_parse_arguments_api_direct", "label": "test_parse_arguments_api_direct()", "file_type": "code", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L719", "_callable": true}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_1", "label": "Su\u00edte de Testes Automatizados para Convers\u00e3o de Artigo JSON para Markdown.\u2026", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L1"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_45", "label": "Valida decodifica\u00e7\u00e3o de entidades HTML nomeadas e num\u00e9ricas.", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L45"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_51", "label": "Valida colapso de tabs, quebras de linha e espa\u00e7os m\u00faltiplos em um \u00fanico espa\u00e7o.", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L51"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_67", "label": "Garante que todos os placeholders documentados no PRD sejam descartados\u2026", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L67"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_73", "label": "Valida que entradas n\u00e3o string retornem None de forma segura.", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L73"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_86", "label": "Testa divis\u00e3o por ponto e v\u00edrgula na string e v\u00edrgulas em elementos de lista\u2026", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L86"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_97", "label": "Garante que URLs em campos de autor sejam estritamente descartadas.", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L97"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_110", "label": "Testa deduplica\u00e7\u00e3o case-insensitive preservando a grafia e ordem da primeira\u2026", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L110"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_116", "label": "Testa comportamento com listas vazias, nulas ou contendo apenas placeholders.", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L116"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_128", "label": "Valida parsing de datas ISO 8601 em m\u00faltiplos formatos e fusos.", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L128"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_136", "label": "Valida parsing de datas no formato RFC 2822 (usado em feeds RSS e cabe\u00e7alhos\u2026", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L136"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_145", "label": "Garante que datas inv\u00e1lidas ou placeholders retornem None sem lan\u00e7ar exce\u00e7\u00e3o\u2026", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L145"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_168", "label": "Garante aceita\u00e7\u00e3o de URLs absolutas com esquema HTTP e HTTPS v\u00e1lidos.", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L168"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_188", "label": "Garante rejei\u00e7\u00e3o de esquemas n\u00e3o permitidos, URLs relativas e strings vazias.", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L188"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_198", "label": "Valida convers\u00e3o de elementos HTML estruturados para Markdown com t\u00edtulos ATX.", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L198"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_228", "label": "Testa convers\u00e3o de HTML vazio retornando string vazia.", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L228"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_240", "label": "Testa prioridade trafilatura.markdown sobre trafilatura.text.", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L240"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_257", "label": "Testa prioridade newspaper4k.article_html sobre newspaper4k.text.", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L257"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_277", "label": "Testa prioridade readability.cleaned_html sobre readability.cleaned_text.", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L277"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_299", "label": "Garante que a aus\u00eancia de corpo no extrator selecionado NUNCA fa\u00e7a fallback\u2026", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L299"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_319", "label": "Garante erro ao receber selected_extractor ausente ou n\u00e3o reconhecido.", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L319"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_333", "label": "Valida a cadeia de fallback completa para o campo T\u00cdTULO (6 n\u00edveis).", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L333"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_372", "label": "Valida a cadeia de fallback completa para a URL ORIGINAL (5 n\u00edveis).", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L372"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_407", "label": "Garante que subt\u00edtulo id\u00eantico ao t\u00edtulo seja automaticamente omitido (None).", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L407"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_422", "label": "Garante que listas de autores/tags usem apenas a primeira fonte v\u00e1lida, sem\u2026", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L422"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_440", "label": "Testa remo\u00e7\u00e3o de H1 inicial coincidente com t\u00edtulo com varia\u00e7\u00f5es de espa\u00e7os e\u2026", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L440"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_457", "label": "Valida descarte de data:, relativos e deduplica\u00e7\u00e3o mantendo a primeira\u2026", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L457"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_479", "label": "Testa montagem com todos os campos e apenas com campos obrigat\u00f3rios.", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L479"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_512", "label": "Garante correspond\u00eancia exata byte a byte para Trafilatura, Newspaper4k e\u2026", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L512"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_529", "label": "Garante que m\u00faltiplas execu\u00e7\u00f5es no mesmo arquivo produzam hashes SHA-256\u2026", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L529"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_553", "label": "Testa toda a matriz de c\u00f3digos de sa\u00edda da CLI (0, 1, 2).", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L553"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_587", "label": "Garante encerramento com c\u00f3digo 1 caso a raiz do JSON seja lista, n\u00famero ou\u2026", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L587"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_602", "label": "Garante que stdout permane\u00e7a limpo e grava\u00e7\u00e3o at\u00f4mica preserve arquivos\u2026", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L602"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_646", "label": "Garante gera\u00e7\u00e3o autom\u00e1tica de .md quando -o n\u00e3o \u00e9 informado.", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L646"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_673", "label": "Valida a convers\u00e3o E2E de um artigo real extra\u00eddo do arquivo\u2026", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L673"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_702", "label": "Testa a chamada direta da fun\u00e7\u00e3o convert_article em c\u00f3digo Python.", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L702"}, {"id": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_720", "label": "Testa a chamada direta do parse_arguments.", "file_type": "rationale", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L720"}], "edges": [{"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "hashlib", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L12", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "json", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L13", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "subprocess", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L14", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "sys", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L15", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "pathlib", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L16", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "pytest", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L18", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "scripts_convert_article_to_markdown", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L20", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_scalar_complex_html_entities", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L44", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_scalar_whitespace_collapsing", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L50", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_scalar_placeholders_discarded", "target": "parametrize", "relation": "references", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L55", "weight": 1.0, "context": "decorator"}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_scalar_placeholders_discarded", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L66", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_scalar_non_string_types", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L72", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_list_semicolon_and_comma_split", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L85", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_list_author_url_filtering", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L96", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_list_deduplication_preserves_case_and_order", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L109", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_list_empty_and_invalid", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L115", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_date_iso_8601_variants", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L127", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_date_rfc_2822_variants", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L135", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_date_invalid_and_placeholders", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L144", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_test_validate_url_valid_schemes", "target": "parametrize", "relation": "references", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L158", "weight": 1.0, "context": "decorator"}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_validate_url_valid_schemes", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L167", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_test_validate_url_invalid_schemes", "target": "parametrize", "relation": "references", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L172", "weight": 1.0, "context": "decorator"}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_validate_url_invalid_schemes", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L187", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_convert_html_to_markdown_rich_formatting", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L197", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_convert_html_to_markdown_empty_or_whitespace", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L227", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_body_trafilatura_primary_and_fallback", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L239", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_body_newspaper4k_primary_and_fallback", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L256", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_body_readability_primary_and_fallback", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L276", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_body_strict_isolation_all_extractors", "target": "parametrize", "relation": "references", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L297", "weight": 1.0, "context": "decorator"}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_body_strict_isolation_all_extractors", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L298", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_body_invalid_selected_extractor", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L318", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_metadata_priority_title_all_fallbacks", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L332", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_metadata_priority_original_url_all_fallbacks", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L371", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_metadata_priority_subtitle_omitted_when_equal_to_title", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L406", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_metadata_priority_first_valid_source_no_cross_merging", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L421", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_remove_duplicate_initial_h1_exact_and_variations", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L439", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_clean_body_images_removes_invalid_and_deduplicates", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L456", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_assemble_markdown_document_full_and_minimal", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L478", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_golden_fixtures_byte_level_precision", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L511", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_conversion_determinism_sha256_repeatability", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L528", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_exit_codes_and_error_handling", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L552", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_json_root_must_be_object", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L586", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_no_stdout_pollution_and_atomic_preservation", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L601", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_default_output_naming", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L645", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_e2e_pipeline_with_real_extracted_selected_json", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L672", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_convert_article_api_direct", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L701", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_py", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_parse_arguments_api_direct", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L719", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_1", "target": "$graphify-root$_tests_test_convert_article_to_markdown_py", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L1", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_45", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_scalar_complex_html_entities", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L45", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_51", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_scalar_whitespace_collapsing", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L51", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_67", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_scalar_placeholders_discarded", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L67", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_73", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_scalar_non_string_types", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L73", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_86", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_list_semicolon_and_comma_split", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L86", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_97", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_list_author_url_filtering", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L97", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_110", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_list_deduplication_preserves_case_and_order", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L110", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_116", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_list_empty_and_invalid", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L116", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_128", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_date_iso_8601_variants", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L128", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_136", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_date_rfc_2822_variants", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L136", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_145", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_date_invalid_and_placeholders", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L145", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_168", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_validate_url_valid_schemes", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L168", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_188", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_validate_url_invalid_schemes", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L188", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_198", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_convert_html_to_markdown_rich_formatting", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L198", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_228", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_convert_html_to_markdown_empty_or_whitespace", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L228", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_240", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_body_trafilatura_primary_and_fallback", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L240", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_257", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_body_newspaper4k_primary_and_fallback", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L257", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_277", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_body_readability_primary_and_fallback", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L277", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_299", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_body_strict_isolation_all_extractors", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L299", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_319", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_body_invalid_selected_extractor", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L319", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_333", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_metadata_priority_title_all_fallbacks", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L333", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_372", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_metadata_priority_original_url_all_fallbacks", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L372", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_407", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_metadata_priority_subtitle_omitted_when_equal_to_title", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L407", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_422", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_metadata_priority_first_valid_source_no_cross_merging", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L422", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_440", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_remove_duplicate_initial_h1_exact_and_variations", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L440", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_457", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_clean_body_images_removes_invalid_and_deduplicates", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L457", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_479", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_assemble_markdown_document_full_and_minimal", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L479", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_512", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_golden_fixtures_byte_level_precision", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L512", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_529", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_conversion_determinism_sha256_repeatability", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L529", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_553", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_exit_codes_and_error_handling", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L553", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_587", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_json_root_must_be_object", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L587", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_602", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_no_stdout_pollution_and_atomic_preservation", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L602", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_646", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_default_output_naming", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L646", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_673", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_e2e_pipeline_with_real_extracted_selected_json", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L673", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_702", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_convert_article_api_direct", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L702", "weight": 1.0}, {"source": "$graphify-root$_tests_test_convert_article_to_markdown_rationale_720", "target": "$graphify-root$_tests_test_convert_article_to_markdown_test_parse_arguments_api_direct", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L720", "weight": 1.0}], "raw_calls": [{"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_scalar_complex_html_entities", "callee": "normalize_scalar", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L46", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_scalar_complex_html_entities", "callee": "normalize_scalar", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L47", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_scalar_whitespace_collapsing", "callee": "normalize_scalar", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L52", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_scalar_placeholders_discarded", "callee": "normalize_scalar", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L68", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_scalar_placeholders_discarded", "callee": "normalize_scalar", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L69", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_scalar_non_string_types", "callee": "normalize_scalar", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L74", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_scalar_non_string_types", "callee": "normalize_scalar", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L75", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_scalar_non_string_types", "callee": "normalize_scalar", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L76", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_scalar_non_string_types", "callee": "normalize_scalar", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L77", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_list_semicolon_and_comma_split", "callee": "normalize_list", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L89", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_list_semicolon_and_comma_split", "callee": "normalize_list", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L93", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_list_author_url_filtering", "callee": "normalize_list", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L105", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_list_deduplication_preserves_case_and_order", "callee": "normalize_list", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L112", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_list_empty_and_invalid", "callee": "normalize_list", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L117", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_list_empty_and_invalid", "callee": "normalize_list", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L118", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_list_empty_and_invalid", "callee": "normalize_list", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L119", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_date_iso_8601_variants", "callee": "normalize_date", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L129", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_date_iso_8601_variants", "callee": "normalize_date", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L130", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_date_iso_8601_variants", "callee": "normalize_date", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L132", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_date_rfc_2822_variants", "callee": "normalize_date", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L137", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_date_rfc_2822_variants", "callee": "normalize_date", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L140", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_date_invalid_and_placeholders", "callee": "normalize_date", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L146", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_date_invalid_and_placeholders", "callee": "normalize_date", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L147", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_date_invalid_and_placeholders", "callee": "normalize_date", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L148", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_date_invalid_and_placeholders", "callee": "normalize_date", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L149", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_normalize_date_invalid_and_placeholders", "callee": "normalize_date", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L150", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_validate_url_valid_schemes", "callee": "validate_url", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L169", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_validate_url_invalid_schemes", "callee": "validate_url", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L189", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_convert_html_to_markdown_rich_formatting", "callee": "convert_html_to_markdown", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L213", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_convert_html_to_markdown_empty_or_whitespace", "callee": "convert_html_to_markdown", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L229", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_convert_html_to_markdown_empty_or_whitespace", "callee": "convert_html_to_markdown", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L230", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_convert_html_to_markdown_empty_or_whitespace", "callee": "convert_html_to_markdown", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L231", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_body_trafilatura_primary_and_fallback", "callee": "resolve_article_body", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L246", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_body_trafilatura_primary_and_fallback", "callee": "resolve_article_body", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L253", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_body_newspaper4k_primary_and_fallback", "callee": "resolve_article_body", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L266", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_body_newspaper4k_primary_and_fallback", "callee": "resolve_article_body", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L273", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_body_readability_primary_and_fallback", "callee": "resolve_article_body", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L286", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_body_readability_primary_and_fallback", "callee": "resolve_article_body", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L294", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_body_strict_isolation_all_extractors", "callee": "raises", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L314", "receiver": "pytest"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_body_strict_isolation_all_extractors", "callee": "ValueError", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L314"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_body_strict_isolation_all_extractors", "callee": "resolve_article_body", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L315", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_body_invalid_selected_extractor", "callee": "raises", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L320", "receiver": "pytest"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_body_invalid_selected_extractor", "callee": "ValueError", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L320"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_body_invalid_selected_extractor", "callee": "resolve_article_body", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L321", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_body_invalid_selected_extractor", "callee": "raises", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L323", "receiver": "pytest"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_body_invalid_selected_extractor", "callee": "ValueError", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L323"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_resolve_article_body_invalid_selected_extractor", "callee": "resolve_article_body", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L324", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_metadata_priority_title_all_fallbacks", "callee": "resolve_article_metadata", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L336", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_metadata_priority_title_all_fallbacks", "callee": "resolve_article_metadata", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L344", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_metadata_priority_title_all_fallbacks", "callee": "resolve_article_metadata", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L352", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_metadata_priority_title_all_fallbacks", "callee": "resolve_article_metadata", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L360", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_metadata_priority_title_all_fallbacks", "callee": "resolve_article_metadata", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L368", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_metadata_priority_original_url_all_fallbacks", "callee": "resolve_article_metadata", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L380", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_metadata_priority_original_url_all_fallbacks", "callee": "resolve_article_metadata", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L388", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_metadata_priority_original_url_all_fallbacks", "callee": "resolve_article_metadata", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L395", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_metadata_priority_original_url_all_fallbacks", "callee": "resolve_article_metadata", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L403", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_metadata_priority_subtitle_omitted_when_equal_to_title", "callee": "resolve_article_metadata", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L416", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_metadata_priority_first_valid_source_no_cross_merging", "callee": "resolve_article_metadata", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L429", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_remove_duplicate_initial_h1_exact_and_variations", "callee": "strip", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L445", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_remove_duplicate_initial_h1_exact_and_variations", "callee": "remove_duplicate_initial_h1", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L445", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_remove_duplicate_initial_h1_exact_and_variations", "callee": "remove_duplicate_initial_h1", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L449", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_remove_duplicate_initial_h1_exact_and_variations", "callee": "remove_duplicate_initial_h1", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L453", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_clean_body_images_removes_invalid_and_deduplicates", "callee": "clean_body_images", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L465", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_clean_body_images_removes_invalid_and_deduplicates", "callee": "count", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L467", "receiver": "cleaned"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_assemble_markdown_document_full_and_minimal", "callee": "assemble_markdown_document", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L494", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_assemble_markdown_document_full_and_minimal", "callee": "startswith", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L496", "receiver": "doc_min"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_assemble_markdown_document_full_and_minimal", "callee": "endswith", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L502", "receiver": "doc_min"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_assemble_markdown_document_full_and_minimal", "callee": "endswith", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L503", "receiver": "doc_min"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_golden_fixtures_byte_level_precision", "callee": "read_text", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L515", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_golden_fixtures_byte_level_precision", "callee": "run", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L518", "receiver": "subprocess"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_golden_fixtures_byte_level_precision", "callee": "SCRIPT_PATH", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L519"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_golden_fixtures_byte_level_precision", "callee": "read_text", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L524", "receiver": "output_md"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_conversion_determinism_sha256_repeatability", "callee": "run", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L535", "receiver": "subprocess"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_conversion_determinism_sha256_repeatability", "callee": "SCRIPT_PATH", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L536"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_conversion_determinism_sha256_repeatability", "callee": "read_bytes", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L541", "receiver": "out_md"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_conversion_determinism_sha256_repeatability", "callee": "add", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L542", "receiver": "hashes"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_conversion_determinism_sha256_repeatability", "callee": "hexdigest", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L542", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_conversion_determinism_sha256_repeatability", "callee": "sha256", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L542", "receiver": "hashlib"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_exit_codes_and_error_handling", "callee": "run", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L555", "receiver": "subprocess"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_exit_codes_and_error_handling", "callee": "SCRIPT_PATH", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L555"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_exit_codes_and_error_handling", "callee": "run", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L559", "receiver": "subprocess"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_exit_codes_and_error_handling", "callee": "SCRIPT_PATH", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L560"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_exit_codes_and_error_handling", "callee": "lower", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L565", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_exit_codes_and_error_handling", "callee": "run", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L568", "receiver": "subprocess"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_exit_codes_and_error_handling", "callee": "SCRIPT_PATH", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L569"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_exit_codes_and_error_handling", "callee": "lower", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L574", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_exit_codes_and_error_handling", "callee": "run", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L577", "receiver": "subprocess"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_exit_codes_and_error_handling", "callee": "SCRIPT_PATH", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L578"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_exit_codes_and_error_handling", "callee": "lower", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L583", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_json_root_must_be_object", "callee": "write_text", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L590", "receiver": "bad_json"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_json_root_must_be_object", "callee": "dumps", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L590", "receiver": "json"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_json_root_must_be_object", "callee": "run", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L592", "receiver": "subprocess"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_json_root_must_be_object", "callee": "SCRIPT_PATH", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L593"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_json_root_must_be_object", "callee": "lower", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L598", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_json_root_must_be_object", "callee": "lower", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L598", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_no_stdout_pollution_and_atomic_preservation", "callee": "write_text", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L604", "receiver": "target_md"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_no_stdout_pollution_and_atomic_preservation", "callee": "run", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L607", "receiver": "subprocess"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_no_stdout_pollution_and_atomic_preservation", "callee": "SCRIPT_PATH", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L610"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_no_stdout_pollution_and_atomic_preservation", "callee": "run", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L624", "receiver": "subprocess"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_no_stdout_pollution_and_atomic_preservation", "callee": "SCRIPT_PATH", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L627"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_no_stdout_pollution_and_atomic_preservation", "callee": "read_text", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L638", "receiver": "target_md"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_no_stdout_pollution_and_atomic_preservation", "callee": "glob", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L641", "receiver": "tmp_path"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_default_output_naming", "callee": "write_text", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L648", "receiver": "sample_file"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_default_output_naming", "callee": "dumps", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L649", "receiver": "json"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_default_output_naming", "callee": "run", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L656", "receiver": "subprocess"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_default_output_naming", "callee": "SCRIPT_PATH", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L657"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_default_output_naming", "callee": "exists", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L663", "receiver": "expected_md"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_cli_default_output_naming", "callee": "read_text", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L664", "receiver": "expected_md"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_e2e_pipeline_with_real_extracted_selected_json", "callee": "Path", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L674", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_e2e_pipeline_with_real_extracted_selected_json", "callee": "__file__", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L674"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_e2e_pipeline_with_real_extracted_selected_json", "callee": "exists", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L675", "receiver": "sample_source"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_e2e_pipeline_with_real_extracted_selected_json", "callee": "skip", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L676", "receiver": "pytest"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_e2e_pipeline_with_real_extracted_selected_json", "callee": "loads", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L678", "receiver": "json"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_e2e_pipeline_with_real_extracted_selected_json", "callee": "read_text", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L678", "receiver": "sample_source"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_e2e_pipeline_with_real_extracted_selected_json", "callee": "write_text", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L683", "receiver": "input_json"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_e2e_pipeline_with_real_extracted_selected_json", "callee": "dumps", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L683", "receiver": "json"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_e2e_pipeline_with_real_extracted_selected_json", "callee": "run", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L686", "receiver": "subprocess"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_e2e_pipeline_with_real_extracted_selected_json", "callee": "SCRIPT_PATH", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L687"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_e2e_pipeline_with_real_extracted_selected_json", "callee": "exists", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L692", "receiver": "output_md"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_e2e_pipeline_with_real_extracted_selected_json", "callee": "read_text", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L694", "receiver": "output_md"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_e2e_pipeline_with_real_extracted_selected_json", "callee": "startswith", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L695", "receiver": "md_content"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_e2e_pipeline_with_real_extracted_selected_json", "callee": "splitlines", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L698", "receiver": "md_content"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_convert_article_api_direct", "callee": "write_text", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L704", "receiver": "in_file"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_convert_article_api_direct", "callee": "dumps", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L705", "receiver": "json"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_convert_article_api_direct", "callee": "convert_article", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L713", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_convert_article_api_direct", "callee": "exists", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L715", "receiver": "out_file"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_convert_article_api_direct", "callee": "read_text", "is_member_call": true, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L716", "receiver": "out_file"}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_parse_arguments_api_direct", "callee": "parse_arguments", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L721", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_parse_arguments_api_direct", "callee": "Path", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L722", "receiver": null}, {"caller_nid": "$graphify-root$_tests_test_convert_article_to_markdown_test_parse_arguments_api_direct", "callee": "Path", "is_member_call": false, "source_file": "tests/test_convert_article_to_markdown.py", "source_location": "L723", "receiver": null}]} \ No newline at end of file diff --git a/graphify-out/cache/ast/v0.9.47-s2/9ec3cc4573e6b7e18b68101acfcdd3a838a4f0453ed5a669a1d7f778b98e16d7.json b/graphify-out/cache/ast/v0.9.47-s2/9ec3cc4573e6b7e18b68101acfcdd3a838a4f0453ed5a669a1d7f778b98e16d7.json new file mode 100644 index 0000000..87a535f --- /dev/null +++ b/graphify-out/cache/ast/v0.9.47-s2/9ec3cc4573e6b7e18b68101acfcdd3a838a4f0453ed5a669a1d7f778b98e16d7.json @@ -0,0 +1 @@ +{"nodes": [{"id": "$graphify-root$_specs_005_convert_json_markdown_tasks_md", "label": "tasks.md", "file_type": "document", "node_kind": "page", "source_file": "specs/005-convert-json-markdown/tasks.md", "source_location": "L1"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_tasks_tasks_convert_article_json_to_markdown", "label": "Tasks: Convert Article JSON to Markdown", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/tasks.md", "source_location": "L1"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_tasks_phase_1_setup_shared_infrastructure", "label": "Phase 1: Setup (Shared Infrastructure)", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/tasks.md", "source_location": "L8"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_tasks_phase_2_foundational_blocking_prerequisites", "label": "Phase 2: Foundational (Blocking Prerequisites)", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/tasks.md", "source_location": "L17"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_tasks_phase_3_user_story_1_single_article_json_to_clean_markdown_conversion_priority_p1_mvp", "label": "Phase 3: User Story 1 - Single Article JSON to Clean Markdown Conversion (Priority: P1) \ud83c\udfaf MVP", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/tasks.md", "source_location": "L30"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_tasks_tests_for_user_story_1_tdd", "label": "Tests for User Story 1 (TDD) \u26a0\ufe0f", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/tasks.md", "source_location": "L36"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_tasks_implementation_for_user_story_1", "label": "Implementation for User Story 1", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/tasks.md", "source_location": "L41"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_tasks_phase_4_user_story_2_deterministic_metadata_resolution_and_fallback_priority_p2", "label": "Phase 4: User Story 2 - Deterministic Metadata Resolution and Fallback (Priority: P2)", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/tasks.md", "source_location": "L50"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_tasks_tests_for_user_story_2_tdd", "label": "Tests for User Story 2 (TDD) \u26a0\ufe0f", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/tasks.md", "source_location": "L56"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_tasks_implementation_for_user_story_2", "label": "Implementation for User Story 2", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/tasks.md", "source_location": "L61"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_tasks_phase_5_user_story_3_cli_usability_validation_and_atomic_output_priority_p3", "label": "Phase 5: User Story 3 - CLI Usability, Validation, and Atomic Output (Priority: P3)", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/tasks.md", "source_location": "L73"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_tasks_tests_for_user_story_3_tdd", "label": "Tests for User Story 3 (TDD) \u26a0\ufe0f", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/tasks.md", "source_location": "L79"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_tasks_implementation_for_user_story_3", "label": "Implementation for User Story 3", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/tasks.md", "source_location": "L84"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_tasks_phase_6_polish_cross_cutting_concerns", "label": "Phase 6: Polish & Cross-Cutting Concerns", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/tasks.md", "source_location": "L93"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_tasks_dependencies_execution_order", "label": "Dependencies & Execution Order", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/tasks.md", "source_location": "L104"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_tasks_phase_dependencies", "label": "Phase Dependencies", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/tasks.md", "source_location": "L106"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_tasks_parallel_opportunities", "label": "Parallel Opportunities", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/tasks.md", "source_location": "L117"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_tasks_implementation_strategy", "label": "Implementation Strategy", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/tasks.md", "source_location": "L128"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_tasks_mvp_first_user_story_1_only", "label": "MVP First (User Story 1 Only)", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/tasks.md", "source_location": "L130"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_tasks_incremental_delivery", "label": "Incremental Delivery", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/tasks.md", "source_location": "L135"}], "edges": [{"source": "$graphify-root$_specs_005_convert_json_markdown_tasks_md", "target": "$graphify-root$_specs_005_convert_json_markdown_tasks_tasks_convert_article_json_to_markdown", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/tasks.md", "source_location": "L1", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_tasks_md", "target": "$graphify-root$_specs_005_convert_json_markdown_spec_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/tasks.md", "source_location": "L4", "weight": 1.0, "target_file": "$graphify-root$/specs/005-convert-json-markdown/spec.md"}, {"source": "$graphify-root$_specs_005_convert_json_markdown_tasks_md", "target": "$graphify-root$_specs_005_convert_json_markdown_plan_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/tasks.md", "source_location": "L4", "weight": 1.0, "target_file": "$graphify-root$/specs/005-convert-json-markdown/plan.md"}, {"source": "$graphify-root$_specs_005_convert_json_markdown_tasks_md", "target": "$graphify-root$_specs_005_convert_json_markdown_data_model_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/tasks.md", "source_location": "L4", "weight": 1.0, "target_file": "$graphify-root$/specs/005-convert-json-markdown/data-model.md"}, {"source": "$graphify-root$_specs_005_convert_json_markdown_tasks_tasks_convert_article_json_to_markdown", "target": "$graphify-root$_specs_005_convert_json_markdown_tasks_phase_1_setup_shared_infrastructure", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/tasks.md", "source_location": "L8", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_tasks_tasks_convert_article_json_to_markdown", "target": "$graphify-root$_specs_005_convert_json_markdown_tasks_phase_2_foundational_blocking_prerequisites", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/tasks.md", "source_location": "L17", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_tasks_tasks_convert_article_json_to_markdown", "target": "$graphify-root$_specs_005_convert_json_markdown_tasks_phase_3_user_story_1_single_article_json_to_clean_markdown_conversion_priority_p1_mvp", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/tasks.md", "source_location": "L30", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_tasks_phase_3_user_story_1_single_article_json_to_clean_markdown_conversion_priority_p1_mvp", "target": "$graphify-root$_specs_005_convert_json_markdown_tasks_tests_for_user_story_1_tdd", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/tasks.md", "source_location": "L36", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_tasks_phase_3_user_story_1_single_article_json_to_clean_markdown_conversion_priority_p1_mvp", "target": "$graphify-root$_specs_005_convert_json_markdown_tasks_implementation_for_user_story_1", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/tasks.md", "source_location": "L41", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_tasks_tasks_convert_article_json_to_markdown", "target": "$graphify-root$_specs_005_convert_json_markdown_tasks_phase_4_user_story_2_deterministic_metadata_resolution_and_fallback_priority_p2", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/tasks.md", "source_location": "L50", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_tasks_phase_4_user_story_2_deterministic_metadata_resolution_and_fallback_priority_p2", "target": "$graphify-root$_specs_005_convert_json_markdown_tasks_tests_for_user_story_2_tdd", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/tasks.md", "source_location": "L56", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_tasks_phase_4_user_story_2_deterministic_metadata_resolution_and_fallback_priority_p2", "target": "$graphify-root$_specs_005_convert_json_markdown_tasks_implementation_for_user_story_2", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/tasks.md", "source_location": "L61", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_tasks_tasks_convert_article_json_to_markdown", "target": "$graphify-root$_specs_005_convert_json_markdown_tasks_phase_5_user_story_3_cli_usability_validation_and_atomic_output_priority_p3", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/tasks.md", "source_location": "L73", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_tasks_phase_5_user_story_3_cli_usability_validation_and_atomic_output_priority_p3", "target": "$graphify-root$_specs_005_convert_json_markdown_tasks_tests_for_user_story_3_tdd", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/tasks.md", "source_location": "L79", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_tasks_phase_5_user_story_3_cli_usability_validation_and_atomic_output_priority_p3", "target": "$graphify-root$_specs_005_convert_json_markdown_tasks_implementation_for_user_story_3", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/tasks.md", "source_location": "L84", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_tasks_tasks_convert_article_json_to_markdown", "target": "$graphify-root$_specs_005_convert_json_markdown_tasks_phase_6_polish_cross_cutting_concerns", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/tasks.md", "source_location": "L93", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_tasks_tasks_convert_article_json_to_markdown", "target": "$graphify-root$_specs_005_convert_json_markdown_tasks_dependencies_execution_order", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/tasks.md", "source_location": "L104", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_tasks_dependencies_execution_order", "target": "$graphify-root$_specs_005_convert_json_markdown_tasks_phase_dependencies", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/tasks.md", "source_location": "L106", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_tasks_tasks_convert_article_json_to_markdown", "target": "$graphify-root$_specs_005_convert_json_markdown_tasks_parallel_opportunities", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/tasks.md", "source_location": "L117", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_tasks_tasks_convert_article_json_to_markdown", "target": "$graphify-root$_specs_005_convert_json_markdown_tasks_implementation_strategy", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/tasks.md", "source_location": "L128", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_tasks_implementation_strategy", "target": "$graphify-root$_specs_005_convert_json_markdown_tasks_mvp_first_user_story_1_only", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/tasks.md", "source_location": "L130", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_tasks_implementation_strategy", "target": "$graphify-root$_specs_005_convert_json_markdown_tasks_incremental_delivery", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/tasks.md", "source_location": "L135", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/graphify-out/cache/ast/v0.9.47-s2/b28308c2c54a4f569f5e533beb0a2a1ff44614fb28853c2f1aa915e58558c4ab.json b/graphify-out/cache/ast/v0.9.47-s2/b28308c2c54a4f569f5e533beb0a2a1ff44614fb28853c2f1aa915e58558c4ab.json new file mode 100644 index 0000000..e5999d7 --- /dev/null +++ b/graphify-out/cache/ast/v0.9.47-s2/b28308c2c54a4f569f5e533beb0a2a1ff44614fb28853c2f1aa915e58558c4ab.json @@ -0,0 +1 @@ +{"nodes": [{"id": "$graphify-root$_specs_005_convert_json_markdown_contracts_markdown_schema_md", "label": "markdown-schema.md", "file_type": "document", "node_kind": "page", "source_file": "specs/005-convert-json-markdown/contracts/markdown-schema.md", "source_location": "L1"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_contracts_markdown_schema_markdown_schema_contract_output_article_markdown", "label": "Markdown Schema Contract: Output Article Markdown", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/contracts/markdown-schema.md", "source_location": "L1"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_contracts_markdown_schema_1_output_document_specification", "label": "1. Output Document Specification", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/contracts/markdown-schema.md", "source_location": "L5"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_contracts_markdown_schema_2_formatting_syntax_constraints", "label": "2. Formatting & Syntax Constraints", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/contracts/markdown-schema.md", "source_location": "L30"}], "edges": [{"source": "$graphify-root$_specs_005_convert_json_markdown_contracts_markdown_schema_md", "target": "$graphify-root$_specs_005_convert_json_markdown_contracts_markdown_schema_markdown_schema_contract_output_article_markdown", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/contracts/markdown-schema.md", "source_location": "L1", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_contracts_markdown_schema_markdown_schema_contract_output_article_markdown", "target": "$graphify-root$_specs_005_convert_json_markdown_contracts_markdown_schema_1_output_document_specification", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/contracts/markdown-schema.md", "source_location": "L5", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_contracts_markdown_schema_markdown_schema_contract_output_article_markdown", "target": "$graphify-root$_specs_005_convert_json_markdown_contracts_markdown_schema_2_formatting_syntax_constraints", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/contracts/markdown-schema.md", "source_location": "L30", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/graphify-out/cache/ast/v0.9.47-s2/b5d0d4f6da5666dd115bd84f2a963c45da3080bb6d5725066aafab49d765746b.json b/graphify-out/cache/ast/v0.9.47-s2/b5d0d4f6da5666dd115bd84f2a963c45da3080bb6d5725066aafab49d765746b.json new file mode 100644 index 0000000..26443fb --- /dev/null +++ b/graphify-out/cache/ast/v0.9.47-s2/b5d0d4f6da5666dd115bd84f2a963c45da3080bb6d5725066aafab49d765746b.json @@ -0,0 +1 @@ +{"nodes": [{"id": "$graphify-root$_specs_005_convert_json_markdown_checklists_markdown_conversion_md", "label": "markdown-conversion.md", "file_type": "document", "node_kind": "page", "source_file": "specs/005-convert-json-markdown/checklists/markdown-conversion.md", "source_location": "L1"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_checklists_markdown_conversion_markdown_conversion_checklist_end_to_end_requirements_quality", "label": "Markdown Conversion Checklist: End-to-End Requirements Quality", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/checklists/markdown-conversion.md", "source_location": "L1"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_checklists_markdown_conversion_1_valida\u00e7\u00e3o_de_entrada_tipagem_isolamento_de_lotes", "label": "1. Valida\u00e7\u00e3o de Entrada, Tipagem & Isolamento de Lotes", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/checklists/markdown-conversion.md", "source_location": "L13"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_checklists_markdown_conversion_2_isolamento_estrito_de_extrator_convers\u00e3o_de_conte\u00fado_html_md", "label": "2. Isolamento Estrito de Extrator & Convers\u00e3o de Conte\u00fado (HTML/MD)", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/checklists/markdown-conversion.md", "source_location": "L21"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_checklists_markdown_conversion_3_resolu\u00e7\u00e3o_determin\u00edstica_de_metadados_mapeamento_de_selecionado", "label": "3. Resolu\u00e7\u00e3o Determin\u00edstica de Metadados & Mapeamento de SELECIONADO", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/checklists/markdown-conversion.md", "source_location": "L29"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_checklists_markdown_conversion_4_normaliza\u00e7\u00e3o_de_escalares_placeholders_sanitiza\u00e7\u00e3o_de_listas", "label": "4. Normaliza\u00e7\u00e3o de Escalares, Placeholders & Sanitiza\u00e7\u00e3o de Listas", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/checklists/markdown-conversion.md", "source_location": "L36"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_checklists_markdown_conversion_5_normaliza\u00e7\u00e3o_de_datas_fusos_valida\u00e7\u00e3o_estrita_de_urls", "label": "5. Normaliza\u00e7\u00e3o de Datas, Fusos & Valida\u00e7\u00e3o Estrita de URLs", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/checklists/markdown-conversion.md", "source_location": "L44"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_checklists_markdown_conversion_6_sanitiza\u00e7\u00e3o_editorial_tratamento_de_imagens_t\u00edtulo_duplicado", "label": "6. Sanitiza\u00e7\u00e3o Editorial, Tratamento de Imagens & T\u00edtulo Duplicado", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/checklists/markdown-conversion.md", "source_location": "L50"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_checklists_markdown_conversion_7_estrutura_sintaxe_do_markdown_de_sa\u00edda_restri\u00e7\u00f5es", "label": "7. Estrutura, Sintaxe do Markdown de Sa\u00edda & Restri\u00e7\u00f5es", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/checklists/markdown-conversion.md", "source_location": "L57"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_checklists_markdown_conversion_8_interface_cli_tratamento_de_erros_atomicidade", "label": "8. Interface CLI, Tratamento de Erros & Atomicidade", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/checklists/markdown-conversion.md", "source_location": "L64"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_checklists_markdown_conversion_9_estrat\u00e9gia_de_testes_golden_fixtures_definition_of_done", "label": "9. Estrat\u00e9gia de Testes, Golden Fixtures & Definition of Done", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/checklists/markdown-conversion.md", "source_location": "L72"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_checklists_markdown_conversion_notes", "label": "Notes", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/checklists/markdown-conversion.md", "source_location": "L81"}], "edges": [{"source": "$graphify-root$_specs_005_convert_json_markdown_checklists_markdown_conversion_md", "target": "$graphify-root$_specs_005_convert_json_markdown_checklists_markdown_conversion_markdown_conversion_checklist_end_to_end_requirements_quality", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/checklists/markdown-conversion.md", "source_location": "L1", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_checklists_markdown_conversion_md", "target": "$graphify-root$_specs_005_convert_json_markdown_spec_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/checklists/markdown-conversion.md", "source_location": "L5", "weight": 1.0, "target_file": "$graphify-root$/specs/005-convert-json-markdown/spec.md"}, {"source": "$graphify-root$_specs_005_convert_json_markdown_checklists_markdown_conversion_md", "target": "$graphify-root$_specs_005_convert_json_markdown_plan_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/checklists/markdown-conversion.md", "source_location": "L5", "weight": 1.0, "target_file": "$graphify-root$/specs/005-convert-json-markdown/plan.md"}, {"source": "$graphify-root$_specs_005_convert_json_markdown_checklists_markdown_conversion_md", "target": "$graphify-root$_specs_005_convert_json_markdown_data_model_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/checklists/markdown-conversion.md", "source_location": "L5", "weight": 1.0, "target_file": "$graphify-root$/specs/005-convert-json-markdown/data-model.md"}, {"source": "$graphify-root$_specs_005_convert_json_markdown_checklists_markdown_conversion_md", "target": "$graphify-root$_docs_prd_convert_json_markdown_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/checklists/markdown-conversion.md", "source_location": "L5", "weight": 1.0, "target_file": "$graphify-root$/docs/prd_convert_json_markdown.md"}, {"source": "$graphify-root$_specs_005_convert_json_markdown_checklists_markdown_conversion_markdown_conversion_checklist_end_to_end_requirements_quality", "target": "$graphify-root$_specs_005_convert_json_markdown_checklists_markdown_conversion_1_valida\u00e7\u00e3o_de_entrada_tipagem_isolamento_de_lotes", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/checklists/markdown-conversion.md", "source_location": "L13", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_checklists_markdown_conversion_markdown_conversion_checklist_end_to_end_requirements_quality", "target": "$graphify-root$_specs_005_convert_json_markdown_checklists_markdown_conversion_2_isolamento_estrito_de_extrator_convers\u00e3o_de_conte\u00fado_html_md", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/checklists/markdown-conversion.md", "source_location": "L21", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_checklists_markdown_conversion_markdown_conversion_checklist_end_to_end_requirements_quality", "target": "$graphify-root$_specs_005_convert_json_markdown_checklists_markdown_conversion_3_resolu\u00e7\u00e3o_determin\u00edstica_de_metadados_mapeamento_de_selecionado", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/checklists/markdown-conversion.md", "source_location": "L29", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_checklists_markdown_conversion_markdown_conversion_checklist_end_to_end_requirements_quality", "target": "$graphify-root$_specs_005_convert_json_markdown_checklists_markdown_conversion_4_normaliza\u00e7\u00e3o_de_escalares_placeholders_sanitiza\u00e7\u00e3o_de_listas", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/checklists/markdown-conversion.md", "source_location": "L36", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_checklists_markdown_conversion_markdown_conversion_checklist_end_to_end_requirements_quality", "target": "$graphify-root$_specs_005_convert_json_markdown_checklists_markdown_conversion_5_normaliza\u00e7\u00e3o_de_datas_fusos_valida\u00e7\u00e3o_estrita_de_urls", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/checklists/markdown-conversion.md", "source_location": "L44", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_checklists_markdown_conversion_markdown_conversion_checklist_end_to_end_requirements_quality", "target": "$graphify-root$_specs_005_convert_json_markdown_checklists_markdown_conversion_6_sanitiza\u00e7\u00e3o_editorial_tratamento_de_imagens_t\u00edtulo_duplicado", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/checklists/markdown-conversion.md", "source_location": "L50", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_checklists_markdown_conversion_markdown_conversion_checklist_end_to_end_requirements_quality", "target": "$graphify-root$_specs_005_convert_json_markdown_checklists_markdown_conversion_7_estrutura_sintaxe_do_markdown_de_sa\u00edda_restri\u00e7\u00f5es", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/checklists/markdown-conversion.md", "source_location": "L57", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_checklists_markdown_conversion_md", "target": "$graphify-root$_specs_005_convert_json_markdown_checklists_url_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/checklists/markdown-conversion.md", "source_location": "L60", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_checklists_markdown_conversion_markdown_conversion_checklist_end_to_end_requirements_quality", "target": "$graphify-root$_specs_005_convert_json_markdown_checklists_markdown_conversion_8_interface_cli_tratamento_de_erros_atomicidade", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/checklists/markdown-conversion.md", "source_location": "L64", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_checklists_markdown_conversion_markdown_conversion_checklist_end_to_end_requirements_quality", "target": "$graphify-root$_specs_005_convert_json_markdown_checklists_markdown_conversion_9_estrat\u00e9gia_de_testes_golden_fixtures_definition_of_done", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/checklists/markdown-conversion.md", "source_location": "L72", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_checklists_markdown_conversion_markdown_conversion_checklist_end_to_end_requirements_quality", "target": "$graphify-root$_specs_005_convert_json_markdown_checklists_markdown_conversion_notes", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/checklists/markdown-conversion.md", "source_location": "L81", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/graphify-out/cache/ast/v0.9.47-s2/c4db190f72e59cd2403bbbd7f99b4a4a5713285af478b2c6a7973f6e4a1007a6.json b/graphify-out/cache/ast/v0.9.47-s2/c4db190f72e59cd2403bbbd7f99b4a4a5713285af478b2c6a7973f6e4a1007a6.json new file mode 100644 index 0000000..b4680f7 --- /dev/null +++ b/graphify-out/cache/ast/v0.9.47-s2/c4db190f72e59cd2403bbbd7f99b4a4a5713285af478b2c6a7973f6e4a1007a6.json @@ -0,0 +1 @@ +{"nodes": [{"id": "$graphify-root$_specs_005_convert_json_markdown_plan_md", "label": "plan.md", "file_type": "document", "node_kind": "page", "source_file": "specs/005-convert-json-markdown/plan.md", "source_location": "L1"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_plan_implementation_plan_convert_article_json_to_markdown", "label": "Implementation Plan: Convert Article JSON to Markdown", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/plan.md", "source_location": "L1"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_plan_summary", "label": "Summary", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/plan.md", "source_location": "L9"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_plan_technical_context", "label": "Technical Context", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/plan.md", "source_location": "L15"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_plan_constitution_check", "label": "Constitution Check", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/plan.md", "source_location": "L30"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_plan_project_structure", "label": "Project Structure", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/plan.md", "source_location": "L44"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_plan_documentation_this_feature", "label": "Documentation (this feature)", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/plan.md", "source_location": "L46"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_plan_source_code_test_layout", "label": "Source Code & Test Layout", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/plan.md", "source_location": "L62"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_plan_implementation_phases", "label": "Implementation Phases", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/plan.md", "source_location": "L86"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_plan_phase_0_outline_research_completed", "label": "Phase 0: Outline & Research *(Completed)*", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/plan.md", "source_location": "L88"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_plan_phase_1_design_contracts_completed", "label": "Phase 1: Design & Contracts *(Completed)*", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/plan.md", "source_location": "L92"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_plan_phase_2_tasks_implementation_breakdown_next_speckit_tasks", "label": "Phase 2: Tasks & Implementation Breakdown *(Next: `/speckit-tasks`)*", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/plan.md", "source_location": "L98"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_plan_complexity_tracking", "label": "Complexity Tracking", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/plan.md", "source_location": "L111"}], "edges": [{"source": "$graphify-root$_specs_005_convert_json_markdown_plan_md", "target": "$graphify-root$_specs_005_convert_json_markdown_plan_implementation_plan_convert_article_json_to_markdown", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/plan.md", "source_location": "L1", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_plan_md", "target": "$graphify-root$_specs_005_convert_json_markdown_spec_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/plan.md", "source_location": "L3", "weight": 1.0, "target_file": "$graphify-root$/specs/005-convert-json-markdown/spec.md"}, {"source": "$graphify-root$_specs_005_convert_json_markdown_plan_implementation_plan_convert_article_json_to_markdown", "target": "$graphify-root$_specs_005_convert_json_markdown_plan_summary", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/plan.md", "source_location": "L9", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_plan_implementation_plan_convert_article_json_to_markdown", "target": "$graphify-root$_specs_005_convert_json_markdown_plan_technical_context", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/plan.md", "source_location": "L15", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_plan_implementation_plan_convert_article_json_to_markdown", "target": "$graphify-root$_specs_005_convert_json_markdown_plan_constitution_check", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/plan.md", "source_location": "L30", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_plan_implementation_plan_convert_article_json_to_markdown", "target": "$graphify-root$_specs_005_convert_json_markdown_plan_project_structure", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/plan.md", "source_location": "L44", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_plan_project_structure", "target": "$graphify-root$_specs_005_convert_json_markdown_plan_documentation_this_feature", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/plan.md", "source_location": "L46", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_plan_project_structure", "target": "$graphify-root$_specs_005_convert_json_markdown_plan_source_code_test_layout", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/plan.md", "source_location": "L62", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_plan_implementation_plan_convert_article_json_to_markdown", "target": "$graphify-root$_specs_005_convert_json_markdown_plan_implementation_phases", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/plan.md", "source_location": "L86", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_plan_implementation_phases", "target": "$graphify-root$_specs_005_convert_json_markdown_plan_phase_0_outline_research_completed", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/plan.md", "source_location": "L88", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_plan_md", "target": "$graphify-root$_specs_005_convert_json_markdown_research_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/plan.md", "source_location": "L89", "weight": 1.0, "target_file": "$graphify-root$/specs/005-convert-json-markdown/research.md"}, {"source": "$graphify-root$_specs_005_convert_json_markdown_plan_implementation_phases", "target": "$graphify-root$_specs_005_convert_json_markdown_plan_phase_1_design_contracts_completed", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/plan.md", "source_location": "L92", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_plan_md", "target": "$graphify-root$_specs_005_convert_json_markdown_data_model_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/plan.md", "source_location": "L93", "weight": 1.0, "target_file": "$graphify-root$/specs/005-convert-json-markdown/data-model.md"}, {"source": "$graphify-root$_specs_005_convert_json_markdown_plan_md", "target": "$graphify-root$_specs_005_convert_json_markdown_contracts_cli_contract_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/plan.md", "source_location": "L94", "weight": 1.0, "target_file": "$graphify-root$/specs/005-convert-json-markdown/contracts/cli-contract.md"}, {"source": "$graphify-root$_specs_005_convert_json_markdown_plan_md", "target": "$graphify-root$_specs_005_convert_json_markdown_contracts_markdown_schema_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/plan.md", "source_location": "L95", "weight": 1.0, "target_file": "$graphify-root$/specs/005-convert-json-markdown/contracts/markdown-schema.md"}, {"source": "$graphify-root$_specs_005_convert_json_markdown_plan_md", "target": "$graphify-root$_specs_005_convert_json_markdown_quickstart_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/plan.md", "source_location": "L96", "weight": 1.0, "target_file": "$graphify-root$/specs/005-convert-json-markdown/quickstart.md"}, {"source": "$graphify-root$_specs_005_convert_json_markdown_plan_implementation_phases", "target": "$graphify-root$_specs_005_convert_json_markdown_plan_phase_2_tasks_implementation_breakdown_next_speckit_tasks", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/plan.md", "source_location": "L98", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_plan_implementation_plan_convert_article_json_to_markdown", "target": "$graphify-root$_specs_005_convert_json_markdown_plan_complexity_tracking", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/plan.md", "source_location": "L111", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/graphify-out/cache/ast/v0.9.47-s2/d4203d9d5a6b9107bcc8ced682b509b30e7c152293298bcae22c1f96570415fb.json b/graphify-out/cache/ast/v0.9.47-s2/d4203d9d5a6b9107bcc8ced682b509b30e7c152293298bcae22c1f96570415fb.json new file mode 100644 index 0000000..f0cc939 --- /dev/null +++ b/graphify-out/cache/ast/v0.9.47-s2/d4203d9d5a6b9107bcc8ced682b509b30e7c152293298bcae22c1f96570415fb.json @@ -0,0 +1 @@ +{"nodes": [{"id": "$graphify-root$_docs_prd_convert_json_markdown_md", "label": "prd_convert_json_markdown.md", "file_type": "document", "node_kind": "page", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L1"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_prd_convers\u00e3o_de_artigo_json_para_markdown", "label": "PRD \u2014 Convers\u00e3o de artigo JSON para Markdown", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L1"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_1_vis\u00e3o_geral", "label": "1. Vis\u00e3o geral", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L3"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_2_problema", "label": "2. Problema", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L11"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_3_objetivo", "label": "3. Objetivo", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L17"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_4_hist\u00f3ria_do_usu\u00e1rio", "label": "4. Hist\u00f3ria do usu\u00e1rio", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L28"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_5_escopo", "label": "5. Escopo", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L32"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_5_1_inclu\u00eddo", "label": "5.1 Inclu\u00eddo", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L34"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_5_2_fora_do_escopo", "label": "5.2 Fora do escopo", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L47"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_6_contrato_de_entrada", "label": "6. Contrato de entrada", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L61"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_6_1_formato", "label": "6.1 Formato", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L63"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_6_2_valores_aceitos_para_selected_extractor", "label": "6.2 Valores aceitos para `selected_extractor`", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L79"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_6_3_campos_obrigat\u00f3rios_ap\u00f3s_a_resolu\u00e7\u00e3o", "label": "6.3 Campos obrigat\u00f3rios ap\u00f3s a resolu\u00e7\u00e3o", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L87"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_7_contrato_de_sa\u00edda", "label": "7. Contrato de sa\u00edda", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L97"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_7_1_arquivo", "label": "7.1 Arquivo", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L99"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_7_2_estrutura_do_markdown", "label": "7.2 Estrutura do Markdown", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L107"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_8_regras_funcionais", "label": "8. Regras funcionais", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L142"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_rf_001_receber_um_\u00fanico_artigo", "label": "RF-001 \u2014 Receber um \u00fanico artigo", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L144"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_rf_002_respeitar_o_extrator_selecionado", "label": "RF-002 \u2014 Respeitar o extrator selecionado", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L148"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_rf_003_resolver_o_corpo_dentro_do_extrator_selecionado", "label": "RF-003 \u2014 Resolver o corpo dentro do extrator selecionado", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L152"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_rf_004_selecionar_metadados_deterministicamente", "label": "RF-004 \u2014 Selecionar metadados deterministicamente", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L162"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_rf_005_priorizar_metadados_por_campo", "label": "RF-005 \u2014 Priorizar metadados por campo", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L174"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_rf_006_normalizar_valores_escalares", "label": "RF-006 \u2014 Normalizar valores escalares", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L207"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_rf_007_normalizar_listas", "label": "RF-007 \u2014 Normalizar listas", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L216"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_rf_008_normalizar_datas", "label": "RF-008 \u2014 Normalizar datas", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L229"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_rf_009_validar_urls", "label": "RF-009 \u2014 Validar URLs", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L237"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_rf_010_converter_html_para_markdown", "label": "RF-010 \u2014 Converter HTML para Markdown", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L243"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_rf_011_tratar_imagens_do_corpo", "label": "RF-011 \u2014 Tratar imagens do corpo", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L261"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_rf_012_evitar_t\u00edtulo_duplicado", "label": "RF-012 \u2014 Evitar t\u00edtulo duplicado", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L269"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_rf_013_normalizar_o_markdown_final", "label": "RF-013 \u2014 Normalizar o Markdown final", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L275"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_rf_014_n\u00e3o_gerar_sa\u00edda_parcial", "label": "RF-014 \u2014 N\u00e3o gerar sa\u00edda parcial", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L286"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_9_interface_cli", "label": "9. Interface CLI", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L290"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_9_1_script", "label": "9.1 Script", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L292"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_9_2_argumentos", "label": "9.2 Argumentos", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L296"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_9_3_exemplos", "label": "9.3 Exemplos", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L305"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_9_4_sa\u00edda_do_processo", "label": "9.4 Sa\u00edda do processo", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L319"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_10_tratamento_de_erros", "label": "10. Tratamento de erros", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L327"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_11_requisitos_n\u00e3o_funcionais", "label": "11. Requisitos n\u00e3o funcionais", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L348"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_rnf_001_determinismo", "label": "RNF-001 \u2014 Determinismo", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L350"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_rnf_002_compatibilidade", "label": "RNF-002 \u2014 Compatibilidade", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L354"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_rnf_003_execu\u00e7\u00e3o_local", "label": "RNF-003 \u2014 Execu\u00e7\u00e3o local", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L358"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_rnf_004_integridade", "label": "RNF-004 \u2014 Integridade", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L362"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_rnf_005_manutenibilidade", "label": "RNF-005 \u2014 Manutenibilidade", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L366"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_rnf_006_qualidade", "label": "RNF-006 \u2014 Qualidade", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L370"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_12_crit\u00e9rios_de_aceite", "label": "12. Crit\u00e9rios de aceite", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L374"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_ca_001_trafilatura_selecionada", "label": "CA-001 \u2014 Trafilatura selecionada", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L376"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_ca_002_newspaper4k_selecionado", "label": "CA-002 \u2014 Newspaper4k selecionado", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L382"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_ca_003_readability_selecionado", "label": "CA-003 \u2014 Readability selecionado", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L388"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_ca_004_fallback_dentro_do_extrator", "label": "CA-004 \u2014 Fallback dentro do extrator", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L394"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_ca_005_proibi\u00e7\u00e3o_de_fallback_de_corpo_entre_extratores", "label": "CA-005 \u2014 Proibi\u00e7\u00e3o de fallback de corpo entre extratores", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L400"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_ca_006_metadado_vindo_de_outro_extrator", "label": "CA-006 \u2014 Metadado vindo de outro extrator", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L406"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_ca_007_obrigat\u00f3rios_presentes", "label": "CA-007 \u2014 Obrigat\u00f3rios presentes", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L412"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_ca_008_opcionais_ausentes", "label": "CA-008 \u2014 Opcionais ausentes", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L418"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_ca_009_imagens_inv\u00e1lidas", "label": "CA-009 \u2014 Imagens inv\u00e1lidas", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L424"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_ca_010_t\u00edtulo_repetido_no_corpo", "label": "CA-010 \u2014 T\u00edtulo repetido no corpo", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L430"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_ca_011_entrada_em_lote_rejeitada", "label": "CA-011 \u2014 Entrada em lote rejeitada", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L436"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_ca_012_determinismo", "label": "CA-012 \u2014 Determinismo", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L442"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_ca_013_grava\u00e7\u00e3o_segura", "label": "CA-013 \u2014 Grava\u00e7\u00e3o segura", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L448"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_13_estrat\u00e9gia_de_testes", "label": "13. Estrat\u00e9gia de testes", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L454"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_13_1_testes_unit\u00e1rios", "label": "13.1 Testes unit\u00e1rios", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L456"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_13_2_testes_de_integra\u00e7\u00e3o_do_cli", "label": "13.2 Testes de integra\u00e7\u00e3o do CLI", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L471"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_13_3_casos_de_resultado_esperado", "label": "13.3 Casos de resultado esperado", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L481"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_14_definition_of_done", "label": "14. Definition of Done", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L495"}, {"id": "$graphify-root$_docs_prd_convert_json_markdown_15_depend\u00eancia_t\u00e9cnica_escolhida", "label": "15. Depend\u00eancia t\u00e9cnica escolhida", "file_type": "document", "node_kind": "heading", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L511"}], "edges": [{"source": "$graphify-root$_docs_prd_convert_json_markdown_md", "target": "$graphify-root$_docs_prd_convert_json_markdown_prd_convers\u00e3o_de_artigo_json_para_markdown", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L1", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_prd_convers\u00e3o_de_artigo_json_para_markdown", "target": "$graphify-root$_docs_prd_convert_json_markdown_1_vis\u00e3o_geral", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L3", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_prd_convers\u00e3o_de_artigo_json_para_markdown", "target": "$graphify-root$_docs_prd_convert_json_markdown_2_problema", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L11", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_prd_convers\u00e3o_de_artigo_json_para_markdown", "target": "$graphify-root$_docs_prd_convert_json_markdown_3_objetivo", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L17", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_prd_convers\u00e3o_de_artigo_json_para_markdown", "target": "$graphify-root$_docs_prd_convert_json_markdown_4_hist\u00f3ria_do_usu\u00e1rio", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L28", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_prd_convers\u00e3o_de_artigo_json_para_markdown", "target": "$graphify-root$_docs_prd_convert_json_markdown_5_escopo", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L32", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_5_escopo", "target": "$graphify-root$_docs_prd_convert_json_markdown_5_1_inclu\u00eddo", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L34", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_5_escopo", "target": "$graphify-root$_docs_prd_convert_json_markdown_5_2_fora_do_escopo", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L47", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_prd_convers\u00e3o_de_artigo_json_para_markdown", "target": "$graphify-root$_docs_prd_convert_json_markdown_6_contrato_de_entrada", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L61", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_6_contrato_de_entrada", "target": "$graphify-root$_docs_prd_convert_json_markdown_6_1_formato", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L63", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_6_contrato_de_entrada", "target": "$graphify-root$_docs_prd_convert_json_markdown_6_2_valores_aceitos_para_selected_extractor", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L79", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_6_contrato_de_entrada", "target": "$graphify-root$_docs_prd_convert_json_markdown_6_3_campos_obrigat\u00f3rios_ap\u00f3s_a_resolu\u00e7\u00e3o", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L87", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_prd_convers\u00e3o_de_artigo_json_para_markdown", "target": "$graphify-root$_docs_prd_convert_json_markdown_7_contrato_de_sa\u00edda", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L97", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_7_contrato_de_sa\u00edda", "target": "$graphify-root$_docs_prd_convert_json_markdown_7_1_arquivo", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L99", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_7_contrato_de_sa\u00edda", "target": "$graphify-root$_docs_prd_convert_json_markdown_7_2_estrutura_do_markdown", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L107", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_prd_convers\u00e3o_de_artigo_json_para_markdown", "target": "$graphify-root$_docs_prd_convert_json_markdown_8_regras_funcionais", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L142", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_8_regras_funcionais", "target": "$graphify-root$_docs_prd_convert_json_markdown_rf_001_receber_um_\u00fanico_artigo", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L144", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_8_regras_funcionais", "target": "$graphify-root$_docs_prd_convert_json_markdown_rf_002_respeitar_o_extrator_selecionado", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L148", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_8_regras_funcionais", "target": "$graphify-root$_docs_prd_convert_json_markdown_rf_003_resolver_o_corpo_dentro_do_extrator_selecionado", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L152", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_8_regras_funcionais", "target": "$graphify-root$_docs_prd_convert_json_markdown_rf_004_selecionar_metadados_deterministicamente", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L162", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_8_regras_funcionais", "target": "$graphify-root$_docs_prd_convert_json_markdown_rf_005_priorizar_metadados_por_campo", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L174", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_8_regras_funcionais", "target": "$graphify-root$_docs_prd_convert_json_markdown_rf_006_normalizar_valores_escalares", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L207", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_8_regras_funcionais", "target": "$graphify-root$_docs_prd_convert_json_markdown_rf_007_normalizar_listas", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L216", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_8_regras_funcionais", "target": "$graphify-root$_docs_prd_convert_json_markdown_rf_008_normalizar_datas", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L229", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_8_regras_funcionais", "target": "$graphify-root$_docs_prd_convert_json_markdown_rf_009_validar_urls", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L237", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_8_regras_funcionais", "target": "$graphify-root$_docs_prd_convert_json_markdown_rf_010_converter_html_para_markdown", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L243", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_8_regras_funcionais", "target": "$graphify-root$_docs_prd_convert_json_markdown_rf_011_tratar_imagens_do_corpo", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L261", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_8_regras_funcionais", "target": "$graphify-root$_docs_prd_convert_json_markdown_rf_012_evitar_t\u00edtulo_duplicado", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L269", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_8_regras_funcionais", "target": "$graphify-root$_docs_prd_convert_json_markdown_rf_013_normalizar_o_markdown_final", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L275", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_8_regras_funcionais", "target": "$graphify-root$_docs_prd_convert_json_markdown_rf_014_n\u00e3o_gerar_sa\u00edda_parcial", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L286", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_prd_convers\u00e3o_de_artigo_json_para_markdown", "target": "$graphify-root$_docs_prd_convert_json_markdown_9_interface_cli", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L290", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_9_interface_cli", "target": "$graphify-root$_docs_prd_convert_json_markdown_9_1_script", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L292", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_9_interface_cli", "target": "$graphify-root$_docs_prd_convert_json_markdown_9_2_argumentos", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L296", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_9_interface_cli", "target": "$graphify-root$_docs_prd_convert_json_markdown_9_3_exemplos", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L305", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_9_interface_cli", "target": "$graphify-root$_docs_prd_convert_json_markdown_9_4_sa\u00edda_do_processo", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L319", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_prd_convers\u00e3o_de_artigo_json_para_markdown", "target": "$graphify-root$_docs_prd_convert_json_markdown_10_tratamento_de_erros", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L327", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_prd_convers\u00e3o_de_artigo_json_para_markdown", "target": "$graphify-root$_docs_prd_convert_json_markdown_11_requisitos_n\u00e3o_funcionais", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L348", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_11_requisitos_n\u00e3o_funcionais", "target": "$graphify-root$_docs_prd_convert_json_markdown_rnf_001_determinismo", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L350", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_11_requisitos_n\u00e3o_funcionais", "target": "$graphify-root$_docs_prd_convert_json_markdown_rnf_002_compatibilidade", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L354", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_11_requisitos_n\u00e3o_funcionais", "target": "$graphify-root$_docs_prd_convert_json_markdown_rnf_003_execu\u00e7\u00e3o_local", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L358", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_11_requisitos_n\u00e3o_funcionais", "target": "$graphify-root$_docs_prd_convert_json_markdown_rnf_004_integridade", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L362", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_11_requisitos_n\u00e3o_funcionais", "target": "$graphify-root$_docs_prd_convert_json_markdown_rnf_005_manutenibilidade", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L366", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_11_requisitos_n\u00e3o_funcionais", "target": "$graphify-root$_docs_prd_convert_json_markdown_rnf_006_qualidade", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L370", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_prd_convers\u00e3o_de_artigo_json_para_markdown", "target": "$graphify-root$_docs_prd_convert_json_markdown_12_crit\u00e9rios_de_aceite", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L374", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_12_crit\u00e9rios_de_aceite", "target": "$graphify-root$_docs_prd_convert_json_markdown_ca_001_trafilatura_selecionada", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L376", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_12_crit\u00e9rios_de_aceite", "target": "$graphify-root$_docs_prd_convert_json_markdown_ca_002_newspaper4k_selecionado", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L382", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_12_crit\u00e9rios_de_aceite", "target": "$graphify-root$_docs_prd_convert_json_markdown_ca_003_readability_selecionado", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L388", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_12_crit\u00e9rios_de_aceite", "target": "$graphify-root$_docs_prd_convert_json_markdown_ca_004_fallback_dentro_do_extrator", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L394", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_12_crit\u00e9rios_de_aceite", "target": "$graphify-root$_docs_prd_convert_json_markdown_ca_005_proibi\u00e7\u00e3o_de_fallback_de_corpo_entre_extratores", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L400", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_12_crit\u00e9rios_de_aceite", "target": "$graphify-root$_docs_prd_convert_json_markdown_ca_006_metadado_vindo_de_outro_extrator", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L406", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_12_crit\u00e9rios_de_aceite", "target": "$graphify-root$_docs_prd_convert_json_markdown_ca_007_obrigat\u00f3rios_presentes", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L412", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_12_crit\u00e9rios_de_aceite", "target": "$graphify-root$_docs_prd_convert_json_markdown_ca_008_opcionais_ausentes", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L418", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_12_crit\u00e9rios_de_aceite", "target": "$graphify-root$_docs_prd_convert_json_markdown_ca_009_imagens_inv\u00e1lidas", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L424", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_12_crit\u00e9rios_de_aceite", "target": "$graphify-root$_docs_prd_convert_json_markdown_ca_010_t\u00edtulo_repetido_no_corpo", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L430", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_12_crit\u00e9rios_de_aceite", "target": "$graphify-root$_docs_prd_convert_json_markdown_ca_011_entrada_em_lote_rejeitada", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L436", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_12_crit\u00e9rios_de_aceite", "target": "$graphify-root$_docs_prd_convert_json_markdown_ca_012_determinismo", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L442", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_12_crit\u00e9rios_de_aceite", "target": "$graphify-root$_docs_prd_convert_json_markdown_ca_013_grava\u00e7\u00e3o_segura", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L448", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_prd_convers\u00e3o_de_artigo_json_para_markdown", "target": "$graphify-root$_docs_prd_convert_json_markdown_13_estrat\u00e9gia_de_testes", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L454", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_13_estrat\u00e9gia_de_testes", "target": "$graphify-root$_docs_prd_convert_json_markdown_13_1_testes_unit\u00e1rios", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L456", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_13_estrat\u00e9gia_de_testes", "target": "$graphify-root$_docs_prd_convert_json_markdown_13_2_testes_de_integra\u00e7\u00e3o_do_cli", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L471", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_13_estrat\u00e9gia_de_testes", "target": "$graphify-root$_docs_prd_convert_json_markdown_13_3_casos_de_resultado_esperado", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L481", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_prd_convers\u00e3o_de_artigo_json_para_markdown", "target": "$graphify-root$_docs_prd_convert_json_markdown_14_definition_of_done", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L495", "weight": 1.0}, {"source": "$graphify-root$_docs_prd_convert_json_markdown_prd_convers\u00e3o_de_artigo_json_para_markdown", "target": "$graphify-root$_docs_prd_convert_json_markdown_15_depend\u00eancia_t\u00e9cnica_escolhida", "relation": "contains", "confidence": "EXTRACTED", "source_file": "docs/prd_convert_json_markdown.md", "source_location": "L511", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/graphify-out/cache/ast/v0.9.47-s2/d7c4ff57e6843d60ebc5a15f59984d9021a5e3889b01d4a8df1db900b912c21b.json b/graphify-out/cache/ast/v0.9.47-s2/d7c4ff57e6843d60ebc5a15f59984d9021a5e3889b01d4a8df1db900b912c21b.json new file mode 100644 index 0000000..1599b20 --- /dev/null +++ b/graphify-out/cache/ast/v0.9.47-s2/d7c4ff57e6843d60ebc5a15f59984d9021a5e3889b01d4a8df1db900b912c21b.json @@ -0,0 +1 @@ +{"nodes": [{"id": "$graphify-root$_scripts_convert_article_to_markdown_py", "label": "convert_article_to_markdown.py", "file_type": "code", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L1"}, {"id": "$graphify-root$_scripts_convert_article_to_markdown_normalize_scalar", "label": "normalize_scalar()", "file_type": "code", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L40", "_callable": true}, {"id": "any", "label": "Any", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "$graphify-root$/scripts/convert_article_to_markdown.py"}, {"id": "$graphify-root$_scripts_convert_article_to_markdown_normalize_list", "label": "normalize_list()", "file_type": "code", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L56", "_callable": true}, {"id": "$graphify-root$_scripts_convert_article_to_markdown_normalize_date", "label": "normalize_date()", "file_type": "code", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L104", "_callable": true}, {"id": "$graphify-root$_scripts_convert_article_to_markdown_validate_url", "label": "validate_url()", "file_type": "code", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L135", "_callable": true}, {"id": "$graphify-root$_scripts_convert_article_to_markdown_convert_html_to_markdown", "label": "convert_html_to_markdown()", "file_type": "code", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L149", "_callable": true}, {"id": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "label": "resolve_article_body()", "file_type": "code", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L161", "_callable": true}, {"id": "$graphify-root$_scripts_convert_article_to_markdown_get_dict", "label": "_get_dict()", "file_type": "code", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L219", "_callable": true}, {"id": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "label": "resolve_article_metadata()", "file_type": "code", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L225", "_callable": true}, {"id": "$graphify-root$_scripts_convert_article_to_markdown_remove_duplicate_initial_h1", "label": "remove_duplicate_initial_h1()", "file_type": "code", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L473", "_callable": true}, {"id": "$graphify-root$_scripts_convert_article_to_markdown_clean_body_images", "label": "clean_body_images()", "file_type": "code", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L508", "_callable": true}, {"id": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "label": "assemble_markdown_document()", "file_type": "code", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L540", "_callable": true}, {"id": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "label": "convert_article()", "file_type": "code", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L608", "_callable": true}, {"id": "path", "label": "Path", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "$graphify-root$/scripts/convert_article_to_markdown.py"}, {"id": "$graphify-root$_scripts_convert_article_to_markdown_parse_arguments", "label": "parse_arguments()", "file_type": "code", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L667", "_callable": true}, {"id": "namespace", "label": "Namespace", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "$graphify-root$/scripts/convert_article_to_markdown.py"}, {"id": "$graphify-root$_scripts_convert_article_to_markdown_main", "label": "main()", "file_type": "code", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L690", "_callable": true}, {"id": "$graphify-root$_scripts_convert_article_to_markdown_rationale_41", "label": "Decodifica entidades HTML, remove espa\u00e7os no in\u00edcio/fim, colapsa espa\u00e7os\u2026", "file_type": "rationale", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L41"}, {"id": "$graphify-root$_scripts_convert_article_to_markdown_rationale_57", "label": "Normaliza listas ou strings separadas por ponto e v\u00edrgula, descartando\u2026", "file_type": "rationale", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L57"}, {"id": "$graphify-root$_scripts_convert_article_to_markdown_rationale_105", "label": "Interpreta datas ISO 8601 e RFC 2822 preservando fuso hor\u00e1rio ou YYYY-MM-DD\u2026", "file_type": "rationale", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L105"}, {"id": "$graphify-root$_scripts_convert_article_to_markdown_rationale_136", "label": "Valida se a URL \u00e9 absoluta com protocolo http ou https e hostname n\u00e3o vazio.", "file_type": "rationale", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L136"}, {"id": "$graphify-root$_scripts_convert_article_to_markdown_rationale_150", "label": "Converte HTML para Markdown usando t\u00edtulos ATX.", "file_type": "rationale", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L150"}, {"id": "$graphify-root$_scripts_convert_article_to_markdown_rationale_162", "label": "Obt\u00e9m o corpo do artigo exclusivamente do selected_extractor com fallback\u2026", "file_type": "rationale", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L162"}, {"id": "$graphify-root$_scripts_convert_article_to_markdown_rationale_220", "label": "Retorna o dicion\u00e1rio associado \u00e0 chave ou um dicion\u00e1rio vazio caso n\u00e3o seja\u2026", "file_type": "rationale", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L220"}, {"id": "$graphify-root$_scripts_convert_article_to_markdown_rationale_226", "label": "Resolve todos os metadados do artigo seguindo a matriz estrita de prioridades\u2026", "file_type": "rationale", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L226"}, {"id": "$graphify-root$_scripts_convert_article_to_markdown_rationale_474", "label": "Remove o primeiro t\u00edtulo H1 do corpo somente quando ele for igual ao t\u00edtulo\u2026", "file_type": "rationale", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L474"}, {"id": "$graphify-root$_scripts_convert_article_to_markdown_rationale_509", "label": "Preserva imagens com URL absoluta http/https, remove relativas/data:/vazias e\u2026", "file_type": "rationale", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L509"}, {"id": "$graphify-root$_scripts_convert_article_to_markdown_rationale_541", "label": "Monta a estrutura final do documento Markdown respeitando a ordem estrita do\u2026", "file_type": "rationale", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L541"}, {"id": "$graphify-root$_scripts_convert_article_to_markdown_rationale_609", "label": "Executa a leitura do JSON, valida\u00e7\u00e3o, convers\u00e3o e escrita at\u00f4mica do arquivo\u2026", "file_type": "rationale", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L609"}, {"id": "$graphify-root$_scripts_convert_article_to_markdown_rationale_668", "label": "Configura o parser de argumentos do CLI.", "file_type": "rationale", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L668"}, {"id": "$graphify-root$_scripts_convert_article_to_markdown_rationale_691", "label": "Ponto de entrada do CLI.", "file_type": "rationale", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L691"}], "edges": [{"source": "$graphify-root$_scripts_convert_article_to_markdown_py", "target": "argparse", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L11", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_py", "target": "datetime", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L12", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_py", "target": "email_utils", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L13", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_py", "target": "html", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L14", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_py", "target": "json", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L15", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_py", "target": "re", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L16", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_py", "target": "sys", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L17", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_py", "target": "urllib_parse", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L18", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_py", "target": "pathlib", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L19", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_py", "target": "typing", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L20", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_py", "target": "markdownify", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L22", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_py", "target": "$graphify-root$_scripts_convert_article_to_markdown_normalize_scalar", "relation": "contains", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L40", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_normalize_scalar", "target": "any", "relation": "references", "context": "parameter_type", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L40", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_py", "target": "$graphify-root$_scripts_convert_article_to_markdown_normalize_list", "relation": "contains", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L56", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_normalize_list", "target": "any", "relation": "references", "context": "parameter_type", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L56", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_py", "target": "$graphify-root$_scripts_convert_article_to_markdown_normalize_date", "relation": "contains", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L104", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_normalize_date", "target": "any", "relation": "references", "context": "parameter_type", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L104", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_py", "target": "$graphify-root$_scripts_convert_article_to_markdown_validate_url", "relation": "contains", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L135", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_validate_url", "target": "any", "relation": "references", "context": "parameter_type", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L135", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_py", "target": "$graphify-root$_scripts_convert_article_to_markdown_convert_html_to_markdown", "relation": "contains", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L149", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_py", "target": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "relation": "contains", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L161", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "target": "any", "relation": "references", "context": "generic_arg", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L161", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_py", "target": "$graphify-root$_scripts_convert_article_to_markdown_get_dict", "relation": "contains", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L219", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_get_dict", "target": "any", "relation": "references", "context": "generic_arg", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L219", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_get_dict", "target": "any", "relation": "references", "context": "generic_arg", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L219", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_py", "target": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "relation": "contains", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L225", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "target": "any", "relation": "references", "context": "generic_arg", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L225", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "target": "any", "relation": "references", "context": "generic_arg", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L225", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_py", "target": "$graphify-root$_scripts_convert_article_to_markdown_remove_duplicate_initial_h1", "relation": "contains", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L473", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_py", "target": "$graphify-root$_scripts_convert_article_to_markdown_clean_body_images", "relation": "contains", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L508", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_py", "target": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "relation": "contains", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L540", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "target": "any", "relation": "references", "context": "generic_arg", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L540", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_py", "target": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "relation": "contains", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L608", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "target": "path", "relation": "references", "context": "parameter_type", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L608", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "target": "path", "relation": "references", "context": "generic_arg", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L608", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "target": "path", "relation": "references", "context": "return_type", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L608", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_py", "target": "$graphify-root$_scripts_convert_article_to_markdown_parse_arguments", "relation": "contains", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L667", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_parse_arguments", "target": "namespace", "relation": "references", "context": "return_type", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L667", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_py", "target": "$graphify-root$_scripts_convert_article_to_markdown_main", "relation": "contains", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L690", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_normalize_list", "target": "$graphify-root$_scripts_convert_article_to_markdown_normalize_scalar", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L85", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_validate_url", "target": "$graphify-root$_scripts_convert_article_to_markdown_normalize_scalar", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L137", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "target": "$graphify-root$_scripts_convert_article_to_markdown_convert_html_to_markdown", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L191", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "target": "$graphify-root$_scripts_convert_article_to_markdown_get_dict", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L230", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "target": "$graphify-root$_scripts_convert_article_to_markdown_normalize_scalar", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L251", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "target": "$graphify-root$_scripts_convert_article_to_markdown_validate_url", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L276", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "target": "$graphify-root$_scripts_convert_article_to_markdown_normalize_list", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L325", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "target": "$graphify-root$_scripts_convert_article_to_markdown_normalize_date", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L346", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_remove_duplicate_initial_h1", "target": "$graphify-root$_scripts_convert_article_to_markdown_normalize_scalar", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L490", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "target": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L632", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "target": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L633", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "target": "$graphify-root$_scripts_convert_article_to_markdown_remove_duplicate_initial_h1", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L636", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "target": "$graphify-root$_scripts_convert_article_to_markdown_clean_body_images", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L637", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "target": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L640", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_main", "target": "$graphify-root$_scripts_convert_article_to_markdown_parse_arguments", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L693", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_main", "target": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L698", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_rationale_41", "target": "$graphify-root$_scripts_convert_article_to_markdown_normalize_scalar", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L41", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_rationale_57", "target": "$graphify-root$_scripts_convert_article_to_markdown_normalize_list", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L57", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_rationale_105", "target": "$graphify-root$_scripts_convert_article_to_markdown_normalize_date", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L105", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_rationale_136", "target": "$graphify-root$_scripts_convert_article_to_markdown_validate_url", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L136", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_rationale_150", "target": "$graphify-root$_scripts_convert_article_to_markdown_convert_html_to_markdown", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L150", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_rationale_162", "target": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L162", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_rationale_220", "target": "$graphify-root$_scripts_convert_article_to_markdown_get_dict", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L220", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_rationale_226", "target": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L226", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_rationale_474", "target": "$graphify-root$_scripts_convert_article_to_markdown_remove_duplicate_initial_h1", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L474", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_rationale_509", "target": "$graphify-root$_scripts_convert_article_to_markdown_clean_body_images", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L509", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_rationale_541", "target": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L541", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_rationale_609", "target": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L609", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_rationale_668", "target": "$graphify-root$_scripts_convert_article_to_markdown_parse_arguments", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L668", "weight": 1.0}, {"source": "$graphify-root$_scripts_convert_article_to_markdown_rationale_691", "target": "$graphify-root$_scripts_convert_article_to_markdown_main", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L691", "weight": 1.0}], "raw_calls": [{"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_scalar", "callee": "str", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L45"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_scalar", "callee": "strip", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L47", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_scalar", "callee": "unescape", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L47", "receiver": "html"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_scalar", "callee": "sub", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L50", "receiver": "re"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_scalar", "callee": "lower", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L51", "receiver": "collapsed"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_list", "callee": "list", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L65"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_list", "callee": "str", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L67"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_list", "callee": "extend", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L70", "receiver": "raw_items"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_list", "callee": "split", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L70", "receiver": "item"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_list", "callee": "extend", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L73", "receiver": "raw_items"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_list", "callee": "split", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L73", "receiver": "item"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_list", "callee": "append", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L75", "receiver": "raw_items"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_list", "callee": "str", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L76"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_list", "callee": "extend", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L77", "receiver": "raw_items"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_list", "callee": "split", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L77", "receiver": "value"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_list", "callee": "lower", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L89", "receiver": "norm"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_list", "callee": "startswith", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L91", "receiver": "norm_lower"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_list", "callee": "startswith", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L92", "receiver": "norm_lower"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_list", "callee": "startswith", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L93", "receiver": "norm_lower"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_list", "callee": "lower", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L96", "receiver": "norm"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_list", "callee": "add", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L98", "receiver": "seen_lower"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_list", "callee": "append", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L99", "receiver": "normalized_items"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_date", "callee": "str", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L108"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_date", "callee": "strip", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L110", "receiver": "value"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_date", "callee": "lower", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L111", "receiver": "s"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_date", "callee": "match", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L115", "receiver": "re"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_date", "callee": "fromisoformat", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L120", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_date", "callee": "isoformat", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L121", "receiver": "dt"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_date", "callee": "ValueError", "is_member_call": false, "indirect": true, "context": "collection", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L122"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_date", "callee": "TypeError", "is_member_call": false, "indirect": true, "context": "collection", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L122"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_date", "callee": "parsedate_to_datetime", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L127", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_date", "callee": "isoformat", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L128", "receiver": "dt"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_date", "callee": "ValueError", "is_member_call": false, "indirect": true, "context": "collection", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L129"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_normalize_date", "callee": "TypeError", "is_member_call": false, "indirect": true, "context": "collection", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L129"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_validate_url", "callee": "urlparse", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L141", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_validate_url", "callee": "lower", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L142", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_convert_html_to_markdown", "callee": "strip", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L151", "receiver": "html_content"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_convert_html_to_markdown", "callee": "markdownify", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L153", "receiver": "markdownify"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_convert_html_to_markdown", "callee": "strip", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L158", "receiver": "md"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L166", "receiver": "article"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "ValueError", "is_member_call": false, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L168", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "join", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L170", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "VALID_EXTRACTORS", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L170"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L173", "receiver": "article"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "dict", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L174"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "ValueError", "is_member_call": false, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L175", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L180", "receiver": "extractor_data"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "str", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L181"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "strip", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L181", "receiver": "primary"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "strip", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L182", "receiver": "primary"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L184", "receiver": "extractor_data"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "str", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L185"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "strip", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L185", "receiver": "fallback"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "strip", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L186", "receiver": "fallback"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L189", "receiver": "extractor_data"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "str", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L190"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "strip", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L190", "receiver": "primary"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L195", "receiver": "extractor_data"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "str", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L196"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "strip", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L196", "receiver": "fallback"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "strip", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L197", "receiver": "fallback"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L200", "receiver": "extractor_data"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "str", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L201"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "strip", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L201", "receiver": "primary"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L206", "receiver": "extractor_data"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "str", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L207"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "strip", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L207", "receiver": "fallback"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "strip", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L208", "receiver": "fallback"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "strip", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L210", "receiver": "body"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "ValueError", "is_member_call": false, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L211", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_body", "callee": "strip", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L216", "receiver": "body"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_get_dict", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L221", "receiver": "data"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_get_dict", "callee": "dict", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L222"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L229", "receiver": "article"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "append", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L239", "receiver": "title_candidates"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L239", "receiver": "sel_data"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "extend", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L241", "receiver": "title_candidates"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L242", "receiver": "input_meta"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L243", "receiver": "article"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L244", "receiver": "newspaper"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L245", "receiver": "trafilatura"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L246", "receiver": "readability"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "ValueError", "is_member_call": false, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L257", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L262", "receiver": "sel_data"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L264", "receiver": "sel_data"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L267", "receiver": "input_meta"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L268", "receiver": "article"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L270", "receiver": "trafilatura"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L271", "receiver": "newspaper"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "ValueError", "is_member_call": false, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L282", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L287", "receiver": "sel_data"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L289", "receiver": "sel_data"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L293", "receiver": "trafilatura"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L294", "receiver": "newspaper"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L295", "receiver": "input_meta"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "lower", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L303", "receiver": "val"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "lower", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L303", "receiver": "resolved_title"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L310", "receiver": "sel_data"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L312", "receiver": "sel_data"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L314", "receiver": "sel_data"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L318", "receiver": "newspaper"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L319", "receiver": "trafilatura"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L320", "receiver": "readability"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L333", "receiver": "sel_data"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L335", "receiver": "sel_data"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L339", "receiver": "newspaper"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L340", "receiver": "trafilatura"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L341", "receiver": "input_meta"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L354", "receiver": "sel_data"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L356", "receiver": "sel_data"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "urlparse", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L358", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L362", "receiver": "trafilatura"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L363", "receiver": "newspaper"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L364", "receiver": "trafilatura"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L376", "receiver": "sel_data"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L379", "receiver": "trafilatura"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L391", "receiver": "sel_data"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L393", "receiver": "sel_data"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L397", "receiver": "trafilatura"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L398", "receiver": "newspaper"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L399", "receiver": "newspaper"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L410", "receiver": "newspaper"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L411", "receiver": "newspaper"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L423", "receiver": "sel_data"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L425", "receiver": "sel_data"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L429", "receiver": "trafilatura"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L430", "receiver": "newspaper"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L442", "receiver": "sel_data"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L444", "receiver": "sel_data"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L448", "receiver": "newspaper"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_resolve_article_metadata", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L449", "receiver": "trafilatura"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_remove_duplicate_initial_h1", "callee": "splitlines", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L481", "receiver": "body"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_remove_duplicate_initial_h1", "callee": "strip", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L485", "receiver": "line"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_remove_duplicate_initial_h1", "callee": "startswith", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L488", "receiver": "stripped"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_remove_duplicate_initial_h1", "callee": "strip", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L489", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_remove_duplicate_initial_h1", "callee": "lower", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L492", "receiver": "norm_h1"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_remove_duplicate_initial_h1", "callee": "lower", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L492", "receiver": "norm_title"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_remove_duplicate_initial_h1", "callee": "pop", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L500", "receiver": "lines"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_remove_duplicate_initial_h1", "callee": "strip", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L502", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_remove_duplicate_initial_h1", "callee": "pop", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L503", "receiver": "lines"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_remove_duplicate_initial_h1", "callee": "join", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L505", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_clean_body_images", "callee": "sub", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L536", "receiver": "re"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_clean_body_images", "callee": "replace_image", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L536"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "append", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L553", "receiver": "sections"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L556", "receiver": "meta"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "append", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L557", "receiver": "sections"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L561", "receiver": "meta"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "append", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L562", "receiver": "meta_lines"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "join", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L562", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L563", "receiver": "meta"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "append", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L564", "receiver": "meta_lines"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L565", "receiver": "meta"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "append", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L566", "receiver": "meta_lines"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L567", "receiver": "meta"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "append", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L568", "receiver": "meta_lines"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "join", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L568", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L569", "receiver": "meta"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "append", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L570", "receiver": "meta_lines"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "join", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L570", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L571", "receiver": "meta"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "append", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L572", "receiver": "meta_lines"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "join", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L572", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L573", "receiver": "meta"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "append", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L574", "receiver": "meta_lines"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L575", "receiver": "meta"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "append", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L576", "receiver": "meta_lines"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "append", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L579", "receiver": "sections"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "join", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L579", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "get", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L582", "receiver": "meta"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "append", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L583", "receiver": "sections"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "append", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L586", "receiver": "sections"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "append", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L589", "receiver": "sections"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "strip", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L589", "receiver": "body"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "join", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L592", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "replace", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L596", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "replace", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L596", "receiver": "raw_doc"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "rstrip", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L598", "receiver": "line"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "split", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L598", "receiver": "raw_doc"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "join", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L599", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "sub", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L601", "receiver": "re"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_assemble_markdown_document", "callee": "strip", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L603", "receiver": "formatted_doc"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "callee": "exists", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L612", "receiver": "input_path"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "callee": "is_file", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L612", "receiver": "input_path"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "callee": "FileNotFoundError", "is_member_call": false, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L613", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "callee": "read_text", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L616", "receiver": "input_path"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "callee": "loads", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L617", "receiver": "json"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "callee": "ValueError", "is_member_call": false, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L619", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "callee": "ValueError", "is_member_call": false, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L621", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "callee": "dict", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L623"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "callee": "ValueError", "is_member_call": false, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L624", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "callee": "ValueError", "is_member_call": false, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L627", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "callee": "with_suffix", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L644", "receiver": "input_path"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "callee": "mkdir", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L649", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "callee": "write_text", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L654", "receiver": "temp_file"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "callee": "replace", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L655", "receiver": "temp_file"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "callee": "exists", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L657", "receiver": "temp_file"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "callee": "unlink", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L659", "receiver": "temp_file"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_convert_article", "callee": "IOError", "is_member_call": false, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L662", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_parse_arguments", "callee": "ArgumentParser", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L669", "receiver": "argparse"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_parse_arguments", "callee": "add_argument", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L672", "receiver": "parser"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_parse_arguments", "callee": "Path", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L676"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_parse_arguments", "callee": "add_argument", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L679", "receiver": "parser"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_parse_arguments", "callee": "Path", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L683"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_parse_arguments", "callee": "parse_args", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L687", "receiver": "parser"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_main", "callee": "int", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L695"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_main", "callee": "write", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L699", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_main", "callee": "FileNotFoundError", "is_member_call": false, "indirect": true, "context": "collection", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L701"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_main", "callee": "ValueError", "is_member_call": false, "indirect": true, "context": "collection", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L701"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_main", "callee": "IOError", "is_member_call": false, "indirect": true, "context": "collection", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L701"}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_main", "callee": "write", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L702", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_main", "callee": "write", "is_member_call": true, "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L705", "receiver": null}, {"caller_nid": "$graphify-root$_scripts_convert_article_to_markdown_main", "callee": "e", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "scripts/convert_article_to_markdown.py", "source_location": "L705"}]} \ No newline at end of file diff --git a/graphify-out/cache/ast/v0.9.47-s2/e1a9fb842244feb21c26788183db26c1746051cac95d8594ec056b13ecd3ebeb.json b/graphify-out/cache/ast/v0.9.47-s2/e1a9fb842244feb21c26788183db26c1746051cac95d8594ec056b13ecd3ebeb.json new file mode 100644 index 0000000..31d2e97 --- /dev/null +++ b/graphify-out/cache/ast/v0.9.47-s2/e1a9fb842244feb21c26788183db26c1746051cac95d8594ec056b13ecd3ebeb.json @@ -0,0 +1 @@ +{"nodes": [{"id": "$graphify-root$_readme_md", "label": "README.md", "file_type": "document", "node_kind": "page", "source_file": "README.md", "source_location": "L1"}, {"id": "$graphify-root$_readme_textnlpclassifierapp", "label": "\ud83e\udde0 TextNLPClassifierApp", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L1"}, {"id": "$graphify-root$_readme_tabela_de_conte\u00fados", "label": "\ud83d\udcd1 Tabela de Conte\u00fados", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L13"}, {"id": "$graphify-root$_readme_vis\u00e3o_geral", "label": "\ud83c\udf1f Vis\u00e3o Geral", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L51"}, {"id": "$graphify-root$_readme_instala\u00e7\u00e3o_e_setup", "label": "\u2699\ufe0f Instala\u00e7\u00e3o e Setup", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L63"}, {"id": "$graphify-root$_readme_1_clonar_o_reposit\u00f3rio_e_criar_ambiente_virtual", "label": "1. Clonar o Reposit\u00f3rio e Criar Ambiente Virtual", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L65"}, {"id": "$graphify-root$_readme_2_instalar_depend\u00eancias", "label": "2. Instalar Depend\u00eancias", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L78"}, {"id": "$graphify-root$_readme_3_baixar_bin\u00e1rios_do_navegador_stealth_camoufox", "label": "3. Baixar Bin\u00e1rios do Navegador Stealth (Camoufox)", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L84"}, {"id": "$graphify-root$_readme_1_classificador_de_conte\u00fado_e_iner\u00eancia_nlp_llm_ecp", "label": "1. \ud83e\udde0 Classificador de Conte\u00fado e Iner\u00eancia (NLP / LLM / ECP)", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L94"}, {"id": "$graphify-root$_readme_o_que_\u00e9_e_como_funciona", "label": "O que \u00e9 e Como Funciona", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L96"}, {"id": "$graphify-root$_readme_arquitetura_de_classifica\u00e7\u00e3o_em_3_tiers", "label": "Arquitetura de Classifica\u00e7\u00e3o em 3 Tiers", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L102"}, {"id": "$graphify-root$_readme_categorias_de_decis\u00e3o", "label": "Categorias de Decis\u00e3o", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L123"}, {"id": "$graphify-root$_readme_formato_do_ecp_snapshot_e_markdown", "label": "Formato do ECP Snapshot e Markdown", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L132"}, {"id": "$graphify-root$_readme_exemplo_de_ecp_snapshot_ecp_sample_json", "label": "Exemplo de ECP Snapshot (`ecp_sample.json`):", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L134"}, {"id": "$graphify-root$_readme_exemplos_de_uso_cli", "label": "Exemplos de Uso CLI", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L156"}, {"id": "$graphify-root$_readme_2_extrator_de_manchetes_do_google_news", "label": "2. \ud83d\udcf0 Extrator de Manchetes do Google News", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L171"}, {"id": "$graphify-root$_readme_o_que_\u00e9_e_como_funciona_173", "label": "O que \u00e9 e Como Funciona", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L173"}, {"id": "$graphify-root$_readme_diferenciais_t\u00e9cnicos", "label": "Diferenciais T\u00e9cnicos", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L177"}, {"id": "$graphify-root$_readme_argumentos_e_flags_de_linha_de_comando", "label": "Argumentos e Flags de Linha de Comando", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L185"}, {"id": "$graphify-root$_readme_exemplos_pr\u00e1ticos_de_uso", "label": "Exemplos Pr\u00e1ticos de Uso", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L198"}, {"id": "$graphify-root$_readme_3_extrator_e_parser_multimotor_de_artigos", "label": "3. \ud83d\udcc4 Extrator e Parser Multimotor de Artigos", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L213"}, {"id": "$graphify-root$_readme_vis\u00e3o_geral_e_tr\u00edplice_extra\u00e7\u00e3o", "label": "Vis\u00e3o Geral e Tr\u00edplice Extra\u00e7\u00e3o", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L215"}, {"id": "$graphify-root$_readme_argumentos_e_flags_cli", "label": "Argumentos e Flags CLI", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L225"}, {"id": "$graphify-root$_readme_exemplos_de_uso", "label": "Exemplos de Uso", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L236"}, {"id": "$graphify-root$_readme_4_seletor_determin\u00edstico_de_conte\u00fado_de_artigos", "label": "4. \ud83c\udfaf Seletor Determin\u00edstico de Conte\u00fado de Artigos", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L251"}, {"id": "$graphify-root$_readme_vis\u00e3o_geral_e_algoritmo_de_consenso_f_1", "label": "Vis\u00e3o Geral e Algoritmo de Consenso ($F_1$)", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L253"}, {"id": "$graphify-root$_readme_pipeline_de_normaliza\u00e7\u00e3o_e_shingles", "label": "Pipeline de Normaliza\u00e7\u00e3o e Shingles", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L282"}, {"id": "$graphify-root$_readme_crit\u00e9rios_de_desempate_t\u00e9cnico_e_resili\u00eancia", "label": "Crit\u00e9rios de Desempate T\u00e9cnico e Resili\u00eancia", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L294"}, {"id": "$graphify-root$_readme_argumentos_e_flags_cli_306", "label": "Argumentos e Flags CLI", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L306"}, {"id": "$graphify-root$_readme_exemplos_pr\u00e1ticos_de_uso_315", "label": "Exemplos Pr\u00e1ticos de Uso", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L315"}, {"id": "$graphify-root$_readme_1_execu\u00e7\u00e3o_padr\u00e3o_autom\u00e1tica", "label": "1. Execu\u00e7\u00e3o Padr\u00e3o Autom\u00e1tica", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L317"}, {"id": "$graphify-root$_readme_2_execu\u00e7\u00e3o_com_modo_verboso", "label": "2. Execu\u00e7\u00e3o com Modo Verboso", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L323"}, {"id": "$graphify-root$_readme_3_uso_program\u00e1tico_como_m\u00f3dulo_python", "label": "3. Uso Program\u00e1tico como M\u00f3dulo Python", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L347"}, {"id": "$graphify-root$_readme_5_conversor_de_artigo_json_para_markdown", "label": "5. \ud83d\udcdd Conversor de Artigo JSON para Markdown", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L364"}, {"id": "$graphify-root$_readme_vis\u00e3o_geral_e_estrutura_do_documento", "label": "Vis\u00e3o Geral e Estrutura do Documento", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L366"}, {"id": "$graphify-root$_readme_isolamento_estrito_de_extratores_e_fallback", "label": "Isolamento Estrito de Extratores e Fallback", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L393"}, {"id": "$graphify-root$_readme_matriz_determin\u00edstica_de_metadados", "label": "Matriz Determin\u00edstica de Metadados", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L402"}, {"id": "$graphify-root$_readme_sanitiza\u00e7\u00e3o_editorial_e_deduplica\u00e7\u00e3o", "label": "Sanitiza\u00e7\u00e3o Editorial e Deduplica\u00e7\u00e3o", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L418"}, {"id": "$graphify-root$_readme_argumentos_e_flags_cli_425", "label": "Argumentos e Flags CLI", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L425"}, {"id": "$graphify-root$_readme_exemplos_pr\u00e1ticos_de_uso_432", "label": "Exemplos Pr\u00e1ticos de Uso", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L432"}, {"id": "$graphify-root$_readme_1_convers\u00e3o_padr\u00e3o", "label": "1. Convers\u00e3o Padr\u00e3o", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L434"}, {"id": "$graphify-root$_readme_2_convers\u00e3o_com_caminho_de_destino_personalizado", "label": "2. Convers\u00e3o com Caminho de Destino Personalizado", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L440"}, {"id": "$graphify-root$_readme_3_uso_program\u00e1tico_em_python", "label": "3. Uso Program\u00e1tico em Python", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L447"}, {"id": "$graphify-root$_readme_estrutura_do_projeto", "label": "\ud83d\udcc1 Estrutura do Projeto", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L458"}, {"id": "$graphify-root$_readme_testes_e_qualidade_de_c\u00f3digo", "label": "\ud83e\uddea Testes e Qualidade de C\u00f3digo", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L493"}, {"id": "$graphify-root$_readme_licen\u00e7a", "label": "\ud83d\udcc4 Licen\u00e7a", "file_type": "document", "node_kind": "heading", "source_file": "README.md", "source_location": "L522"}], "edges": [{"source": "$graphify-root$_readme_md", "target": "$graphify-root$_readme_textnlpclassifierapp", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L1", "weight": 1.0}, {"source": "$graphify-root$_readme_textnlpclassifierapp", "target": "$graphify-root$_readme_tabela_de_conte\u00fados", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L13", "weight": 1.0}, {"source": "$graphify-root$_readme_textnlpclassifierapp", "target": "$graphify-root$_readme_vis\u00e3o_geral", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L51", "weight": 1.0}, {"source": "$graphify-root$_readme_textnlpclassifierapp", "target": "$graphify-root$_readme_instala\u00e7\u00e3o_e_setup", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L63", "weight": 1.0}, {"source": "$graphify-root$_readme_instala\u00e7\u00e3o_e_setup", "target": "$graphify-root$_readme_1_clonar_o_reposit\u00f3rio_e_criar_ambiente_virtual", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L65", "weight": 1.0}, {"source": "$graphify-root$_readme_instala\u00e7\u00e3o_e_setup", "target": "$graphify-root$_readme_2_instalar_depend\u00eancias", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L78", "weight": 1.0}, {"source": "$graphify-root$_readme_instala\u00e7\u00e3o_e_setup", "target": "$graphify-root$_readme_3_baixar_bin\u00e1rios_do_navegador_stealth_camoufox", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L84", "weight": 1.0}, {"source": "$graphify-root$_readme_textnlpclassifierapp", "target": "$graphify-root$_readme_1_classificador_de_conte\u00fado_e_iner\u00eancia_nlp_llm_ecp", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L94", "weight": 1.0}, {"source": "$graphify-root$_readme_1_classificador_de_conte\u00fado_e_iner\u00eancia_nlp_llm_ecp", "target": "$graphify-root$_readme_o_que_\u00e9_e_como_funciona", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L96", "weight": 1.0}, {"source": "$graphify-root$_readme_1_classificador_de_conte\u00fado_e_iner\u00eancia_nlp_llm_ecp", "target": "$graphify-root$_readme_arquitetura_de_classifica\u00e7\u00e3o_em_3_tiers", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L102", "weight": 1.0}, {"source": "$graphify-root$_readme_1_classificador_de_conte\u00fado_e_iner\u00eancia_nlp_llm_ecp", "target": "$graphify-root$_readme_categorias_de_decis\u00e3o", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L123", "weight": 1.0}, {"source": "$graphify-root$_readme_1_classificador_de_conte\u00fado_e_iner\u00eancia_nlp_llm_ecp", "target": "$graphify-root$_readme_formato_do_ecp_snapshot_e_markdown", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L132", "weight": 1.0}, {"source": "$graphify-root$_readme_formato_do_ecp_snapshot_e_markdown", "target": "$graphify-root$_readme_exemplo_de_ecp_snapshot_ecp_sample_json", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L134", "weight": 1.0}, {"source": "$graphify-root$_readme_1_classificador_de_conte\u00fado_e_iner\u00eancia_nlp_llm_ecp", "target": "$graphify-root$_readme_exemplos_de_uso_cli", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L156", "weight": 1.0}, {"source": "$graphify-root$_readme_textnlpclassifierapp", "target": "$graphify-root$_readme_2_extrator_de_manchetes_do_google_news", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L171", "weight": 1.0}, {"source": "$graphify-root$_readme_2_extrator_de_manchetes_do_google_news", "target": "$graphify-root$_readme_o_que_\u00e9_e_como_funciona_173", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L173", "weight": 1.0}, {"source": "$graphify-root$_readme_2_extrator_de_manchetes_do_google_news", "target": "$graphify-root$_readme_diferenciais_t\u00e9cnicos", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L177", "weight": 1.0}, {"source": "$graphify-root$_readme_2_extrator_de_manchetes_do_google_news", "target": "$graphify-root$_readme_argumentos_e_flags_de_linha_de_comando", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L185", "weight": 1.0}, {"source": "$graphify-root$_readme_2_extrator_de_manchetes_do_google_news", "target": "$graphify-root$_readme_exemplos_pr\u00e1ticos_de_uso", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L198", "weight": 1.0}, {"source": "$graphify-root$_readme_textnlpclassifierapp", "target": "$graphify-root$_readme_3_extrator_e_parser_multimotor_de_artigos", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L213", "weight": 1.0}, {"source": "$graphify-root$_readme_3_extrator_e_parser_multimotor_de_artigos", "target": "$graphify-root$_readme_vis\u00e3o_geral_e_tr\u00edplice_extra\u00e7\u00e3o", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L215", "weight": 1.0}, {"source": "$graphify-root$_readme_3_extrator_e_parser_multimotor_de_artigos", "target": "$graphify-root$_readme_argumentos_e_flags_cli", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L225", "weight": 1.0}, {"source": "$graphify-root$_readme_3_extrator_e_parser_multimotor_de_artigos", "target": "$graphify-root$_readme_exemplos_de_uso", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L236", "weight": 1.0}, {"source": "$graphify-root$_readme_textnlpclassifierapp", "target": "$graphify-root$_readme_4_seletor_determin\u00edstico_de_conte\u00fado_de_artigos", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L251", "weight": 1.0}, {"source": "$graphify-root$_readme_4_seletor_determin\u00edstico_de_conte\u00fado_de_artigos", "target": "$graphify-root$_readme_vis\u00e3o_geral_e_algoritmo_de_consenso_f_1", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L253", "weight": 1.0}, {"source": "$graphify-root$_readme_4_seletor_determin\u00edstico_de_conte\u00fado_de_artigos", "target": "$graphify-root$_readme_pipeline_de_normaliza\u00e7\u00e3o_e_shingles", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L282", "weight": 1.0}, {"source": "$graphify-root$_readme_md", "target": "$graphify-root$_url_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L287", "weight": 1.0}, {"source": "$graphify-root$_readme_4_seletor_determin\u00edstico_de_conte\u00fado_de_artigos", "target": "$graphify-root$_readme_crit\u00e9rios_de_desempate_t\u00e9cnico_e_resili\u00eancia", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L294", "weight": 1.0}, {"source": "$graphify-root$_readme_4_seletor_determin\u00edstico_de_conte\u00fado_de_artigos", "target": "$graphify-root$_readme_argumentos_e_flags_cli_306", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L306", "weight": 1.0}, {"source": "$graphify-root$_readme_4_seletor_determin\u00edstico_de_conte\u00fado_de_artigos", "target": "$graphify-root$_readme_exemplos_pr\u00e1ticos_de_uso_315", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L315", "weight": 1.0}, {"source": "$graphify-root$_readme_exemplos_pr\u00e1ticos_de_uso_315", "target": "$graphify-root$_readme_1_execu\u00e7\u00e3o_padr\u00e3o_autom\u00e1tica", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L317", "weight": 1.0}, {"source": "$graphify-root$_readme_exemplos_pr\u00e1ticos_de_uso_315", "target": "$graphify-root$_readme_2_execu\u00e7\u00e3o_com_modo_verboso", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L323", "weight": 1.0}, {"source": "$graphify-root$_readme_exemplos_pr\u00e1ticos_de_uso_315", "target": "$graphify-root$_readme_3_uso_program\u00e1tico_como_m\u00f3dulo_python", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L347", "weight": 1.0}, {"source": "$graphify-root$_readme_textnlpclassifierapp", "target": "$graphify-root$_readme_5_conversor_de_artigo_json_para_markdown", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L364", "weight": 1.0}, {"source": "$graphify-root$_readme_5_conversor_de_artigo_json_para_markdown", "target": "$graphify-root$_readme_vis\u00e3o_geral_e_estrutura_do_documento", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L366", "weight": 1.0}, {"source": "$graphify-root$_readme_5_conversor_de_artigo_json_para_markdown", "target": "$graphify-root$_readme_isolamento_estrito_de_extratores_e_fallback", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L393", "weight": 1.0}, {"source": "$graphify-root$_readme_5_conversor_de_artigo_json_para_markdown", "target": "$graphify-root$_readme_matriz_determin\u00edstica_de_metadados", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L402", "weight": 1.0}, {"source": "$graphify-root$_readme_5_conversor_de_artigo_json_para_markdown", "target": "$graphify-root$_readme_sanitiza\u00e7\u00e3o_editorial_e_deduplica\u00e7\u00e3o", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L418", "weight": 1.0}, {"source": "$graphify-root$_readme_5_conversor_de_artigo_json_para_markdown", "target": "$graphify-root$_readme_argumentos_e_flags_cli_425", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L425", "weight": 1.0}, {"source": "$graphify-root$_readme_5_conversor_de_artigo_json_para_markdown", "target": "$graphify-root$_readme_exemplos_pr\u00e1ticos_de_uso_432", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L432", "weight": 1.0}, {"source": "$graphify-root$_readme_exemplos_pr\u00e1ticos_de_uso_432", "target": "$graphify-root$_readme_1_convers\u00e3o_padr\u00e3o", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L434", "weight": 1.0}, {"source": "$graphify-root$_readme_exemplos_pr\u00e1ticos_de_uso_432", "target": "$graphify-root$_readme_2_convers\u00e3o_com_caminho_de_destino_personalizado", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L440", "weight": 1.0}, {"source": "$graphify-root$_readme_exemplos_pr\u00e1ticos_de_uso_432", "target": "$graphify-root$_readme_3_uso_program\u00e1tico_em_python", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L447", "weight": 1.0}, {"source": "$graphify-root$_readme_textnlpclassifierapp", "target": "$graphify-root$_readme_estrutura_do_projeto", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L458", "weight": 1.0}, {"source": "$graphify-root$_readme_textnlpclassifierapp", "target": "$graphify-root$_readme_testes_e_qualidade_de_c\u00f3digo", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L493", "weight": 1.0}, {"source": "$graphify-root$_readme_textnlpclassifierapp", "target": "$graphify-root$_readme_licen\u00e7a", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L522", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/graphify-out/cache/ast/v0.9.47-s2/f2c146fd734cceaa4f2268d03c8633153f57d2fd468073a6a4701fbc14b25ef7.json b/graphify-out/cache/ast/v0.9.47-s2/f2c146fd734cceaa4f2268d03c8633153f57d2fd468073a6a4701fbc14b25ef7.json new file mode 100644 index 0000000..e6213c5 --- /dev/null +++ b/graphify-out/cache/ast/v0.9.47-s2/f2c146fd734cceaa4f2268d03c8633153f57d2fd468073a6a4701fbc14b25ef7.json @@ -0,0 +1 @@ +{"nodes": [{"id": "$graphify-root$_specs_005_convert_json_markdown_contracts_cli_contract_md", "label": "cli-contract.md", "file_type": "document", "node_kind": "page", "source_file": "specs/005-convert-json-markdown/contracts/cli-contract.md", "source_location": "L1"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_contracts_cli_contract_cli_contract_convert_article_to_markdown_py", "label": "CLI Contract: `convert_article_to_markdown.py`", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/contracts/cli-contract.md", "source_location": "L1"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_contracts_cli_contract_1_script_signature", "label": "1. Script Signature", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/contracts/cli-contract.md", "source_location": "L5"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_contracts_cli_contract_2_command_line_arguments", "label": "2. Command-Line Arguments", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/contracts/cli-contract.md", "source_location": "L11"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_contracts_cli_contract_3_exit_codes", "label": "3. Exit Codes", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/contracts/cli-contract.md", "source_location": "L18"}, {"id": "$graphify-root$_specs_005_convert_json_markdown_contracts_cli_contract_4_standard_stream_behavior", "label": "4. Standard Stream Behavior", "file_type": "document", "node_kind": "heading", "source_file": "specs/005-convert-json-markdown/contracts/cli-contract.md", "source_location": "L26"}], "edges": [{"source": "$graphify-root$_specs_005_convert_json_markdown_contracts_cli_contract_md", "target": "$graphify-root$_specs_005_convert_json_markdown_contracts_cli_contract_cli_contract_convert_article_to_markdown_py", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/contracts/cli-contract.md", "source_location": "L1", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_contracts_cli_contract_cli_contract_convert_article_to_markdown_py", "target": "$graphify-root$_specs_005_convert_json_markdown_contracts_cli_contract_1_script_signature", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/contracts/cli-contract.md", "source_location": "L5", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_contracts_cli_contract_cli_contract_convert_article_to_markdown_py", "target": "$graphify-root$_specs_005_convert_json_markdown_contracts_cli_contract_2_command_line_arguments", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/contracts/cli-contract.md", "source_location": "L11", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_contracts_cli_contract_cli_contract_convert_article_to_markdown_py", "target": "$graphify-root$_specs_005_convert_json_markdown_contracts_cli_contract_3_exit_codes", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/contracts/cli-contract.md", "source_location": "L18", "weight": 1.0}, {"source": "$graphify-root$_specs_005_convert_json_markdown_contracts_cli_contract_cli_contract_convert_article_to_markdown_py", "target": "$graphify-root$_specs_005_convert_json_markdown_contracts_cli_contract_4_standard_stream_behavior", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/005-convert-json-markdown/contracts/cli-contract.md", "source_location": "L26", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} \ No newline at end of file diff --git a/graphify-out/cache/stat-index.json b/graphify-out/cache/stat-index.json index 3c6827d..21c62b3 100644 --- a/graphify-out/cache/stat-index.json +++ b/graphify-out/cache/stat-index.json @@ -1 +1 @@ -{".agents/skills/graphify/SKILL.md":{"size":41276,"mtime_ns":1787189375574389900,"indexed_at_ns":1787189383574665500,"word_count":5211,"hashes":{".agents/skills/graphify/skill.md":"3f0ba089a04e342e4337913a03515905fe205f57914b53b8eb1ff59dc926a4ea"}},".agents/skills/graphify/references/add-watch.md":{"size":2486,"mtime_ns":1787176247108301100,"indexed_at_ns":1787189352249948700,"word_count":366,"hashes":{".agents/skills/graphify/references/add-watch.md":"bc4c3ac2e736e36fff3e120b2a7967f1f049c6b05ca39db50606b4bb83c768f7"}},".agents/skills/graphify/references/exports.md":{"size":3362,"mtime_ns":1787176247109325900,"indexed_at_ns":1787189352252005200,"word_count":470,"hashes":{".agents/skills/graphify/references/exports.md":"81b09c0ad09d54d52b68755c32544024e290c02f53bdeb283b1b76d7eebc2445"}},".agents/skills/graphify/references/extraction-spec.md":{"size":7960,"mtime_ns":1787176247109325900,"indexed_at_ns":1787189352254091000,"word_count":1038,"hashes":{".agents/skills/graphify/references/extraction-spec.md":"d07c5b2e8224b1006b1a336f77d0af22f637fe8d20166895bf852c32324d851b"}},".agents/skills/graphify/references/github-and-merge.md":{"size":2177,"mtime_ns":1787176247111831300,"indexed_at_ns":1787189352255826900,"word_count":271,"hashes":{".agents/skills/graphify/references/github-and-merge.md":"189cf7c8c51988d23f6ad25dff96855ce0e7336bffa352dedb3867954e702f7b"}},".agents/skills/graphify/references/hooks.md":{"size":1267,"mtime_ns":1787176247112843500,"indexed_at_ns":1787189352257586300,"word_count":193,"hashes":{".agents/skills/graphify/references/hooks.md":"3e7d2df361e7059e921192b1693cc7859e4a2b0474446f8352be5a4624790eaa"}},".agents/skills/graphify/references/query.md":{"size":13456,"mtime_ns":1787176247113897600,"indexed_at_ns":1787189352259619700,"word_count":1763,"hashes":{".agents/skills/graphify/references/query.md":"151ad7ed0ee4aefe411f026261f605a61134cc6247324fe8df3ae1e785321283"}},".agents/skills/graphify/references/transcribe.md":{"size":3173,"mtime_ns":1787176247113897600,"indexed_at_ns":1787189352261502100,"word_count":418,"hashes":{".agents/skills/graphify/references/transcribe.md":"cbbbae90e451d722b39df0df7bc267bb9b7ecb3dd8a9e8be4b40237df053c8d6"}},".agents/skills/graphify/references/update.md":{"size":10425,"mtime_ns":1787176247115420200,"indexed_at_ns":1787189352263334600,"word_count":1196,"hashes":{".agents/skills/graphify/references/update.md":"b209dbb3bb5466e601a530b65925c55c34f040ffcf56d38ea64be9aaf75f92ce"}},".agents/skills/ponytail-audit/SKILL.md":{"size":1693,"mtime_ns":1786995804152832800,"indexed_at_ns":1787189325036907200,"word_count":234,"hashes":{".agents/skills/ponytail-audit/skill.md":"b29dd08e26692c4bdd87b024d43820e2b45527984d9b3330b5fcfc78491aac52"}},".agents/skills/ponytail-debt/SKILL.md":{"size":1747,"mtime_ns":1786995804152832800,"indexed_at_ns":1787189325037560500,"word_count":261,"hashes":{".agents/skills/ponytail-debt/skill.md":"4b8e8de454f0d7d46bce20b3f4b4ea4c5a1eb60691c0d8bef27ef4ded155e4bc"}},".agents/skills/ponytail-gain/SKILL.md":{"size":2023,"mtime_ns":1786995804154227800,"indexed_at_ns":1787189325038161300,"word_count":246,"hashes":{".agents/skills/ponytail-gain/skill.md":"9e15d99db7452555dae0cc55e5c37799e1dc8acaed4eb89c0e9641d3afbb9646"}},".agents/skills/ponytail-help/SKILL.md":{"size":2867,"mtime_ns":1786995804154227800,"indexed_at_ns":1787189325038779900,"word_count":379,"hashes":{".agents/skills/ponytail-help/skill.md":"4b6ba4d12d19068c08b12af63c05b0acc9ce3beed06654065450c0cd6042d9db"}},".agents/skills/ponytail-review/SKILL.md":{"size":2440,"mtime_ns":1786995804155238700,"indexed_at_ns":1787189325039426100,"word_count":339,"hashes":{".agents/skills/ponytail-review/skill.md":"694090b91438cff578931361d36947da438722dd1f9f7460022bb3aa5b18b4de"}},".agents/skills/ponytail/SKILL.md":{"size":6757,"mtime_ns":1786995804156239700,"indexed_at_ns":1787189325040071200,"word_count":1079,"hashes":{".agents/skills/ponytail/skill.md":"64fc6e81a1b2b008fd72f5c9686498e53383e9cb25d518dc81305799e985bf6f"}},".agents/skills/speckit-analyze/SKILL.md":{"size":11642,"mtime_ns":1787189272133064100,"indexed_at_ns":1787189325040713600,"word_count":1569,"hashes":{".agents/skills/speckit-analyze/skill.md":"12f78b5b87a05d7075320de7e7df0fc3890ee915bf5203ef2c397fee48b0d04e"}},".agents/skills/speckit-checklist/SKILL.md":{"size":22277,"mtime_ns":1787189272160379600,"indexed_at_ns":1787189325041377200,"word_count":2981,"hashes":{".agents/skills/speckit-checklist/skill.md":"1b9b592206c499d1c46699ea99fd3795ec31638e3968aa90054d07bff9f26852"}},".agents/skills/speckit-clarify/SKILL.md":{"size":19212,"mtime_ns":1787189272137533000,"indexed_at_ns":1787189325042095600,"word_count":2688,"hashes":{".agents/skills/speckit-clarify/skill.md":"d091faedcb83b3f11a3049a84424f5d66b6bdf181b192a8167c07b94133e617d"}},".agents/skills/speckit-constitution/SKILL.md":{"size":9959,"mtime_ns":1787189272141381400,"indexed_at_ns":1787189325042781900,"word_count":1376,"hashes":{".agents/skills/speckit-constitution/skill.md":"791892a3d87f7bd6ea936f896c5050b183942489d68bfb383c2ba4de8380a901"}},".agents/skills/speckit-converge/SKILL.md":{"size":12639,"mtime_ns":1787189272150381400,"indexed_at_ns":1787189325043428600,"word_count":1798,"hashes":{".agents/skills/speckit-converge/skill.md":"c04c22c94ac9a47d73d547636127b06f38647627a4dbfbc36ae50dd0a95971b3"}},".agents/skills/speckit-implement/SKILL.md":{"size":12703,"mtime_ns":1787189272146373000,"indexed_at_ns":1787189325044057400,"word_count":1691,"hashes":{".agents/skills/speckit-implement/skill.md":"a779bc551abfa24d77556554b4cc0225b3c57bc436956b9cb9aafe306c581945"}},".agents/skills/speckit-plan/SKILL.md":{"size":7857,"mtime_ns":1787189272154380100,"indexed_at_ns":1787189325044689700,"word_count":1083,"hashes":{".agents/skills/speckit-plan/skill.md":"74b5f950130fa658b857d1c81ac052d89277cbe9901c51f01270963c746277b6"}},".agents/skills/speckit-specify/SKILL.md":{"size":18258,"mtime_ns":1787189272165381000,"indexed_at_ns":1787189325045384300,"word_count":2452,"hashes":{".agents/skills/speckit-specify/skill.md":"b86e839509339a9e11a605b6db50fcd3a435511d5cbe1bbbf4f473ac4bdd5447"}},".agents/skills/speckit-tasks/SKILL.md":{"size":10978,"mtime_ns":1787189272169379600,"indexed_at_ns":1787189325046041900,"word_count":1581,"hashes":{".agents/skills/speckit-tasks/skill.md":"69de6853783574ace13eadf7c706a610df2f2584901974b713a51c1576e53339"}},".agents/skills/speckit-taskstoissues/SKILL.md":{"size":7686,"mtime_ns":1787189272172364900,"indexed_at_ns":1787189325046665600,"word_count":1153,"hashes":{".agents/skills/speckit-taskstoissues/skill.md":"fc53c7413cf050b143775a1aeca2773eabb248782a58d599b52d0d232c6c05fd"}},".specify/init-options.json":{"size":174,"mtime_ns":1787189272252382200,"indexed_at_ns":1787189325022221000,"word_count":16,"hashes":{".specify/init-options.json":"b39c8c1030871841dded0aede892fe2d25b36883333777cbab7d7c1c67b36f87"}},".specify/integration.json":{"size":279,"mtime_ns":1787189272181379700,"indexed_at_ns":1787189325023926100,"word_count":24,"hashes":{".specify/integration.json":"d7545650420a2ed3fd6878ad7006b8de79f5e812dd6352c0d86d530db3a12134"}},".specify/integrations/agy.manifest.json":{"size":1299,"mtime_ns":1787189272178366200,"indexed_at_ns":1787189325024675000,"word_count":31,"hashes":{".specify/integrations/agy.manifest.json":"504c42820b8e37a7eb26b328881026982f3a6a71fa16de670c425b35b37f00e4"}},".specify/integrations/speckit.manifest.json":{"size":1536,"mtime_ns":1787189272238379600,"indexed_at_ns":1787189325025369900,"word_count":35,"hashes":{".specify/integrations/speckit.manifest.json":"cc15502df7b241b7ef08785a613f642d69dc561b8b5db2ccba121fcb6d2c1680"}},".specify/memory/.constitution-template.json":{"size":103,"mtime_ns":1787189272257369800,"indexed_at_ns":1787189325026009300,"word_count":6,"hashes":{".specify/memory/.constitution-template.json":"a0f4bf5e5399e118b61e8bae9404743316cea6d0fff4270d8758aeb55525b988"}},".specify/memory/constitution.md":{"size":2346,"mtime_ns":1787189272254379900,"indexed_at_ns":1787189325047314000,"word_count":272,"hashes":{".specify/memory/constitution.md":"51f14d46d5b6abddce28779396666792636c8d9629f0202e84501a5e759267ab"}},".specify/scripts/powershell/check-prerequisites.ps1":{"size":6122,"mtime_ns":1787189272202379800,"indexed_at_ns":1787189325026668000,"word_count":685,"hashes":{".specify/scripts/powershell/check-prerequisites.ps1":"80f1c4dc6817140dea987bb5727d38be754679c7052f1d9a088031536423cb23"}},".specify/scripts/powershell/common.ps1":{"size":34245,"mtime_ns":1787189272206379800,"indexed_at_ns":1787189325027347800,"word_count":3419,"hashes":{".specify/scripts/powershell/common.ps1":"63b253c967802e85ab12e76ac716eca4bb164dde2b9324e08e406d848ec4104b"}},".specify/scripts/powershell/create-new-feature.ps1":{"size":13026,"mtime_ns":1787189272211369000,"indexed_at_ns":1787189325028005300,"word_count":1421,"hashes":{".specify/scripts/powershell/create-new-feature.ps1":"7b4eb36a1fbbbe9a449b5f99de1055b1aad88e775eeb0db3f86e4ff013e6ddd1"}},".specify/scripts/powershell/resolve-template.ps1":{"size":889,"mtime_ns":1787189272214379900,"indexed_at_ns":1787189325028621300,"word_count":86,"hashes":{".specify/scripts/powershell/resolve-template.ps1":"78234a87c584e697a8fda8b18f134914e41465cbb67c1608b81e69860741502c"}},".specify/scripts/powershell/setup-plan.ps1":{"size":2927,"mtime_ns":1787189272218379500,"indexed_at_ns":1787189325029271700,"word_count":325,"hashes":{".specify/scripts/powershell/setup-plan.ps1":"4d5b636734ae78061da3a7675f0af4acfa6b65f7d994d5372c8c051f25bb8966"}},".specify/scripts/powershell/setup-tasks.ps1":{"size":3892,"mtime_ns":1787189272221379900,"indexed_at_ns":1787189325029900900,"word_count":429,"hashes":{".specify/scripts/powershell/setup-tasks.ps1":"5c980d1a41d186b634bc350128c31e5f3074099b996989c0a0d95b22623b2932"}},".specify/templates/checklist-template.md":{"size":2033,"mtime_ns":1787189272223379700,"indexed_at_ns":1787189325047907900,"word_count":271,"hashes":{".specify/templates/checklist-template.md":"6fb0a979b8534e1b3343d1ce6e45f84d32b118e096620bfdeed241dbc1a1da8a"}},".specify/templates/constitution-template.md":{"size":2346,"mtime_ns":1787189272226379800,"indexed_at_ns":1787189325048534600,"word_count":272,"hashes":{".specify/templates/constitution-template.md":"ae22b7c7ecb6ccd516fed25916e465146432c58f1bef904a92b535ac0bbecfcf"}},".specify/templates/plan-template.md":{"size":3682,"mtime_ns":1787189272229368600,"indexed_at_ns":1787189325049160100,"word_count":463,"hashes":{".specify/templates/plan-template.md":"e5cfe5097c5de0add0f0de02b7a5d2cd2470c9a2f24c0e6e15439d274e12abe0"}},".specify/templates/spec-template.md":{"size":4556,"mtime_ns":1787189272231368600,"indexed_at_ns":1787189325049780800,"word_count":629,"hashes":{".specify/templates/spec-template.md":"2734a509d4b2f34ee6258475c4fb2e80a6dbfcbc47c8552df5b6278907529250"}},".specify/templates/tasks-template.md":{"size":9171,"mtime_ns":1787189272234379700,"indexed_at_ns":1787189325050369300,"word_count":1384,"hashes":{".specify/templates/tasks-template.md":"070ed0dfafd8310a243b51cc30b1b6dfb19883fdd5ad20e4b53e45eb7f939e3e"}},".specify/workflows/speckit/workflow.yml":{"size":2216,"mtime_ns":1787160407462626700,"indexed_at_ns":1787189324996696100,"word_count":276},".specify/workflows/workflow-registry.json":{"size":381,"mtime_ns":1787189272250379800,"indexed_at_ns":1787189325030509700,"word_count":34,"hashes":{".specify/workflows/workflow-registry.json":"2c5bf7f4ba03ddf54945cd64d4740301036c18ebea47448d93ff428c771eff3d"}},".agents/rules/graphify.md":{"size":947,"mtime_ns":1787189347444181700,"indexed_at_ns":1787189352246818600,"word_count":127,"hashes":{".agents/rules/graphify.md":"e55792958648fb69255e3ce3f71a8fcead36307c34b2d67feda9ac650ac61803"}},".agents/workflows/graphify.md":{"size":239,"mtime_ns":1787189347444181700,"indexed_at_ns":1787189352301037700,"word_count":37,"hashes":{".agents/workflows/graphify.md":"d92622463299d313da48e2cdbebf79d7ea24ffaf2ae2de2a1714be8ee42b22b3"}},"specs/001-multilingual-entity-classifier/checklists/requirements.md":{"size":1897,"mtime_ns":1787193985655018100,"indexed_at_ns":1787194002726038300,"word_count":258,"hashes":{"specs/001-multilingual-entity-classifier/checklists/requirements.md":"277036c8add1bae5eeae6da5595cf66405670d33f9d4842784b1c5581cef62d0"}},"specs/001-multilingual-entity-classifier/spec.md":{"size":10753,"mtime_ns":1787194850510689300,"indexed_at_ns":1787194930726970700,"word_count":1423,"hashes":{"specs/001-multilingual-entity-classifier/spec.md":"f136d1d2e6a539072ea238be9d0e918dbc32eb89555ffd37e9b84579064e7799"}},"specs/001-multilingual-entity-classifier/contracts/cli-contract.md":{"size":1808,"mtime_ns":1787194605824187100,"indexed_at_ns":1787194638410863000,"word_count":281,"hashes":{"specs/001-multilingual-entity-classifier/contracts/cli-contract.md":"894670a7228b93a2202203ac532aa0d415bd1921272b61a8d07e951a417bc75c"}},"specs/001-multilingual-entity-classifier/data-model.md":{"size":5137,"mtime_ns":1787194591677816000,"indexed_at_ns":1787194638411601100,"word_count":524,"hashes":{"specs/001-multilingual-entity-classifier/data-model.md":"89ecf2e55508b53ba208d011a76868294f0ff3cab87a217e7ed73c19edfbd9f6"}},"specs/001-multilingual-entity-classifier/plan.md":{"size":6215,"mtime_ns":1787194897854106700,"indexed_at_ns":1787194930724386200,"word_count":782,"hashes":{"specs/001-multilingual-entity-classifier/plan.md":"d37d1c5f3bffc4dad289ad128024ab6dffb409b06f49e96fc5a2fd2a735472a5"}},"specs/001-multilingual-entity-classifier/quickstart.md":{"size":3235,"mtime_ns":1787194877439851000,"indexed_at_ns":1787194930725082000,"word_count":339,"hashes":{"specs/001-multilingual-entity-classifier/quickstart.md":"816060813a37d728ceed955aa829d7fa4f80862f0932133cd5293bdbfdbd40db"}},"specs/001-multilingual-entity-classifier/research.md":{"size":4059,"mtime_ns":1787194581004019000,"indexed_at_ns":1787194638413783100,"word_count":509,"hashes":{"specs/001-multilingual-entity-classifier/research.md":"d4b61795fb09da693ead647d4c05e8f44699c36e9f43b47e808e09a2f970d996"}},"specs/001-multilingual-entity-classifier/tasks.md":{"size":6951,"mtime_ns":1787196452595599000,"indexed_at_ns":1787196460266934400,"word_count":874,"hashes":{"specs/001-multilingual-entity-classifier/tasks.md":"7a33202595cf192baf702d3d8e169ea8db59ca0f2fecb471594f7f3c48417082"}},"specs/001-multilingual-entity-classifier/checklists/poc-readiness.md":{"size":4154,"mtime_ns":1787195218247525200,"indexed_at_ns":1787195224690016000,"word_count":546,"hashes":{"specs/001-multilingual-entity-classifier/checklists/poc-readiness.md":"6da9d16dcd60e927f892c69aa05945e99840b6dc824f93ea2686f12801e81a8a"}},"classify.py":{"size":6143,"mtime_ns":1787264412245764200,"indexed_at_ns":1787264516410989400,"word_count":482,"hashes":{"classify.py":"7fc86ae608bd6656cd4d2d91285ab1857edf96864249e6df308dc5c327b35775"}},"examples/content_northvolt_de.md":{"size":530,"mtime_ns":1787195963813740900,"indexed_at_ns":1787196460246681400,"word_count":57,"hashes":{"examples/content_northvolt_de.md":"5708f5dac050fea9c5e4fbdee40910cbb4c4be0efc9c3212f7cf2a7a034eb91d"}},"examples/content_presal_pt.md":{"size":506,"mtime_ns":1787195950024799800,"indexed_at_ns":1787196460247532700,"word_count":72,"hashes":{"examples/content_presal_pt.md":"ef8c7d61a4d721f7d702fa608274da920476be3a4f7bfe6e4f603abba12a133f"}},"examples/content_tangential_es.md":{"size":414,"mtime_ns":1787195975527150700,"indexed_at_ns":1787196460248387000,"word_count":60,"hashes":{"examples/content_tangential_es.md":"d02c405931b0752377a2ba10cbffe4d664713e33c3b6a8fbdd36b4a75b30f11b"}},"examples/ecp_apple.json":{"size":723,"mtime_ns":1787195969757856700,"indexed_at_ns":1787196460143672700,"word_count":68,"hashes":{"examples/ecp_apple.json":"166fb76e5d0d181835dd636450b6828565c2baafcb21228313bcea3c850d9a92"}},"examples/ecp_petrobras.json":{"size":714,"mtime_ns":1787195944394575600,"indexed_at_ns":1787196460144504800,"word_count":62,"hashes":{"examples/ecp_petrobras.json":"5dd24cf4d5cb9f636f3a1c2511eeaa152be0511b80974a4f36d5d68aded046db"}},"examples/ecp_volkswagen.json":{"size":720,"mtime_ns":1787195955456870500,"indexed_at_ns":1787196460145217300,"word_count":56,"hashes":{"examples/ecp_volkswagen.json":"3d3866179c67e332ad5aa46f5d15eeb4de3fa829d1cc21ccf73cc7f3a7eb32c5"}},"pyproject.toml":{"size":762,"mtime_ns":1787264482850924600,"indexed_at_ns":1787264516414577000,"word_count":86,"hashes":{"pyproject.toml":"ab0b0276581056a63d591237beb2e4e8fe3a4441c06963a847dd1f74b569dd88"}},"requirements.txt":{"size":313,"mtime_ns":1787310744908501900,"indexed_at_ns":1787310811272623600,"word_count":29},"src/__init__.py":{"size":83,"mtime_ns":1787195832559486000,"indexed_at_ns":1787196460146819200,"word_count":9,"hashes":{"src/__init__.py":"81c4eae46f05fd529d4f81f2d318c2b4e3af282f140963e9c5c876690bb1ca74"}},"src/adapters/__init__.py":{"size":73,"mtime_ns":1787195842271676800,"indexed_at_ns":1787196460147577400,"word_count":9,"hashes":{"src/adapters/__init__.py":"f4dcecfaeea2ae0852fd9836bfb4f9b2a9bedd60057157064e6d3fed4a8c1bd7"}},"src/adapters/base.py":{"size":907,"mtime_ns":1787264412243760700,"indexed_at_ns":1787264516431216000,"word_count":95,"hashes":{"src/adapters/base.py":"39d8678210517983b9fe9bfa26a1990c1f4f63195651da2a180d3bb73db51a1e"}},"src/adapters/embeddings.py":{"size":1399,"mtime_ns":1787264437927229800,"indexed_at_ns":1787264516432540300,"word_count":139,"hashes":{"src/adapters/embeddings.py":"acf74e38373f16e923350dbcf514b2958215391024c8abed3b8a621b0e69bd61"}},"src/adapters/llm.py":{"size":1232,"mtime_ns":1787264412243760700,"indexed_at_ns":1787264516433377900,"word_count":135,"hashes":{"src/adapters/llm.py":"084a9de66475aad2eb213ff906128d4094408891bd8ddbbd9f0e5674a1cb6192"}},"src/classifier.py":{"size":9804,"mtime_ns":1787264459052089000,"indexed_at_ns":1787264516434381400,"word_count":820,"hashes":{"src/classifier.py":"d890fd0c6be9bb68eeb459e8a89ed988c075978cc220d923a8b81714563db177"}},"src/language.py":{"size":10957,"mtime_ns":1787264437931227400,"indexed_at_ns":1787264516435249300,"word_count":887,"hashes":{"src/language.py":"75d8e6444528450b5d11eee5b51965c98525070bb65eb0edabc996701a4c5075"}},"src/models.py":{"size":5959,"mtime_ns":1787264437930228400,"indexed_at_ns":1787264516436265800,"word_count":487,"hashes":{"src/models.py":"260513e4539e617b4123ac5b5352cb6ce7caf3a5dfba08badf6390bf60784ac9"}},"src/parser.py":{"size":2654,"mtime_ns":1787264437931227400,"indexed_at_ns":1787264516437222700,"word_count":299,"hashes":{"src/parser.py":"a789a6ba02724ad75604dcc56991e8b7989558abe673d4701242012723954407"}},"tests/__init__.py":{"size":69,"mtime_ns":1787195847518641200,"indexed_at_ns":1787196460153585600,"word_count":8,"hashes":{"tests/__init__.py":"2acdae7d2696c23d5391ed343046cffa11b82f3f0d7d85767dacf0e762a955d1"}},"tests/fixtures/benchmark_24/de/contextual.md":{"size":144,"mtime_ns":1787196180779459400,"indexed_at_ns":1787196460268138600,"word_count":17,"hashes":{"tests/fixtures/benchmark_24/de/contextual.md":"b6a18c4bef2defe99773d3ba43137148d25b42ac27562b10b73ccdee1a49f203"}},"tests/fixtures/benchmark_24/de/contextual_expected.json":{"size":136,"mtime_ns":1787196187032823100,"indexed_at_ns":1787196460154321700,"word_count":10,"hashes":{"tests/fixtures/benchmark_24/de/contextual_expected.json":"cb741ed9bef3359a41d5c031ad213d4320c5b8fe3f8579e497ee9b1eda0ed478"}},"tests/fixtures/benchmark_24/de/direct.md":{"size":148,"mtime_ns":1787196169572812500,"indexed_at_ns":1787196460269192500,"word_count":16,"hashes":{"tests/fixtures/benchmark_24/de/direct.md":"67f375d26d8424655b76d5650c656b4af79b9964d52f2d24049e1f4de6545c9b"}},"tests/fixtures/benchmark_24/de/direct_expected.json":{"size":132,"mtime_ns":1787196175168070900,"indexed_at_ns":1787196460155004400,"word_count":10,"hashes":{"tests/fixtures/benchmark_24/de/direct_expected.json":"5301a39d31b365266b529ce9823145381241f8876af1ec21f0a9c27c9bdc80fa"}},"tests/fixtures/benchmark_24/de/ecp.json":{"size":579,"mtime_ns":1787196164027193900,"indexed_at_ns":1787196460155664300,"word_count":40,"hashes":{"tests/fixtures/benchmark_24/de/ecp.json":"061fc3a9468d2baaaf2b3e8355d08d23261a9a7adc484cb06b45646eacba46fc"}},"tests/fixtures/benchmark_24/de/not_related.md":{"size":137,"mtime_ns":1787196204093781400,"indexed_at_ns":1787196460270056100,"word_count":21,"hashes":{"tests/fixtures/benchmark_24/de/not_related.md":"4904b694b45a2058614a4e4350046eee042c4bbd7bcd6b88c56408ee3aebd81d"}},"tests/fixtures/benchmark_24/de/not_related_expected.json":{"size":129,"mtime_ns":1787196209729787600,"indexed_at_ns":1787196460156391600,"word_count":10,"hashes":{"tests/fixtures/benchmark_24/de/not_related_expected.json":"730fa882c1f3b8a7c0e2d3da9af55ee57ad7425a8b304c11f54e01899c740952"}},"tests/fixtures/benchmark_24/de/tangential.md":{"size":150,"mtime_ns":1787196193187087300,"indexed_at_ns":1787196460270857700,"word_count":21,"hashes":{"tests/fixtures/benchmark_24/de/tangential.md":"8207068977006dafa7c9c4459bd996b5c124972d25f1015a589d3b06d0999613"}},"tests/fixtures/benchmark_24/de/tangential_expected.json":{"size":128,"mtime_ns":1787196198703847300,"indexed_at_ns":1787196460157130400,"word_count":10,"hashes":{"tests/fixtures/benchmark_24/de/tangential_expected.json":"82dea5e55d7586c4e7005755e3da4f44560238733094876047de51e854d41d92"}},"tests/fixtures/benchmark_24/en/contextual.md":{"size":148,"mtime_ns":1787196066427405900,"indexed_at_ns":1787196460271878300,"word_count":19,"hashes":{"tests/fixtures/benchmark_24/en/contextual.md":"258a9f1ae01dae52955c1f45cb176e7d981a72ba869c33232c8c295f4816acc0"}},"tests/fixtures/benchmark_24/en/contextual_expected.json":{"size":136,"mtime_ns":1787196073211713100,"indexed_at_ns":1787196460158457500,"word_count":10,"hashes":{"tests/fixtures/benchmark_24/en/contextual_expected.json":"70605f9d8901d4c4b99d9fda1f30bc114cb0b65893579f77a1f9d50f62c1e3fc"}},"tests/fixtures/benchmark_24/en/direct.md":{"size":155,"mtime_ns":1787196054149613200,"indexed_at_ns":1787196460272766400,"word_count":21,"hashes":{"tests/fixtures/benchmark_24/en/direct.md":"c7e0b093c386ccf19d9d7cbef4763dfb665213a7a245093af43529b1eaff8266"}},"tests/fixtures/benchmark_24/en/direct_expected.json":{"size":132,"mtime_ns":1787196059966736300,"indexed_at_ns":1787196460159526700,"word_count":10,"hashes":{"tests/fixtures/benchmark_24/en/direct_expected.json":"0b803b2ad37388be7ef4ea1d164db22c9fd784bcb9be6f56627d412f1f9299bc"}},"tests/fixtures/benchmark_24/en/ecp.json":{"size":594,"mtime_ns":1787197123717795600,"indexed_at_ns":1787197157494285900,"word_count":52,"hashes":{"tests/fixtures/benchmark_24/en/ecp.json":"601423ac1e0b0e2bb7a0151ac87f5bdfd32450d90a022eaf9ef030338e0b4893"}},"tests/fixtures/benchmark_24/en/not_related.md":{"size":146,"mtime_ns":1787196350333465500,"indexed_at_ns":1787196460273595300,"word_count":24,"hashes":{"tests/fixtures/benchmark_24/en/not_related.md":"2fa405b123733c5a9b5beba8c646b886b27e212cff55496a9fe7d6208ddfb11c"}},"tests/fixtures/benchmark_24/en/not_related_expected.json":{"size":129,"mtime_ns":1787196104521133100,"indexed_at_ns":1787196460161344300,"word_count":10,"hashes":{"tests/fixtures/benchmark_24/en/not_related_expected.json":"cb046b055b5c72d8146b6035a935211d60fb0b313ef819576bb8e7048d55f468"}},"tests/fixtures/benchmark_24/en/tangential.md":{"size":147,"mtime_ns":1787196082730266300,"indexed_at_ns":1787196460274648200,"word_count":25,"hashes":{"tests/fixtures/benchmark_24/en/tangential.md":"793acebc11e5d6c17872d56881c8fe99cb187116c38fa4b2647d28fe3063a61e"}},"tests/fixtures/benchmark_24/en/tangential_expected.json":{"size":128,"mtime_ns":1787196089699545000,"indexed_at_ns":1787196460162151700,"word_count":10,"hashes":{"tests/fixtures/benchmark_24/en/tangential_expected.json":"d5b1a4dc64246838a066f73c41f0e33dcd59636e61d6c0842a3728247e536aff"}},"tests/fixtures/benchmark_24/es/contextual.md":{"size":167,"mtime_ns":1787196129959491900,"indexed_at_ns":1787196460275850900,"word_count":22,"hashes":{"tests/fixtures/benchmark_24/es/contextual.md":"d45ef46752e2093455e35cbf97076f943ab2be736c9bc4580607960b9d068731"}},"tests/fixtures/benchmark_24/es/contextual_expected.json":{"size":136,"mtime_ns":1787196135705341100,"indexed_at_ns":1787196460162957600,"word_count":10,"hashes":{"tests/fixtures/benchmark_24/es/contextual_expected.json":"083f7153df08f93f595782eb2959e8505ac4bda4daaf6634c7a11d444c1ba6b0"}},"tests/fixtures/benchmark_24/es/direct.md":{"size":179,"mtime_ns":1787196118640588800,"indexed_at_ns":1787196460276716800,"word_count":29,"hashes":{"tests/fixtures/benchmark_24/es/direct.md":"f6e282a68830d5518285b0cda510fe57fa844cc6322979604a427797f07fdbd7"}},"tests/fixtures/benchmark_24/es/direct_expected.json":{"size":132,"mtime_ns":1787196124282103900,"indexed_at_ns":1787196460163727400,"word_count":10,"hashes":{"tests/fixtures/benchmark_24/es/direct_expected.json":"fb96e4ae9e2e1603b9ac4d31b6984b31d814b3f31a8a3ca03c52c1ffa4199471"}},"tests/fixtures/benchmark_24/es/ecp.json":{"size":590,"mtime_ns":1787196110761765400,"indexed_at_ns":1787196460164509700,"word_count":52,"hashes":{"tests/fixtures/benchmark_24/es/ecp.json":"09cad55a4cc5a8c04b9898dee21c28b0d40561fcdd8ff012fe4de96616c05f7f"}},"tests/fixtures/benchmark_24/es/not_related.md":{"size":148,"mtime_ns":1787196152611035900,"indexed_at_ns":1787196460277631800,"word_count":23,"hashes":{"tests/fixtures/benchmark_24/es/not_related.md":"1b8a7f7a6852c9ec33fc34513ab479bd5edba48762a0801f7982e48adcb0089b"}},"tests/fixtures/benchmark_24/es/not_related_expected.json":{"size":129,"mtime_ns":1787196158098444000,"indexed_at_ns":1787196460165309300,"word_count":10,"hashes":{"tests/fixtures/benchmark_24/es/not_related_expected.json":"01645746a62894e6448895d9bf5eac394e94e54711d7f519d2ed14d8b8957487"}},"tests/fixtures/benchmark_24/es/tangential.md":{"size":141,"mtime_ns":1787196141436479100,"indexed_at_ns":1787196460278451000,"word_count":23,"hashes":{"tests/fixtures/benchmark_24/es/tangential.md":"41888c762fdc38fb9d5a6dc39373ac2e38331ba4520535088efef8943ea40e49"}},"tests/fixtures/benchmark_24/es/tangential_expected.json":{"size":128,"mtime_ns":1787196147026058000,"indexed_at_ns":1787196460166503400,"word_count":10,"hashes":{"tests/fixtures/benchmark_24/es/tangential_expected.json":"aac2bd9ab5946710c62dc0a8daf8b1481462bed081e11db4558c08ef917fcf81"}},"tests/fixtures/benchmark_24/fr/contextual.md":{"size":167,"mtime_ns":1787196288415259700,"indexed_at_ns":1787196460279288100,"word_count":23,"hashes":{"tests/fixtures/benchmark_24/fr/contextual.md":"8a36d5737429e743ffbdc8c6ae78bcc9410915e048056dbd1fb4d3d493ac7ec6"}},"tests/fixtures/benchmark_24/fr/contextual_expected.json":{"size":136,"mtime_ns":1787196295706997200,"indexed_at_ns":1787196460167650500,"word_count":10,"hashes":{"tests/fixtures/benchmark_24/fr/contextual_expected.json":"4a155288609fc5c935a39a633d7185109629871380b88af1c367922e44abe900"}},"tests/fixtures/benchmark_24/fr/direct.md":{"size":160,"mtime_ns":1787196277020128300,"indexed_at_ns":1787196460280073100,"word_count":20,"hashes":{"tests/fixtures/benchmark_24/fr/direct.md":"f218d9c8ada6c31e813c41bcb5e6a081a1df526022b907795065c0f845480077"}},"tests/fixtures/benchmark_24/fr/direct_expected.json":{"size":132,"mtime_ns":1787196282775093400,"indexed_at_ns":1787196460168573600,"word_count":10,"hashes":{"tests/fixtures/benchmark_24/fr/direct_expected.json":"b93c2059a731e06a164fe1331e1c7ff01fb741f728c8aa1df151ee51bc993268"}},"tests/fixtures/benchmark_24/fr/ecp.json":{"size":600,"mtime_ns":1787197131861351500,"indexed_at_ns":1787197157506006100,"word_count":50,"hashes":{"tests/fixtures/benchmark_24/fr/ecp.json":"f2e7f9eafa1fd24514541868c83db90b69784d5faf4e8d039d79d11597b51428"}},"tests/fixtures/benchmark_24/fr/not_related.md":{"size":181,"mtime_ns":1787196312472120100,"indexed_at_ns":1787196460280811500,"word_count":30,"hashes":{"tests/fixtures/benchmark_24/fr/not_related.md":"475984d25541d876b7d9e3e8f7cff7b3db2bc1489c25d6612b911da6d2b2af8e"}},"tests/fixtures/benchmark_24/fr/not_related_expected.json":{"size":129,"mtime_ns":1787196317906240800,"indexed_at_ns":1787196460170379300,"word_count":10,"hashes":{"tests/fixtures/benchmark_24/fr/not_related_expected.json":"31b3104faa21c2a417399fdd85d077d1c58fe74ee33fd41b0942580be6f81267"}},"tests/fixtures/benchmark_24/fr/tangential.md":{"size":158,"mtime_ns":1787196301225610200,"indexed_at_ns":1787196460281594400,"word_count":25,"hashes":{"tests/fixtures/benchmark_24/fr/tangential.md":"7f6c6ab84d2a26675f9f16fb23d45cf1e97b3ff5e28fb98df6aeaa2368d2c305"}},"tests/fixtures/benchmark_24/fr/tangential_expected.json":{"size":128,"mtime_ns":1787196306729905200,"indexed_at_ns":1787196460171141500,"word_count":10,"hashes":{"tests/fixtures/benchmark_24/fr/tangential_expected.json":"cc117a22ba73be1b308d377767ca0ae8da8e5889ccdaa430893b3ae70a58c9ca"}},"tests/fixtures/benchmark_24/it/contextual.md":{"size":150,"mtime_ns":1787196234462201200,"indexed_at_ns":1787196460283346800,"word_count":21,"hashes":{"tests/fixtures/benchmark_24/it/contextual.md":"045391f6f676add7e1ae9391419ef65442259ab90f9cacb5caca4d468d292017"}},"tests/fixtures/benchmark_24/it/contextual_expected.json":{"size":136,"mtime_ns":1787196240055631300,"indexed_at_ns":1787196460171870600,"word_count":10,"hashes":{"tests/fixtures/benchmark_24/it/contextual_expected.json":"b2b4b297f43e5af1cda526e259acede43a31b552c0321bee1ce1c72572cec557"}},"tests/fixtures/benchmark_24/it/direct.md":{"size":145,"mtime_ns":1787196221664473400,"indexed_at_ns":1787196460284281100,"word_count":23,"hashes":{"tests/fixtures/benchmark_24/it/direct.md":"d54bad27d944692fa7f00a036f882d1c0e42d189241822adcae86edf73a444da"}},"tests/fixtures/benchmark_24/it/direct_expected.json":{"size":132,"mtime_ns":1787196228986408600,"indexed_at_ns":1787196460172673300,"word_count":10,"hashes":{"tests/fixtures/benchmark_24/it/direct_expected.json":"f94e71dc4b78c0646190ff288f08dab46c67f2356b8b75cc515c28af7c9c423c"}},"tests/fixtures/benchmark_24/it/ecp.json":{"size":529,"mtime_ns":1787196215715634300,"indexed_at_ns":1787196460173452600,"word_count":45,"hashes":{"tests/fixtures/benchmark_24/it/ecp.json":"bcbd12d3057368618b006c24f384341f91349c713d10a3028d3eb4afada32de6"}},"tests/fixtures/benchmark_24/it/not_related.md":{"size":153,"mtime_ns":1787196259362992300,"indexed_at_ns":1787196460285099000,"word_count":23,"hashes":{"tests/fixtures/benchmark_24/it/not_related.md":"bca227c7b17fd4404e5ca1d082b848981c1da28d0b657df1e025c03056387f13"}},"tests/fixtures/benchmark_24/it/not_related_expected.json":{"size":129,"mtime_ns":1787196265318256200,"indexed_at_ns":1787196460174468400,"word_count":10,"hashes":{"tests/fixtures/benchmark_24/it/not_related_expected.json":"d007ac531224ad0834e9a8807582d0e047524be4c30fffdd1a19a51dba36d85d"}},"tests/fixtures/benchmark_24/it/tangential.md":{"size":155,"mtime_ns":1787196245918356300,"indexed_at_ns":1787196460285993500,"word_count":23,"hashes":{"tests/fixtures/benchmark_24/it/tangential.md":"a78a886f11462033c996a20b629e13c6bb55d4e08ffed20601cd4ea877b9db09"}},"tests/fixtures/benchmark_24/it/tangential_expected.json":{"size":128,"mtime_ns":1787196252898853500,"indexed_at_ns":1787196460175957500,"word_count":10,"hashes":{"tests/fixtures/benchmark_24/it/tangential_expected.json":"18872f6fe4cbd71812566494e88bd97633d696f732b3b5bad871f81076703f74"}},"tests/fixtures/benchmark_24/pt/contextual.md":{"size":125,"mtime_ns":1787196014201071400,"indexed_at_ns":1787196460286845200,"word_count":18,"hashes":{"tests/fixtures/benchmark_24/pt/contextual.md":"e9ea12885a5c68822f96691e543b55885afba3d00a9e0fa65837bd88e559f157"}},"tests/fixtures/benchmark_24/pt/contextual_expected.json":{"size":136,"mtime_ns":1787196019487136800,"indexed_at_ns":1787196460176915600,"word_count":10,"hashes":{"tests/fixtures/benchmark_24/pt/contextual_expected.json":"34145a845a7f6b155bf42c028bb0c6d8d43ed5cd0b1d179c089b1e621fecd08f"}},"tests/fixtures/benchmark_24/pt/direct.md":{"size":140,"mtime_ns":1787196003236562000,"indexed_at_ns":1787196460287899900,"word_count":21,"hashes":{"tests/fixtures/benchmark_24/pt/direct.md":"150182b9c1352163cb136c19141b85b3f0323e7eaa0cd023fce1dfef0de63d29"}},"tests/fixtures/benchmark_24/pt/direct_expected.json":{"size":132,"mtime_ns":1787196008785189600,"indexed_at_ns":1787196460177800600,"word_count":10,"hashes":{"tests/fixtures/benchmark_24/pt/direct_expected.json":"a9c666394db6a6e2fcd503d8cf67549531ee9e70eb73b1edb2b6a2443316cbf2"}},"tests/fixtures/benchmark_24/pt/ecp.json":{"size":507,"mtime_ns":1787195997549710300,"indexed_at_ns":1787196460178615000,"word_count":40,"hashes":{"tests/fixtures/benchmark_24/pt/ecp.json":"cec78c3ed8d2ec311d079239922a10a35a7fc9c382d8886fec81c6322d2a70ac"}},"tests/fixtures/benchmark_24/pt/not_related.md":{"size":124,"mtime_ns":1787196036724084200,"indexed_at_ns":1787196460288769500,"word_count":19,"hashes":{"tests/fixtures/benchmark_24/pt/not_related.md":"3af103a7f0df8e93c6154157e9903dc7fc10d64fa69dd7c2b08d4f68b99b1972"}},"tests/fixtures/benchmark_24/pt/not_related_expected.json":{"size":129,"mtime_ns":1787196042201218800,"indexed_at_ns":1787196460179403700,"word_count":10,"hashes":{"tests/fixtures/benchmark_24/pt/not_related_expected.json":"d5ce36bca028f31ba472e325993610eb82f98e1a8f84fa770bf92aa7158ce954"}},"tests/fixtures/benchmark_24/pt/tangential.md":{"size":140,"mtime_ns":1787196024978861700,"indexed_at_ns":1787196460289652400,"word_count":24,"hashes":{"tests/fixtures/benchmark_24/pt/tangential.md":"77d86f819ccbefe9830a57151354ca47d83e46b3d0e55d0f5139f37a1d9df0b8"}},"tests/fixtures/benchmark_24/pt/tangential_expected.json":{"size":128,"mtime_ns":1787196030395574000,"indexed_at_ns":1787196460180223100,"word_count":10,"hashes":{"tests/fixtures/benchmark_24/pt/tangential_expected.json":"fb977fec8db613f9545c81adffe0295084c6198b5f7c9a85d8901a228de63a51"}},"tests/test_adapters.py":{"size":1166,"mtime_ns":1787264437929228700,"indexed_at_ns":1787264516466770300,"word_count":91,"hashes":{"tests/test_adapters.py":"32a9519d5c55012aedaa43a786aff1cec88e7391d186f5d0a54213ca1b204f48"}},"tests/test_benchmark_24.py":{"size":2757,"mtime_ns":1787264437930228400,"indexed_at_ns":1787264516468505400,"word_count":257,"hashes":{"tests/test_benchmark_24.py":"7c136ac4d442e47a2f8914303880ce265c2fe49485eb182014fc3e10c06f9e71"}},"tests/test_classifier.py":{"size":3836,"mtime_ns":1787264437927229800,"indexed_at_ns":1787264516469349200,"word_count":351,"hashes":{"tests/test_classifier.py":"d3323e05dd21f20686d9293f767ebb2ced206c7b74e7ca89d2ac02c0a4e31282"}},"tests/test_cli.py":{"size":3872,"mtime_ns":1787264437929228700,"indexed_at_ns":1787264516470059400,"word_count":314,"hashes":{"tests/test_cli.py":"0573d9b13e45413beefac33d86eae94e17dbbf37554120a1fc5720bfb3d67d63"}},"tests/test_language.py":{"size":1929,"mtime_ns":1787264437929228700,"indexed_at_ns":1787264516472426100,"word_count":242,"hashes":{"tests/test_language.py":"7f7aae057ecbda26edd747d24241e9cf36f611c71c5d70d0aa308df7d71e0547"}},"tests/test_models.py":{"size":3668,"mtime_ns":1787264437930228400,"indexed_at_ns":1787264516473330500,"word_count":306,"hashes":{"tests/test_models.py":"232210770fc690edcc732d940bafe46fcec9bfed7f17e0aa5c60e6cf6635751f"}},"tests/test_adversarial.py":{"size":8429,"mtime_ns":1787264437924228700,"indexed_at_ns":1787264516467613100,"word_count":704,"hashes":{"tests/test_adversarial.py":"3acc7ff372e6b0f1f42dad29d280b835ac51784b1dca8054472287a7355c9386"}},"docs/googlenews_extractor_guia_completo.md":{"size":23200,"mtime_ns":1787264437928228500,"indexed_at_ns":1787264516560203200,"word_count":2292,"hashes":{"docs/googlenews_extractor_guia_completo.md":"dcff19204ab04403030b2339663c0d3c161744f50a53f5254c459a894eb3b3c8"}},"examples/ecp_sao_paulo_futebol_clube.json":{"size":23358,"mtime_ns":1787229477299354200,"indexed_at_ns":1787234770609429300,"word_count":1524,"hashes":{"examples/ecp_sao_paulo_futebol_clube.json":"1af9006669d57f8dc123f0edea0d0fe8aaeb9016e36ec3e0d95023ea26996915"}},"scripts/extract_google_news.py":{"size":14720,"mtime_ns":1787264437927229800,"indexed_at_ns":1787264516421445500,"word_count":1314,"hashes":{"scripts/extract_google_news.py":"aa17b59997ab6bb549a918fb1026ddf5a5c5143c75c234895dc32447e2c5b85a"}},"specs/002-google-news-extractor/checklists/readiness.md":{"size":5258,"mtime_ns":1787234305932687100,"indexed_at_ns":1787234770736852100,"word_count":706,"hashes":{"specs/002-google-news-extractor/checklists/readiness.md":"ad4c18a1fe1c6f19f45a043748fe4f195db525afac53ed77905222015ec5230c"}},"specs/002-google-news-extractor/checklists/requirements.md":{"size":1144,"mtime_ns":1787232386676398600,"indexed_at_ns":1787234770737689600,"word_count":158,"hashes":{"specs/002-google-news-extractor/checklists/requirements.md":"d83944755d7f6e43d8c76e032f0047be6f8c4cb2b80dea65e198f57b9c5eccd7"}},"specs/002-google-news-extractor/contracts/cli_contract.md":{"size":2681,"mtime_ns":1787236744313922700,"indexed_at_ns":1787236813512122300,"word_count":424,"hashes":{"specs/002-google-news-extractor/contracts/cli_contract.md":"6b9e3c10becd7b8fa633e409e9a3298ff4b2903dfd5194054c8e41dd0c0c5f23"}},"specs/002-google-news-extractor/data-model.md":{"size":3008,"mtime_ns":1787234040813431800,"indexed_at_ns":1787234770739130200,"word_count":472,"hashes":{"specs/002-google-news-extractor/data-model.md":"78cec846c1173fbdff3c77313ba02c7977365e5ab102df527f90ed7b06e69519"}},"specs/002-google-news-extractor/plan.md":{"size":3947,"mtime_ns":1787236725982522400,"indexed_at_ns":1787236813514970600,"word_count":448,"hashes":{"specs/002-google-news-extractor/plan.md":"57a0a3eb1fd6d7afbe394be62e681a02d7ef26124f4142b9d8b72ea95259a34b"}},"specs/002-google-news-extractor/quickstart.md":{"size":2341,"mtime_ns":1787236764020651300,"indexed_at_ns":1787236813515935900,"word_count":317,"hashes":{"specs/002-google-news-extractor/quickstart.md":"3478a487614358839b3e53c15b05b86a4b850bead9b4142384566e244753bde3"}},"specs/002-google-news-extractor/research.md":{"size":3630,"mtime_ns":1787236785046618200,"indexed_at_ns":1787236813516811500,"word_count":483,"hashes":{"specs/002-google-news-extractor/research.md":"71e796c83a1c293fa380b4f01a2eed810275e4628548e0f8e8b9ecaa90d3ac13"}},"specs/002-google-news-extractor/spec.md":{"size":7506,"mtime_ns":1787236709078315600,"indexed_at_ns":1787236813517705300,"word_count":1096,"hashes":{"specs/002-google-news-extractor/spec.md":"e84b37b25f61ed209d1295f77bf84024ac6c3c818f6b98043204a9f81bff49f0"}},"specs/002-google-news-extractor/tasks.md":{"size":5315,"mtime_ns":1787236802480804800,"indexed_at_ns":1787236813518644500,"word_count":692,"hashes":{"specs/002-google-news-extractor/tasks.md":"94430da291ad0dc34b1cde7c30f2b8e1ce0c83d35b5e71ab68bd135146c9ef47"}},"tests/test_extract_google_news.py":{"size":12221,"mtime_ns":1787264437931227400,"indexed_at_ns":1787264516471687100,"word_count":1114,"hashes":{"tests/test_extract_google_news.py":"5304424b746b871720985cfdd031b0f8895c664bdd9d273b9c1723f445a2276f"}},"scripts/__init__.py":{"size":50,"mtime_ns":1787234973578233800,"indexed_at_ns":1787235018163517900,"word_count":6,"hashes":{"scripts/__init__.py":"f30a694c2114ef6bc58efa1caea7265dde8ef296d92cdb77c8b3e3d1f21af3a5"}},"README.md":{"size":21396,"mtime_ns":1787274502478128000,"indexed_at_ns":1787310811708847800,"word_count":2606,"hashes":{"readme.md":"0faa53d99044235bdde7cb366a601675f06de64ca615a9d783cae687dae87a17"}},"docs/prd_extrator_artigos_nlp.md":{"size":11894,"mtime_ns":1787237774009258300,"indexed_at_ns":1787240513666474800,"word_count":1548,"hashes":{"docs/prd_extrator_artigos_nlp.md":"e10035c73584efc6d043bec17d43388ecbf25b576ca3475d0b9906cbc16fad90"}},"scripts/extract_article_contents.py":{"size":27025,"mtime_ns":1787264465341521500,"indexed_at_ns":1787264516419754800,"word_count":2069,"hashes":{"scripts/extract_article_contents.py":"a76fc087a959496bc2cf4767baaed89628bd945e1aaa8e981be840cf1240f1ba"}},"specs/003-article-content-extractor/checklists/extraction.md":{"size":4716,"mtime_ns":1787239873797626000,"indexed_at_ns":1787240513705426800,"word_count":609,"hashes":{"specs/003-article-content-extractor/checklists/extraction.md":"b8351909b93111f8f1e50f0f100446d3f579d0c11823eba4936c72a617aba5f8"}},"specs/003-article-content-extractor/checklists/requirements.md":{"size":1209,"mtime_ns":1787237950814070500,"indexed_at_ns":1787240513706099200,"word_count":164,"hashes":{"specs/003-article-content-extractor/checklists/requirements.md":"3c770288636c4523897b41c6dad5f2771af2007654d6b5f6b87d74bc9c33d11d"}},"specs/003-article-content-extractor/contracts/cli-contract.md":{"size":2493,"mtime_ns":1787239569056013800,"indexed_at_ns":1787240513706906100,"word_count":390,"hashes":{"specs/003-article-content-extractor/contracts/cli-contract.md":"44c5ec336c210bdd9671a5e852ee750e91f426b87c954b2c52499513cb85168d"}},"specs/003-article-content-extractor/contracts/json-schema.md":{"size":3065,"mtime_ns":1787239578931403200,"indexed_at_ns":1787240513707577900,"word_count":298,"hashes":{"specs/003-article-content-extractor/contracts/json-schema.md":"0cefe7faadd07932717b8c3493914e5367ec6ac50673671aee1f4edc7bde7e37"}},"specs/003-article-content-extractor/data-model.md":{"size":4410,"mtime_ns":1787239558236282500,"indexed_at_ns":1787240513708324600,"word_count":733,"hashes":{"specs/003-article-content-extractor/data-model.md":"651180962cf2a9253cb0a22429947eb3bf552c26be7defce98ef7583cbcd8fbf"}},"specs/003-article-content-extractor/plan.md":{"size":4642,"mtime_ns":1787264323707266000,"indexed_at_ns":1787264516630842500,"word_count":510,"hashes":{"specs/003-article-content-extractor/plan.md":"3ae38a2a907f1aeb6987c647a6290533acde67ef91f590445bdec0e1da5f52be"}},"specs/003-article-content-extractor/quickstart.md":{"size":2210,"mtime_ns":1787239589989665700,"indexed_at_ns":1787240513709638200,"word_count":282,"hashes":{"specs/003-article-content-extractor/quickstart.md":"332c407a9b1c3eafcb874d24f5396f005cde65d4d8e9e643fda95f47f093c544"}},"specs/003-article-content-extractor/research.md":{"size":4220,"mtime_ns":1787239545833014600,"indexed_at_ns":1787240513710259700,"word_count":588,"hashes":{"specs/003-article-content-extractor/research.md":"485f0e63023aa6dc8c4c64b22dd7394c032b7f468fa41632967789c4e269587b"}},"specs/003-article-content-extractor/spec.md":{"size":10428,"mtime_ns":1787264319288323400,"indexed_at_ns":1787264516635570600,"word_count":1515,"hashes":{"specs/003-article-content-extractor/spec.md":"1ad671e31d86c76aedaa27d5d4da839cdf2d602bd17e618310c80bd3747fab78"}},"specs/003-article-content-extractor/tasks.md":{"size":8201,"mtime_ns":1787240464652064400,"indexed_at_ns":1787240513711676500,"word_count":1070,"hashes":{"specs/003-article-content-extractor/tasks.md":"3122914461e8d6017e63900c66fa8935135b5efcc9fca8d64e762ee109602901"}},"tests/test_extract_article_contents.py":{"size":13204,"mtime_ns":1787264437929228700,"indexed_at_ns":1787264516470977000,"word_count":1039,"hashes":{"tests/test_extract_article_contents.py":"4333ac8911d1cd27964b0bacfa394ee8fe9e068bb2f25f3e0ff5e299564a7b4d"}},"docs/prd_deterministic_content_selection.md":{"size":15516,"mtime_ns":1787264674203828600,"indexed_at_ns":1787272605069414800,"word_count":2047,"hashes":{"docs/prd_deterministic_content_selection.md":"a337f19aa87b82ef5ee4f04bae19833331de5c49ee83bca2cf1f542eb893ae0b"}},"scripts/select_article_extractor.py":{"size":21658,"mtime_ns":1787274502480126900,"indexed_at_ns":1787310811622526500,"word_count":2097,"hashes":{"scripts/select_article_extractor.py":"027743d36fd728fded28a085abf202e4eab0102bc5517cf4975a094d5df04c3f"}},"specs/004-deterministic-content-selection/checklists/deterministic-selection.md":{"size":4236,"mtime_ns":1787272346869214200,"indexed_at_ns":1787272605178155100,"word_count":566,"hashes":{"specs/004-deterministic-content-selection/checklists/deterministic-selection.md":"937ec7535aa3602a811212d196f441aff79338c4358b881c1bc8f7844b4f8241"}},"specs/004-deterministic-content-selection/checklists/requirements.md":{"size":1303,"mtime_ns":1787264728720272700,"indexed_at_ns":1787272605179339000,"word_count":175,"hashes":{"specs/004-deterministic-content-selection/checklists/requirements.md":"8a7f723658366b3ba5e135483200453bbbe100152977f488f39161c537903f56"}},"specs/004-deterministic-content-selection/contracts/cli-contract.md":{"size":2071,"mtime_ns":1787274329217544500,"indexed_at_ns":1787274399618300500,"word_count":293,"hashes":{"specs/004-deterministic-content-selection/contracts/cli-contract.md":"6e6d43cae2405e648ff02f937b911d61e8efbd1f34b1f608feed7166f6c241f4"}},"specs/004-deterministic-content-selection/contracts/json-schema.md":{"size":1982,"mtime_ns":1787271837732839400,"indexed_at_ns":1787272605181473200,"word_count":195,"hashes":{"specs/004-deterministic-content-selection/contracts/json-schema.md":"db8b8702249e41e00c89cfcba0c76be591c320e8c42c9ef9a1098bb764097da6"}},"specs/004-deterministic-content-selection/data-model.md":{"size":5498,"mtime_ns":1787271825597039400,"indexed_at_ns":1787272605182487300,"word_count":681,"hashes":{"specs/004-deterministic-content-selection/data-model.md":"5773f5110269524eda7750f0d154d16e0bb29990fac51f57f76b42702789de8a"}},"specs/004-deterministic-content-selection/plan.md":{"size":5319,"mtime_ns":1787271850174420500,"indexed_at_ns":1787272605183666400,"word_count":643,"hashes":{"specs/004-deterministic-content-selection/plan.md":"2baf2f08897f9e80d43db55aa178ac515e3f012fac265e43a7fb679eb4c01f1f"}},"specs/004-deterministic-content-selection/quickstart.md":{"size":2239,"mtime_ns":1787274502478128000,"indexed_at_ns":1787310811759309400,"word_count":245,"hashes":{"specs/004-deterministic-content-selection/quickstart.md":"7136c34e9fa9c525ff01d65f8c35c2368cace0468b2651e85901195bfb8730a5"}},"specs/004-deterministic-content-selection/research.md":{"size":6915,"mtime_ns":1787274316854443300,"indexed_at_ns":1787274399622900200,"word_count":906,"hashes":{"specs/004-deterministic-content-selection/research.md":"11e7f5000a2fb8eeff02785f691ae153bc0eedd913432e3ca833022d394ff427"}},"specs/004-deterministic-content-selection/spec.md":{"size":11807,"mtime_ns":1787274311156486400,"indexed_at_ns":1787274399623530600,"word_count":1619,"hashes":{"specs/004-deterministic-content-selection/spec.md":"7f0baab75874dd05fc9fc891aefd4b4012b5ad82b2ed1738261ec6cb15d9f303"}},"specs/004-deterministic-content-selection/tasks.md":{"size":8181,"mtime_ns":1787272595818614500,"indexed_at_ns":1787272605189230700,"word_count":1024,"hashes":{"specs/004-deterministic-content-selection/tasks.md":"412b7a4261ea8c52655286c5b5761cc3800dfedf827289589380b700a4c40887"}},"tests/test_select_article_extractor.py":{"size":24179,"mtime_ns":1787274502480126900,"indexed_at_ns":1787310811669359800,"word_count":2243,"hashes":{"tests/test_select_article_extractor.py":"22eb249629c891e4cd4b2bc09ce17c1e334bc908de3db53539ced305d3bfd287"}}} \ No newline at end of file +{".agents/skills/graphify/SKILL.md":{"size":41276,"mtime_ns":1787189375574389900,"indexed_at_ns":1787189383574665500,"word_count":5211,"hashes":{".agents/skills/graphify/skill.md":"3f0ba089a04e342e4337913a03515905fe205f57914b53b8eb1ff59dc926a4ea"}},".agents/skills/graphify/references/add-watch.md":{"size":2486,"mtime_ns":1787176247108301100,"indexed_at_ns":1787189352249948700,"word_count":366,"hashes":{".agents/skills/graphify/references/add-watch.md":"bc4c3ac2e736e36fff3e120b2a7967f1f049c6b05ca39db50606b4bb83c768f7"}},".agents/skills/graphify/references/exports.md":{"size":3362,"mtime_ns":1787176247109325900,"indexed_at_ns":1787189352252005200,"word_count":470,"hashes":{".agents/skills/graphify/references/exports.md":"81b09c0ad09d54d52b68755c32544024e290c02f53bdeb283b1b76d7eebc2445"}},".agents/skills/graphify/references/extraction-spec.md":{"size":7960,"mtime_ns":1787176247109325900,"indexed_at_ns":1787189352254091000,"word_count":1038,"hashes":{".agents/skills/graphify/references/extraction-spec.md":"d07c5b2e8224b1006b1a336f77d0af22f637fe8d20166895bf852c32324d851b"}},".agents/skills/graphify/references/github-and-merge.md":{"size":2177,"mtime_ns":1787176247111831300,"indexed_at_ns":1787189352255826900,"word_count":271,"hashes":{".agents/skills/graphify/references/github-and-merge.md":"189cf7c8c51988d23f6ad25dff96855ce0e7336bffa352dedb3867954e702f7b"}},".agents/skills/graphify/references/hooks.md":{"size":1267,"mtime_ns":1787176247112843500,"indexed_at_ns":1787189352257586300,"word_count":193,"hashes":{".agents/skills/graphify/references/hooks.md":"3e7d2df361e7059e921192b1693cc7859e4a2b0474446f8352be5a4624790eaa"}},".agents/skills/graphify/references/query.md":{"size":13456,"mtime_ns":1787176247113897600,"indexed_at_ns":1787189352259619700,"word_count":1763,"hashes":{".agents/skills/graphify/references/query.md":"151ad7ed0ee4aefe411f026261f605a61134cc6247324fe8df3ae1e785321283"}},".agents/skills/graphify/references/transcribe.md":{"size":3173,"mtime_ns":1787176247113897600,"indexed_at_ns":1787189352261502100,"word_count":418,"hashes":{".agents/skills/graphify/references/transcribe.md":"cbbbae90e451d722b39df0df7bc267bb9b7ecb3dd8a9e8be4b40237df053c8d6"}},".agents/skills/graphify/references/update.md":{"size":10425,"mtime_ns":1787176247115420200,"indexed_at_ns":1787189352263334600,"word_count":1196,"hashes":{".agents/skills/graphify/references/update.md":"b209dbb3bb5466e601a530b65925c55c34f040ffcf56d38ea64be9aaf75f92ce"}},".agents/skills/ponytail-audit/SKILL.md":{"size":1693,"mtime_ns":1786995804152832800,"indexed_at_ns":1787189325036907200,"word_count":234,"hashes":{".agents/skills/ponytail-audit/skill.md":"b29dd08e26692c4bdd87b024d43820e2b45527984d9b3330b5fcfc78491aac52"}},".agents/skills/ponytail-debt/SKILL.md":{"size":1747,"mtime_ns":1786995804152832800,"indexed_at_ns":1787189325037560500,"word_count":261,"hashes":{".agents/skills/ponytail-debt/skill.md":"4b8e8de454f0d7d46bce20b3f4b4ea4c5a1eb60691c0d8bef27ef4ded155e4bc"}},".agents/skills/ponytail-gain/SKILL.md":{"size":2023,"mtime_ns":1786995804154227800,"indexed_at_ns":1787189325038161300,"word_count":246,"hashes":{".agents/skills/ponytail-gain/skill.md":"9e15d99db7452555dae0cc55e5c37799e1dc8acaed4eb89c0e9641d3afbb9646"}},".agents/skills/ponytail-help/SKILL.md":{"size":2867,"mtime_ns":1786995804154227800,"indexed_at_ns":1787189325038779900,"word_count":379,"hashes":{".agents/skills/ponytail-help/skill.md":"4b6ba4d12d19068c08b12af63c05b0acc9ce3beed06654065450c0cd6042d9db"}},".agents/skills/ponytail-review/SKILL.md":{"size":2440,"mtime_ns":1786995804155238700,"indexed_at_ns":1787189325039426100,"word_count":339,"hashes":{".agents/skills/ponytail-review/skill.md":"694090b91438cff578931361d36947da438722dd1f9f7460022bb3aa5b18b4de"}},".agents/skills/ponytail/SKILL.md":{"size":6757,"mtime_ns":1786995804156239700,"indexed_at_ns":1787189325040071200,"word_count":1079,"hashes":{".agents/skills/ponytail/skill.md":"64fc6e81a1b2b008fd72f5c9686498e53383e9cb25d518dc81305799e985bf6f"}},".agents/skills/speckit-analyze/SKILL.md":{"size":11642,"mtime_ns":1787189272133064100,"indexed_at_ns":1787189325040713600,"word_count":1569,"hashes":{".agents/skills/speckit-analyze/skill.md":"12f78b5b87a05d7075320de7e7df0fc3890ee915bf5203ef2c397fee48b0d04e"}},".agents/skills/speckit-checklist/SKILL.md":{"size":22277,"mtime_ns":1787189272160379600,"indexed_at_ns":1787189325041377200,"word_count":2981,"hashes":{".agents/skills/speckit-checklist/skill.md":"1b9b592206c499d1c46699ea99fd3795ec31638e3968aa90054d07bff9f26852"}},".agents/skills/speckit-clarify/SKILL.md":{"size":19212,"mtime_ns":1787189272137533000,"indexed_at_ns":1787189325042095600,"word_count":2688,"hashes":{".agents/skills/speckit-clarify/skill.md":"d091faedcb83b3f11a3049a84424f5d66b6bdf181b192a8167c07b94133e617d"}},".agents/skills/speckit-constitution/SKILL.md":{"size":9959,"mtime_ns":1787189272141381400,"indexed_at_ns":1787189325042781900,"word_count":1376,"hashes":{".agents/skills/speckit-constitution/skill.md":"791892a3d87f7bd6ea936f896c5050b183942489d68bfb383c2ba4de8380a901"}},".agents/skills/speckit-converge/SKILL.md":{"size":12639,"mtime_ns":1787189272150381400,"indexed_at_ns":1787189325043428600,"word_count":1798,"hashes":{".agents/skills/speckit-converge/skill.md":"c04c22c94ac9a47d73d547636127b06f38647627a4dbfbc36ae50dd0a95971b3"}},".agents/skills/speckit-implement/SKILL.md":{"size":12703,"mtime_ns":1787189272146373000,"indexed_at_ns":1787189325044057400,"word_count":1691,"hashes":{".agents/skills/speckit-implement/skill.md":"a779bc551abfa24d77556554b4cc0225b3c57bc436956b9cb9aafe306c581945"}},".agents/skills/speckit-plan/SKILL.md":{"size":7857,"mtime_ns":1787189272154380100,"indexed_at_ns":1787189325044689700,"word_count":1083,"hashes":{".agents/skills/speckit-plan/skill.md":"74b5f950130fa658b857d1c81ac052d89277cbe9901c51f01270963c746277b6"}},".agents/skills/speckit-specify/SKILL.md":{"size":18258,"mtime_ns":1787189272165381000,"indexed_at_ns":1787189325045384300,"word_count":2452,"hashes":{".agents/skills/speckit-specify/skill.md":"b86e839509339a9e11a605b6db50fcd3a435511d5cbe1bbbf4f473ac4bdd5447"}},".agents/skills/speckit-tasks/SKILL.md":{"size":10978,"mtime_ns":1787189272169379600,"indexed_at_ns":1787189325046041900,"word_count":1581,"hashes":{".agents/skills/speckit-tasks/skill.md":"69de6853783574ace13eadf7c706a610df2f2584901974b713a51c1576e53339"}},".agents/skills/speckit-taskstoissues/SKILL.md":{"size":7686,"mtime_ns":1787189272172364900,"indexed_at_ns":1787189325046665600,"word_count":1153,"hashes":{".agents/skills/speckit-taskstoissues/skill.md":"fc53c7413cf050b143775a1aeca2773eabb248782a58d599b52d0d232c6c05fd"}},".specify/init-options.json":{"size":174,"mtime_ns":1787189272252382200,"indexed_at_ns":1787189325022221000,"word_count":16,"hashes":{".specify/init-options.json":"b39c8c1030871841dded0aede892fe2d25b36883333777cbab7d7c1c67b36f87"}},".specify/integration.json":{"size":279,"mtime_ns":1787189272181379700,"indexed_at_ns":1787189325023926100,"word_count":24,"hashes":{".specify/integration.json":"d7545650420a2ed3fd6878ad7006b8de79f5e812dd6352c0d86d530db3a12134"}},".specify/integrations/agy.manifest.json":{"size":1299,"mtime_ns":1787189272178366200,"indexed_at_ns":1787189325024675000,"word_count":31,"hashes":{".specify/integrations/agy.manifest.json":"504c42820b8e37a7eb26b328881026982f3a6a71fa16de670c425b35b37f00e4"}},".specify/integrations/speckit.manifest.json":{"size":1536,"mtime_ns":1787189272238379600,"indexed_at_ns":1787189325025369900,"word_count":35,"hashes":{".specify/integrations/speckit.manifest.json":"cc15502df7b241b7ef08785a613f642d69dc561b8b5db2ccba121fcb6d2c1680"}},".specify/memory/.constitution-template.json":{"size":103,"mtime_ns":1787189272257369800,"indexed_at_ns":1787189325026009300,"word_count":6,"hashes":{".specify/memory/.constitution-template.json":"a0f4bf5e5399e118b61e8bae9404743316cea6d0fff4270d8758aeb55525b988"}},".specify/memory/constitution.md":{"size":2346,"mtime_ns":1787189272254379900,"indexed_at_ns":1787189325047314000,"word_count":272,"hashes":{".specify/memory/constitution.md":"51f14d46d5b6abddce28779396666792636c8d9629f0202e84501a5e759267ab"}},".specify/scripts/powershell/check-prerequisites.ps1":{"size":6122,"mtime_ns":1787189272202379800,"indexed_at_ns":1787189325026668000,"word_count":685,"hashes":{".specify/scripts/powershell/check-prerequisites.ps1":"80f1c4dc6817140dea987bb5727d38be754679c7052f1d9a088031536423cb23"}},".specify/scripts/powershell/common.ps1":{"size":34245,"mtime_ns":1787189272206379800,"indexed_at_ns":1787189325027347800,"word_count":3419,"hashes":{".specify/scripts/powershell/common.ps1":"63b253c967802e85ab12e76ac716eca4bb164dde2b9324e08e406d848ec4104b"}},".specify/scripts/powershell/create-new-feature.ps1":{"size":13026,"mtime_ns":1787189272211369000,"indexed_at_ns":1787189325028005300,"word_count":1421,"hashes":{".specify/scripts/powershell/create-new-feature.ps1":"7b4eb36a1fbbbe9a449b5f99de1055b1aad88e775eeb0db3f86e4ff013e6ddd1"}},".specify/scripts/powershell/resolve-template.ps1":{"size":889,"mtime_ns":1787189272214379900,"indexed_at_ns":1787189325028621300,"word_count":86,"hashes":{".specify/scripts/powershell/resolve-template.ps1":"78234a87c584e697a8fda8b18f134914e41465cbb67c1608b81e69860741502c"}},".specify/scripts/powershell/setup-plan.ps1":{"size":2927,"mtime_ns":1787189272218379500,"indexed_at_ns":1787189325029271700,"word_count":325,"hashes":{".specify/scripts/powershell/setup-plan.ps1":"4d5b636734ae78061da3a7675f0af4acfa6b65f7d994d5372c8c051f25bb8966"}},".specify/scripts/powershell/setup-tasks.ps1":{"size":3892,"mtime_ns":1787189272221379900,"indexed_at_ns":1787189325029900900,"word_count":429,"hashes":{".specify/scripts/powershell/setup-tasks.ps1":"5c980d1a41d186b634bc350128c31e5f3074099b996989c0a0d95b22623b2932"}},".specify/templates/checklist-template.md":{"size":2033,"mtime_ns":1787189272223379700,"indexed_at_ns":1787189325047907900,"word_count":271,"hashes":{".specify/templates/checklist-template.md":"6fb0a979b8534e1b3343d1ce6e45f84d32b118e096620bfdeed241dbc1a1da8a"}},".specify/templates/constitution-template.md":{"size":2346,"mtime_ns":1787189272226379800,"indexed_at_ns":1787189325048534600,"word_count":272,"hashes":{".specify/templates/constitution-template.md":"ae22b7c7ecb6ccd516fed25916e465146432c58f1bef904a92b535ac0bbecfcf"}},".specify/templates/plan-template.md":{"size":3682,"mtime_ns":1787189272229368600,"indexed_at_ns":1787189325049160100,"word_count":463,"hashes":{".specify/templates/plan-template.md":"e5cfe5097c5de0add0f0de02b7a5d2cd2470c9a2f24c0e6e15439d274e12abe0"}},".specify/templates/spec-template.md":{"size":4556,"mtime_ns":1787189272231368600,"indexed_at_ns":1787189325049780800,"word_count":629,"hashes":{".specify/templates/spec-template.md":"2734a509d4b2f34ee6258475c4fb2e80a6dbfcbc47c8552df5b6278907529250"}},".specify/templates/tasks-template.md":{"size":9171,"mtime_ns":1787189272234379700,"indexed_at_ns":1787189325050369300,"word_count":1384,"hashes":{".specify/templates/tasks-template.md":"070ed0dfafd8310a243b51cc30b1b6dfb19883fdd5ad20e4b53e45eb7f939e3e"}},".specify/workflows/speckit/workflow.yml":{"size":2216,"mtime_ns":1787160407462626700,"indexed_at_ns":1787189324996696100,"word_count":276},".specify/workflows/workflow-registry.json":{"size":381,"mtime_ns":1787189272250379800,"indexed_at_ns":1787189325030509700,"word_count":34,"hashes":{".specify/workflows/workflow-registry.json":"2c5bf7f4ba03ddf54945cd64d4740301036c18ebea47448d93ff428c771eff3d"}},".agents/rules/graphify.md":{"size":947,"mtime_ns":1787189347444181700,"indexed_at_ns":1787189352246818600,"word_count":127,"hashes":{".agents/rules/graphify.md":"e55792958648fb69255e3ce3f71a8fcead36307c34b2d67feda9ac650ac61803"}},".agents/workflows/graphify.md":{"size":239,"mtime_ns":1787189347444181700,"indexed_at_ns":1787189352301037700,"word_count":37,"hashes":{".agents/workflows/graphify.md":"d92622463299d313da48e2cdbebf79d7ea24ffaf2ae2de2a1714be8ee42b22b3"}},"specs/001-multilingual-entity-classifier/checklists/requirements.md":{"size":1897,"mtime_ns":1787193985655018100,"indexed_at_ns":1787194002726038300,"word_count":258,"hashes":{"specs/001-multilingual-entity-classifier/checklists/requirements.md":"277036c8add1bae5eeae6da5595cf66405670d33f9d4842784b1c5581cef62d0"}},"specs/001-multilingual-entity-classifier/spec.md":{"size":10753,"mtime_ns":1787194850510689300,"indexed_at_ns":1787194930726970700,"word_count":1423,"hashes":{"specs/001-multilingual-entity-classifier/spec.md":"f136d1d2e6a539072ea238be9d0e918dbc32eb89555ffd37e9b84579064e7799"}},"specs/001-multilingual-entity-classifier/contracts/cli-contract.md":{"size":1808,"mtime_ns":1787194605824187100,"indexed_at_ns":1787194638410863000,"word_count":281,"hashes":{"specs/001-multilingual-entity-classifier/contracts/cli-contract.md":"894670a7228b93a2202203ac532aa0d415bd1921272b61a8d07e951a417bc75c"}},"specs/001-multilingual-entity-classifier/data-model.md":{"size":5137,"mtime_ns":1787194591677816000,"indexed_at_ns":1787194638411601100,"word_count":524,"hashes":{"specs/001-multilingual-entity-classifier/data-model.md":"89ecf2e55508b53ba208d011a76868294f0ff3cab87a217e7ed73c19edfbd9f6"}},"specs/001-multilingual-entity-classifier/plan.md":{"size":6215,"mtime_ns":1787194897854106700,"indexed_at_ns":1787194930724386200,"word_count":782,"hashes":{"specs/001-multilingual-entity-classifier/plan.md":"d37d1c5f3bffc4dad289ad128024ab6dffb409b06f49e96fc5a2fd2a735472a5"}},"specs/001-multilingual-entity-classifier/quickstart.md":{"size":3235,"mtime_ns":1787194877439851000,"indexed_at_ns":1787194930725082000,"word_count":339,"hashes":{"specs/001-multilingual-entity-classifier/quickstart.md":"816060813a37d728ceed955aa829d7fa4f80862f0932133cd5293bdbfdbd40db"}},"specs/001-multilingual-entity-classifier/research.md":{"size":4059,"mtime_ns":1787194581004019000,"indexed_at_ns":1787194638413783100,"word_count":509,"hashes":{"specs/001-multilingual-entity-classifier/research.md":"d4b61795fb09da693ead647d4c05e8f44699c36e9f43b47e808e09a2f970d996"}},"specs/001-multilingual-entity-classifier/tasks.md":{"size":6951,"mtime_ns":1787196452595599000,"indexed_at_ns":1787196460266934400,"word_count":874,"hashes":{"specs/001-multilingual-entity-classifier/tasks.md":"7a33202595cf192baf702d3d8e169ea8db59ca0f2fecb471594f7f3c48417082"}},"specs/001-multilingual-entity-classifier/checklists/poc-readiness.md":{"size":4154,"mtime_ns":1787195218247525200,"indexed_at_ns":1787195224690016000,"word_count":546,"hashes":{"specs/001-multilingual-entity-classifier/checklists/poc-readiness.md":"6da9d16dcd60e927f892c69aa05945e99840b6dc824f93ea2686f12801e81a8a"}},"classify.py":{"size":6143,"mtime_ns":1787264412245764200,"indexed_at_ns":1787264516410989400,"word_count":482,"hashes":{"classify.py":"7fc86ae608bd6656cd4d2d91285ab1857edf96864249e6df308dc5c327b35775"}},"examples/content_northvolt_de.md":{"size":530,"mtime_ns":1787195963813740900,"indexed_at_ns":1787196460246681400,"word_count":57,"hashes":{"examples/content_northvolt_de.md":"5708f5dac050fea9c5e4fbdee40910cbb4c4be0efc9c3212f7cf2a7a034eb91d"}},"examples/content_presal_pt.md":{"size":506,"mtime_ns":1787195950024799800,"indexed_at_ns":1787196460247532700,"word_count":72,"hashes":{"examples/content_presal_pt.md":"ef8c7d61a4d721f7d702fa608274da920476be3a4f7bfe6e4f603abba12a133f"}},"examples/content_tangential_es.md":{"size":414,"mtime_ns":1787195975527150700,"indexed_at_ns":1787196460248387000,"word_count":60,"hashes":{"examples/content_tangential_es.md":"d02c405931b0752377a2ba10cbffe4d664713e33c3b6a8fbdd36b4a75b30f11b"}},"examples/ecp_apple.json":{"size":723,"mtime_ns":1787195969757856700,"indexed_at_ns":1787196460143672700,"word_count":68,"hashes":{"examples/ecp_apple.json":"166fb76e5d0d181835dd636450b6828565c2baafcb21228313bcea3c850d9a92"}},"examples/ecp_petrobras.json":{"size":714,"mtime_ns":1787195944394575600,"indexed_at_ns":1787196460144504800,"word_count":62,"hashes":{"examples/ecp_petrobras.json":"5dd24cf4d5cb9f636f3a1c2511eeaa152be0511b80974a4f36d5d68aded046db"}},"examples/ecp_volkswagen.json":{"size":720,"mtime_ns":1787195955456870500,"indexed_at_ns":1787196460145217300,"word_count":56,"hashes":{"examples/ecp_volkswagen.json":"3d3866179c67e332ad5aa46f5d15eeb4de3fa829d1cc21ccf73cc7f3a7eb32c5"}},"pyproject.toml":{"size":762,"mtime_ns":1787264482850924600,"indexed_at_ns":1787264516414577000,"word_count":86,"hashes":{"pyproject.toml":"ab0b0276581056a63d591237beb2e4e8fe3a4441c06963a847dd1f74b569dd88"}},"requirements.txt":{"size":333,"mtime_ns":1787317345925397200,"indexed_at_ns":1787317709341206400,"word_count":30},"src/__init__.py":{"size":83,"mtime_ns":1787195832559486000,"indexed_at_ns":1787196460146819200,"word_count":9,"hashes":{"src/__init__.py":"81c4eae46f05fd529d4f81f2d318c2b4e3af282f140963e9c5c876690bb1ca74"}},"src/adapters/__init__.py":{"size":73,"mtime_ns":1787195842271676800,"indexed_at_ns":1787196460147577400,"word_count":9,"hashes":{"src/adapters/__init__.py":"f4dcecfaeea2ae0852fd9836bfb4f9b2a9bedd60057157064e6d3fed4a8c1bd7"}},"src/adapters/base.py":{"size":907,"mtime_ns":1787264412243760700,"indexed_at_ns":1787264516431216000,"word_count":95,"hashes":{"src/adapters/base.py":"39d8678210517983b9fe9bfa26a1990c1f4f63195651da2a180d3bb73db51a1e"}},"src/adapters/embeddings.py":{"size":1399,"mtime_ns":1787264437927229800,"indexed_at_ns":1787264516432540300,"word_count":139,"hashes":{"src/adapters/embeddings.py":"acf74e38373f16e923350dbcf514b2958215391024c8abed3b8a621b0e69bd61"}},"src/adapters/llm.py":{"size":1232,"mtime_ns":1787264412243760700,"indexed_at_ns":1787264516433377900,"word_count":135,"hashes":{"src/adapters/llm.py":"084a9de66475aad2eb213ff906128d4094408891bd8ddbbd9f0e5674a1cb6192"}},"src/classifier.py":{"size":9804,"mtime_ns":1787264459052089000,"indexed_at_ns":1787264516434381400,"word_count":820,"hashes":{"src/classifier.py":"d890fd0c6be9bb68eeb459e8a89ed988c075978cc220d923a8b81714563db177"}},"src/language.py":{"size":10957,"mtime_ns":1787264437931227400,"indexed_at_ns":1787264516435249300,"word_count":887,"hashes":{"src/language.py":"75d8e6444528450b5d11eee5b51965c98525070bb65eb0edabc996701a4c5075"}},"src/models.py":{"size":5959,"mtime_ns":1787264437930228400,"indexed_at_ns":1787264516436265800,"word_count":487,"hashes":{"src/models.py":"260513e4539e617b4123ac5b5352cb6ce7caf3a5dfba08badf6390bf60784ac9"}},"src/parser.py":{"size":2654,"mtime_ns":1787264437931227400,"indexed_at_ns":1787264516437222700,"word_count":299,"hashes":{"src/parser.py":"a789a6ba02724ad75604dcc56991e8b7989558abe673d4701242012723954407"}},"tests/__init__.py":{"size":69,"mtime_ns":1787195847518641200,"indexed_at_ns":1787196460153585600,"word_count":8,"hashes":{"tests/__init__.py":"2acdae7d2696c23d5391ed343046cffa11b82f3f0d7d85767dacf0e762a955d1"}},"tests/fixtures/benchmark_24/de/contextual.md":{"size":144,"mtime_ns":1787196180779459400,"indexed_at_ns":1787196460268138600,"word_count":17,"hashes":{"tests/fixtures/benchmark_24/de/contextual.md":"b6a18c4bef2defe99773d3ba43137148d25b42ac27562b10b73ccdee1a49f203"}},"tests/fixtures/benchmark_24/de/contextual_expected.json":{"size":136,"mtime_ns":1787196187032823100,"indexed_at_ns":1787196460154321700,"word_count":10,"hashes":{"tests/fixtures/benchmark_24/de/contextual_expected.json":"cb741ed9bef3359a41d5c031ad213d4320c5b8fe3f8579e497ee9b1eda0ed478"}},"tests/fixtures/benchmark_24/de/direct.md":{"size":148,"mtime_ns":1787196169572812500,"indexed_at_ns":1787196460269192500,"word_count":16,"hashes":{"tests/fixtures/benchmark_24/de/direct.md":"67f375d26d8424655b76d5650c656b4af79b9964d52f2d24049e1f4de6545c9b"}},"tests/fixtures/benchmark_24/de/direct_expected.json":{"size":132,"mtime_ns":1787196175168070900,"indexed_at_ns":1787196460155004400,"word_count":10,"hashes":{"tests/fixtures/benchmark_24/de/direct_expected.json":"5301a39d31b365266b529ce9823145381241f8876af1ec21f0a9c27c9bdc80fa"}},"tests/fixtures/benchmark_24/de/ecp.json":{"size":579,"mtime_ns":1787196164027193900,"indexed_at_ns":1787196460155664300,"word_count":40,"hashes":{"tests/fixtures/benchmark_24/de/ecp.json":"061fc3a9468d2baaaf2b3e8355d08d23261a9a7adc484cb06b45646eacba46fc"}},"tests/fixtures/benchmark_24/de/not_related.md":{"size":137,"mtime_ns":1787196204093781400,"indexed_at_ns":1787196460270056100,"word_count":21,"hashes":{"tests/fixtures/benchmark_24/de/not_related.md":"4904b694b45a2058614a4e4350046eee042c4bbd7bcd6b88c56408ee3aebd81d"}},"tests/fixtures/benchmark_24/de/not_related_expected.json":{"size":129,"mtime_ns":1787196209729787600,"indexed_at_ns":1787196460156391600,"word_count":10,"hashes":{"tests/fixtures/benchmark_24/de/not_related_expected.json":"730fa882c1f3b8a7c0e2d3da9af55ee57ad7425a8b304c11f54e01899c740952"}},"tests/fixtures/benchmark_24/de/tangential.md":{"size":150,"mtime_ns":1787196193187087300,"indexed_at_ns":1787196460270857700,"word_count":21,"hashes":{"tests/fixtures/benchmark_24/de/tangential.md":"8207068977006dafa7c9c4459bd996b5c124972d25f1015a589d3b06d0999613"}},"tests/fixtures/benchmark_24/de/tangential_expected.json":{"size":128,"mtime_ns":1787196198703847300,"indexed_at_ns":1787196460157130400,"word_count":10,"hashes":{"tests/fixtures/benchmark_24/de/tangential_expected.json":"82dea5e55d7586c4e7005755e3da4f44560238733094876047de51e854d41d92"}},"tests/fixtures/benchmark_24/en/contextual.md":{"size":148,"mtime_ns":1787196066427405900,"indexed_at_ns":1787196460271878300,"word_count":19,"hashes":{"tests/fixtures/benchmark_24/en/contextual.md":"258a9f1ae01dae52955c1f45cb176e7d981a72ba869c33232c8c295f4816acc0"}},"tests/fixtures/benchmark_24/en/contextual_expected.json":{"size":136,"mtime_ns":1787196073211713100,"indexed_at_ns":1787196460158457500,"word_count":10,"hashes":{"tests/fixtures/benchmark_24/en/contextual_expected.json":"70605f9d8901d4c4b99d9fda1f30bc114cb0b65893579f77a1f9d50f62c1e3fc"}},"tests/fixtures/benchmark_24/en/direct.md":{"size":155,"mtime_ns":1787196054149613200,"indexed_at_ns":1787196460272766400,"word_count":21,"hashes":{"tests/fixtures/benchmark_24/en/direct.md":"c7e0b093c386ccf19d9d7cbef4763dfb665213a7a245093af43529b1eaff8266"}},"tests/fixtures/benchmark_24/en/direct_expected.json":{"size":132,"mtime_ns":1787196059966736300,"indexed_at_ns":1787196460159526700,"word_count":10,"hashes":{"tests/fixtures/benchmark_24/en/direct_expected.json":"0b803b2ad37388be7ef4ea1d164db22c9fd784bcb9be6f56627d412f1f9299bc"}},"tests/fixtures/benchmark_24/en/ecp.json":{"size":594,"mtime_ns":1787197123717795600,"indexed_at_ns":1787197157494285900,"word_count":52,"hashes":{"tests/fixtures/benchmark_24/en/ecp.json":"601423ac1e0b0e2bb7a0151ac87f5bdfd32450d90a022eaf9ef030338e0b4893"}},"tests/fixtures/benchmark_24/en/not_related.md":{"size":146,"mtime_ns":1787196350333465500,"indexed_at_ns":1787196460273595300,"word_count":24,"hashes":{"tests/fixtures/benchmark_24/en/not_related.md":"2fa405b123733c5a9b5beba8c646b886b27e212cff55496a9fe7d6208ddfb11c"}},"tests/fixtures/benchmark_24/en/not_related_expected.json":{"size":129,"mtime_ns":1787196104521133100,"indexed_at_ns":1787196460161344300,"word_count":10,"hashes":{"tests/fixtures/benchmark_24/en/not_related_expected.json":"cb046b055b5c72d8146b6035a935211d60fb0b313ef819576bb8e7048d55f468"}},"tests/fixtures/benchmark_24/en/tangential.md":{"size":147,"mtime_ns":1787196082730266300,"indexed_at_ns":1787196460274648200,"word_count":25,"hashes":{"tests/fixtures/benchmark_24/en/tangential.md":"793acebc11e5d6c17872d56881c8fe99cb187116c38fa4b2647d28fe3063a61e"}},"tests/fixtures/benchmark_24/en/tangential_expected.json":{"size":128,"mtime_ns":1787196089699545000,"indexed_at_ns":1787196460162151700,"word_count":10,"hashes":{"tests/fixtures/benchmark_24/en/tangential_expected.json":"d5b1a4dc64246838a066f73c41f0e33dcd59636e61d6c0842a3728247e536aff"}},"tests/fixtures/benchmark_24/es/contextual.md":{"size":167,"mtime_ns":1787196129959491900,"indexed_at_ns":1787196460275850900,"word_count":22,"hashes":{"tests/fixtures/benchmark_24/es/contextual.md":"d45ef46752e2093455e35cbf97076f943ab2be736c9bc4580607960b9d068731"}},"tests/fixtures/benchmark_24/es/contextual_expected.json":{"size":136,"mtime_ns":1787196135705341100,"indexed_at_ns":1787196460162957600,"word_count":10,"hashes":{"tests/fixtures/benchmark_24/es/contextual_expected.json":"083f7153df08f93f595782eb2959e8505ac4bda4daaf6634c7a11d444c1ba6b0"}},"tests/fixtures/benchmark_24/es/direct.md":{"size":179,"mtime_ns":1787196118640588800,"indexed_at_ns":1787196460276716800,"word_count":29,"hashes":{"tests/fixtures/benchmark_24/es/direct.md":"f6e282a68830d5518285b0cda510fe57fa844cc6322979604a427797f07fdbd7"}},"tests/fixtures/benchmark_24/es/direct_expected.json":{"size":132,"mtime_ns":1787196124282103900,"indexed_at_ns":1787196460163727400,"word_count":10,"hashes":{"tests/fixtures/benchmark_24/es/direct_expected.json":"fb96e4ae9e2e1603b9ac4d31b6984b31d814b3f31a8a3ca03c52c1ffa4199471"}},"tests/fixtures/benchmark_24/es/ecp.json":{"size":590,"mtime_ns":1787196110761765400,"indexed_at_ns":1787196460164509700,"word_count":52,"hashes":{"tests/fixtures/benchmark_24/es/ecp.json":"09cad55a4cc5a8c04b9898dee21c28b0d40561fcdd8ff012fe4de96616c05f7f"}},"tests/fixtures/benchmark_24/es/not_related.md":{"size":148,"mtime_ns":1787196152611035900,"indexed_at_ns":1787196460277631800,"word_count":23,"hashes":{"tests/fixtures/benchmark_24/es/not_related.md":"1b8a7f7a6852c9ec33fc34513ab479bd5edba48762a0801f7982e48adcb0089b"}},"tests/fixtures/benchmark_24/es/not_related_expected.json":{"size":129,"mtime_ns":1787196158098444000,"indexed_at_ns":1787196460165309300,"word_count":10,"hashes":{"tests/fixtures/benchmark_24/es/not_related_expected.json":"01645746a62894e6448895d9bf5eac394e94e54711d7f519d2ed14d8b8957487"}},"tests/fixtures/benchmark_24/es/tangential.md":{"size":141,"mtime_ns":1787196141436479100,"indexed_at_ns":1787196460278451000,"word_count":23,"hashes":{"tests/fixtures/benchmark_24/es/tangential.md":"41888c762fdc38fb9d5a6dc39373ac2e38331ba4520535088efef8943ea40e49"}},"tests/fixtures/benchmark_24/es/tangential_expected.json":{"size":128,"mtime_ns":1787196147026058000,"indexed_at_ns":1787196460166503400,"word_count":10,"hashes":{"tests/fixtures/benchmark_24/es/tangential_expected.json":"aac2bd9ab5946710c62dc0a8daf8b1481462bed081e11db4558c08ef917fcf81"}},"tests/fixtures/benchmark_24/fr/contextual.md":{"size":167,"mtime_ns":1787196288415259700,"indexed_at_ns":1787196460279288100,"word_count":23,"hashes":{"tests/fixtures/benchmark_24/fr/contextual.md":"8a36d5737429e743ffbdc8c6ae78bcc9410915e048056dbd1fb4d3d493ac7ec6"}},"tests/fixtures/benchmark_24/fr/contextual_expected.json":{"size":136,"mtime_ns":1787196295706997200,"indexed_at_ns":1787196460167650500,"word_count":10,"hashes":{"tests/fixtures/benchmark_24/fr/contextual_expected.json":"4a155288609fc5c935a39a633d7185109629871380b88af1c367922e44abe900"}},"tests/fixtures/benchmark_24/fr/direct.md":{"size":160,"mtime_ns":1787196277020128300,"indexed_at_ns":1787196460280073100,"word_count":20,"hashes":{"tests/fixtures/benchmark_24/fr/direct.md":"f218d9c8ada6c31e813c41bcb5e6a081a1df526022b907795065c0f845480077"}},"tests/fixtures/benchmark_24/fr/direct_expected.json":{"size":132,"mtime_ns":1787196282775093400,"indexed_at_ns":1787196460168573600,"word_count":10,"hashes":{"tests/fixtures/benchmark_24/fr/direct_expected.json":"b93c2059a731e06a164fe1331e1c7ff01fb741f728c8aa1df151ee51bc993268"}},"tests/fixtures/benchmark_24/fr/ecp.json":{"size":600,"mtime_ns":1787197131861351500,"indexed_at_ns":1787197157506006100,"word_count":50,"hashes":{"tests/fixtures/benchmark_24/fr/ecp.json":"f2e7f9eafa1fd24514541868c83db90b69784d5faf4e8d039d79d11597b51428"}},"tests/fixtures/benchmark_24/fr/not_related.md":{"size":181,"mtime_ns":1787196312472120100,"indexed_at_ns":1787196460280811500,"word_count":30,"hashes":{"tests/fixtures/benchmark_24/fr/not_related.md":"475984d25541d876b7d9e3e8f7cff7b3db2bc1489c25d6612b911da6d2b2af8e"}},"tests/fixtures/benchmark_24/fr/not_related_expected.json":{"size":129,"mtime_ns":1787196317906240800,"indexed_at_ns":1787196460170379300,"word_count":10,"hashes":{"tests/fixtures/benchmark_24/fr/not_related_expected.json":"31b3104faa21c2a417399fdd85d077d1c58fe74ee33fd41b0942580be6f81267"}},"tests/fixtures/benchmark_24/fr/tangential.md":{"size":158,"mtime_ns":1787196301225610200,"indexed_at_ns":1787196460281594400,"word_count":25,"hashes":{"tests/fixtures/benchmark_24/fr/tangential.md":"7f6c6ab84d2a26675f9f16fb23d45cf1e97b3ff5e28fb98df6aeaa2368d2c305"}},"tests/fixtures/benchmark_24/fr/tangential_expected.json":{"size":128,"mtime_ns":1787196306729905200,"indexed_at_ns":1787196460171141500,"word_count":10,"hashes":{"tests/fixtures/benchmark_24/fr/tangential_expected.json":"cc117a22ba73be1b308d377767ca0ae8da8e5889ccdaa430893b3ae70a58c9ca"}},"tests/fixtures/benchmark_24/it/contextual.md":{"size":150,"mtime_ns":1787196234462201200,"indexed_at_ns":1787196460283346800,"word_count":21,"hashes":{"tests/fixtures/benchmark_24/it/contextual.md":"045391f6f676add7e1ae9391419ef65442259ab90f9cacb5caca4d468d292017"}},"tests/fixtures/benchmark_24/it/contextual_expected.json":{"size":136,"mtime_ns":1787196240055631300,"indexed_at_ns":1787196460171870600,"word_count":10,"hashes":{"tests/fixtures/benchmark_24/it/contextual_expected.json":"b2b4b297f43e5af1cda526e259acede43a31b552c0321bee1ce1c72572cec557"}},"tests/fixtures/benchmark_24/it/direct.md":{"size":145,"mtime_ns":1787196221664473400,"indexed_at_ns":1787196460284281100,"word_count":23,"hashes":{"tests/fixtures/benchmark_24/it/direct.md":"d54bad27d944692fa7f00a036f882d1c0e42d189241822adcae86edf73a444da"}},"tests/fixtures/benchmark_24/it/direct_expected.json":{"size":132,"mtime_ns":1787196228986408600,"indexed_at_ns":1787196460172673300,"word_count":10,"hashes":{"tests/fixtures/benchmark_24/it/direct_expected.json":"f94e71dc4b78c0646190ff288f08dab46c67f2356b8b75cc515c28af7c9c423c"}},"tests/fixtures/benchmark_24/it/ecp.json":{"size":529,"mtime_ns":1787196215715634300,"indexed_at_ns":1787196460173452600,"word_count":45,"hashes":{"tests/fixtures/benchmark_24/it/ecp.json":"bcbd12d3057368618b006c24f384341f91349c713d10a3028d3eb4afada32de6"}},"tests/fixtures/benchmark_24/it/not_related.md":{"size":153,"mtime_ns":1787196259362992300,"indexed_at_ns":1787196460285099000,"word_count":23,"hashes":{"tests/fixtures/benchmark_24/it/not_related.md":"bca227c7b17fd4404e5ca1d082b848981c1da28d0b657df1e025c03056387f13"}},"tests/fixtures/benchmark_24/it/not_related_expected.json":{"size":129,"mtime_ns":1787196265318256200,"indexed_at_ns":1787196460174468400,"word_count":10,"hashes":{"tests/fixtures/benchmark_24/it/not_related_expected.json":"d007ac531224ad0834e9a8807582d0e047524be4c30fffdd1a19a51dba36d85d"}},"tests/fixtures/benchmark_24/it/tangential.md":{"size":155,"mtime_ns":1787196245918356300,"indexed_at_ns":1787196460285993500,"word_count":23,"hashes":{"tests/fixtures/benchmark_24/it/tangential.md":"a78a886f11462033c996a20b629e13c6bb55d4e08ffed20601cd4ea877b9db09"}},"tests/fixtures/benchmark_24/it/tangential_expected.json":{"size":128,"mtime_ns":1787196252898853500,"indexed_at_ns":1787196460175957500,"word_count":10,"hashes":{"tests/fixtures/benchmark_24/it/tangential_expected.json":"18872f6fe4cbd71812566494e88bd97633d696f732b3b5bad871f81076703f74"}},"tests/fixtures/benchmark_24/pt/contextual.md":{"size":125,"mtime_ns":1787196014201071400,"indexed_at_ns":1787196460286845200,"word_count":18,"hashes":{"tests/fixtures/benchmark_24/pt/contextual.md":"e9ea12885a5c68822f96691e543b55885afba3d00a9e0fa65837bd88e559f157"}},"tests/fixtures/benchmark_24/pt/contextual_expected.json":{"size":136,"mtime_ns":1787196019487136800,"indexed_at_ns":1787196460176915600,"word_count":10,"hashes":{"tests/fixtures/benchmark_24/pt/contextual_expected.json":"34145a845a7f6b155bf42c028bb0c6d8d43ed5cd0b1d179c089b1e621fecd08f"}},"tests/fixtures/benchmark_24/pt/direct.md":{"size":140,"mtime_ns":1787196003236562000,"indexed_at_ns":1787196460287899900,"word_count":21,"hashes":{"tests/fixtures/benchmark_24/pt/direct.md":"150182b9c1352163cb136c19141b85b3f0323e7eaa0cd023fce1dfef0de63d29"}},"tests/fixtures/benchmark_24/pt/direct_expected.json":{"size":132,"mtime_ns":1787196008785189600,"indexed_at_ns":1787196460177800600,"word_count":10,"hashes":{"tests/fixtures/benchmark_24/pt/direct_expected.json":"a9c666394db6a6e2fcd503d8cf67549531ee9e70eb73b1edb2b6a2443316cbf2"}},"tests/fixtures/benchmark_24/pt/ecp.json":{"size":507,"mtime_ns":1787195997549710300,"indexed_at_ns":1787196460178615000,"word_count":40,"hashes":{"tests/fixtures/benchmark_24/pt/ecp.json":"cec78c3ed8d2ec311d079239922a10a35a7fc9c382d8886fec81c6322d2a70ac"}},"tests/fixtures/benchmark_24/pt/not_related.md":{"size":124,"mtime_ns":1787196036724084200,"indexed_at_ns":1787196460288769500,"word_count":19,"hashes":{"tests/fixtures/benchmark_24/pt/not_related.md":"3af103a7f0df8e93c6154157e9903dc7fc10d64fa69dd7c2b08d4f68b99b1972"}},"tests/fixtures/benchmark_24/pt/not_related_expected.json":{"size":129,"mtime_ns":1787196042201218800,"indexed_at_ns":1787196460179403700,"word_count":10,"hashes":{"tests/fixtures/benchmark_24/pt/not_related_expected.json":"d5ce36bca028f31ba472e325993610eb82f98e1a8f84fa770bf92aa7158ce954"}},"tests/fixtures/benchmark_24/pt/tangential.md":{"size":140,"mtime_ns":1787196024978861700,"indexed_at_ns":1787196460289652400,"word_count":24,"hashes":{"tests/fixtures/benchmark_24/pt/tangential.md":"77d86f819ccbefe9830a57151354ca47d83e46b3d0e55d0f5139f37a1d9df0b8"}},"tests/fixtures/benchmark_24/pt/tangential_expected.json":{"size":128,"mtime_ns":1787196030395574000,"indexed_at_ns":1787196460180223100,"word_count":10,"hashes":{"tests/fixtures/benchmark_24/pt/tangential_expected.json":"fb977fec8db613f9545c81adffe0295084c6198b5f7c9a85d8901a228de63a51"}},"tests/test_adapters.py":{"size":1166,"mtime_ns":1787264437929228700,"indexed_at_ns":1787264516466770300,"word_count":91,"hashes":{"tests/test_adapters.py":"32a9519d5c55012aedaa43a786aff1cec88e7391d186f5d0a54213ca1b204f48"}},"tests/test_benchmark_24.py":{"size":2757,"mtime_ns":1787264437930228400,"indexed_at_ns":1787264516468505400,"word_count":257,"hashes":{"tests/test_benchmark_24.py":"7c136ac4d442e47a2f8914303880ce265c2fe49485eb182014fc3e10c06f9e71"}},"tests/test_classifier.py":{"size":3836,"mtime_ns":1787264437927229800,"indexed_at_ns":1787264516469349200,"word_count":351,"hashes":{"tests/test_classifier.py":"d3323e05dd21f20686d9293f767ebb2ced206c7b74e7ca89d2ac02c0a4e31282"}},"tests/test_cli.py":{"size":3872,"mtime_ns":1787264437929228700,"indexed_at_ns":1787264516470059400,"word_count":314,"hashes":{"tests/test_cli.py":"0573d9b13e45413beefac33d86eae94e17dbbf37554120a1fc5720bfb3d67d63"}},"tests/test_language.py":{"size":1929,"mtime_ns":1787264437929228700,"indexed_at_ns":1787264516472426100,"word_count":242,"hashes":{"tests/test_language.py":"7f7aae057ecbda26edd747d24241e9cf36f611c71c5d70d0aa308df7d71e0547"}},"tests/test_models.py":{"size":3668,"mtime_ns":1787264437930228400,"indexed_at_ns":1787264516473330500,"word_count":306,"hashes":{"tests/test_models.py":"232210770fc690edcc732d940bafe46fcec9bfed7f17e0aa5c60e6cf6635751f"}},"tests/test_adversarial.py":{"size":8429,"mtime_ns":1787264437924228700,"indexed_at_ns":1787264516467613100,"word_count":704,"hashes":{"tests/test_adversarial.py":"3acc7ff372e6b0f1f42dad29d280b835ac51784b1dca8054472287a7355c9386"}},"docs/googlenews_extractor_guia_completo.md":{"size":23200,"mtime_ns":1787264437928228500,"indexed_at_ns":1787264516560203200,"word_count":2292,"hashes":{"docs/googlenews_extractor_guia_completo.md":"dcff19204ab04403030b2339663c0d3c161744f50a53f5254c459a894eb3b3c8"}},"examples/ecp_sao_paulo_futebol_clube.json":{"size":23358,"mtime_ns":1787229477299354200,"indexed_at_ns":1787234770609429300,"word_count":1524,"hashes":{"examples/ecp_sao_paulo_futebol_clube.json":"1af9006669d57f8dc123f0edea0d0fe8aaeb9016e36ec3e0d95023ea26996915"}},"scripts/extract_google_news.py":{"size":14720,"mtime_ns":1787264437927229800,"indexed_at_ns":1787264516421445500,"word_count":1314,"hashes":{"scripts/extract_google_news.py":"aa17b59997ab6bb549a918fb1026ddf5a5c5143c75c234895dc32447e2c5b85a"}},"specs/002-google-news-extractor/checklists/readiness.md":{"size":5258,"mtime_ns":1787234305932687100,"indexed_at_ns":1787234770736852100,"word_count":706,"hashes":{"specs/002-google-news-extractor/checklists/readiness.md":"ad4c18a1fe1c6f19f45a043748fe4f195db525afac53ed77905222015ec5230c"}},"specs/002-google-news-extractor/checklists/requirements.md":{"size":1144,"mtime_ns":1787232386676398600,"indexed_at_ns":1787234770737689600,"word_count":158,"hashes":{"specs/002-google-news-extractor/checklists/requirements.md":"d83944755d7f6e43d8c76e032f0047be6f8c4cb2b80dea65e198f57b9c5eccd7"}},"specs/002-google-news-extractor/contracts/cli_contract.md":{"size":2681,"mtime_ns":1787236744313922700,"indexed_at_ns":1787236813512122300,"word_count":424,"hashes":{"specs/002-google-news-extractor/contracts/cli_contract.md":"6b9e3c10becd7b8fa633e409e9a3298ff4b2903dfd5194054c8e41dd0c0c5f23"}},"specs/002-google-news-extractor/data-model.md":{"size":3008,"mtime_ns":1787234040813431800,"indexed_at_ns":1787234770739130200,"word_count":472,"hashes":{"specs/002-google-news-extractor/data-model.md":"78cec846c1173fbdff3c77313ba02c7977365e5ab102df527f90ed7b06e69519"}},"specs/002-google-news-extractor/plan.md":{"size":3947,"mtime_ns":1787236725982522400,"indexed_at_ns":1787236813514970600,"word_count":448,"hashes":{"specs/002-google-news-extractor/plan.md":"57a0a3eb1fd6d7afbe394be62e681a02d7ef26124f4142b9d8b72ea95259a34b"}},"specs/002-google-news-extractor/quickstart.md":{"size":2341,"mtime_ns":1787236764020651300,"indexed_at_ns":1787236813515935900,"word_count":317,"hashes":{"specs/002-google-news-extractor/quickstart.md":"3478a487614358839b3e53c15b05b86a4b850bead9b4142384566e244753bde3"}},"specs/002-google-news-extractor/research.md":{"size":3630,"mtime_ns":1787236785046618200,"indexed_at_ns":1787236813516811500,"word_count":483,"hashes":{"specs/002-google-news-extractor/research.md":"71e796c83a1c293fa380b4f01a2eed810275e4628548e0f8e8b9ecaa90d3ac13"}},"specs/002-google-news-extractor/spec.md":{"size":7506,"mtime_ns":1787236709078315600,"indexed_at_ns":1787236813517705300,"word_count":1096,"hashes":{"specs/002-google-news-extractor/spec.md":"e84b37b25f61ed209d1295f77bf84024ac6c3c818f6b98043204a9f81bff49f0"}},"specs/002-google-news-extractor/tasks.md":{"size":5315,"mtime_ns":1787236802480804800,"indexed_at_ns":1787236813518644500,"word_count":692,"hashes":{"specs/002-google-news-extractor/tasks.md":"94430da291ad0dc34b1cde7c30f2b8e1ce0c83d35b5e71ab68bd135146c9ef47"}},"tests/test_extract_google_news.py":{"size":12221,"mtime_ns":1787264437931227400,"indexed_at_ns":1787264516471687100,"word_count":1114,"hashes":{"tests/test_extract_google_news.py":"5304424b746b871720985cfdd031b0f8895c664bdd9d273b9c1723f445a2276f"}},"scripts/__init__.py":{"size":50,"mtime_ns":1787234973578233800,"indexed_at_ns":1787235018163517900,"word_count":6,"hashes":{"scripts/__init__.py":"f30a694c2114ef6bc58efa1caea7265dde8ef296d92cdb77c8b3e3d1f21af3a5"}},"README.md":{"size":27600,"mtime_ns":1787318406716765900,"indexed_at_ns":1787318414451286000,"word_count":3285,"hashes":{"readme.md":"e1a9fb842244feb21c26788183db26c1746051cac95d8594ec056b13ecd3ebeb"}},"docs/prd_extrator_artigos_nlp.md":{"size":11894,"mtime_ns":1787237774009258300,"indexed_at_ns":1787240513666474800,"word_count":1548,"hashes":{"docs/prd_extrator_artigos_nlp.md":"e10035c73584efc6d043bec17d43388ecbf25b576ca3475d0b9906cbc16fad90"}},"scripts/extract_article_contents.py":{"size":27025,"mtime_ns":1787264465341521500,"indexed_at_ns":1787264516419754800,"word_count":2069,"hashes":{"scripts/extract_article_contents.py":"a76fc087a959496bc2cf4767baaed89628bd945e1aaa8e981be840cf1240f1ba"}},"specs/003-article-content-extractor/checklists/extraction.md":{"size":4716,"mtime_ns":1787239873797626000,"indexed_at_ns":1787240513705426800,"word_count":609,"hashes":{"specs/003-article-content-extractor/checklists/extraction.md":"b8351909b93111f8f1e50f0f100446d3f579d0c11823eba4936c72a617aba5f8"}},"specs/003-article-content-extractor/checklists/requirements.md":{"size":1209,"mtime_ns":1787237950814070500,"indexed_at_ns":1787240513706099200,"word_count":164,"hashes":{"specs/003-article-content-extractor/checklists/requirements.md":"3c770288636c4523897b41c6dad5f2771af2007654d6b5f6b87d74bc9c33d11d"}},"specs/003-article-content-extractor/contracts/cli-contract.md":{"size":2493,"mtime_ns":1787239569056013800,"indexed_at_ns":1787240513706906100,"word_count":390,"hashes":{"specs/003-article-content-extractor/contracts/cli-contract.md":"44c5ec336c210bdd9671a5e852ee750e91f426b87c954b2c52499513cb85168d"}},"specs/003-article-content-extractor/contracts/json-schema.md":{"size":3065,"mtime_ns":1787239578931403200,"indexed_at_ns":1787240513707577900,"word_count":298,"hashes":{"specs/003-article-content-extractor/contracts/json-schema.md":"0cefe7faadd07932717b8c3493914e5367ec6ac50673671aee1f4edc7bde7e37"}},"specs/003-article-content-extractor/data-model.md":{"size":4410,"mtime_ns":1787239558236282500,"indexed_at_ns":1787240513708324600,"word_count":733,"hashes":{"specs/003-article-content-extractor/data-model.md":"651180962cf2a9253cb0a22429947eb3bf552c26be7defce98ef7583cbcd8fbf"}},"specs/003-article-content-extractor/plan.md":{"size":4642,"mtime_ns":1787264323707266000,"indexed_at_ns":1787264516630842500,"word_count":510,"hashes":{"specs/003-article-content-extractor/plan.md":"3ae38a2a907f1aeb6987c647a6290533acde67ef91f590445bdec0e1da5f52be"}},"specs/003-article-content-extractor/quickstart.md":{"size":2210,"mtime_ns":1787239589989665700,"indexed_at_ns":1787240513709638200,"word_count":282,"hashes":{"specs/003-article-content-extractor/quickstart.md":"332c407a9b1c3eafcb874d24f5396f005cde65d4d8e9e643fda95f47f093c544"}},"specs/003-article-content-extractor/research.md":{"size":4220,"mtime_ns":1787239545833014600,"indexed_at_ns":1787240513710259700,"word_count":588,"hashes":{"specs/003-article-content-extractor/research.md":"485f0e63023aa6dc8c4c64b22dd7394c032b7f468fa41632967789c4e269587b"}},"specs/003-article-content-extractor/spec.md":{"size":10428,"mtime_ns":1787264319288323400,"indexed_at_ns":1787264516635570600,"word_count":1515,"hashes":{"specs/003-article-content-extractor/spec.md":"1ad671e31d86c76aedaa27d5d4da839cdf2d602bd17e618310c80bd3747fab78"}},"specs/003-article-content-extractor/tasks.md":{"size":8201,"mtime_ns":1787240464652064400,"indexed_at_ns":1787240513711676500,"word_count":1070,"hashes":{"specs/003-article-content-extractor/tasks.md":"3122914461e8d6017e63900c66fa8935135b5efcc9fca8d64e762ee109602901"}},"tests/test_extract_article_contents.py":{"size":13204,"mtime_ns":1787264437929228700,"indexed_at_ns":1787264516470977000,"word_count":1039,"hashes":{"tests/test_extract_article_contents.py":"4333ac8911d1cd27964b0bacfa394ee8fe9e068bb2f25f3e0ff5e299564a7b4d"}},"docs/prd_deterministic_content_selection.md":{"size":15516,"mtime_ns":1787264674203828600,"indexed_at_ns":1787272605069414800,"word_count":2047,"hashes":{"docs/prd_deterministic_content_selection.md":"a337f19aa87b82ef5ee4f04bae19833331de5c49ee83bca2cf1f542eb893ae0b"}},"scripts/select_article_extractor.py":{"size":21658,"mtime_ns":1787274502480126900,"indexed_at_ns":1787310811622526500,"word_count":2097,"hashes":{"scripts/select_article_extractor.py":"027743d36fd728fded28a085abf202e4eab0102bc5517cf4975a094d5df04c3f"}},"specs/004-deterministic-content-selection/checklists/deterministic-selection.md":{"size":4236,"mtime_ns":1787272346869214200,"indexed_at_ns":1787272605178155100,"word_count":566,"hashes":{"specs/004-deterministic-content-selection/checklists/deterministic-selection.md":"937ec7535aa3602a811212d196f441aff79338c4358b881c1bc8f7844b4f8241"}},"specs/004-deterministic-content-selection/checklists/requirements.md":{"size":1303,"mtime_ns":1787264728720272700,"indexed_at_ns":1787272605179339000,"word_count":175,"hashes":{"specs/004-deterministic-content-selection/checklists/requirements.md":"8a7f723658366b3ba5e135483200453bbbe100152977f488f39161c537903f56"}},"specs/004-deterministic-content-selection/contracts/cli-contract.md":{"size":2071,"mtime_ns":1787274329217544500,"indexed_at_ns":1787274399618300500,"word_count":293,"hashes":{"specs/004-deterministic-content-selection/contracts/cli-contract.md":"6e6d43cae2405e648ff02f937b911d61e8efbd1f34b1f608feed7166f6c241f4"}},"specs/004-deterministic-content-selection/contracts/json-schema.md":{"size":1982,"mtime_ns":1787271837732839400,"indexed_at_ns":1787272605181473200,"word_count":195,"hashes":{"specs/004-deterministic-content-selection/contracts/json-schema.md":"db8b8702249e41e00c89cfcba0c76be591c320e8c42c9ef9a1098bb764097da6"}},"specs/004-deterministic-content-selection/data-model.md":{"size":5498,"mtime_ns":1787271825597039400,"indexed_at_ns":1787272605182487300,"word_count":681,"hashes":{"specs/004-deterministic-content-selection/data-model.md":"5773f5110269524eda7750f0d154d16e0bb29990fac51f57f76b42702789de8a"}},"specs/004-deterministic-content-selection/plan.md":{"size":5319,"mtime_ns":1787271850174420500,"indexed_at_ns":1787272605183666400,"word_count":643,"hashes":{"specs/004-deterministic-content-selection/plan.md":"2baf2f08897f9e80d43db55aa178ac515e3f012fac265e43a7fb679eb4c01f1f"}},"specs/004-deterministic-content-selection/quickstart.md":{"size":2239,"mtime_ns":1787274502478128000,"indexed_at_ns":1787310811759309400,"word_count":245,"hashes":{"specs/004-deterministic-content-selection/quickstart.md":"7136c34e9fa9c525ff01d65f8c35c2368cace0468b2651e85901195bfb8730a5"}},"specs/004-deterministic-content-selection/research.md":{"size":6915,"mtime_ns":1787274316854443300,"indexed_at_ns":1787274399622900200,"word_count":906,"hashes":{"specs/004-deterministic-content-selection/research.md":"11e7f5000a2fb8eeff02785f691ae153bc0eedd913432e3ca833022d394ff427"}},"specs/004-deterministic-content-selection/spec.md":{"size":11807,"mtime_ns":1787274311156486400,"indexed_at_ns":1787274399623530600,"word_count":1619,"hashes":{"specs/004-deterministic-content-selection/spec.md":"7f0baab75874dd05fc9fc891aefd4b4012b5ad82b2ed1738261ec6cb15d9f303"}},"specs/004-deterministic-content-selection/tasks.md":{"size":8181,"mtime_ns":1787272595818614500,"indexed_at_ns":1787272605189230700,"word_count":1024,"hashes":{"specs/004-deterministic-content-selection/tasks.md":"412b7a4261ea8c52655286c5b5761cc3800dfedf827289589380b700a4c40887"}},"tests/test_select_article_extractor.py":{"size":24179,"mtime_ns":1787274502480126900,"indexed_at_ns":1787310811669359800,"word_count":2243,"hashes":{"tests/test_select_article_extractor.py":"22eb249629c891e4cd4b2bc09ce17c1e334bc908de3db53539ced305d3bfd287"}},"docs/prd_convert_json_markdown.md":{"size":22478,"mtime_ns":1787315400452784100,"indexed_at_ns":1787317709833244200,"word_count":3252,"hashes":{"docs/prd_convert_json_markdown.md":"d4203d9d5a6b9107bcc8ced682b509b30e7c152293298bcae22c1f96570415fb"}},"scripts/convert_article_to_markdown.py":{"size":21902,"mtime_ns":1787318308435895700,"indexed_at_ns":1787318414340653000,"word_count":2026,"hashes":{"scripts/convert_article_to_markdown.py":"36cde38c040c6fbfb15792ad8479c502c6b89b63070bf17120f39dafd6b27475"}},"specs/005-convert-json-markdown/checklists/markdown-conversion.md":{"size":10081,"mtime_ns":1787315812919805400,"indexed_at_ns":1787317709896809600,"word_count":1322,"hashes":{"specs/005-convert-json-markdown/checklists/markdown-conversion.md":"b5d0d4f6da5666dd115bd84f2a963c45da3080bb6d5725066aafab49d765746b"}},"specs/005-convert-json-markdown/checklists/requirements.md":{"size":1339,"mtime_ns":1787315513450848200,"indexed_at_ns":1787317709897553300,"word_count":181,"hashes":{"specs/005-convert-json-markdown/checklists/requirements.md":"702ba88fb2e7c9740d4c83a0c1fd434d5c348b7691f12688a1c00c0ee4956afd"}},"specs/005-convert-json-markdown/contracts/cli-contract.md":{"size":1641,"mtime_ns":1787315656382816000,"indexed_at_ns":1787317709898261700,"word_count":231,"hashes":{"specs/005-convert-json-markdown/contracts/cli-contract.md":"f2c146fd734cceaa4f2268d03c8633153f57d2fd468073a6a4701fbc14b25ef7"}},"specs/005-convert-json-markdown/contracts/markdown-schema.md":{"size":1616,"mtime_ns":1787315662306015400,"indexed_at_ns":1787317709898922500,"word_count":218,"hashes":{"specs/005-convert-json-markdown/contracts/markdown-schema.md":"b28308c2c54a4f569f5e533beb0a2a1ff44614fb28853c2f1aa915e58558c4ab"}},"specs/005-convert-json-markdown/data-model.md":{"size":5828,"mtime_ns":1787315648195198100,"indexed_at_ns":1787317709899563900,"word_count":687,"hashes":{"specs/005-convert-json-markdown/data-model.md":"2eb414a927cb0f39ba466d0870792afd73b719c8baa2fb5fe47020a024f93520"}},"specs/005-convert-json-markdown/plan.md":{"size":6196,"mtime_ns":1787315676826685000,"indexed_at_ns":1787317709900209400,"word_count":723,"hashes":{"specs/005-convert-json-markdown/plan.md":"c4db190f72e59cd2403bbbd7f99b4a4a5713285af478b2c6a7973f6e4a1007a6"}},"specs/005-convert-json-markdown/quickstart.md":{"size":1179,"mtime_ns":1787315668269243000,"indexed_at_ns":1787317709901438900,"word_count":126,"hashes":{"specs/005-convert-json-markdown/quickstart.md":"1481575738d29705da2fb1db54f53a744cdc90a79f00331dde7c351619b4036e"}},"specs/005-convert-json-markdown/research.md":{"size":5982,"mtime_ns":1787315639720415300,"indexed_at_ns":1787317709902236300,"word_count":765,"hashes":{"specs/005-convert-json-markdown/research.md":"66f816e6bda19ec162a55f35d16d5cc230e031e9002d434d69cdf79ca6fcea77"}},"specs/005-convert-json-markdown/spec.md":{"size":15416,"mtime_ns":1787315504210700900,"indexed_at_ns":1787317709902900100,"word_count":2032,"hashes":{"specs/005-convert-json-markdown/spec.md":"6e7faebc853323fb40729b8ea0b0719017c3387e69b4433fc9e4a2448d3efb9c"}},"specs/005-convert-json-markdown/tasks.md":{"size":8664,"mtime_ns":1787317701507180900,"indexed_at_ns":1787317709903569500,"word_count":1107,"hashes":{"specs/005-convert-json-markdown/tasks.md":"9ec3cc4573e6b7e18b68101acfcdd3a838a4f0453ed5a669a1d7f778b98e16d7"}},"tests/fixtures/markdown_conversion/batch_articles_invalid.json":{"size":162,"mtime_ns":1787317425649588100,"indexed_at_ns":1787317709759979900,"word_count":17,"hashes":{"tests/fixtures/markdown_conversion/batch_articles_invalid.json":"37b5ff42ccf176effa7abd142658afa91ea93d9080f51d6300b5e6be8248e22c"}},"tests/fixtures/markdown_conversion/corrupt_json_invalid.json":{"size":84,"mtime_ns":1787317430995160700,"indexed_at_ns":1787317709760596100,"word_count":8,"hashes":{"tests/fixtures/markdown_conversion/corrupt_json_invalid.json":"26317cdd3614f55612321aa9385bbbbd07bda718beb2f86692d1d30266a942c7"}},"tests/fixtures/markdown_conversion/invalid_url_invalid.json":{"size":181,"mtime_ns":1787317453854590700,"indexed_at_ns":1787317709761157600,"word_count":16,"hashes":{"tests/fixtures/markdown_conversion/invalid_url_invalid.json":"6641507e5b57acf774f7088c936cd109fd7600ff6f4d43176d27c236ef96d19c"}},"tests/fixtures/markdown_conversion/missing_body_invalid.json":{"size":328,"mtime_ns":1787317440927113900,"indexed_at_ns":1787317709761735000,"word_count":30,"hashes":{"tests/fixtures/markdown_conversion/missing_body_invalid.json":"ff9c5e6910d5b4d09ab14273098f3a5367c1e29ac5fb8782438ff667bee4e524"}},"tests/fixtures/markdown_conversion/missing_extractor_invalid.json":{"size":166,"mtime_ns":1787317435197323100,"indexed_at_ns":1787317709762359200,"word_count":16,"hashes":{"tests/fixtures/markdown_conversion/missing_extractor_invalid.json":"cc924af9d02584efa2942cfa2dfa789d63e1d45cac4f85105805657e66ef5e1d"}},"tests/fixtures/markdown_conversion/missing_title_invalid.json":{"size":168,"mtime_ns":1787317446757957200,"indexed_at_ns":1787317709762935000,"word_count":16,"hashes":{"tests/fixtures/markdown_conversion/missing_title_invalid.json":"c94b7bf69eab2bb707c2de6dedaeab750c42115b3bc27d4edb9fad543b7d242d"}},"tests/fixtures/markdown_conversion/valid_newspaper4k.json":{"size":1154,"mtime_ns":1787317391619680400,"indexed_at_ns":1787317709763503300,"word_count":113,"hashes":{"tests/fixtures/markdown_conversion/valid_newspaper4k.json":"09bf8517ec513e3c49a7dbb822baca7ed7020bc9cf6fa116f6e01d72f9bf2f49"}},"tests/fixtures/markdown_conversion/valid_newspaper4k.md":{"size":646,"mtime_ns":1787317400974503500,"indexed_at_ns":1787317709931058900,"word_count":67,"hashes":{"tests/fixtures/markdown_conversion/valid_newspaper4k.md":"32a5e4fac2616b5d9ff8859c4e14a76f243c48ce6eedffde51cac9e97b5cd57c"}},"tests/fixtures/markdown_conversion/valid_readability.json":{"size":794,"mtime_ns":1787317412440020900,"indexed_at_ns":1787317709764089400,"word_count":83,"hashes":{"tests/fixtures/markdown_conversion/valid_readability.json":"91e50abb1bf7195d2b6b84ea7dcdebfdb454dec3dead69e8ecc58971e0aabfe1"}},"tests/fixtures/markdown_conversion/valid_readability.md":{"size":455,"mtime_ns":1787317419401926200,"indexed_at_ns":1787317709931788100,"word_count":45,"hashes":{"tests/fixtures/markdown_conversion/valid_readability.md":"05c37379ff5c24c9c875a806c74f362759127986c834a2f069ed4fa64ab1cd30"}},"tests/fixtures/markdown_conversion/valid_trafilatura.json":{"size":1541,"mtime_ns":1787317377645516500,"indexed_at_ns":1787317709764666700,"word_count":140,"hashes":{"tests/fixtures/markdown_conversion/valid_trafilatura.json":"7a4214ab8db9f66674677b410816534645906a327091a2b8c864763f269123b3"}},"tests/fixtures/markdown_conversion/valid_trafilatura.md":{"size":895,"mtime_ns":1787317383505866600,"indexed_at_ns":1787317709932479900,"word_count":86,"hashes":{"tests/fixtures/markdown_conversion/valid_trafilatura.md":"024ca5b2b269152ed2e7afbc719589d6f005d3dd4a50d1a6303c426415313326"}},"tests/test_convert_article_to_markdown.py":{"size":28638,"mtime_ns":1787318233657426400,"indexed_at_ns":1787318414398829800,"word_count":2388,"hashes":{"tests/test_convert_article_to_markdown.py":"93b93b8fe832e887faa7acf1dcd7f8121e7492213ffb20398af13ae520acb58d"}}} \ No newline at end of file diff --git a/graphify-out/graph.html b/graphify-out/graph.html index 70de111..20a3502 100644 --- a/graphify-out/graph.html +++ b/graphify-out/graph.html @@ -63,12 +63,12 @@
-
1235 nodes · 1541 edges · 131 communities
+
1527 nodes · 1899 edges · 165 communities
" + "" + "" + ) + md = convert_html_to_markdown(html_raw) + + assert "# Título H1" in md + assert "## Subtítulo H2" in md + assert "### Seção H3" in md + assert "**negrito**" in md or "__negrito__" in md + assert "> Uma citação memorável." in md + assert "* Item 1" in md or "- Item 1" in md + assert "[portal oficial](https://example.com/fonte)" in md + assert "`codigo_inline()`" in md + assert "alert('remover')" not in md + assert "display: none" not in md + + +def test_convert_html_to_markdown_empty_or_whitespace(): + """Testa conversão de HTML vazio retornando string vazia.""" + assert convert_html_to_markdown("") == "" + assert convert_html_to_markdown(" \n\t ") == "" + assert convert_html_to_markdown(None) == "" + + +# ============================================================================== +# 6. Testes de Isolamento Estrito do Extrator e Fallback Interno +# ============================================================================== + + +def test_resolve_article_body_trafilatura_primary_and_fallback(): + """Testa prioridade trafilatura.markdown sobre trafilatura.text.""" + # Primário + art1 = { + "selected_extractor": "trafilatura", + "trafilatura": {"markdown": "Corpo primário Trafilatura", "text": "Texto secundário"}, + } + assert resolve_article_body(art1) == "Corpo primário Trafilatura" + + # Fallback + art2 = { + "selected_extractor": "trafilatura", + "trafilatura": {"markdown": None, "text": "Texto secundário Trafilatura"}, + } + assert resolve_article_body(art2) == "Texto secundário Trafilatura" + + +def test_resolve_article_body_newspaper4k_primary_and_fallback(): + """Testa prioridade newspaper4k.article_html sobre newspaper4k.text.""" + # Primário HTML -> MD + art1 = { + "selected_extractor": "newspaper4k", + "newspaper4k": { + "article_html": "

Artigo em HTML

", + "text": "Artigo em texto puro", + }, + } + assert "**HTML**" in resolve_article_body(art1) + + # Fallback + art2 = { + "selected_extractor": "newspaper4k", + "newspaper4k": {"article_html": None, "text": "Artigo em texto puro Newspaper"}, + } + assert resolve_article_body(art2) == "Artigo em texto puro Newspaper" + + +def test_resolve_article_body_readability_primary_and_fallback(): + """Testa prioridade readability.cleaned_html sobre readability.cleaned_text.""" + # Primário HTML -> MD + art1 = { + "selected_extractor": "readability", + "readability": { + "cleaned_html": "

Conteúdo Readability

", + "cleaned_text": "Texto puro Readability", + }, + } + body = resolve_article_body(art1) + assert "*Readability*" in body or "_Readability_" in body + + # Fallback + art2 = { + "selected_extractor": "readability", + "readability": {"cleaned_html": "", "cleaned_text": "Texto puro Readability Fallback"}, + } + assert resolve_article_body(art2) == "Texto puro Readability Fallback" + + +@pytest.mark.parametrize("extractor", ["trafilatura", "newspaper4k", "readability"]) +def test_resolve_article_body_strict_isolation_all_extractors(extractor: str): + """Garante que a ausência de corpo no extrator selecionado NUNCA faça fallback para outro extrator.""" + article = { + "selected_extractor": extractor, + "trafilatura": {"markdown": "Texto Trafilatura", "text": "Texto Trafilatura"}, + "newspaper4k": {"article_html": "

Texto Newspaper

", "text": "Texto Newspaper"}, + "readability": { + "cleaned_html": "

Texto Readability

", + "cleaned_text": "Texto Readability", + }, + } + # Esvazia o corpo do extrator selecionado + if extractor == "trafilatura": + article["trafilatura"] = {"markdown": None, "text": ""} + elif extractor == "newspaper4k": + article["newspaper4k"] = {"article_html": "", "text": None} + elif extractor == "readability": + article["readability"] = {"cleaned_html": None, "cleaned_text": ""} + + with pytest.raises(ValueError, match="Corpo do extrator selecionado.*vazio|indisponível"): + resolve_article_body(article) + + +def test_resolve_article_body_invalid_selected_extractor(): + """Garante erro ao receber selected_extractor ausente ou não reconhecido.""" + with pytest.raises(ValueError, match="selected_extractor inválido ou ausente"): + resolve_article_body({"selected_extractor": "extrator_desconhecido"}) + + with pytest.raises(ValueError, match="selected_extractor inválido ou ausente"): + resolve_article_body({"selected_extractor": None}) + + +# ============================================================================== +# 7. Testes da Matriz Determinística de Resolução de Metadados +# ============================================================================== + + +def test_metadata_priority_title_all_fallbacks(): + """Valida a cadeia de fallback completa para o campo TÍTULO (6 níveis).""" + # 1. Do selecionado + art1 = {"selected_extractor": "trafilatura", "trafilatura": {"title": "Título Selecionado"}} + assert ( + resolve_article_metadata({**art1, "crawled_url": "https://e.com"})["title"] + == "Título Selecionado" + ) + + # 2. input_meta.titulo + art2 = { + "selected_extractor": "trafilatura", + "input_meta": {"titulo": "Título Input Meta"}, + "crawled_url": "https://e.com", + } + assert resolve_article_metadata(art2)["title"] == "Título Input Meta" + + # 3. page_title + art3 = { + "selected_extractor": "trafilatura", + "page_title": "Título Page Title", + "crawled_url": "https://e.com", + } + assert resolve_article_metadata(art3)["title"] == "Título Page Title" + + # 4. newspaper4k.title + art4 = { + "selected_extractor": "trafilatura", + "newspaper4k": {"title": "Título Newspaper"}, + "crawled_url": "https://e.com", + } + assert resolve_article_metadata(art4)["title"] == "Título Newspaper" + + # 5. readability.title + art5 = { + "selected_extractor": "trafilatura", + "readability": {"title": "Título Readability"}, + "crawled_url": "https://e.com", + } + assert resolve_article_metadata(art5)["title"] == "Título Readability" + + +def test_metadata_priority_original_url_all_fallbacks(): + """Valida a cadeia de fallback completa para a URL ORIGINAL (5 níveis).""" + # 1. input_meta.url + art1 = { + "selected_extractor": "trafilatura", + "trafilatura": {"title": "T"}, + "input_meta": {"url": "https://example.com/input-meta"}, + "crawled_url": "https://example.com/crawled", + } + assert resolve_article_metadata(art1)["original_url"] == "https://example.com/input-meta" + + # 2. crawled_url + art2 = { + "selected_extractor": "trafilatura", + "trafilatura": {"title": "T"}, + "crawled_url": "https://example.com/crawled", + } + assert resolve_article_metadata(art2)["original_url"] == "https://example.com/crawled" + + # 3. Canonical do selecionado + art3 = { + "selected_extractor": "trafilatura", + "trafilatura": {"title": "T", "canonical_url": "https://example.com/canonical-trafilatura"}, + } + assert ( + resolve_article_metadata(art3)["original_url"] + == "https://example.com/canonical-trafilatura" + ) + + # 4. Canonical do newspaper4k + art4 = { + "selected_extractor": "readability", + "readability": {"title": "T"}, + "newspaper4k": {"canonical_link": "https://example.com/canonical-newspaper"}, + } + assert ( + resolve_article_metadata(art4)["original_url"] == "https://example.com/canonical-newspaper" + ) + + +def test_metadata_priority_subtitle_omitted_when_equal_to_title(): + """Garante que subtítulo idêntico ao título seja automaticamente omitido (None).""" + art = { + "selected_extractor": "trafilatura", + "trafilatura": { + "title": "Grande Vitória no Clássico", + "description": " grande vitória no clássico ", + }, + "crawled_url": "https://example.com/noticia", + } + meta = resolve_article_metadata(art) + assert meta["title"] == "Grande Vitória no Clássico" + assert meta["subtitle"] is None + + +def test_metadata_priority_first_valid_source_no_cross_merging(): + """Garante que listas de autores/tags usem apenas a primeira fonte válida, sem merge cruzado.""" + art = { + "selected_extractor": "readability", + "crawled_url": "https://example.com/noticia", + "readability": {"title": "Título", "author": "Carlos Bilardo"}, + "newspaper4k": {"authors": ["Juan Pérez", "María Gómez"]}, + } + meta = resolve_article_metadata(art) + # Deve pegar o autor de Readability (selecionado), sem misturar com Newspaper4k + assert meta["authors"] == ["Carlos Bilardo"] + + +# ============================================================================== +# 8. Testes de Higienização de Cabeçalhos e Imagens no Corpo +# ============================================================================== + + +def test_remove_duplicate_initial_h1_exact_and_variations(): + """Testa remoção de H1 inicial coincidente com título com variações de espaços e caixa.""" + title = "River Plate Conquista a Copa" + + # H1 inicial igual + body1 = "# river plate conquista a copa\n\nPrimeiro parágrafo do artigo." + assert remove_duplicate_initial_h1(body1, title).strip() == "Primeiro parágrafo do artigo." + + # H1 inicial diferente (deve ser preservado) + body2 = "# Outro Título Diferente\n\nPrimeiro parágrafo." + assert remove_duplicate_initial_h1(body2, title) == body2 + + # Sem H1 inicial + body3 = "Parágrafo sem nenhum título H1 inicial." + assert remove_duplicate_initial_h1(body3, title) == body3 + + +def test_clean_body_images_removes_invalid_and_deduplicates(): + """Valida descarte de data:, relativos e deduplicação mantendo a primeira ocorrência.""" + body = ( + "![Legenda 1](https://example.com/img1.jpg)\n\n" + "![Legenda Relativa](/imagem.png)\n\n" + "![Legenda Data](data:image/png;base64,AAAA)\n\n" + "![Legenda 1 Repetida](https://example.com/img1.jpg)\n\n" + "![Legenda 2](https://example.com/img2.webp)" + ) + cleaned = clean_body_images(body) + + assert cleaned.count("https://example.com/img1.jpg") == 1 + assert "https://example.com/img2.webp" in cleaned + assert "/imagem.png" not in cleaned + assert "data:image" not in cleaned + + +# ============================================================================== +# 9. Testes de Montagem e Formatação do Documento Markdown +# ============================================================================== + + +def test_assemble_markdown_document_full_and_minimal(): + """Testa montagem com todos os campos e apenas com campos obrigatórios.""" + # Artigo Mínimo (apenas Título e URL Original) + min_meta = { + "title": "Título Mínimo", + "original_url": "https://example.com/minimo", + "subtitle": None, + "authors": [], + "publish_date": None, + "site_name": None, + "categories": [], + "tags": [], + "keywords": [], + "language": None, + "top_image": None, + } + doc_min = assemble_markdown_document(min_meta, "Corpo do texto simples.") + + assert doc_min.startswith("# Título Mínimo\n\n") + assert "**Fonte original:** [https://example.com/minimo](https://example.com/minimo)" in doc_min + assert "**Autor:**" not in doc_min + assert "**Site:**" not in doc_min + assert "![Imagem principal]" not in doc_min + assert "\n\n---\n\nCorpo do texto simples.\n" in doc_min + assert doc_min.endswith("\n") + assert not doc_min.endswith("\n\n") + + +# ============================================================================== +# 10. Golden Test Fixtures (Conformidade 100% Byte a Byte) +# ============================================================================== + + +def test_golden_fixtures_byte_level_precision(tmp_path): + """Garante correspondência exata byte a byte para Trafilatura, Newspaper4k e Readability.""" + for extractor in ["trafilatura", "newspaper4k", "readability"]: + input_json = FIXTURES_DIR / f"valid_{extractor}.json" + expected_md = (FIXTURES_DIR / f"valid_{extractor}.md").read_text(encoding="utf-8") + output_md = tmp_path / f"valid_{extractor}.md" + + res = subprocess.run( + [sys.executable, str(SCRIPT_PATH), "-i", str(input_json), "-o", str(output_md)], + capture_output=True, + text=True, + ) + assert res.returncode == 0, f"Erro no extrator {extractor}: {res.stderr}" + generated_md = output_md.read_text(encoding="utf-8") + assert generated_md == expected_md, f"Divergência byte a byte na fixture {extractor}" + + +def test_conversion_determinism_sha256_repeatability(tmp_path): + """Garante que múltiplas execuções no mesmo arquivo produzam hashes SHA-256 idênticos.""" + input_json = FIXTURES_DIR / "valid_trafilatura.json" + hashes = set() + + for i in range(5): + out_md = tmp_path / f"deterministic_{i}.md" + res = subprocess.run( + [sys.executable, str(SCRIPT_PATH), "-i", str(input_json), "-o", str(out_md)], + capture_output=True, + text=True, + ) + assert res.returncode == 0 + content_bytes = out_md.read_bytes() + hashes.add(hashlib.sha256(content_bytes).hexdigest()) + + assert len(hashes) == 1, "A conversão não foi 100% determinística entre execuções repetidas." + + +# ============================================================================== +# 11. Testes de Integração CLI, Validação e Códigos de Saída +# ============================================================================== + + +def test_cli_exit_codes_and_error_handling(tmp_path): + """Testa toda a matriz de códigos de saída da CLI (0, 1, 2).""" + # Código 2: Sintaxe / Argumentos Faltantes + res_no_args = subprocess.run([sys.executable, str(SCRIPT_PATH)], capture_output=True, text=True) + assert res_no_args.returncode == 2 + + # Código 1: Arquivo Inexistente + res_missing_file = subprocess.run( + [sys.executable, str(SCRIPT_PATH), "-i", "arquivo_que_nao_existe_xyz.json"], + capture_output=True, + text=True, + ) + assert res_missing_file.returncode == 1 + assert "não encontrado" in res_missing_file.stderr.lower() + + # Código 1: Rejeição de Batch com chave 'articles' + res_batch = subprocess.run( + [sys.executable, str(SCRIPT_PATH), "-i", str(FIXTURES_DIR / "batch_articles_invalid.json")], + capture_output=True, + text=True, + ) + assert res_batch.returncode == 1 + assert "articles" in res_batch.stderr.lower() + + # Código 1: JSON Corrompido + res_corrupt = subprocess.run( + [sys.executable, str(SCRIPT_PATH), "-i", str(FIXTURES_DIR / "corrupt_json_invalid.json")], + capture_output=True, + text=True, + ) + assert res_corrupt.returncode == 1 + assert "json" in res_corrupt.stderr.lower() + + +def test_cli_json_root_must_be_object(tmp_path): + """Garante encerramento com código 1 caso a raiz do JSON seja lista, número ou string.""" + for invalid_root in [["item1", "item2"], 12345, "string simples"]: + bad_json = tmp_path / "bad_root.json" + bad_json.write_text(json.dumps(invalid_root), encoding="utf-8") + + res = subprocess.run( + [sys.executable, str(SCRIPT_PATH), "-i", str(bad_json)], + capture_output=True, + text=True, + ) + assert res.returncode == 1 + assert "objeto" in res.stderr.lower() or "dict" in res.stderr.lower() + + +def test_cli_no_stdout_pollution_and_atomic_preservation(tmp_path): + """Garante que stdout permaneça limpo e gravação atômica preserve arquivos preexistentes em falha.""" + target_md = tmp_path / "target_document.md" + target_md.write_text("Versão Original Preservada", encoding="utf-8") + + # Executa conversão bem-sucedida + res_ok = subprocess.run( + [ + sys.executable, + str(SCRIPT_PATH), + "-i", + str(FIXTURES_DIR / "valid_trafilatura.json"), + "-o", + str(target_md), + ], + capture_output=True, + text=True, + ) + assert res_ok.returncode == 0 + assert res_ok.stdout == "" # Não polui stdout + assert "[INFO]" in res_ok.stderr + + # Executa falha direcionada ao mesmo target + res_fail = subprocess.run( + [ + sys.executable, + str(SCRIPT_PATH), + "-i", + str(FIXTURES_DIR / "missing_body_invalid.json"), + "-o", + str(target_md), + ], + capture_output=True, + text=True, + ) + assert res_fail.returncode == 1 + # O arquivo target deve manter o conteúdo do sucesso anterior, não foi apagado/corrompido + assert "# Los puntajes de River" in target_md.read_text(encoding="utf-8") + + # Verifica que não há arquivos temporários .tmp no diretório + tmp_files = list(tmp_path.glob("*.tmp")) + assert len(tmp_files) == 0 + + +def test_cli_default_output_naming(tmp_path): + """Garante geração automática de .md quando -o não é informado.""" + sample_file = tmp_path / "meu_artigo_editorial.json" + sample_file.write_text( + json.dumps( + { + "selected_extractor": "trafilatura", + "crawled_url": "https://example.com/editorial", + "trafilatura": {"title": "Editorial do Dia", "markdown": "Texto do editorial."}, + } + ), + encoding="utf-8", + ) + res = subprocess.run( + [sys.executable, str(SCRIPT_PATH), "-i", str(sample_file)], + capture_output=True, + text=True, + ) + assert res.returncode == 0 + expected_md = tmp_path / "meu_artigo_editorial.md" + assert expected_md.exists() + assert "# Editorial do Dia" in expected_md.read_text(encoding="utf-8") + + +# ============================================================================== +# 12. Teste E2E de Pipeline Real (Artigo Autêntico) +# ============================================================================== + + +def test_e2e_pipeline_with_real_extracted_selected_json(tmp_path): + """Valida a conversão E2E de um artigo real extraído do arquivo out/river_plate_extracted_selected.json.""" + sample_source = Path(__file__).parent.parent / "out" / "river_plate_extracted_selected.json" + if not sample_source.exists(): + pytest.skip( + "Arquivo out/river_plate_extracted_selected.json não encontrado para teste de integração real." + ) + + data = json.loads(sample_source.read_text(encoding="utf-8")) + assert "articles" in data and len(data["articles"]) > 0 + + first_article = data["articles"][0] + input_json = tmp_path / "river_first_article.json" + input_json.write_text(json.dumps(first_article, indent=2, ensure_ascii=False), encoding="utf-8") + + output_md = tmp_path / "river_first_article.md" + res = subprocess.run( + [sys.executable, str(SCRIPT_PATH), "-i", str(input_json), "-o", str(output_md)], + capture_output=True, + text=True, + ) + assert res.returncode == 0, f"Erro na conversão E2E real: {res.stderr}" + assert output_md.exists() + + md_content = output_md.read_text(encoding="utf-8") + assert md_content.startswith("# ") + assert "**Fonte original:** [" in md_content + assert "\n\n---\n\n" in md_content + assert len(md_content.splitlines()) > 10 + + +def test_convert_article_api_direct(tmp_path): + """Testa a chamada direta da função convert_article em código Python.""" + in_file = tmp_path / "direct.json" + in_file.write_text( + json.dumps( + { + "selected_extractor": "trafilatura", + "crawled_url": "https://example.com/direct", + "trafilatura": {"title": "Título Direto", "markdown": "Conteúdo direto."}, + } + ), + encoding="utf-8", + ) + out_file = tmp_path / "direct.md" + result = convert_article(in_file, out_file) + assert result == out_file + assert out_file.exists() + assert "# Título Direto" in out_file.read_text(encoding="utf-8") + + +def test_parse_arguments_api_direct(): + """Testa a chamada direta do parse_arguments.""" + args = parse_arguments(["-i", "input_test.json", "-o", "output_test.md"]) + assert args.input == Path("input_test.json") + assert args.output == Path("output_test.md")