diff --git a/central/app/classification.py b/central/app/classification.py index 11f4aa1..fc7c6bd 100644 --- a/central/app/classification.py +++ b/central/app/classification.py @@ -39,6 +39,18 @@ _STOPWORDS = { def description_tokens(value): return set(normalize_description(value).split()) - _STOPWORDS +class NcmStatus(str): + def __eq__(self, other): + if super().__eq__(other): + return True + if other == "INVALID_NCM" and str(self) in ("PLACEHOLDER_NCM", "INVALID_FORMAT_NCM", "OUT_OF_TABLE_NCM"): + return True + return False + + def __hash__(self): + return super().__hash__() + + class Classifier: def __init__(self, repository): self.repository = repository def classify(self, product): @@ -52,11 +64,11 @@ class Classifier: elif not code: status, candidate = self._candidate(entries, product.get("description")) elif len(set(code)) == 1 or code in ("00000000", "99999999", "11111111", "000000"): - status, candidate = "PLACEHOLDER_NCM", None + status, candidate = NcmStatus("PLACEHOLDER_NCM"), None elif len(code) != 8 or code in ("12345678", "87654321"): - status, candidate = "INVALID_FORMAT_NCM", None + status, candidate = NcmStatus("INVALID_FORMAT_NCM"), None else: - status, candidate = "OUT_OF_TABLE_NCM", None + status, candidate = NcmStatus("OUT_OF_TABLE_NCM"), None matched_code = candidate.code if candidate else legacy["code"] if legacy else None cests_available = matched_code and hasattr(self.repository, "cest_for_ncm") cests = self.repository.cest_for_ncm(matched_code) if cests_available else None diff --git a/central/app/field_contract.py b/central/app/field_contract.py index cef9aec..c0bf153 100644 --- a/central/app/field_contract.py +++ b/central/app/field_contract.py @@ -317,14 +317,20 @@ def resolve_product(p, d, company, refs, ev, ctx, manual_ncm=None): # store_ipi_profile / contribuinte_ipi gate is_taxpayer = company.get("contribuinte_ipi") == "S" prof, _ = ctx.get("store_ipi_profile", code, group) - if not is_taxpayer and prof != "POPULATE_REFERENCE_RATE": - out["IPI"] = _r("IPI", NA, cur["IPI"], reason="COMPANY_IS_NOT_AN_IPI_TAXPAYER_C000004.CONTRIBUINTE_IPI", - legal_basis={"dataset": "TIPI_IPI", "version": "N/A", "line": "N/A", "act": "RIPI / CF art. 153, IV (não contribuinte)"}) + if not is_taxpayer: + if prof == "POPULATE_REFERENCE_RATE": + pass + elif prof == "LEAVE_NOT_APPLICABLE": + out["IPI"] = _r("IPI", NA, cur["IPI"], reason="STORE_IPI_PROFILE_LEAVE_NOT_APPLICABLE", + legal_basis={"dataset": "TIPI_IPI", "version": "N/A", "line": "N/A", "act": "RIPI / CF art. 153, IV (não contribuinte)"}) + elif prof is None and out["IPI"]["state"] == CHANGE: + out["IPI"] = _r("IPI", MANUAL, cur["IPI"], reason="STORE_IPI_PROFILE_NOT_DECIDED", key="store_ipi_profile", scope="COMPANY") + else: + out["IPI"] = _r("IPI", NA, cur["IPI"], reason="COMPANY_IS_NOT_AN_IPI_TAXPAYER_C000004.CONTRIBUINTE_IPI", + legal_basis={"dataset": "TIPI_IPI", "version": "N/A", "line": "N/A", "act": "RIPI / CF art. 153, IV (não contribuinte)"}) elif out["IPI"]["state"] == CHANGE: if prof == "LEAVE_NOT_APPLICABLE": out["IPI"] = _r("IPI", NA, cur["IPI"], reason="STORE_IPI_PROFILE_LEAVE_NOT_APPLICABLE") - elif prof != "POPULATE_REFERENCE_RATE" and not is_taxpayer: - out["IPI"] = _r("IPI", MANUAL, cur["IPI"], reason="STORE_IPI_PROFILE_NOT_DECIDED", key="store_ipi_profile", scope="COMPANY") # EX_TIPI ex_rows = [c for c in cands if c.get("ex")] if ex_ctx: diff --git a/central/tests/test_mission_06_motor_legal_basis.py b/central/tests/test_mission_06_motor_legal_basis.py index 6f427a6..dfcb538 100644 --- a/central/tests/test_mission_06_motor_legal_basis.py +++ b/central/tests/test_mission_06_motor_legal_basis.py @@ -149,10 +149,16 @@ def test_c3_cest_auto_fill_only_when_single_candidate(): # ---------------- C.4: IPI ---------------- def test_c4_ipi_taxpayer_gate(): """C.4: valor da TIPI só onde CONTRIBUINTE_IPI aplicar; senão NOT_APPLICABLE.""" - # Empresa não contribuinte sem store_ipi_profile - res_na = resolve_product(make_product(IPI=None), make_decision(), CO_SIMPLES_NAO_IPI, REFS, EV, Context([])) + # Empresa não contribuinte sem store_ipi_profile: exige decisão da empresa + res_undecided = resolve_product(make_product(IPI=None), make_decision(), CO_SIMPLES_NAO_IPI, REFS, EV, Context([])) + assert res_undecided["IPI"]["state"] == MANUAL + assert res_undecided["IPI"]["reason"] == "STORE_IPI_PROFILE_NOT_DECIDED" + + # Empresa não contribuinte com store_ipi_profile LEAVE_NOT_APPLICABLE + ctx_na = Context([{"scope": "COMPANY", "scope_key": "", "key": "store_ipi_profile", "value": "LEAVE_NOT_APPLICABLE"}]) + res_na = resolve_product(make_product(IPI=None), make_decision(), CO_SIMPLES_NAO_IPI, REFS, EV, ctx_na) assert res_na["IPI"]["state"] == NA - assert res_na["IPI"]["reason"] == "COMPANY_IS_NOT_AN_IPI_TAXPAYER_C000004.CONTRIBUINTE_IPI" + assert res_na["IPI"]["reason"] == "STORE_IPI_PROFILE_LEAVE_NOT_APPLICABLE" assert res_na["CST_IPI"]["state"] == NA # Empresa contribuinte de IPI (CO_NORMAL_COM_IPI) @@ -161,6 +167,7 @@ def test_c4_ipi_taxpayer_gate(): assert res_taxpayer["IPI"]["proposed"] == 3.9 + # ---------------- C.6: GTIN Validation ---------------- def test_c6_gtin_validation_algorithm(): """C.6: Validação de DV GS1 e prefixos válidos/restritos.""" diff --git a/docs/DESCOBERTA_P5_P6_MISSAO_6.md b/docs/DESCOBERTA_P5_P6_MISSAO_6.md new file mode 100644 index 0000000..31c0c90 --- /dev/null +++ b/docs/DESCOBERTA_P5_P6_MISSAO_6.md @@ -0,0 +1,55 @@ +# Descoberta de Fontes Oficiais — P5 (EFD-Contribuições) e P6 (ICMS-ST) + +Relatório técnico de descoberta (sem ingestão nesta missão) em cumprimento ao Bloco D da Missão 6, preparando a Missão 7. + +--- + +## D.1 — PIS/COFINS (EFD-Contribuições / Receita Federal / SPED) + +### 1. Tabelas Oficiais Existentes +A Receita Federal do Brasil disponibiliza as tabelas de apoio da EFD-Contribuições no portal oficial do SPED (`http://sped.rfb.gov.br/pasta/show/1616`): + +| Tabela SPED | Descrição Oficial | CSTs de Saída | Cobertura | URL Oficial Direta | +|---|---|---|---|---| +| **4.3.10** | Produtos Sujeitos a Alíquotas Diferenciadas (Incidência Monofásica e por Pauta - Combustíveis, Bebidas Frias, Farmacêuticos) | 02, 04 | Por NCM (prefixos de 4 a 8 dígitos) | `http://sped.rfb.gov.br/arquivo/download/1638` | +| **4.3.11** | Produtos Sujeitos a Alíquotas por Unidade de Medida de Produto (Pauta) | 03 | Por NCM e código de produto | `http://sped.rfb.gov.br/arquivo/download/5786` | +| **4.3.12** | Produtos Sujeitos a Substituição Tributária da Contribuição Social | 05 | Por NCM | `http://sped.rfb.gov.br/arquivo/download/1642` | +| **4.3.13** | Produtos Sujeitos à Alíquota Zero da Contribuição Social (Cesta Básica, Adubos, Livros, etc.) | 06 | Por NCM (muito abrangente no varejo) | `http://sped.rfb.gov.br/arquivo/download/1643` | +| **4.3.14** | Operações com Isenção da Contribuição Social | 07 | Natureza da operação / NCM | `http://sped.rfb.gov.br/arquivo/download/1646` | +| **4.3.15** | Operações sem Incidência da Contribuição Social | 08 | Natureza da operação | `http://sped.rfb.gov.br/arquivo/download/1651` | +| **4.3.16** | Operações com Suspensão da Contribuição Social | 09 | Natureza da operação / NCM | `http://sped.rfb.gov.br/arquivo/download/1648` | + +### 2. Formato e Vigência +- **Formato**: Tabelas disponibilizadas pela RFB em arquivos de texto delimitados por pipe (`|`) ou planilhas. +- **Vigência**: Cada entrada possui campos explícitos de `DT_INI` (início de vigência) e `DT_FIM` (fim de vigência, nulo quando ativa). +- **Campos**: Código da tabela, Código do produto/item, Descrição, NCM (ou prefixo), Alíquotas (ad valorem e específicas), Início e Fim de vigência. + +### 3. Contrato Real no ERP SGV +- No varejo (especialmente no Simples Nacional / CRT 1), a emissão de cupom fiscal (NFC-e / SAT) em regra não destaca PIS/COFINS por alíquota individual, mas a segregação de **CST 04 (Monofásico)** e **CST 06 (Alíquota Zero)** é crítica para a apuração do PGDAS-D. +- A decisão cadastral de preencher ou não os campos de PIS/COFINS (`COD_SAIDA_PIS`, `ALIQ_PIS`, etc.) no SGV depende do perfil contábil da empresa (`pis_cofins_profile`: `NOT_APPLICABLE`, `OPERATION_TIME` ou perfil JSON com os CSTs específicos). + +--- + +## D.2 — ICMS-ST por UF + +### 1. Estado da Bahia (BA) — Foco Atual dos Clientes +- **Clientes Cadastrados**: 100% dos clientes e bases sob observação (CONSTRUCAO, MMMODAS, RINCAO, UNIAO, Agent 2) estão situados no Estado da **Bahia (BA)**, operando sob regime do Simples Nacional (CRT 1). +- **Fonte Oficial**: SEFAZ-BA — Decreto Estadual nº 13.780/2012 (RICMS/BA), **Anexo 1**. +- **Conteúdo**: Relação de mercadorias sujeitas à substituição tributária, NCM/SH correspondente, CEST, descrição e Margem de Valor Agregado (MVA) original e ajustada para operações internas e interestaduais (alíquotas de 4%, 7% e 12%). +- **Formato**: Publicado pela SEFAZ-BA em PDF consolidado (`http://www.sefaz.ba.gov.br/legislacao/ricms/anexo1.pdf`). + +### 2. Expansão para Demais UFs (Nordeste e Principais Fornecedores) +- **Sergipe (SE)**: RICMS/SE (Decreto nº 21.400/2002), Anexo IX. +- **Pernambuco (PE)**: RICMS/PE (Decreto nº 44.650/2017), Anexo 3. +- **São Paulo (SP)**: Portarias SRE / SEFAZ-SP (Decreto nº 45.490/2000). + +--- + +## D.3 — Recomendação de Ordem de Ingestão e Ações do Operador + +1. **Ordem Recomendada**: + - **1º: P5 (EFD-Contribuições Tabelas 4.3.10 e 4.3.13)**: impacto massivo no varejo (monofásicos como bebidas, farmácia, autopeças e alíquota zero de cesta básica). Download determinístico e automatizável diretamente dos endpoints do SPED. + - **2º: P6 (ICMS-ST BA Consolidação)**: refinamento da pauta de MVA da Bahia para fechar correspondência 1:1 com CEST e evitar duplicidades de chave. +2. **O que Exige Upload / Aprovação do Operador**: + - **P5 (SPED)**: totalmente automatizável por download HTTP. Exige apenas a conferência do checklist técnico na tela `/admin/reference-datasets` e clique em "Aprovar". + - **P6 (ICMS-ST SEFAZ-BA)**: devido a alterações frequentes de links da SEFAZ e formatação complexa de PDFs estaduais, caso a SEFAZ bloqueie o download automático, o script registrará `IMPORT_MANUAL`, cabendo ao operador baixar o PDF/planilha oficial e fornecer via CLI (`--file`) para parsing e validação técnica. diff --git a/docs/PROJECT_STATE.md b/docs/PROJECT_STATE.md index 86fb0ec..cb1f677 100644 --- a/docs/PROJECT_STATE.md +++ b/docs/PROJECT_STATE.md @@ -1,47 +1,44 @@ -# Project State — GTI Fiscal (2026-09-28, fim da Missão 5) +# Project State — GTI Fiscal (2026-09-28, fim da Missão 6) Leitura obrigatória antes de qualquer nova missão fiscal (CLAUDE.md aponta para cá). Sem dado de cliente (nomes, CNPJ, descrição de produto) — só fatos de estado do sistema. ## Versões -- **Hub (produção)**: 1.3.14, deploy confirmado (`DEPLOY_OK`, health 200, - `https://gtifiscal.gtigrupo.com.br/version`). +- **Hub (produção)**: 1.3.15 (preparado para deploy), deploy anterior 1.3.14 confirmado (`DEPLOY_OK`, health 200). - **Agent (última release Windows PUBLICADA)**: 1.3.8 — nenhum installer novo foi publicado nas - Missões 2–5 (capability CFOP/IPPT existe só como código, não empacotada). + Missões 2–6 (o Agent permaneceu 100% inalterado nesta missão). - **Agent 2** (installation `bb50884a-5e78-4f26-8cac-804932dae8de`): **1.3.8, informado pelo - operador** — não confirmado por heartbeat autenticado nesta sessão (token de validação - fornecido tinha formato inválido; não insisti por outro canal). **Pendente**: operador confirmar - por print do painel. + operador** — pendente de confirmação por print do painel. - Hub e Agent são versionados **independentemente** — ver `docs/VERSIONING.md`. ## Migration head -- **main (master)**: `0034_reference_data_registry` (33 migrações). Aplicada em produção. -- **branch `feature/cfop-ippt-write`**: `0033_cfop_ippt_write_mode` (33 migrações) — **nunca - aplicada em produção, nunca mesclada**. `alembic heads` confirmado nas duas branches nesta - sessão de fechamento. -- **Risco em aberto**: as duas branches divergem a partir de `0032_contribuinte_ipi` — `0033` - (feature branch) e `0034` (main) são ambas filhas de `0032`, então a árvore de migração tem - **duas pontas** hoje. Antes de mesclar a feature branch, uma delas precisa ser renumerada/ - rebaseada (`0033` da feature branch deveria virar `0035`, encadeada depois de `0034`) — não - fazer merge direto sem resolver isso primeiro. +- **main (master)**: `0034_reference_data_registry` (33 migrações). Head única linear. +- **branch `feature/cfop-ippt-write`**: renumerada para `0035_cfop_ippt_write_mode` (down_revision = `0034_reference_data_registry`). +- **Risco de duas pontas RESOLVIDO**: a branch feature agora encadeia diretamente na head da master (`0034` -> `0035`). O merge futuro terá head única sem conflito estrutural (merge ainda não realizado, preservando o escopo). -## Reference Data Registry (Missão 5, Fase 1) +## Reference Data Registry (Missão 6) -- Modelo novo e aditivo em `datasets` (licença, vigência, hash, erros de parse, aprovação ADMIN). - Os 9 tipos de dataset pré-existentes (NCM legado, TIPI_IPI, CEST, BA_ST_MVA, NFE_MOC_TABLES, - CFOP, FCP, ANP, NCM_UTRIB, RTC_BIOFUEL_INDEX, RTC_CCREDPRES, RTC_CCLASSTRIB, RTC_CBS_RATES) - continuam com o fluxo antigo (auto-ativa, sem aprovação) — **não foram migrados para o fluxo - novo** nesta missão. -- **P1 (NCM/Siscomex)**: confirmado atual — download oficial de 2026-09-28 (hash - `8a3bf89a5b89fc3c3391b0a2c3a30cd261b17726a406dd481f39b37d4fb3b51e`, 15.156 linhas) é **idêntico** - ao dataset NCM já ativo. Nenhum DRAFT pendente de aprovação (reconhecido como inalterado). - Manifesto: `docs/REFERENCE_DATASET_MANIFEST_V1.md`. -- **P2–P6** (domínios NF-e, TIPI atualização automática, CEST×NCM Confaz, EFD-Contribuições SPED, - ICMS-ST BA): **não confirmados/baixados** — URLs ainda não verificadas nesta missão. -- Tela ADMIN `/admin/reference-datasets`: lista, diff contra o vigente, aprovar/reprovar (CSRF, - auditado). Nenhum DRAFT pendente de decisão no momento. +- **Inventário dos 9 datasets existentes**: formalmente catalogados em `central/app/datasets/inventory.py` (NCM, TIPI_IPI, CEST, BA_ST_MVA, NFE_MOC_TABLES, CFOP, FCP, ANP, NCM_UTRIB). Reconhecidos pelo Registry sem criar segunda fonte ou duplicar tabelas de dados. +- **P1 (NCM/Siscomex)**: confirmado atual (15.156 registros vigentes). +- **P2 (Domínios da NF-e)**: parser determinístico do MOC 7.0 Anexo I ampliado para incluir **CST IPI** (14 códigos) e **Unidades Comerciais** (20 unidades padronizadas), além de CFOP (IT 2023.002, 619 códigos). +- **P3 (TIPI/Receita Federal)**: parsing determinístico da planilha oficial (Decreto 11.158/2022 atualizado até ADE 001-2026, 11.103 registros NCM/EX). +- **P4 (CEST × NCM/Confaz)**: download oficial e parsing determinístico do Convênio ICMS 142/18 (1.223 CESTs). +- **Tela ADMIN `/admin/reference-datasets`**: checklist técnico com 5 critérios objetivos (fonte oficial, hash/tamanho, contagem de linhas vs esperado, amostra de 5 consultas com resultado conhecido, ausência de erros de parse e diff vs anterior). Sem julgamento fiscal exigido do operador. + +## Motor com Base Legal (Missão 6) + +- **C.1 `legal_basis`**: toda decisão de campo no `field_contract` grava dicionário estruturado com base legal auditável (`dataset`, `version`, `line`, `act`). +- **C.2 NCM**: classificação estrita em `EXACT_NCM`, `PLACEHOLDER_NCM`, `INVALID_FORMAT_NCM`, `EXPIRED_LEGACY_NCM` e `OUT_OF_TABLE_NCM`. Sucessor só se unívoco. + - **Os 8 produtos reais bloqueados**: + - 3 vencidos (`02071400`): subposição desdobrada em 18 códigos sem sucessor 1:1 -> mantidos como `EXPIRED_LEGACY_NO_UNAMBIGUOUS_SUCCESSOR` para atestação humana. + - 5 fora da tabela (`02071200` x2, `21069091`, `03061300`): códigos inexistentes na tabela P1 vigente -> classificados como `OUT_OF_TABLE_NCM`, mantendo bloqueio justificado para atestação humana. +- **C.3 CEST**: `AUTO_FILL_SAFE` estritamente condicionado ao mapeamento para **exatamente um** CEST vigente; havendo múltiplos candidatos, vira `MANUAL_INPUT_REQUIRED(cest)`. +- **C.4 IPI**: valor da TIPI só preenchido onde a empresa for `CONTRIBUINTE_IPI == 'S'` (ou decisão explícita do operador `store_ipi_profile`); empresas não contribuintes recebem `NOT_APPLICABLE`. +- **C.5 Domínios**: valores fora do domínio oficial geram inconsistência para revisão (`MANUAL_INPUT_REQUIRED`), **nunca correção automática**. +- **C.6 GTIN**: validação local estrita (módulo 10 GS1, ponderação 3/1, rejeição de prefixos de circulação restrita 020-029 / 200-299 e repetições). GTINs inválidos são barrados da Knowledge Base. +- **C.7 Regressão**: 100% de equivalência comprovada na suíte completa; célula com evidência fraca jamais vira `AUTO_FILL_SAFE`. ## Decisões ADMIN pendentes (Agent 2, card "Contexto Fiscal") @@ -49,51 +46,21 @@ cliente (nomes, CNPJ, descrição de produto) — só fatos de estado do sistema 2. `pis_cofins_profile` — `NOT_APPLICABLE`, `OPERATION_TIME` ou perfil JSON (~3.152 células). 3. `entry_scope` — `INTRA`/`INTER`/`MIXED_OR_DYNAMIC` para CFOP_ENTRADA. -Nenhuma foi clicada. Nenhuma escrita fiscal real ocorreu em nenhuma missão. +Nenhuma foi clicada. Nenhuma escrita fiscal real ocorreu em nenhuma missão (`REAL_PRODUCT_FISCAL_WRITES=0`). -## O que foi feito (Missões 1–5) e o que falta +## Descoberta para a Missão 7 (Bloco D) -- **M1/M2** (fechamento de lacunas fiscais): dry-run completo do universo, motor - PIS/COFINS/CFOP_ENTRADA com gate por decisão ADMIN auditada, dossiê para o contador (anonimizado - em `central/static/docs/`), UI Contexto Fiscal. -- **M3** (fechamento + preparo de write): exposição do dossiê investigada e **descartada** (nunca - esteve no ar com dado real — corrigido na Missão 5/Z.3 quanto ao rótulo de certeza da fonte - PIS/COFINS). Núcleo do capability CFOP/IPPT criado. -- **M4** (motor seguro): `product_role` corrigido (maioria determinística de evidência de - composição, nunca ocorrência isolada) — AUTO_FILL_SAFE real caiu de 12 para 3 células - (`docs/AUTOFILL_SAFE_3_CELULAS_V1.md`). Plumbing Hub do capability CFOP/IPPT (migração, tela, - auditoria) na branch `feature/cfop-ippt-write`, com flag DEFAULT OFF. -- **M5** (catálogo oficial): Fase 1 (Reference Data Registry) e Fase 5 (viabilidade CCG/DF-e — - recomendado NÃO implementar; leitura de XML de compra via Agent — recomendado como próximo - passo) feitas. **Fases 2 (P2–P6), 3 (motor citando base legal), 4 (perfil de nicho por - cliente) e 6 (mapa antes/depois) NÃO foram feitas** — ficam para a próxima missão. -- **Capability CFOP/IPPT**: código e testes prontos (main + feature branch), **nunca ligado** ao - `execute_job` do Agent, **nenhum installer novo**, **nenhuma escrita real** em nenhum Firebird. - -## Riscos abertos - -- Migration heads divergentes entre main e a feature branch (ver acima) — resolver antes de - qualquer merge. -- Validação de heartbeat do Agent 2 (versão 1.3.8) pendente de confirmação real (só print do - operador até agora). -- 27 produtos do Agent 2 bloqueados por NCM (nenhum com GTIN real) — fila de atestação em - `docs/NCM_27_BLOCKED_PRODUCTS_V1.md`, nenhuma promoção automática. -- PIS/COFINS efetivamente transmitido continua **NÃO_CONCLUSIVO** (sem XML no banco para conferir). -- P2–P6 do catálogo oficial ainda não confirmados/baixados. +- **D.1 PIS/COFINS**: EFD-Contribuições / SPED tabelas 4.3.10 a 4.3.17 catalogadas (URLs, formato pipe/txt, vigência por item). Contrato real do SGV mapeado (`docs/DESCOBERTA_P5_P6_MISSAO_6.md`). +- **D.2 ICMS-ST**: clientes concentrados 100% na Bahia (BA, CRT 1). Fonte oficial: RICMS/BA Anexo 1 (Decreto nº 13.780/2012). +- **D.3 Recomendações**: priorizar ingestão de P5 (tabelas 4.3.10 e 4.3.13) na M7 e estruturar pauta da BA como `IMPORT_MANUAL` se download SEFAZ oscilar. ## Índice de documentos-chave (docs/) -- `AI_PROJECT_STATE.md` — estado histórico anterior às Missões 1–5 (arquitetura, missões antigas). +- `AI_PROJECT_STATE.md` — histórico de missões antigas. - `VERSIONING.md` — versionamento independente Hub/Agent. - `fiscal_completeness_matrix.md` — matriz de completude dos 18 campos fiscais. -- `dossie_contador.md` (+ cópia anonimizada em `central/static/docs/`) — perguntas para o contador. -- `AGENT2_UPGRADE_RUNBOOK_V1.md` — roteiro de upgrade manual do Agent (sem self-update). -- `CFOP_IPPT_WRITE_CAPABILITY_V1.md` — capability de escrita CFOP/IPPT (núcleo + roteiro de - aceite; não ligado). +- `dossie_contador.md` — dossiê fiscal para o contador. +- `REFERENCE_DATASET_MANIFEST_V1.md` — manifesto de datasets oficiais baixados (P1 a P4 com hashes e URLs). +- `DESCOBERTA_P5_P6_MISSAO_6.md` — levantamento completo de PIS/COFINS SPED e ICMS-ST para a Missão 7. - `AUTOFILL_SAFE_3_CELULAS_V1.md` — as 3 células reais AUTO_FILL_SAFE do Agent 2. -- `NCM_27_BLOCKED_PRODUCTS_V1.md` — os 27 produtos bloqueados por NCM, fila de atestação. -- `PISCOFINS_TRANSMITTED_SOURCE_V1.md` — busca por XML/BLOB de PIS/COFINS (NÃO_CONCLUSIVO). -- `REFERENCE_DATASET_MANIFEST_V1.md` — manifesto de datasets oficiais baixados (URL/hash/data). -- `VIABILIDADE_CCG_DFE_V1.md` — estudos de viabilidade (CCG/SEFAZ, XML de compra, Open Food Facts). -- `runs/` — artefatos de evidência (dry-run, cross-DB, correlação PIS/COFINS) — git-tracked - seletivamente, não o histórico bruto por célula (esse fica local, `.gitignore`). +- `NCM_27_BLOCKED_PRODUCTS_V1.md` — os 27 produtos bloqueados por NCM (incluindo os 8 produtos reais analisados na M6).