diff --git a/agent/pyproject.toml b/agent/pyproject.toml index 89c4abd..bb5589c 100644 --- a/agent/pyproject.toml +++ b/agent/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "gti-fiscal-agent" -version = "1.2.0" +version = "1.2.1" requires-python = ">=3.10" dependencies = ["httpx>=0.27,<1"] diff --git a/agent/scripts/run_agent_service.py b/agent/scripts/run_agent_service.py index 6f1c4cd..b9edc72 100644 --- a/agent/scripts/run_agent_service.py +++ b/agent/scripts/run_agent_service.py @@ -106,7 +106,7 @@ class Config: self.poll_interval_seconds = float(env.get("POLL_INTERVAL_SECONDS", "5")) # RTC auto-apply is a SEPARATE switch (default OFF): FIREBIRD_WRITES alone never lets the Agent fill cClassTrib. self.rtc_auto_apply_max_per_job = int(env.get("RTC_AUTO_APPLY_MAX_PER_JOB", str(_rtc_apply.DEFAULT_MAX_PER_JOB))) - self.agent_version = env.get("AGENT_VERSION", "1.2.0") + self.agent_version = env.get("AGENT_VERSION", "1.2.1") self.schema_fingerprint = env.get("SCHEMA_FINGERPRINT", REFERENCE_SCHEMA_V1) self.state_db = env.get("AGENT_STATE_DB", str(AGENT_ROOT / "agent_state.sqlite")) # Pilot write authorization: both must be explicitly set by the installer for @@ -212,6 +212,31 @@ def _fiscal_blocked_products(products, findings): return out +def _fetch_authorizations(config, job): + """Current central authorization for this installation, straight from the Hub (authenticated). Tests replace this; production never trusts the job's copy for the write itself.""" + return HubClient(config.hub_url, config.agent_token).authorizations() + + +def _make_authorizer(config, job, mode, approved_at_claim): + """Re-checks the Hub right before writing (cached for a few seconds): if the mode changed, the product lost its approval, or the Hub cannot be reached, nothing is written (fail closed).""" + state = {"at": None, "auth": None} + + def authorize(code): + now = time.monotonic() + if state["auth"] is None or now - state["at"] > 3.0: + try: + state["auth"], state["at"] = _fetch_authorizations(config, job) or {}, now + except Exception: # noqa: BLE001 - unverifiable authorization is not authorization + return "AUTHORIZATION_UNVERIFIABLE" + fresh = state["auth"] + if fresh.get("rtc_write_mode") != mode: + return "AUTHORIZATION_CHANGED" + if mode == "APPROVAL_REQUIRED" and str(code) not in {str(c) for c in fresh.get("rtc_approved_codes") or []}: + return "AUTHORIZATION_CHANGED" + return None + return authorize + + def _rtc_auto_apply(env, config, job, products, fiscal, company): """Preview (always) and, only when the Hub-delivered mode permits it, fill CCLASSTRIB for products whose class is PROVEN by an AUTO_APPLY_SAFE rule; also executes Hub-requested rollbacks. Authorization arrives ONLY inside the authenticated job (`authorizations`); there is no local switch. Never raises for a single product.""" @@ -244,7 +269,7 @@ def _rtc_auto_apply(env, config, job, products, fiscal, company): if rollbacks: summary["rollbacks"] = _rtc_apply.rollback_records(connection, rollbacks, now=now, job_id=job.get("job_id"))["rollbacks"] if gate["allowed"] and wanted: - outcome = _rtc_apply.apply_candidates(connection, wanted, company=company or {}, decision={"local_catalog_hash": fiscal["context"].get("local_catalog_hash"), "origin": f"HUB_MODE:{mode}"}, now=now, job_id=job.get("job_id")) + outcome = _rtc_apply.apply_candidates(connection, wanted, company=company or {}, decision={"local_catalog_hash": fiscal["context"].get("local_catalog_hash"), "origin": f"HUB_MODE:{mode}"}, now=now, job_id=job.get("job_id"), authorize=_make_authorizer(config, job, mode, approved)) summary.update({k: outcome[k] for k in ("applied", "aborted", "aborted_reasons", "write_attempts", "write_successes")}) finally: connection.close() @@ -323,7 +348,7 @@ def execute_job(job, config, executor, state, env): "fiscal_context": fiscal_context, "rtc_auto_apply": rtc_apply, "fiscal_mode": getattr(config, "fiscal_mode", None), - "release_version": env.get("AGENT_VERSION") or "1.2.0", + "release_version": env.get("AGENT_VERSION") or "1.2.1", "products_total": len(products), "products_changed": len(to_process), "products_processed": summary["processed"], @@ -481,7 +506,7 @@ def run(config, env, *, max_iterations=None, stopper=None): def enforce_startup_preflight(env): """Full read-only preflight at startup (Hub, auth, Firebird, capabilities, company context, guards). Fail closed.""" from gti_fiscal_agent.preflight import run_preflight - report = run_preflight(env, agent_version=env.get("AGENT_VERSION") or "1.2.0") + report = run_preflight(env, agent_version=env.get("AGENT_VERSION") or "1.2.1") logger.info("startup preflight: %s", json.dumps({k: report[k] for k in ("PREFLIGHT", "blockers", "fiscal_mode", "effective_firebird_writes")}, ensure_ascii=False)) print(json.dumps({"PREFLIGHT": report["PREFLIGHT"], "blockers": report["blockers"]}, ensure_ascii=False)) if report["PREFLIGHT"] != "PASS": diff --git a/agent/src/gti_fiscal_agent/client.py b/agent/src/gti_fiscal_agent/client.py index 4ca4180..1a98259 100644 --- a/agent/src/gti_fiscal_agent/client.py +++ b/agent/src/gti_fiscal_agent/client.py @@ -21,6 +21,7 @@ class HubClient: response = httpx.get(f"{self.url}{path}", headers=self._headers(), timeout=30) response.raise_for_status(); return response.json() def identity(self): return self.get_json("/v1/agents/me/identity") + def authorizations(self): return self.get_json("/v1/agents/me/authorizations") def health(self): response = httpx.get(f"{self.url}/health", timeout=10) return response.status_code == 200 diff --git a/agent/src/gti_fiscal_agent/preflight.py b/agent/src/gti_fiscal_agent/preflight.py index ebacaa7..63247bd 100644 --- a/agent/src/gti_fiscal_agent/preflight.py +++ b/agent/src/gti_fiscal_agent/preflight.py @@ -9,7 +9,7 @@ import os import sqlite3 from pathlib import Path -AGENT_VERSION_DEFAULT = "1.2.0" +AGENT_VERSION_DEFAULT = "1.2.1" REQUIRED_ENV = ("GTI_HUB_URL", "AGENT_TOKEN", "FIREBIRD_DATABASE_PATH", "FB_USER", "FB_PASSWORD") REQUIRED_CAPABILITIES = ("supports_ncm", "supports_ipi", "supports_cest") FISCAL_MODES = ("DRY_RUN", "AUTO_APPLY") diff --git a/agent/src/gti_fiscal_agent/rtc_auto_apply.py b/agent/src/gti_fiscal_agent/rtc_auto_apply.py index 57e3f8f..6f9cfdf 100644 --- a/agent/src/gti_fiscal_agent/rtc_auto_apply.py +++ b/agent/src/gti_fiscal_agent/rtc_auto_apply.py @@ -147,10 +147,18 @@ def apply_candidate(conn, candidate: dict, *, company: dict, decision: dict, now raise -def apply_candidates(conn, candidates: list[dict], *, company: dict, decision: dict, now: str, job_id=None, today: date | None = None) -> dict: - """Applies each candidate independently; a failure or an abort never stops the rest and never leaves a partial change.""" +def apply_candidates(conn, candidates: list[dict], *, company: dict, decision: dict, now: str, job_id=None, today: date | None = None, authorize=None) -> dict: + """Applies each candidate independently; a failure or an abort never stops the rest and never leaves a partial change. + `authorize(product_code)` (optional) re-asks the Hub, right before each UPDATE, whether the central authorization still permits it: it returns None to proceed or a + reason (AUTHORIZATION_CHANGED / AUTHORIZATION_UNVERIFIABLE) to skip the product with zero writes.""" applied, aborted, reasons = [], [], {} for candidate in candidates: + if authorize is not None: + denied = authorize(candidate["product_code"]) + if denied: + aborted.append({"outcome": "ABORTED", "product_code": candidate["product_code"], "field": "CCLASSTRIB", "reason": denied, "rule_id": candidate["rule_id"], "job_id": job_id, "timestamp": now, "action": "APPLY", "authorization_origin": decision.get("origin")}) + reasons[denied] = reasons.get(denied, 0) + 1 + continue try: applied.append(apply_candidate(conn, candidate, company=company, decision=decision, now=now, job_id=job_id, today=today)) except RtcApplyAborted as stop: diff --git a/agent/tests/test_rtc_auto_apply.py b/agent/tests/test_rtc_auto_apply.py index e8f5dcf..1261737 100644 --- a/agent/tests/test_rtc_auto_apply.py +++ b/agent/tests/test_rtc_auto_apply.py @@ -254,6 +254,16 @@ def test_catalog_hash_is_recorded_for_audit(): # ---------------------------------------------------------------- job integration (gates) +import pytest # noqa: E402 + + +@pytest.fixture(autouse=True) +def _hub_echoes_the_job_authorization(monkeypatch): + """By default the Hub still says what the job said; individual tests change that to prove the pre-write re-check.""" + from test_run_agent_service import service + monkeypatch.setattr(service, "_fetch_authorizations", lambda config, job: dict(job.get("authorizations") or {})) + + def _service(): from test_run_agent_service import _config, service return service, _config @@ -399,3 +409,31 @@ def test_connection_is_closed_even_when_a_product_fails_mid_batch(monkeypatch): monkeypatch.setattr(service, "open_write_connection", lambda env, path: conn) summary = service._rtc_auto_apply({}, _config(), {"job_id": 1, "authorizations": {"rtc_write_mode": "ENABLED"}}, _products_of(db), fiscal, NORMAL) assert closed == [True] and summary["write_successes"] == 2 and summary["aborted_reasons"] + + +def test_authorization_revoked_after_the_job_was_claimed_means_zero_writes(monkeypatch): + service, _config = _service() + db = FakeFirebird(PRODUCTS) + fiscal = _fiscal_for(db) + monkeypatch.setattr(service, "open_write_connection", lambda env, path: _Closeable(db)) + monkeypatch.setattr(service, "_fetch_authorizations", lambda config, job: {"rtc_write_mode": "DISABLED"}) # operator switched it off while the job was running + summary = service._rtc_auto_apply({}, _config(), {"job_id": 5, "authorizations": {"rtc_write_mode": "ENABLED"}}, _products_of(db), fiscal, NORMAL) + assert summary["write_successes"] == 0 and summary["aborted_reasons"] == {"AUTHORIZATION_CHANGED": 3} + assert [db.products[c]["CCLASSTRIB"] for c in ("000001", "000002", "000003")] == [None, None, None] + + +def test_unreachable_hub_is_not_authorization_and_approval_removal_is_honoured(monkeypatch): + service, _config = _service() + db = FakeFirebird(PRODUCTS) + fiscal = _fiscal_for(db) + monkeypatch.setattr(service, "open_write_connection", lambda env, path: _Closeable(db)) + + def down(config, job): + raise ConnectionError("hub down") + + monkeypatch.setattr(service, "_fetch_authorizations", down) + summary = service._rtc_auto_apply({}, _config(), {"job_id": 6, "authorizations": {"rtc_write_mode": "ENABLED"}}, _products_of(db), fiscal, NORMAL) + assert summary["write_successes"] == 0 and summary["aborted_reasons"] == {"AUTHORIZATION_UNVERIFIABLE": 3} + monkeypatch.setattr(service, "_fetch_authorizations", lambda config, job: {"rtc_write_mode": "APPROVAL_REQUIRED", "rtc_approved_codes": ["000001"]}) # 000002 was un-approved meanwhile + summary = service._rtc_auto_apply({}, _config(), {"job_id": 7, "authorizations": {"rtc_write_mode": "APPROVAL_REQUIRED", "rtc_approved_codes": ["000001", "000002"]}}, _products_of(db), fiscal, NORMAL) + assert summary["write_successes"] == 1 and db.products["000001"]["CCLASSTRIB"] == "200003" and db.products["000002"]["CCLASSTRIB"] is None diff --git a/central/app/api.py b/central/app/api.py index edea918..0188876 100644 --- a/central/app/api.py +++ b/central/app/api.py @@ -252,6 +252,16 @@ def router(session_factory, bootstrap_token): finally: session.close() + @routes.get("/agents/me/authorizations") + def agent_authorizations(identity=Depends(principal)): + """Current central RTC write authorization of the authenticated Agent's own installation (read by the Agent right before it writes). Nothing else is exposed.""" + session, agent = identity + try: + installation = session.scalar(select(Installation).where(Installation.agent_id == agent.id)) + return job_authorizations(session, installation) if installation is not None else {"rtc_write_mode": "DISABLED"} + finally: + session.close() + @routes.get("/agents/me") def agent_status(identity=Depends(principal)): session, agent = identity diff --git a/central/app/panel_presentation.py b/central/app/panel_presentation.py index fe2d2d9..2a1d6fd 100644 --- a/central/app/panel_presentation.py +++ b/central/app/panel_presentation.py @@ -121,7 +121,7 @@ def job_kind_label(value): _FISCAL_LABELS = { - "CCLASSTRIB_MISSING": "cClassTrib ausente", "CCLASSTRIB_MISSING_UNRESOLVED": "cClassTrib não determinado", "CCLASSTRIB_AMBIGUOUS": "cClassTrib ambíguo", "CCLASSTRIB_CONFLICT": "cClassTrib conflitante", + "CCLASSTRIB_MISSING": "cClassTrib ausente", "CCLASSTRIB_MISSING_UNRESOLVED": "cClassTrib não determinado", "CCLASSTRIB_AMBIGUOUS": "cClassTrib ambíguo", "CCLASSTRIB_CONFLICT": "cClassTrib existente diverge da classificação proposta", "CCLASSTRIB_OFFICIAL_MISMATCH": "cClassTrib diverge da tabela oficial", "RTC_LOCAL_CATALOG_INCOMPATIBLE": "Catálogo RTC incompatível", "RTC_RULE_EVIDENCE_MISSING": "Regra fiscal insuficiente", "CCLASSTRIB_INVALID_FORMAT": "cClassTrib com formato inválido", "CCLASSTRIB_NOT_IN_CATALOG": "cClassTrib fora do catálogo local", "RTC_CST_MISSING": "CST IBS/CBS ausente no catálogo", "RTC_CATALOG_INVALID": "Catálogo RTC local inválido", "PIS_CST_MISSING": "CST PIS ausente", "PIS_CST_INVALID": "CST PIS inválido", "PIS_RATE_MISSING": "Alíquota PIS ausente", "PIS_RATE_INVALID": "Alíquota PIS inválida", "PIS_CST_INCIDENCE_MISMATCH": "CST PIS incompatível com a incidência", @@ -137,7 +137,7 @@ def blocker_type_label(value): _REASON_LABELS = { "INVALID_NCM": "NCM inválido", "LEGACY_NCM": "NCM legado", "LEGACY_NCM_NO_AUTOMATIC_SUCCESSOR": "NCM legado sem sucessor automático", "LEGACY_NCM_REVIEW": "NCM legado em revisão", "LEGACY_NCM_REVIEW_REQUIRED": "NCM legado exige revisão", "LEGACY_OR_INVALID_NCM": "NCM legado ou inválido", - "INSUFFICIENT_EVIDENCE": "Evidência insuficiente", "MISSING_EVIDENCE": "Evidência fiscal ausente", "BLOCKED_MISSING_EVIDENCE": "Evidência fiscal ausente", + "INSUFFICIENT_EVIDENCE": "Evidência fiscal insuficiente", "MISSING_EVIDENCE": "Evidência fiscal ausente", "BLOCKED_MISSING_EVIDENCE": "Evidência fiscal ausente", "MISSING_CONTEXT": "Contexto fiscal ausente", "NO_EVIDENCE": "Sem evidência", "MISSING_PRODUCT_ORIGIN": "Origem do produto ausente", "MISSING_PROFILE": "Perfil fiscal ausente", "MISSING_ST_DETERMINATION": "Determinação de ST ausente", "NO_IPI_DECISION": "Sem decisão de IPI", "NO_NUMERIC_VALUE": "Sem valor numérico", "CHANGE_REQUIRED": "Alteração necessária", "SAME_VALUE": "Valor já correto", "AMBIGUOUS": "Ambíguo", @@ -207,3 +207,37 @@ def _rtc_apply_view(report, mode): report = report or {} return {"mode": mode, "state": RTC_MODE_LABELS[mode], "explanation": RTC_MODE_EXPLANATION, "applied_last_job": len(report.get("applied") or []), "aborted_last_job": len(report.get("aborted") or []), "ready_total": report.get("ready_total"), "capability": report.get("capability"), "authorized": mode in ("ENABLED", "APPROVAL_REQUIRED")} + + +# ---- cClassTrib control page (Agent -> cClassTrib): candidate status, audit outcome/reason, rule and catalog wording ---- +_CANDIDATE_STATUS = {"PENDING": "Pendente", "APPROVED": "Aprovado", "REJECTED": "Rejeitado", "APPLIED": "Aplicado", "STALE": "Obsoleto"} +_AUDIT_OUTCOME = {"APPLIED": "Aplicado", "ROLLED_BACK": "Revertido", "ABORTED": "Interrompido sem escrever", "FAILED": "Falha técnica", "ROLLBACK_REQUESTED": "Reversão solicitada"} +_RULE_LABELS = {"RTC-R3": "Anexo com classe única (RTC-R3)", "RTC-R4": "Sugestão sem autorização de preenchimento (RTC-R4)", "RTC-A3": "Bloqueada por evidência (RTC-A3)", "RTC-G2": "Bloqueada por evidência (RTC-G2)"} +_CATALOG_STATE = {"MATCH_SAFE": "Compatível com a tabela oficial", "MATCH_WITH_NON_MATERIAL_DIFFERENCE": "Diferença sem impacto (não autoriza escrita)", "MISMATCH": "Diverge da tabela oficial", + "EXPIRED": "Classe oficial vencida", "MISSING_LOCAL": "Classe oficial ausente no catálogo local do SGV", "MISSING_OFFICIAL": "Classe local ausente na tabela oficial"} +_ABORT_REASONS = {"VALUE_ALREADY_SET_NEVER_OVERWRITTEN": "cClassTrib existente diverge da classificação proposta", "NO_WRITE_REQUIRED": "Já preenchido com o valor proposto", + "RTC_NO_LONGER_ENABLED": "Reforma tributária desligada no ERP", "RTC_CATALOG_INVALID": "Catálogo RTC local inválido", "LOCAL_CATALOG_CHANGED_SINCE_DECISION": "Catálogo local mudou desde a decisão", + "COMPANY_CONTEXT_CHANGED": "Contexto da empresa mudou", "REGIME_NOT_NORMAL": "Regime sem regra segura de preenchimento", "PRODUCT_CHANGED_NCM": "NCM do produto mudou", + "PRODUCT_CHANGED_SINCE_DECISION": "Produto mudou desde a decisão", "DECISION_CHANGED": "A classificação proposta mudou", "PRODUCT_NOT_FOUND": "Produto não encontrado", + "PRODUCT_ROW_NOT_UNIQUE": "Código de produto duplicado", "UPDATE_ROWCOUNT_NOT_ONE": "Escrita recusada (contagem inesperada)", "ROLLBACK_CONFLICT_VALUE_CHANGED": "Valor alterado depois da escrita: reversão recusada", + "ALREADY_EMPTY": "Já estava vazio", "ROLLBACK_REQUEST_INVALID": "Pedido de reversão inválido", "TECHNICAL_FAILURE": "Falha técnica", "AUTHORIZATION_CHANGED": "Autorização central mudou antes da escrita", "AUTHORIZATION_UNVERIFIABLE": "Autorização central não pôde ser confirmada"} + + +def candidate_status_label(value): + return _human_label(value, _CANDIDATE_STATUS) + + +def audit_outcome_label(value): + return _human_label(value, _AUDIT_OUTCOME) + + +def rtc_rule_label(value): + return _human_label(value, _RULE_LABELS) + + +def catalog_state_label(value): + return _human_label(value, _CATALOG_STATE) + + +def abort_reason_label(value): + return _human_label(value, _ABORT_REASONS) if value else "" diff --git a/central/app/version.py b/central/app/version.py index 827ccff..ee63da3 100644 --- a/central/app/version.py +++ b/central/app/version.py @@ -4,5 +4,5 @@ kept identical to this) and what an AgentRelease row's `version` column holds once published — never a second, independent version number. Fiscal semantics are versioned separately (ENGINE_VERSION/DECISION_VERSION in classification.py, DECISION_ENGINE_VERSION etc.) and are NOT changed by a release bump.""" -GTI_FISCAL_VERSION = "1.2.0" +GTI_FISCAL_VERSION = "1.2.1" API_COMPAT_MAJOR_MINOR = "1.0" # an Agent 1.0.x/1.1.x talks to any Hub 1.0.x diff --git a/central/app/web.py b/central/app/web.py index ff3cafd..b666cd3 100644 --- a/central/app/web.py +++ b/central/app/web.py @@ -15,7 +15,7 @@ from .config import settings from .blocker_resolution import BlockerResolutionUnavailable, _company_key, resolve_blocker_with_context from .context_keys import ALLOWED_KEYS, ENUMS from .installation_identity import reference_agent_version -from .panel_presentation import RTC_MODE_EXPLANATION, RTC_MODE_LABELS, job_kind_label, job_status_label, rtc_status_view +from .panel_presentation import RTC_MODE_EXPLANATION, RTC_MODE_LABELS, abort_reason_label, audit_outcome_label, candidate_status_label, catalog_state_label, job_kind_label, job_status_label, rtc_rule_label, rtc_status_view from .control_plane import blocker_detail, blocker_filter_summary, dashboard_summary, installation_view, jobs_status_summary, list_blockers, list_installations, list_jobs, list_panel_events from .human_auth import create_session, current_session, require_csrf, verify_password from .panel_presentation import format_ui_datetime @@ -344,7 +344,8 @@ def router(session_factory): audits = list(session.scalars(select(RtcWriteAudit).where(RtcWriteAudit.installation_id == installation.id, RtcWriteAudit.outcome.in_(("APPLIED", "ROLLED_BACK"))).order_by(RtcWriteAudit.id.desc()).limit(25))) ops = _ops_view(session, installation, agent) return render(request, "rtc_control.html", {"agent_id": agent_id, "installation": installation, "mode": installation.rtc_write_mode, "modes": RTC_MODE_LABELS, "explanation": RTC_MODE_EXPLANATION, "ops": ops, - "rows": rows, "counts": counts, "status": status, "page": page, "pages": max(1, -(-total // size)), "total": total, "audits": audits}) + "rows": rows, "counts": counts, "status": status, "page": page, "pages": max(1, -(-total // size)), "total": total, "audits": audits, + "L": {"status": candidate_status_label, "outcome": audit_outcome_label, "reason": abort_reason_label, "rule": rtc_rule_label, "catalog": catalog_state_label}}) finally: session.close() @routes.post("/agents/{agent_id}/rtc-mode") diff --git a/central/pyproject.toml b/central/pyproject.toml index cc25c03..27bcce7 100644 --- a/central/pyproject.toml +++ b/central/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "gti-fiscal-hub" -version = "1.2.0" +version = "1.2.1" requires-python = ">=3.10" dependencies = [ "fastapi>=0.115,<1", diff --git a/central/templates/rtc_control.html b/central/templates/rtc_control.html index 2f53aed..ead9e12 100644 --- a/central/templates/rtc_control.html +++ b/central/templates/rtc_control.html @@ -25,9 +25,9 @@

Candidatos

{{ total }} produto(s) neste filtro.

- -{% for c in rows %} -{% else %}{% endfor %}
ProdutoNCMAtualPropostoCST IBS/CBSRegraBaseStatus
{{ c.product_code }} · {{ c.description or "" }}{{ c.ncm }}{{ c.current_value or "vazio" }}{{ c.proposed }}{{ c.cst_ibscbs }}{{ c.rule_id }}{{ c.basis }}{{ c.status }}
Nenhum candidato neste filtro.
+ +{% for c in rows %} +{% else %}{% endfor %}
ProdutoDescriçãoNCMcClassTrib atualcClassTrib propostoCST IBS/CBSRegraFundamentoCatálogoSituação
{{ c.product_code }}{{ c.description or "" }}{{ c.ncm }}{{ c.current_value or "vazio" }}{{ c.proposed }}{{ c.cst_ibscbs }}{{ L.rule(c.rule_id) }}{{ c.basis }}{{ L.catalog("MATCH_SAFE") }}{{ L.status(c.status) }}
Nenhum candidato neste filtro.

Página {{ page }} de {{ pages }}{% if page > 1 %} · anterior{% endif %}{% if page < pages %} · próxima{% endif %}

@@ -35,7 +35,7 @@

Auditoria e reversão

Cada preenchimento pode ser revertido individualmente, desde que o valor no ERP ainda seja o gravado.

-{% for a in audits %} +{% for a in audits %} {% else %}{% endfor %}
#ProdutoAçãoResultadoAntes → DepoisRegraOrigemReversão
{{ a.id }}{{ a.product_code }} · {{ a.description_snapshot or "" }}{{ a.action or "APPLY" }}{{ a.outcome }}{% if a.reason %} ({{ a.reason }}){% endif %}{{ a.old_value or "vazio" }} → {{ a.new_value or "vazio" }}{{ a.rule_id }}{{ a.authorization_origin }}
{{ a.id }}{{ a.product_code }} · {{ a.description_snapshot or "" }}{{ "Reversão" if a.action == "ROLLBACK" else "Preenchimento" }}{{ L.outcome(a.outcome) }}{% if a.reason %} ({{ L.reason(a.reason) }}){% endif %}{{ a.old_value or "vazio" }} → {{ a.new_value or "vazio" }}{{ L.rule(a.rule_id) }}{{ a.authorization_origin }} {% if a.action == "APPLY" and a.outcome == "APPLIED" and not a.rollback_state %}{% else %}{{ a.rollback_state or "" }}{% endif %}
Nenhum preenchimento registrado.
{% endblock %} diff --git a/central/tests/test_control_panel_pages.py b/central/tests/test_control_panel_pages.py index 98fd8d5..7e067d8 100644 --- a/central/tests/test_control_panel_pages.py +++ b/central/tests/test_control_panel_pages.py @@ -689,3 +689,19 @@ def test_panel_shows_rtc_products_summary_and_the_pending_message_only_when_rtc_ assert "Preenchimento automático" in on and "Desativada" in on and f"/agents/{agent_id}/rtc" in on for legacy in ("Escopo anterior", "Escopo ampliado"): assert legacy not in on + + +def test_rtc_control_page_shows_human_labels_and_a_catalog_column_never_raw_enums(): + from central.app.panel_presentation import abort_reason_label, audit_outcome_label, candidate_status_label, catalog_state_label, blocker_reason_label, blocker_type_label, rtc_rule_label + assert candidate_status_label("APPROVED") == "Aprovado" and audit_outcome_label("ROLLED_BACK") == "Revertido" + assert rtc_rule_label("RTC-R4") == "Sugestão sem autorização de preenchimento (RTC-R4)" + assert blocker_reason_label("INSUFFICIENT_EVIDENCE") == "Evidência fiscal insuficiente" + assert blocker_type_label("CCLASSTRIB_CONFLICT") == "cClassTrib existente diverge da classificação proposta" + assert catalog_state_label("MISSING_LOCAL") == "Classe oficial ausente no catálogo local do SGV" + assert abort_reason_label("VALUE_ALREADY_SET_NEVER_OVERWRITTEN") == "cClassTrib existente diverge da classificação proposta" + client, agent_id, _ = _panel_client() + page = client.get(f"/agents/{agent_id}/rtc").text + for header in ("cClassTrib atual", "cClassTrib proposto", "Fundamento", "Catálogo", "Situação", "Descrição"): + assert header in page + for raw in ("PENDING", "APPLIED", "ABORTED"): + assert raw not in page diff --git a/central/tests/test_health.py b/central/tests/test_health.py index 2ce1aae..3994c2e 100644 --- a/central/tests/test_health.py +++ b/central/tests/test_health.py @@ -17,7 +17,7 @@ def test_health_is_unavailable_when_database_is_down(): def test_version_endpoint_reports_release_and_fiscal_versions(): body = TestClient(create_app(database_probe=lambda: True)).get("/version").json() - assert body["version"] == "1.2.0" and body["api_compat"] == "1.0" and body["engine_version"] and body["decision_version"] + assert body["version"] == "1.2.1" and body["api_compat"] == "1.0" and body["engine_version"] and body["decision_version"] def test_production_refuses_the_dev_token(monkeypatch): diff --git a/central/tests/test_rtc_security.py b/central/tests/test_rtc_security.py index 6cdae2f..c231815 100644 --- a/central/tests/test_rtc_security.py +++ b/central/tests/test_rtc_security.py @@ -85,3 +85,15 @@ def test_audit_rows_never_carry_credentials_or_tokens(): blob = repr([getattr(row, c.name) for c in RtcWriteAudit.__table__.columns]) assert "password" not in blob.lower() and "'t'" not in blob and "Bearer" not in blob assert not any("pass" in c.name or "token" in c.name or "secret" in c.name for c in RtcWriteAudit.__table__.columns) + + +def test_agent_can_reread_only_its_own_current_authorization_and_it_follows_the_operator(): + client, engine = _client() + hb(client) + assert client.get("/v1/agents/me/authorizations").status_code in (401, 403) # requires the Agent credential + assert client.get("/v1/agents/me/authorizations", headers=H).json()["rtc_write_mode"] == "DISABLED" + with Session(engine) as s: + s.scalars(select(Installation)).one().rtc_write_mode = "ENABLED" + s.commit() + body = client.get("/v1/agents/me/authorizations", headers=H).json() + assert body["rtc_write_mode"] == "ENABLED" and set(body) == {"rtc_write_mode", "rtc_approved_codes", "rtc_rollbacks"} diff --git a/deploy/agent-windows/agent.env.template b/deploy/agent-windows/agent.env.template index 8fbeb8c..ef8f709 100644 --- a/deploy/agent-windows/agent.env.template +++ b/deploy/agent-windows/agent.env.template @@ -19,4 +19,4 @@ FB_PASSWORD= FISCAL_MODE=DRY_RUN FIREBIRD_WRITES=0 POLL_INTERVAL_SECONDS=5 -AGENT_VERSION=1.2.0 +AGENT_VERSION=1.2.1 diff --git a/deploy/agent-windows/gti-agent.ps1 b/deploy/agent-windows/gti-agent.ps1 index 0d9367c..73558c0 100644 --- a/deploy/agent-windows/gti-agent.ps1 +++ b/deploy/agent-windows/gti-agent.ps1 @@ -164,7 +164,7 @@ switch ($Command) { "GTI_HUB_URL=$hub", "AGENT_TOKEN=$token", "AGENT_ID=$agentId", "COMPANY_CODE=$code", "COMPANY_CNPJ=$cnpj", "COMPANY_CRT_SOURCE=$crtSource", "FIREBIRD_DATABASE_PATH=$db", "FB_USER=$fbUser", "FB_PASSWORD=$fbPass", - 'FISCAL_MODE=DRY_RUN', 'FIREBIRD_WRITES=0', 'POLL_INTERVAL_SECONDS=5', 'AGENT_VERSION=1.2.0' + 'FISCAL_MODE=DRY_RUN', 'FIREBIRD_WRITES=0', 'POLL_INTERVAL_SECONDS=5', 'AGENT_VERSION=1.2.1' ) Set-Content -Path $EnvFile -Value $lines -Encoding UTF8 } diff --git a/deploy/agent-windows/pilot-construcao.env.example b/deploy/agent-windows/pilot-construcao.env.example index 114e97c..532db8b 100644 --- a/deploy/agent-windows/pilot-construcao.env.example +++ b/deploy/agent-windows/pilot-construcao.env.example @@ -19,4 +19,4 @@ FB_PASSWORD= FISCAL_MODE=DRY_RUN FIREBIRD_WRITES=0 POLL_INTERVAL_SECONDS=5 -AGENT_VERSION=1.2.0 +AGENT_VERSION=1.2.1 diff --git a/deploy/agent-windows/profiles/mmmodas.env.example b/deploy/agent-windows/profiles/mmmodas.env.example index fcd1faa..a324788 100644 --- a/deploy/agent-windows/profiles/mmmodas.env.example +++ b/deploy/agent-windows/profiles/mmmodas.env.example @@ -19,4 +19,4 @@ FB_PASSWORD= FISCAL_MODE=DRY_RUN FIREBIRD_WRITES=0 POLL_INTERVAL_SECONDS=5 -AGENT_VERSION=1.2.0 +AGENT_VERSION=1.2.1 diff --git a/deploy/agent-windows/profiles/rincao.env.example b/deploy/agent-windows/profiles/rincao.env.example index 519c965..bee3e41 100644 --- a/deploy/agent-windows/profiles/rincao.env.example +++ b/deploy/agent-windows/profiles/rincao.env.example @@ -19,4 +19,4 @@ FB_PASSWORD= FISCAL_MODE=DRY_RUN FIREBIRD_WRITES=0 POLL_INTERVAL_SECONDS=5 -AGENT_VERSION=1.2.0 +AGENT_VERSION=1.2.1 diff --git a/deploy/agent-windows/profiles/uniao.env.example b/deploy/agent-windows/profiles/uniao.env.example index 4b255e5..52ddd24 100644 --- a/deploy/agent-windows/profiles/uniao.env.example +++ b/deploy/agent-windows/profiles/uniao.env.example @@ -19,4 +19,4 @@ FB_PASSWORD= FISCAL_MODE=DRY_RUN FIREBIRD_WRITES=0 POLL_INTERVAL_SECONDS=5 -AGENT_VERSION=1.2.0 +AGENT_VERSION=1.2.1 diff --git a/deploy/hub/.env.example b/deploy/hub/.env.example index 04e342b..7b45d0e 100644 --- a/deploy/hub/.env.example +++ b/deploy/hub/.env.example @@ -1,5 +1,5 @@ # GTI Fiscal Hub — production environment (copy to .env, never commit .env) -GTI_FISCAL_VERSION=1.2.0 +GTI_FISCAL_VERSION=1.2.1 # REQUIRED. URL-safe secret (used inside a connection URL): openssl rand -hex 24 POSTGRES_PASSWORD= diff --git a/deploy/hub/docker-compose.prod.yml b/deploy/hub/docker-compose.prod.yml index 3edad53..eb7fa6b 100644 --- a/deploy/hub/docker-compose.prod.yml +++ b/deploy/hub/docker-compose.prod.yml @@ -36,7 +36,7 @@ services: build: context: ../.. dockerfile: central/Dockerfile - image: gti-fiscal-hub:${GTI_FISCAL_VERSION:-1.2.0} + image: gti-fiscal-hub:${GTI_FISCAL_VERSION:-1.2.1} restart: unless-stopped depends_on: postgres: diff --git a/docs/DEPLOY_HUB.md b/docs/DEPLOY_HUB.md index 8d08d64..f0a04eb 100644 --- a/docs/DEPLOY_HUB.md +++ b/docs/DEPLOY_HUB.md @@ -16,7 +16,7 @@ A variável de ambiente `GTI_SSH_PASSWORD`, se existir, tem prioridade. A senha ## Deploy ``` powershell -ExecutionPolicy Bypass -File .\scripts\deploy_hub.ps1 -powershell -ExecutionPolicy Bypass -File .\scripts\deploy_hub.ps1 -PublishAgent -Version 1.2.0 +powershell -ExecutionPolicy Bypass -File .\scripts\deploy_hub.ps1 -PublishAgent -Version 1.2.1 ``` Parâmetros: `-Version` (padrão `release/VERSION`), `-PublishAgent`, `-SkipTests`, `-DryRun`. diff --git a/docs/rtc_auto_apply.md b/docs/rtc_auto_apply.md index 48cd0e3..14947df 100644 --- a/docs/rtc_auto_apply.md +++ b/docs/rtc_auto_apply.md @@ -18,6 +18,9 @@ Somente `C000025.CCLASSTRIB` (allowlist `ALLOWED_RTC_WRITE_FIELDS`), somente qua Sequência por produto (uma transação curta): reler tudo → recalcular a decisão → conferir fingerprint → `UPDATE C000025 SET CCLASSTRIB = ? WHERE CODIGO = ? AND (CCLASSTRIB IS NULL OR TRIM(CCLASSTRIB)='')` → rowcount = 1 → reler → commit → auditoria. +## Reautorização imediata antes da escrita (1.2.1) +O modo entregue no job pode envelhecer (operador desativa durante um lote). Antes de **cada** UPDATE o Agent relê a autorização atual no Hub (`GET /v1/agents/me/authorizations`, autenticado pelo token do próprio Agent; devolve só modo, aprovados e reversões da sua instalação; cache de 3 s). Se o modo mudou, se o produto perdeu a aprovação ou se o Hub não puder ser consultado, o produto é interrompido **sem escrever** (`AUTHORIZATION_CHANGED` / `AUTHORIZATION_UNVERIFIABLE`). Autorização não confirmada não é autorização. + ## Preview e aprovação O Agent envia os candidatos (até 5.000 por job; `preview_truncated` sinaliza excesso) → tabela `rtc_candidates` (PENDING/APPROVED/REJECTED/APPLIED/STALE). O painel pagina no servidor (50/página), filtra por status, aprova/rejeita selecionados ou todos os pendentes e dispara "Aplicar aprovados agora". Uma proposta que muda invalida a aprovação anterior; produto que deixa de ser elegível numa avaliação completa vira `STALE`. diff --git a/docs/runs/final_corpus/rtc_resolution_dryrun_final.json b/docs/runs/final_corpus/rtc_resolution_dryrun_final.json new file mode 100644 index 0000000..883b2b6 --- /dev/null +++ b/docs/runs/final_corpus/rtc_resolution_dryrun_final.json @@ -0,0 +1,987 @@ +{ + "mode": "READ_ONLY_DRY_RUN", + "FIREBIRD_WRITES": 0, + "WRITE_ATTEMPTS": 0, + "WRITE_SUCCESSES": 0, + "databases": { + "TESTESOFICIAIS": { + "crt": "1", + "total_products": 521, + "passes": { + "AS_FOUND": { + "crt": "1", + "rtc_enabled": true, + "products": 521, + "resolution_summary": { + "total": 521, + "valid_existing": 0, + "ready_to_apply": 0, + "suggestion_only": 0, + "ambiguous": 0, + "insufficient": 521, + "conflicts": 0, + "official_mismatch": 0, + "catalog_incompatible": 0, + "not_applicable": 0, + "other_blocked": 0, + "by_rule": { + "RTC-R1": 521 + }, + "by_reason": { + "SIMPLES_ORIENTATION_PENDING_OFFICIAL_NT": 521 + }, + "catalog_compatibility": { + "compatibility": "MATERIAL_MISMATCH", + "counts": { + "MATCH_SAFE": 131, + "MATCH_WITH_NON_MATERIAL_DIFFERENCE": 0, + "MISMATCH": 11, + "EXPIRED": 3, + "MISSING_LOCAL": 19, + "MISSING_OFFICIAL": 0 + }, + "expired_present_locally": 3 + } + }, + "by_status": { + "INSUFFICIENT_EVIDENCE": 521 + }, + "rtc_blocker_types": { + "CCLASSTRIB_MISSING_UNRESOLVED": 521 + }, + "AUTO_APPLY_CANDIDATES": 0, + "context": { + "rtc_param": "1", + "rtc_source": "PARAMETROS.USAR_REFORMA_TRIBUTARIA", + "rtc_observed_at": "2026-09-25T11:52:37+00:00", + "local_catalog_hash": "1da77aec27fbde88488d1edf562f3af315ab2b5d06efb2e0b2f1ed606585d459", + "official_catalog": { + "sha256": "1448cb63a41bdb67ea30b4e11f4dc200d9568542c6b9335b6cff87a4fd664654", + "publication": "2026-06-22", + "file": "cClassTrib 2026-06-22.xlsx" + }, + "catalog_integrity": { + "classes": 145, + "cst": 18, + "orphan_classes": 0, + "bad_class_format": 0, + "bad_cst_format": 0, + "duplicates": 0, + "valid": true + } + } + }, + "WHATIF_RTC_ON": { + "crt": "1", + "rtc_enabled": true, + "products": 521, + "resolution_summary": { + "total": 521, + "valid_existing": 0, + "ready_to_apply": 0, + "suggestion_only": 0, + "ambiguous": 0, + "insufficient": 521, + "conflicts": 0, + "official_mismatch": 0, + "catalog_incompatible": 0, + "not_applicable": 0, + "other_blocked": 0, + "by_rule": { + "RTC-R1": 521 + }, + "by_reason": { + "SIMPLES_ORIENTATION_PENDING_OFFICIAL_NT": 521 + }, + "catalog_compatibility": { + "compatibility": "MATERIAL_MISMATCH", + "counts": { + "MATCH_SAFE": 131, + "MATCH_WITH_NON_MATERIAL_DIFFERENCE": 0, + "MISMATCH": 11, + "EXPIRED": 3, + "MISSING_LOCAL": 19, + "MISSING_OFFICIAL": 0 + }, + "expired_present_locally": 3 + } + }, + "by_status": { + "INSUFFICIENT_EVIDENCE": 521 + }, + "rtc_blocker_types": { + "CCLASSTRIB_MISSING_UNRESOLVED": 521 + }, + "AUTO_APPLY_CANDIDATES": 0, + "context": { + "rtc_param": "1", + "rtc_source": "SIMULATION", + "rtc_observed_at": "2026-09-25T11:52:37+00:00", + "local_catalog_hash": "1da77aec27fbde88488d1edf562f3af315ab2b5d06efb2e0b2f1ed606585d459", + "official_catalog": { + "sha256": "1448cb63a41bdb67ea30b4e11f4dc200d9568542c6b9335b6cff87a4fd664654", + "publication": "2026-06-22", + "file": "cClassTrib 2026-06-22.xlsx" + }, + "catalog_integrity": { + "classes": 145, + "cst": 18, + "orphan_classes": 0, + "bad_class_format": 0, + "bad_cst_format": 0, + "duplicates": 0, + "valid": true + } + } + }, + "WHATIF_NORMAL_ON": { + "crt": "3", + "rtc_enabled": true, + "products": 521, + "resolution_summary": { + "total": 521, + "valid_existing": 0, + "ready_to_apply": 77, + "suggestion_only": 203, + "ambiguous": 215, + "insufficient": 26, + "conflicts": 0, + "official_mismatch": 0, + "catalog_incompatible": 0, + "not_applicable": 0, + "other_blocked": 0, + "by_rule": { + "RTC-A1": 41, + "RTC-A3": 10, + "RTC-R2": 26, + "RTC-R4": 203, + "RTC-R3": 77, + "RTC-A2": 164 + }, + "by_reason": { + "ANNEX_XV_NEEDS_OPERATION_OR_CONDITION": 14, + "SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD": 10, + "NO_VALID_NCM": 26, + "ANNEX_VII_NEEDS_OPERATION_OR_CONDITION": 10, + "ANNEX_I_NEEDS_OPERATION_OR_CONDITION": 14, + "NCM_IN_NO_ANNEX_AND_NO_NATURE_BASED_CHAPTER": 203, + "ANNEX_VII_CLEAN_ITEM_UNIQUE_DEFAULT_CLASS": 75, + "ANNEX_XV_CLEAN_ITEM_UNIQUE_DEFAULT_CLASS": 2, + "LISTED_IN_MORE_THAN_ONE_ANNEX": 164, + "ANNEX_V_NEEDS_OPERATION_OR_CONDITION": 3 + }, + "catalog_compatibility": { + "compatibility": "MATERIAL_MISMATCH", + "counts": { + "MATCH_SAFE": 131, + "MATCH_WITH_NON_MATERIAL_DIFFERENCE": 0, + "MISMATCH": 11, + "EXPIRED": 3, + "MISSING_LOCAL": 19, + "MISSING_OFFICIAL": 0 + }, + "expired_present_locally": 3 + } + }, + "by_status": { + "AMBIGUOUS": 215, + "INSUFFICIENT_EVIDENCE": 26, + "SUGGESTION_ONLY": 203, + "RESOLVED_WITH_EXPLICIT_RULE": 77 + }, + "rtc_blocker_types": { + "CCLASSTRIB_AMBIGUOUS": 215, + "RTC_RULE_EVIDENCE_MISSING": 26, + "CCLASSTRIB_MISSING_UNRESOLVED": 203, + "CCLASSTRIB_MISSING": 77 + }, + "AUTO_APPLY_CANDIDATES": 77, + "context": { + "rtc_param": "1", + "rtc_source": "SIMULATION", + "rtc_observed_at": "2026-09-25T11:52:37+00:00", + "local_catalog_hash": "1da77aec27fbde88488d1edf562f3af315ab2b5d06efb2e0b2f1ed606585d459", + "official_catalog": { + "sha256": "1448cb63a41bdb67ea30b4e11f4dc200d9568542c6b9335b6cff87a4fd664654", + "publication": "2026-06-22", + "file": "cClassTrib 2026-06-22.xlsx" + }, + "catalog_integrity": { + "classes": 145, + "cst": 18, + "orphan_classes": 0, + "bad_class_format": 0, + "bad_cst_format": 0, + "duplicates": 0, + "valid": true + } + } + } + } + }, + "CONSTRUCAO": { + "crt": "1", + "total_products": 3712, + "passes": { + "AS_FOUND": { + "crt": "1", + "rtc_enabled": true, + "products": 3712, + "resolution_summary": { + "total": 3712, + "valid_existing": 0, + "ready_to_apply": 0, + "suggestion_only": 0, + "ambiguous": 0, + "insufficient": 3712, + "conflicts": 0, + "official_mismatch": 0, + "catalog_incompatible": 0, + "not_applicable": 0, + "other_blocked": 0, + "by_rule": { + "RTC-R1": 3712 + }, + "by_reason": { + "SIMPLES_ORIENTATION_PENDING_OFFICIAL_NT": 3712 + }, + "catalog_compatibility": { + "compatibility": "MATERIAL_MISMATCH", + "counts": { + "MATCH_SAFE": 131, + "MATCH_WITH_NON_MATERIAL_DIFFERENCE": 0, + "MISMATCH": 11, + "EXPIRED": 3, + "MISSING_LOCAL": 19, + "MISSING_OFFICIAL": 0 + }, + "expired_present_locally": 3 + } + }, + "by_status": { + "INSUFFICIENT_EVIDENCE": 3712 + }, + "rtc_blocker_types": { + "CCLASSTRIB_MISSING_UNRESOLVED": 3712 + }, + "AUTO_APPLY_CANDIDATES": 0, + "context": { + "rtc_param": "1", + "rtc_source": "PARAMETROS.USAR_REFORMA_TRIBUTARIA", + "rtc_observed_at": "2026-09-25T11:52:38+00:00", + "local_catalog_hash": "be8c5899fff3e236c6c77bbb887087c0a2db048aeff763a5823676c7b478a151", + "official_catalog": { + "sha256": "1448cb63a41bdb67ea30b4e11f4dc200d9568542c6b9335b6cff87a4fd664654", + "publication": "2026-06-22", + "file": "cClassTrib 2026-06-22.xlsx" + }, + "catalog_integrity": { + "classes": 145, + "cst": 18, + "orphan_classes": 0, + "bad_class_format": 0, + "bad_cst_format": 0, + "duplicates": 0, + "valid": true + } + } + }, + "WHATIF_RTC_ON": { + "crt": "1", + "rtc_enabled": true, + "products": 3712, + "resolution_summary": { + "total": 3712, + "valid_existing": 0, + "ready_to_apply": 0, + "suggestion_only": 0, + "ambiguous": 0, + "insufficient": 3712, + "conflicts": 0, + "official_mismatch": 0, + "catalog_incompatible": 0, + "not_applicable": 0, + "other_blocked": 0, + "by_rule": { + "RTC-R1": 3712 + }, + "by_reason": { + "SIMPLES_ORIENTATION_PENDING_OFFICIAL_NT": 3712 + }, + "catalog_compatibility": { + "compatibility": "MATERIAL_MISMATCH", + "counts": { + "MATCH_SAFE": 131, + "MATCH_WITH_NON_MATERIAL_DIFFERENCE": 0, + "MISMATCH": 11, + "EXPIRED": 3, + "MISSING_LOCAL": 19, + "MISSING_OFFICIAL": 0 + }, + "expired_present_locally": 3 + } + }, + "by_status": { + "INSUFFICIENT_EVIDENCE": 3712 + }, + "rtc_blocker_types": { + "CCLASSTRIB_MISSING_UNRESOLVED": 3712 + }, + "AUTO_APPLY_CANDIDATES": 0, + "context": { + "rtc_param": "1", + "rtc_source": "SIMULATION", + "rtc_observed_at": "2026-09-25T11:52:38+00:00", + "local_catalog_hash": "be8c5899fff3e236c6c77bbb887087c0a2db048aeff763a5823676c7b478a151", + "official_catalog": { + "sha256": "1448cb63a41bdb67ea30b4e11f4dc200d9568542c6b9335b6cff87a4fd664654", + "publication": "2026-06-22", + "file": "cClassTrib 2026-06-22.xlsx" + }, + "catalog_integrity": { + "classes": 145, + "cst": 18, + "orphan_classes": 0, + "bad_class_format": 0, + "bad_cst_format": 0, + "duplicates": 0, + "valid": true + } + } + }, + "WHATIF_NORMAL_ON": { + "crt": "3", + "rtc_enabled": true, + "products": 3712, + "resolution_summary": { + "total": 3712, + "valid_existing": 0, + "ready_to_apply": 0, + "suggestion_only": 2725, + "ambiguous": 973, + "insufficient": 14, + "conflicts": 0, + "official_mismatch": 0, + "catalog_incompatible": 0, + "not_applicable": 0, + "other_blocked": 0, + "by_rule": { + "RTC-R4": 2725, + "RTC-A1": 255, + "RTC-R2": 14, + "RTC-A3": 682, + "RTC-A2": 36 + }, + "by_reason": { + "NCM_IN_NO_ANNEX_AND_NO_NATURE_BASED_CHAPTER": 2725, + "ANNEX_IX_NEEDS_OPERATION_OR_CONDITION": 63, + "NO_VALID_NCM": 14, + "SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD": 682, + "ANNEX_IV_NEEDS_OPERATION_OR_CONDITION": 179, + "LISTED_IN_MORE_THAN_ONE_ANNEX": 36, + "ANNEX_XI_NEEDS_OPERATION_OR_CONDITION": 8, + "ANNEX_V_NEEDS_OPERATION_OR_CONDITION": 1, + "ANNEX_XIII_NEEDS_OPERATION_OR_CONDITION": 4 + }, + "catalog_compatibility": { + "compatibility": "MATERIAL_MISMATCH", + "counts": { + "MATCH_SAFE": 131, + "MATCH_WITH_NON_MATERIAL_DIFFERENCE": 0, + "MISMATCH": 11, + "EXPIRED": 3, + "MISSING_LOCAL": 19, + "MISSING_OFFICIAL": 0 + }, + "expired_present_locally": 3 + } + }, + "by_status": { + "SUGGESTION_ONLY": 2725, + "AMBIGUOUS": 973, + "INSUFFICIENT_EVIDENCE": 14 + }, + "rtc_blocker_types": { + "CCLASSTRIB_MISSING_UNRESOLVED": 2725, + "CCLASSTRIB_AMBIGUOUS": 973, + "RTC_RULE_EVIDENCE_MISSING": 14 + }, + "AUTO_APPLY_CANDIDATES": 0, + "context": { + "rtc_param": "1", + "rtc_source": "SIMULATION", + "rtc_observed_at": "2026-09-25T11:52:39+00:00", + "local_catalog_hash": "be8c5899fff3e236c6c77bbb887087c0a2db048aeff763a5823676c7b478a151", + "official_catalog": { + "sha256": "1448cb63a41bdb67ea30b4e11f4dc200d9568542c6b9335b6cff87a4fd664654", + "publication": "2026-06-22", + "file": "cClassTrib 2026-06-22.xlsx" + }, + "catalog_integrity": { + "classes": 145, + "cst": 18, + "orphan_classes": 0, + "bad_class_format": 0, + "bad_cst_format": 0, + "duplicates": 0, + "valid": true + } + } + } + } + }, + "RINCAO": { + "crt": "3", + "total_products": 894, + "passes": { + "AS_FOUND": { + "crt": "3", + "rtc_enabled": false, + "products": 894, + "resolution_summary": null, + "by_status": { + "NOT_EVALUATED": 894 + }, + "rtc_blocker_types": {}, + "AUTO_APPLY_CANDIDATES": 0, + "context": { + "rtc_param": "0", + "rtc_source": "PARAMETROS.USAR_REFORMA_TRIBUTARIA", + "rtc_observed_at": "2026-09-25T11:52:40+00:00", + "local_catalog_hash": "be8c5899fff3e236c6c77bbb887087c0a2db048aeff763a5823676c7b478a151", + "official_catalog": null, + "catalog_integrity": { + "classes": 145, + "cst": 18, + "orphan_classes": 0, + "bad_class_format": 0, + "bad_cst_format": 0, + "duplicates": 0, + "valid": true + } + } + }, + "WHATIF_RTC_ON": { + "crt": "3", + "rtc_enabled": true, + "products": 894, + "resolution_summary": { + "total": 894, + "valid_existing": 0, + "ready_to_apply": 63, + "suggestion_only": 467, + "ambiguous": 364, + "insufficient": 0, + "conflicts": 0, + "official_mismatch": 0, + "catalog_incompatible": 0, + "not_applicable": 0, + "other_blocked": 0, + "by_rule": { + "RTC-R4": 467, + "RTC-A1": 129, + "RTC-A2": 234, + "RTC-R3": 63, + "RTC-A3": 1 + }, + "by_reason": { + "NCM_IN_NO_ANNEX_AND_NO_NATURE_BASED_CHAPTER": 467, + "ANNEX_X_NEEDS_OPERATION_OR_CONDITION": 109, + "LISTED_IN_MORE_THAN_ONE_ANNEX": 234, + "ANNEX_VII_CLEAN_ITEM_UNIQUE_DEFAULT_CLASS": 59, + "ANNEX_I_CLEAN_ITEM_UNIQUE_DEFAULT_CLASS": 2, + "ANNEX_XV_NEEDS_OPERATION_OR_CONDITION": 16, + "SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD": 1, + "ANNEX_XV_CLEAN_ITEM_UNIQUE_DEFAULT_CLASS": 2, + "ANNEX_I_NEEDS_OPERATION_OR_CONDITION": 3, + "ANNEX_VII_NEEDS_OPERATION_OR_CONDITION": 1 + }, + "catalog_compatibility": { + "compatibility": "MATERIAL_MISMATCH", + "counts": { + "MATCH_SAFE": 131, + "MATCH_WITH_NON_MATERIAL_DIFFERENCE": 0, + "MISMATCH": 11, + "EXPIRED": 3, + "MISSING_LOCAL": 19, + "MISSING_OFFICIAL": 0 + }, + "expired_present_locally": 3 + } + }, + "by_status": { + "SUGGESTION_ONLY": 467, + "AMBIGUOUS": 364, + "RESOLVED_WITH_EXPLICIT_RULE": 63 + }, + "rtc_blocker_types": { + "CCLASSTRIB_MISSING_UNRESOLVED": 467, + "CCLASSTRIB_AMBIGUOUS": 364, + "CCLASSTRIB_MISSING": 63 + }, + "AUTO_APPLY_CANDIDATES": 63, + "context": { + "rtc_param": "0", + "rtc_source": "SIMULATION", + "rtc_observed_at": "2026-09-25T11:52:40+00:00", + "local_catalog_hash": "be8c5899fff3e236c6c77bbb887087c0a2db048aeff763a5823676c7b478a151", + "official_catalog": { + "sha256": "1448cb63a41bdb67ea30b4e11f4dc200d9568542c6b9335b6cff87a4fd664654", + "publication": "2026-06-22", + "file": "cClassTrib 2026-06-22.xlsx" + }, + "catalog_integrity": { + "classes": 145, + "cst": 18, + "orphan_classes": 0, + "bad_class_format": 0, + "bad_cst_format": 0, + "duplicates": 0, + "valid": true + } + } + }, + "WHATIF_NORMAL_ON": { + "crt": "3", + "rtc_enabled": true, + "products": 894, + "resolution_summary": { + "total": 894, + "valid_existing": 0, + "ready_to_apply": 63, + "suggestion_only": 467, + "ambiguous": 364, + "insufficient": 0, + "conflicts": 0, + "official_mismatch": 0, + "catalog_incompatible": 0, + "not_applicable": 0, + "other_blocked": 0, + "by_rule": { + "RTC-R4": 467, + "RTC-A1": 129, + "RTC-A2": 234, + "RTC-R3": 63, + "RTC-A3": 1 + }, + "by_reason": { + "NCM_IN_NO_ANNEX_AND_NO_NATURE_BASED_CHAPTER": 467, + "ANNEX_X_NEEDS_OPERATION_OR_CONDITION": 109, + "LISTED_IN_MORE_THAN_ONE_ANNEX": 234, + "ANNEX_VII_CLEAN_ITEM_UNIQUE_DEFAULT_CLASS": 59, + "ANNEX_I_CLEAN_ITEM_UNIQUE_DEFAULT_CLASS": 2, + "ANNEX_XV_NEEDS_OPERATION_OR_CONDITION": 16, + "SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD": 1, + "ANNEX_XV_CLEAN_ITEM_UNIQUE_DEFAULT_CLASS": 2, + "ANNEX_I_NEEDS_OPERATION_OR_CONDITION": 3, + "ANNEX_VII_NEEDS_OPERATION_OR_CONDITION": 1 + }, + "catalog_compatibility": { + "compatibility": "MATERIAL_MISMATCH", + "counts": { + "MATCH_SAFE": 131, + "MATCH_WITH_NON_MATERIAL_DIFFERENCE": 0, + "MISMATCH": 11, + "EXPIRED": 3, + "MISSING_LOCAL": 19, + "MISSING_OFFICIAL": 0 + }, + "expired_present_locally": 3 + } + }, + "by_status": { + "SUGGESTION_ONLY": 467, + "AMBIGUOUS": 364, + "RESOLVED_WITH_EXPLICIT_RULE": 63 + }, + "rtc_blocker_types": { + "CCLASSTRIB_MISSING_UNRESOLVED": 467, + "CCLASSTRIB_AMBIGUOUS": 364, + "CCLASSTRIB_MISSING": 63 + }, + "AUTO_APPLY_CANDIDATES": 63, + "context": { + "rtc_param": "0", + "rtc_source": "SIMULATION", + "rtc_observed_at": "2026-09-25T11:52:40+00:00", + "local_catalog_hash": "be8c5899fff3e236c6c77bbb887087c0a2db048aeff763a5823676c7b478a151", + "official_catalog": { + "sha256": "1448cb63a41bdb67ea30b4e11f4dc200d9568542c6b9335b6cff87a4fd664654", + "publication": "2026-06-22", + "file": "cClassTrib 2026-06-22.xlsx" + }, + "catalog_integrity": { + "classes": 145, + "cst": 18, + "orphan_classes": 0, + "bad_class_format": 0, + "bad_cst_format": 0, + "duplicates": 0, + "valid": true + } + } + } + } + }, + "UNIAO": { + "crt": "1", + "total_products": 8942, + "passes": { + "AS_FOUND": { + "crt": "1", + "rtc_enabled": false, + "products": 8942, + "resolution_summary": null, + "by_status": { + "NOT_EVALUATED": 8942 + }, + "rtc_blocker_types": {}, + "AUTO_APPLY_CANDIDATES": 0, + "context": { + "rtc_param": "0", + "rtc_source": "PARAMETROS.USAR_REFORMA_TRIBUTARIA", + "rtc_observed_at": "2026-09-25T11:52:42+00:00", + "local_catalog_hash": "be8c5899fff3e236c6c77bbb887087c0a2db048aeff763a5823676c7b478a151", + "official_catalog": null, + "catalog_integrity": { + "classes": 145, + "cst": 18, + "orphan_classes": 0, + "bad_class_format": 0, + "bad_cst_format": 0, + "duplicates": 0, + "valid": true + } + } + }, + "WHATIF_RTC_ON": { + "crt": "1", + "rtc_enabled": true, + "products": 8942, + "resolution_summary": { + "total": 8942, + "valid_existing": 0, + "ready_to_apply": 0, + "suggestion_only": 0, + "ambiguous": 0, + "insufficient": 8942, + "conflicts": 0, + "official_mismatch": 0, + "catalog_incompatible": 0, + "not_applicable": 0, + "other_blocked": 0, + "by_rule": { + "RTC-R1": 8942 + }, + "by_reason": { + "SIMPLES_ORIENTATION_PENDING_OFFICIAL_NT": 8942 + }, + "catalog_compatibility": { + "compatibility": "MATERIAL_MISMATCH", + "counts": { + "MATCH_SAFE": 131, + "MATCH_WITH_NON_MATERIAL_DIFFERENCE": 0, + "MISMATCH": 11, + "EXPIRED": 3, + "MISSING_LOCAL": 19, + "MISSING_OFFICIAL": 0 + }, + "expired_present_locally": 3 + } + }, + "by_status": { + "INSUFFICIENT_EVIDENCE": 8942 + }, + "rtc_blocker_types": { + "CCLASSTRIB_MISSING_UNRESOLVED": 8942 + }, + "AUTO_APPLY_CANDIDATES": 0, + "context": { + "rtc_param": "0", + "rtc_source": "SIMULATION", + "rtc_observed_at": "2026-09-25T11:52:43+00:00", + "local_catalog_hash": "be8c5899fff3e236c6c77bbb887087c0a2db048aeff763a5823676c7b478a151", + "official_catalog": { + "sha256": "1448cb63a41bdb67ea30b4e11f4dc200d9568542c6b9335b6cff87a4fd664654", + "publication": "2026-06-22", + "file": "cClassTrib 2026-06-22.xlsx" + }, + "catalog_integrity": { + "classes": 145, + "cst": 18, + "orphan_classes": 0, + "bad_class_format": 0, + "bad_cst_format": 0, + "duplicates": 0, + "valid": true + } + } + }, + "WHATIF_NORMAL_ON": { + "crt": "3", + "rtc_enabled": true, + "products": 8942, + "resolution_summary": { + "total": 8942, + "valid_existing": 0, + "ready_to_apply": 989, + "suggestion_only": 6430, + "ambiguous": 1432, + "insufficient": 91, + "conflicts": 0, + "official_mismatch": 0, + "catalog_incompatible": 0, + "not_applicable": 0, + "other_blocked": 0, + "by_rule": { + "RTC-R4": 6430, + "RTC-R3": 989, + "RTC-A1": 821, + "RTC-A3": 296, + "RTC-R2": 91, + "RTC-A2": 315 + }, + "by_reason": { + "NCM_IN_NO_ANNEX_AND_NO_NATURE_BASED_CHAPTER": 6430, + "ANNEX_VII_CLEAN_ITEM_UNIQUE_DEFAULT_CLASS": 113, + "ANNEX_IX_NEEDS_OPERATION_OR_CONDITION": 174, + "SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD": 296, + "ANNEX_I_CLEAN_ITEM_UNIQUE_DEFAULT_CLASS": 262, + "ANNEX_I_NEEDS_OPERATION_OR_CONDITION": 196, + "ANNEX_VII_NEEDS_OPERATION_OR_CONDITION": 193, + "NO_VALID_NCM": 91, + "LISTED_IN_MORE_THAN_ONE_ANNEX": 315, + "ANNEX_VIII_CLEAN_ITEM_UNIQUE_DEFAULT_CLASS": 580, + "ANNEX_X_NEEDS_OPERATION_OR_CONDITION": 22, + "ANNEX_IV_NEEDS_OPERATION_OR_CONDITION": 156, + "ANNEX_XV_CLEAN_ITEM_UNIQUE_DEFAULT_CLASS": 34, + "ANNEX_II_NEEDS_OPERATION_OR_CONDITION": 11, + "ANNEX_XV_NEEDS_OPERATION_OR_CONDITION": 42, + "ANNEX_V_NEEDS_OPERATION_OR_CONDITION": 12, + "ANNEX_XI_NEEDS_OPERATION_OR_CONDITION": 12, + "ANNEX_VI_NEEDS_OPERATION_OR_CONDITION": 3 + }, + "catalog_compatibility": { + "compatibility": "MATERIAL_MISMATCH", + "counts": { + "MATCH_SAFE": 131, + "MATCH_WITH_NON_MATERIAL_DIFFERENCE": 0, + "MISMATCH": 11, + "EXPIRED": 3, + "MISSING_LOCAL": 19, + "MISSING_OFFICIAL": 0 + }, + "expired_present_locally": 3 + } + }, + "by_status": { + "SUGGESTION_ONLY": 6430, + "RESOLVED_WITH_EXPLICIT_RULE": 989, + "AMBIGUOUS": 1432, + "INSUFFICIENT_EVIDENCE": 91 + }, + "rtc_blocker_types": { + "CCLASSTRIB_MISSING_UNRESOLVED": 6430, + "CCLASSTRIB_MISSING": 989, + "CCLASSTRIB_AMBIGUOUS": 1432, + "RTC_RULE_EVIDENCE_MISSING": 91 + }, + "AUTO_APPLY_CANDIDATES": 989, + "context": { + "rtc_param": "0", + "rtc_source": "SIMULATION", + "rtc_observed_at": "2026-09-25T11:52:45+00:00", + "local_catalog_hash": "be8c5899fff3e236c6c77bbb887087c0a2db048aeff763a5823676c7b478a151", + "official_catalog": { + "sha256": "1448cb63a41bdb67ea30b4e11f4dc200d9568542c6b9335b6cff87a4fd664654", + "publication": "2026-06-22", + "file": "cClassTrib 2026-06-22.xlsx" + }, + "catalog_integrity": { + "classes": 145, + "cst": 18, + "orphan_classes": 0, + "bad_class_format": 0, + "bad_cst_format": 0, + "duplicates": 0, + "valid": true + } + } + } + } + }, + "MMMODAS": { + "crt": "1", + "total_products": 20997, + "passes": { + "AS_FOUND": { + "crt": "1", + "rtc_enabled": false, + "products": 20996, + "resolution_summary": null, + "by_status": { + "NOT_EVALUATED": 20996 + }, + "rtc_blocker_types": {}, + "AUTO_APPLY_CANDIDATES": 0, + "context": { + "rtc_param": "0", + "rtc_source": "PARAMETROS.USAR_REFORMA_TRIBUTARIA", + "rtc_observed_at": "2026-09-25T11:52:47+00:00", + "local_catalog_hash": "1da77aec27fbde88488d1edf562f3af315ab2b5d06efb2e0b2f1ed606585d459", + "official_catalog": null, + "catalog_integrity": { + "classes": 145, + "cst": 18, + "orphan_classes": 0, + "bad_class_format": 0, + "bad_cst_format": 0, + "duplicates": 0, + "valid": true + } + } + }, + "WHATIF_RTC_ON": { + "crt": "1", + "rtc_enabled": true, + "products": 20996, + "resolution_summary": { + "total": 20996, + "valid_existing": 0, + "ready_to_apply": 0, + "suggestion_only": 0, + "ambiguous": 0, + "insufficient": 20996, + "conflicts": 0, + "official_mismatch": 0, + "catalog_incompatible": 0, + "not_applicable": 0, + "other_blocked": 0, + "by_rule": { + "RTC-R1": 20996 + }, + "by_reason": { + "SIMPLES_ORIENTATION_PENDING_OFFICIAL_NT": 20996 + }, + "catalog_compatibility": { + "compatibility": "MATERIAL_MISMATCH", + "counts": { + "MATCH_SAFE": 131, + "MATCH_WITH_NON_MATERIAL_DIFFERENCE": 0, + "MISMATCH": 11, + "EXPIRED": 3, + "MISSING_LOCAL": 19, + "MISSING_OFFICIAL": 0 + }, + "expired_present_locally": 3 + } + }, + "by_status": { + "INSUFFICIENT_EVIDENCE": 20996 + }, + "rtc_blocker_types": { + "CCLASSTRIB_MISSING_UNRESOLVED": 20996 + }, + "AUTO_APPLY_CANDIDATES": 0, + "context": { + "rtc_param": "0", + "rtc_source": "SIMULATION", + "rtc_observed_at": "2026-09-25T11:52:49+00:00", + "local_catalog_hash": "1da77aec27fbde88488d1edf562f3af315ab2b5d06efb2e0b2f1ed606585d459", + "official_catalog": { + "sha256": "1448cb63a41bdb67ea30b4e11f4dc200d9568542c6b9335b6cff87a4fd664654", + "publication": "2026-06-22", + "file": "cClassTrib 2026-06-22.xlsx" + }, + "catalog_integrity": { + "classes": 145, + "cst": 18, + "orphan_classes": 0, + "bad_class_format": 0, + "bad_cst_format": 0, + "duplicates": 0, + "valid": true + } + } + }, + "WHATIF_NORMAL_ON": { + "crt": "3", + "rtc_enabled": true, + "products": 20996, + "resolution_summary": { + "total": 20996, + "valid_existing": 0, + "ready_to_apply": 1, + "suggestion_only": 20565, + "ambiguous": 314, + "insufficient": 116, + "conflicts": 0, + "official_mismatch": 0, + "catalog_incompatible": 0, + "not_applicable": 0, + "other_blocked": 0, + "by_rule": { + "RTC-R3": 1, + "RTC-R4": 20565, + "RTC-R2": 116, + "RTC-A3": 313, + "RTC-A1": 1 + }, + "by_reason": { + "ANNEX_VII_CLEAN_ITEM_UNIQUE_DEFAULT_CLASS": 1, + "NCM_IN_NO_ANNEX_AND_NO_NATURE_BASED_CHAPTER": 20565, + "NO_VALID_NCM": 116, + "SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD": 313, + "ANNEX_XV_NEEDS_OPERATION_OR_CONDITION": 1 + }, + "catalog_compatibility": { + "compatibility": "MATERIAL_MISMATCH", + "counts": { + "MATCH_SAFE": 131, + "MATCH_WITH_NON_MATERIAL_DIFFERENCE": 0, + "MISMATCH": 11, + "EXPIRED": 3, + "MISSING_LOCAL": 19, + "MISSING_OFFICIAL": 0 + }, + "expired_present_locally": 3 + } + }, + "by_status": { + "RESOLVED_WITH_EXPLICIT_RULE": 1, + "SUGGESTION_ONLY": 20565, + "INSUFFICIENT_EVIDENCE": 116, + "AMBIGUOUS": 314 + }, + "rtc_blocker_types": { + "CCLASSTRIB_MISSING": 1, + "CCLASSTRIB_MISSING_UNRESOLVED": 20565, + "RTC_RULE_EVIDENCE_MISSING": 116, + "CCLASSTRIB_AMBIGUOUS": 314 + }, + "AUTO_APPLY_CANDIDATES": 1, + "context": { + "rtc_param": "0", + "rtc_source": "SIMULATION", + "rtc_observed_at": "2026-09-25T11:52:55+00:00", + "local_catalog_hash": "1da77aec27fbde88488d1edf562f3af315ab2b5d06efb2e0b2f1ed606585d459", + "official_catalog": { + "sha256": "1448cb63a41bdb67ea30b4e11f4dc200d9568542c6b9335b6cff87a4fd664654", + "publication": "2026-06-22", + "file": "cClassTrib 2026-06-22.xlsx" + }, + "catalog_integrity": { + "classes": 145, + "cst": 18, + "orphan_classes": 0, + "bad_class_format": 0, + "bad_cst_format": 0, + "duplicates": 0, + "valid": true + } + } + } + } + } + } +} \ No newline at end of file diff --git a/docs/runs/final_corpus/scale_agent_MMMODAS.json b/docs/runs/final_corpus/scale_agent_MMMODAS.json new file mode 100644 index 0000000..1247976 --- /dev/null +++ b/docs/runs/final_corpus/scale_agent_MMMODAS.json @@ -0,0 +1,14 @@ +{ + "database": "MMMODAS", + "phases_seconds": { + "firebird_read": 1.15, + "hub_classification": 722.4, + "operational_states": 0.12, + "fiscal_rtc_pis_cofins_assessment": 1.38, + "payload_generation": 0.01 + }, + "products": 20997, + "total_seconds": 725.06, + "peak_rss_mb": null, + "products_per_second": 29.0 +} \ No newline at end of file diff --git a/docs/runs/final_corpus/unified_coverage_CONSTRUCAO.json b/docs/runs/final_corpus/unified_coverage_CONSTRUCAO.json new file mode 100644 index 0000000..6610076 --- /dev/null +++ b/docs/runs/final_corpus/unified_coverage_CONSTRUCAO.json @@ -0,0 +1,657 @@ +{ + "mode": "FULL (Hub decision + fiscal)", + "database": "CONSTRUCAO", + "crt": "1", + "products": 3712, + "fiscal_products_read": 3712, + "BEFORE": { + "COMPLETE_PRODUCTS": 3698, + "SAFE_BLOCKED_PRODUCTS": 14, + "COVERAGE_PERCENT": 99.62, + "UNKNOWN_APPLICABILITY_previous_model": 3712 + }, + "runs": { + "ERP_AS_FOUND": { + "rtc_enabled": true, + "TOTAL_PRODUCTS": 3712, + "COMPLETE_PRODUCTS": 0, + "SAFE_BLOCKED_PRODUCTS": 3712, + "FAILED_PRODUCTS": 0, + "UNCLASSIFIED_PRODUCTS": 0, + "COVERAGE_PERCENT": 0.0, + "INVARIANT_PASS": true, + "PIS_BLOCKERS": 0, + "COFINS_BLOCKERS": 0, + "RTC_BLOCKERS": 3712, + "OTHER_BLOCKERS": 0, + "blockers_by_type": { + "CCLASSTRIB_MISSING_UNRESOLVED": 3712 + }, + "applicability": { + "NOT_APPLICABLE": 3712 + }, + "rtc_applicability": { + "REQUIRED": 3712 + }, + "changed_products": 3698, + "examples": [ + { + "product": "000001", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000002", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000003", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000004", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000005", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000006", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000007", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000008", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000009", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000010", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000011", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000012", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000013", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000014", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000015", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000016", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000017", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000018", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000019", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000020", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000021", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000022", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000023", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000024", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000025", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000026", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000027", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000028", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000029", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000030", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + } + ], + "non_canonical_warnings": 0, + "context": { + "rtc_enabled": true, + "erp_rtc_enabled": true, + "rtc_supported": true, + "rtc_catalog_valid": true, + "rtc_param": "1", + "rtc_source": "PARAMETROS.USAR_REFORMA_TRIBUTARIA", + "rtc_param_rows": 1, + "rtc_param_conflict": false, + "rtc_observed_at": "2026-09-25T11:29:29+00:00", + "legal_effective_context": { + "crt": "1", + "informational_only": true, + "ibs_cbs_in_documents": "MANDATORY_FROM_2027-01-01", + "cclasstrib_orientation": "PENDING_OFFICIAL_NT", + "sources": [ + "Ato Conjunto RFB/CGIBS n 4/2026 (DOU 31/07/2026) art. 1 I, II and par. 1", + "NT 2025.002-RTC v1.51 (Portal NF-e, 04/08/2026): CRT 1/2/4 orientations in a future NT", + "LC 214/2025 art. 348" + ] + }, + "catalog_integrity": { + "classes": 145, + "cst": 18, + "orphan_classes": 0, + "bad_class_format": 0, + "bad_cst_format": 0, + "duplicates": 0, + "valid": true + }, + "crt": "1", + "products_evaluated": 3712, + "pis_cofins_applicability": { + "NOT_APPLICABLE": 3712 + }, + "rtc_resolution": { + "total": 3712, + "valid_existing": 0, + "ready_to_apply": 0, + "suggestion_only": 0, + "ambiguous": 0, + "insufficient": 3712, + "conflicts": 0, + "official_mismatch": 0, + "catalog_incompatible": 0, + "not_applicable": 0, + "other_blocked": 0, + "by_rule": { + "RTC-R1": 3712 + }, + "by_reason": { + "SIMPLES_ORIENTATION_PENDING_OFFICIAL_NT": 3712 + }, + "catalog_compatibility": { + "compatibility": "MATERIAL_MISMATCH", + "counts": { + "MATCH_SAFE": 131, + "MATCH_WITH_NON_MATERIAL_DIFFERENCE": 0, + "MISMATCH": 11, + "EXPIRED": 3, + "MISSING_LOCAL": 19, + "MISSING_OFFICIAL": 0 + }, + "expired_present_locally": 3 + } + }, + "local_catalog_hash": "be8c5899fff3e236c6c77bbb887087c0a2db048aeff763a5823676c7b478a151", + "official_catalog": { + "sha256": "1448cb63a41bdb67ea30b4e11f4dc200d9568542c6b9335b6cff87a4fd664654", + "publication": "2026-06-22", + "file": "cClassTrib 2026-06-22.xlsx" + }, + "non_canonical_warnings": { + "products": 0, + "by_type": {}, + "samples": [] + } + } + }, + "RTC_OFF_SIMULATION": { + "rtc_enabled": false, + "TOTAL_PRODUCTS": 3712, + "COMPLETE_PRODUCTS": 3698, + "SAFE_BLOCKED_PRODUCTS": 14, + "FAILED_PRODUCTS": 0, + "UNCLASSIFIED_PRODUCTS": 0, + "COVERAGE_PERCENT": 99.62, + "INVARIANT_PASS": true, + "PIS_BLOCKERS": 0, + "COFINS_BLOCKERS": 0, + "RTC_BLOCKERS": 0, + "OTHER_BLOCKERS": 0, + "blockers_by_type": {}, + "applicability": { + "NOT_APPLICABLE": 3712 + }, + "rtc_applicability": { + "NOT_APPLICABLE": 3712 + }, + "changed_products": 0, + "examples": [], + "non_canonical_warnings": 0 + }, + "RTC_ON_SIMULATION": { + "rtc_enabled": true, + "TOTAL_PRODUCTS": 3712, + "COMPLETE_PRODUCTS": 0, + "SAFE_BLOCKED_PRODUCTS": 3712, + "FAILED_PRODUCTS": 0, + "UNCLASSIFIED_PRODUCTS": 0, + "COVERAGE_PERCENT": 0.0, + "INVARIANT_PASS": true, + "PIS_BLOCKERS": 0, + "COFINS_BLOCKERS": 0, + "RTC_BLOCKERS": 3712, + "OTHER_BLOCKERS": 0, + "blockers_by_type": { + "CCLASSTRIB_MISSING_UNRESOLVED": 3712 + }, + "applicability": { + "NOT_APPLICABLE": 3712 + }, + "rtc_applicability": { + "REQUIRED": 3712 + }, + "changed_products": 3698, + "examples": [ + { + "product": "000001", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000002", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000003", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000004", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000005", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000006", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000007", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000008", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000009", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000010", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000011", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000012", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000013", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000014", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000015", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000016", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000017", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000018", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000019", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000020", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000021", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000022", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000023", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000024", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000025", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000026", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000027", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000028", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000029", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000030", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + } + ], + "non_canonical_warnings": 0 + } + }, + "SAFETY": { + "FIREBIRD_WRITES": 0, + "WRITE_ATTEMPTS": 0, + "WRITE_SUCCESSES": 0, + "connection_mode": "READ COMMITTED READ ONLY (Agent reader); no write-capable connection opened" + } +} \ No newline at end of file diff --git a/docs/runs/final_corpus/unified_coverage_MMMODAS.json b/docs/runs/final_corpus/unified_coverage_MMMODAS.json new file mode 100644 index 0000000..cd1b90d --- /dev/null +++ b/docs/runs/final_corpus/unified_coverage_MMMODAS.json @@ -0,0 +1,380 @@ +{ + "mode": "FULL (Hub decision + fiscal)", + "database": "MMMODAS", + "crt": "1", + "products": 20997, + "fiscal_products_read": 20997, + "BEFORE": { + "COMPLETE_PRODUCTS": 20881, + "SAFE_BLOCKED_PRODUCTS": 116, + "COVERAGE_PERCENT": 99.45, + "UNKNOWN_APPLICABILITY_previous_model": 20996 + }, + "runs": { + "ERP_AS_FOUND": { + "rtc_enabled": false, + "TOTAL_PRODUCTS": 20997, + "COMPLETE_PRODUCTS": 20881, + "SAFE_BLOCKED_PRODUCTS": 116, + "FAILED_PRODUCTS": 0, + "UNCLASSIFIED_PRODUCTS": 0, + "COVERAGE_PERCENT": 99.45, + "INVARIANT_PASS": true, + "PIS_BLOCKERS": 0, + "COFINS_BLOCKERS": 0, + "RTC_BLOCKERS": 0, + "OTHER_BLOCKERS": 0, + "blockers_by_type": {}, + "applicability": { + "NOT_APPLICABLE": 20996 + }, + "rtc_applicability": { + "NOT_APPLICABLE": 20996 + }, + "changed_products": 0, + "examples": [], + "non_canonical_warnings": 0, + "context": { + "rtc_enabled": false, + "erp_rtc_enabled": false, + "rtc_supported": true, + "rtc_catalog_valid": true, + "rtc_param": "0", + "rtc_source": "PARAMETROS.USAR_REFORMA_TRIBUTARIA", + "rtc_param_rows": 1, + "rtc_param_conflict": false, + "rtc_observed_at": "2026-09-25T11:47:33+00:00", + "legal_effective_context": { + "crt": "1", + "informational_only": true, + "ibs_cbs_in_documents": "MANDATORY_FROM_2027-01-01", + "cclasstrib_orientation": "PENDING_OFFICIAL_NT", + "sources": [ + "Ato Conjunto RFB/CGIBS n 4/2026 (DOU 31/07/2026) art. 1 I, II and par. 1", + "NT 2025.002-RTC v1.51 (Portal NF-e, 04/08/2026): CRT 1/2/4 orientations in a future NT", + "LC 214/2025 art. 348" + ] + }, + "catalog_integrity": { + "classes": 145, + "cst": 18, + "orphan_classes": 0, + "bad_class_format": 0, + "bad_cst_format": 0, + "duplicates": 0, + "valid": true + }, + "crt": "1", + "products_evaluated": 20997, + "pis_cofins_applicability": { + "NOT_APPLICABLE": 20997 + }, + "rtc_resolution": null, + "local_catalog_hash": "1da77aec27fbde88488d1edf562f3af315ab2b5d06efb2e0b2f1ed606585d459", + "official_catalog": null, + "non_canonical_warnings": { + "products": 0, + "by_type": {}, + "samples": [] + } + } + }, + "RTC_OFF_SIMULATION": { + "rtc_enabled": false, + "TOTAL_PRODUCTS": 20997, + "COMPLETE_PRODUCTS": 20881, + "SAFE_BLOCKED_PRODUCTS": 116, + "FAILED_PRODUCTS": 0, + "UNCLASSIFIED_PRODUCTS": 0, + "COVERAGE_PERCENT": 99.45, + "INVARIANT_PASS": true, + "PIS_BLOCKERS": 0, + "COFINS_BLOCKERS": 0, + "RTC_BLOCKERS": 0, + "OTHER_BLOCKERS": 0, + "blockers_by_type": {}, + "applicability": { + "NOT_APPLICABLE": 20996 + }, + "rtc_applicability": { + "NOT_APPLICABLE": 20996 + }, + "changed_products": 0, + "examples": [], + "non_canonical_warnings": 0 + }, + "RTC_ON_SIMULATION": { + "rtc_enabled": true, + "TOTAL_PRODUCTS": 20997, + "COMPLETE_PRODUCTS": 0, + "SAFE_BLOCKED_PRODUCTS": 20997, + "FAILED_PRODUCTS": 0, + "UNCLASSIFIED_PRODUCTS": 0, + "COVERAGE_PERCENT": 0.0, + "INVARIANT_PASS": true, + "PIS_BLOCKERS": 0, + "COFINS_BLOCKERS": 0, + "RTC_BLOCKERS": 20996, + "OTHER_BLOCKERS": 0, + "blockers_by_type": { + "CCLASSTRIB_MISSING_UNRESOLVED": 20996 + }, + "applicability": { + "NOT_APPLICABLE": 20996 + }, + "rtc_applicability": { + "REQUIRED": 20996 + }, + "changed_products": 20881, + "examples": [ + { + "product": "000002", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000003", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000006", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000008", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000011", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000013", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000014", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000016", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000017", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000018", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000019", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000020", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000022", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000023", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000024", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000025", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000026", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000027", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000028", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000029", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000030", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000031", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000032", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000033", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000034", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000038", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000039", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000040", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000041", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000042", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + } + ], + "non_canonical_warnings": 0 + } + }, + "SAFETY": { + "FIREBIRD_WRITES": 0, + "WRITE_ATTEMPTS": 0, + "WRITE_SUCCESSES": 0, + "connection_mode": "READ COMMITTED READ ONLY (Agent reader); no write-capable connection opened" + } +} \ No newline at end of file diff --git a/docs/runs/final_corpus/unified_coverage_RINCAO.json b/docs/runs/final_corpus/unified_coverage_RINCAO.json new file mode 100644 index 0000000..8ca7576 --- /dev/null +++ b/docs/runs/final_corpus/unified_coverage_RINCAO.json @@ -0,0 +1,462 @@ +{ + "mode": "FULL (Hub decision + fiscal)", + "database": "RINCAO", + "crt": "3", + "products": 894, + "fiscal_products_read": 894, + "BEFORE": { + "COMPLETE_PRODUCTS": 894, + "SAFE_BLOCKED_PRODUCTS": 0, + "COVERAGE_PERCENT": 100.0, + "UNKNOWN_APPLICABILITY_previous_model": 815 + }, + "runs": { + "ERP_AS_FOUND": { + "rtc_enabled": false, + "TOTAL_PRODUCTS": 894, + "COMPLETE_PRODUCTS": 893, + "SAFE_BLOCKED_PRODUCTS": 1, + "FAILED_PRODUCTS": 0, + "UNCLASSIFIED_PRODUCTS": 0, + "COVERAGE_PERCENT": 99.89, + "INVARIANT_PASS": true, + "PIS_BLOCKERS": 1, + "COFINS_BLOCKERS": 1, + "RTC_BLOCKERS": 0, + "OTHER_BLOCKERS": 0, + "blockers_by_type": { + "COFINS_CST_INVALID": 1, + "PIS_CST_INVALID": 1 + }, + "applicability": { + "OPTIONAL": 894 + }, + "rtc_applicability": { + "NOT_APPLICABLE": 894 + }, + "changed_products": 1, + "examples": [ + { + "product": "000866", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "COFINS_CST_INVALID", + "PIS_CST_INVALID" + ] + } + ], + "non_canonical_warnings": 78, + "context": { + "rtc_enabled": false, + "erp_rtc_enabled": false, + "rtc_supported": true, + "rtc_catalog_valid": true, + "rtc_param": "0", + "rtc_source": "PARAMETROS.USAR_REFORMA_TRIBUTARIA", + "rtc_param_rows": 1, + "rtc_param_conflict": false, + "rtc_observed_at": "2026-09-25T11:30:07+00:00", + "legal_effective_context": { + "crt": "3", + "informational_only": true, + "ibs_cbs_in_documents": "MANDATORY_FROM_2026-08-03", + "cclasstrib_orientation": "TABLE_AND_LC214_ANNEXES", + "sources": [ + "Ato Conjunto RFB/CGIBS n 4/2026 (DOU 31/07/2026) art. 1 I, II and par. 1", + "NT 2025.002-RTC v1.51 (Portal NF-e, 04/08/2026): CRT 1/2/4 orientations in a future NT", + "LC 214/2025 art. 348" + ] + }, + "catalog_integrity": { + "classes": 145, + "cst": 18, + "orphan_classes": 0, + "bad_class_format": 0, + "bad_cst_format": 0, + "duplicates": 0, + "valid": true + }, + "crt": "3", + "products_evaluated": 894, + "pis_cofins_applicability": { + "OPTIONAL": 894 + }, + "rtc_resolution": null, + "local_catalog_hash": "be8c5899fff3e236c6c77bbb887087c0a2db048aeff763a5823676c7b478a151", + "official_catalog": null, + "non_canonical_warnings": { + "products": 78, + "by_type": { + "CST_COFINS_NON_CANONICAL_FORMAT": 78, + "CST_PIS_NON_CANONICAL_FORMAT": 78 + }, + "samples": [ + { + "product_code": "000139", + "type": "CST_PIS_NON_CANONICAL_FORMAT", + "reason": "EXIT:4->04" + }, + { + "product_code": "000139", + "type": "CST_COFINS_NON_CANONICAL_FORMAT", + "reason": "EXIT:4->04" + }, + { + "product_code": "000140", + "type": "CST_PIS_NON_CANONICAL_FORMAT", + "reason": "EXIT:4->04" + }, + { + "product_code": "000140", + "type": "CST_COFINS_NON_CANONICAL_FORMAT", + "reason": "EXIT:4->04" + }, + { + "product_code": "000141", + "type": "CST_PIS_NON_CANONICAL_FORMAT", + "reason": "EXIT:4->04" + }, + { + "product_code": "000141", + "type": "CST_COFINS_NON_CANONICAL_FORMAT", + "reason": "EXIT:4->04" + }, + { + "product_code": "000142", + "type": "CST_PIS_NON_CANONICAL_FORMAT", + "reason": "EXIT:4->04" + }, + { + "product_code": "000142", + "type": "CST_COFINS_NON_CANONICAL_FORMAT", + "reason": "EXIT:4->04" + }, + { + "product_code": "000143", + "type": "CST_PIS_NON_CANONICAL_FORMAT", + "reason": "EXIT:4->04" + }, + { + "product_code": "000143", + "type": "CST_COFINS_NON_CANONICAL_FORMAT", + "reason": "EXIT:4->04" + } + ] + } + } + }, + "RTC_OFF_SIMULATION": { + "rtc_enabled": false, + "TOTAL_PRODUCTS": 894, + "COMPLETE_PRODUCTS": 893, + "SAFE_BLOCKED_PRODUCTS": 1, + "FAILED_PRODUCTS": 0, + "UNCLASSIFIED_PRODUCTS": 0, + "COVERAGE_PERCENT": 99.89, + "INVARIANT_PASS": true, + "PIS_BLOCKERS": 1, + "COFINS_BLOCKERS": 1, + "RTC_BLOCKERS": 0, + "OTHER_BLOCKERS": 0, + "blockers_by_type": { + "COFINS_CST_INVALID": 1, + "PIS_CST_INVALID": 1 + }, + "applicability": { + "OPTIONAL": 894 + }, + "rtc_applicability": { + "NOT_APPLICABLE": 894 + }, + "changed_products": 1, + "examples": [ + { + "product": "000866", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "COFINS_CST_INVALID", + "PIS_CST_INVALID" + ] + } + ], + "non_canonical_warnings": 78 + }, + "RTC_ON_SIMULATION": { + "rtc_enabled": true, + "TOTAL_PRODUCTS": 894, + "COMPLETE_PRODUCTS": 0, + "SAFE_BLOCKED_PRODUCTS": 894, + "FAILED_PRODUCTS": 0, + "UNCLASSIFIED_PRODUCTS": 0, + "COVERAGE_PERCENT": 0.0, + "INVARIANT_PASS": true, + "PIS_BLOCKERS": 1, + "COFINS_BLOCKERS": 1, + "RTC_BLOCKERS": 894, + "OTHER_BLOCKERS": 0, + "blockers_by_type": { + "COFINS_CST_INVALID": 1, + "PIS_CST_INVALID": 1, + "RTC_RULE_EVIDENCE_MISSING": 894 + }, + "applicability": { + "OPTIONAL": 894 + }, + "rtc_applicability": { + "REQUIRED": 894 + }, + "changed_products": 894, + "examples": [ + { + "product": "000001", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "RTC_RULE_EVIDENCE_MISSING" + ] + }, + { + "product": "000004", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "RTC_RULE_EVIDENCE_MISSING" + ] + }, + { + "product": "000005", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "RTC_RULE_EVIDENCE_MISSING" + ] + }, + { + "product": "000006", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "RTC_RULE_EVIDENCE_MISSING" + ] + }, + { + "product": "000007", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "RTC_RULE_EVIDENCE_MISSING" + ] + }, + { + "product": "000008", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "RTC_RULE_EVIDENCE_MISSING" + ] + }, + { + "product": "000009", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "RTC_RULE_EVIDENCE_MISSING" + ] + }, + { + "product": "000010", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "RTC_RULE_EVIDENCE_MISSING" + ] + }, + { + "product": "000011", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "RTC_RULE_EVIDENCE_MISSING" + ] + }, + { + "product": "000012", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "RTC_RULE_EVIDENCE_MISSING" + ] + }, + { + "product": "000013", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "RTC_RULE_EVIDENCE_MISSING" + ] + }, + { + "product": "000014", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "RTC_RULE_EVIDENCE_MISSING" + ] + }, + { + "product": "000015", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "RTC_RULE_EVIDENCE_MISSING" + ] + }, + { + "product": "000016", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "RTC_RULE_EVIDENCE_MISSING" + ] + }, + { + "product": "000017", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "RTC_RULE_EVIDENCE_MISSING" + ] + }, + { + "product": "000018", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "RTC_RULE_EVIDENCE_MISSING" + ] + }, + { + "product": "000019", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "RTC_RULE_EVIDENCE_MISSING" + ] + }, + { + "product": "000020", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "RTC_RULE_EVIDENCE_MISSING" + ] + }, + { + "product": "000021", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "RTC_RULE_EVIDENCE_MISSING" + ] + }, + { + "product": "000022", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "RTC_RULE_EVIDENCE_MISSING" + ] + }, + { + "product": "000023", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "RTC_RULE_EVIDENCE_MISSING" + ] + }, + { + "product": "000024", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "RTC_RULE_EVIDENCE_MISSING" + ] + }, + { + "product": "000025", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "RTC_RULE_EVIDENCE_MISSING" + ] + }, + { + "product": "000026", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "RTC_RULE_EVIDENCE_MISSING" + ] + }, + { + "product": "000027", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "RTC_RULE_EVIDENCE_MISSING" + ] + }, + { + "product": "000028", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "RTC_RULE_EVIDENCE_MISSING" + ] + }, + { + "product": "000029", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "RTC_RULE_EVIDENCE_MISSING" + ] + }, + { + "product": "000030", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "RTC_RULE_EVIDENCE_MISSING" + ] + }, + { + "product": "000031", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "RTC_RULE_EVIDENCE_MISSING" + ] + }, + { + "product": "000032", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "RTC_RULE_EVIDENCE_MISSING" + ] + } + ], + "non_canonical_warnings": 78 + } + }, + "SAFETY": { + "FIREBIRD_WRITES": 0, + "WRITE_ATTEMPTS": 0, + "WRITE_SUCCESSES": 0, + "connection_mode": "READ COMMITTED READ ONLY (Agent reader); no write-capable connection opened" + } +} \ No newline at end of file diff --git a/docs/runs/final_corpus/unified_coverage_TESTESOFICIAIS.json b/docs/runs/final_corpus/unified_coverage_TESTESOFICIAIS.json new file mode 100644 index 0000000..e3485e1 --- /dev/null +++ b/docs/runs/final_corpus/unified_coverage_TESTESOFICIAIS.json @@ -0,0 +1,702 @@ +{ + "mode": "FULL (Hub decision + fiscal)", + "database": "TESTESOFICIAIS", + "crt": "1", + "products": 521, + "fiscal_products_read": 521, + "BEFORE": { + "COMPLETE_PRODUCTS": 495, + "SAFE_BLOCKED_PRODUCTS": 26, + "COVERAGE_PERCENT": 95.01, + "UNKNOWN_APPLICABILITY_previous_model": 518 + }, + "runs": { + "ERP_AS_FOUND": { + "rtc_enabled": true, + "TOTAL_PRODUCTS": 521, + "COMPLETE_PRODUCTS": 0, + "SAFE_BLOCKED_PRODUCTS": 521, + "FAILED_PRODUCTS": 0, + "UNCLASSIFIED_PRODUCTS": 0, + "COVERAGE_PERCENT": 0.0, + "INVARIANT_PASS": true, + "PIS_BLOCKERS": 1, + "COFINS_BLOCKERS": 1, + "RTC_BLOCKERS": 521, + "OTHER_BLOCKERS": 0, + "blockers_by_type": { + "CCLASSTRIB_MISSING_UNRESOLVED": 521, + "COFINS_CST_INCIDENCE_MISMATCH": 1, + "PIS_CST_INCIDENCE_MISMATCH": 1 + }, + "applicability": { + "NOT_APPLICABLE": 519, + "REQUIRED": 2 + }, + "rtc_applicability": { + "REQUIRED": 521 + }, + "changed_products": 495, + "examples": [ + { + "product": "000004", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000005", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000006", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000008", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000009", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000010", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000011", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000013", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000015", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000017", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000018", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000019", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000021", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000022", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000023", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000024", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000025", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000026", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000027", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000028", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000029", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000032", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000033", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000034", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000035", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000036", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000038", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000040", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000041", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000042", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + } + ], + "non_canonical_warnings": 1, + "context": { + "rtc_enabled": true, + "erp_rtc_enabled": true, + "rtc_supported": true, + "rtc_catalog_valid": true, + "rtc_param": "1", + "rtc_source": "PARAMETROS.USAR_REFORMA_TRIBUTARIA", + "rtc_param_rows": 1, + "rtc_param_conflict": false, + "rtc_observed_at": "2026-09-25T11:27:25+00:00", + "legal_effective_context": { + "crt": "1", + "informational_only": true, + "ibs_cbs_in_documents": "MANDATORY_FROM_2027-01-01", + "cclasstrib_orientation": "PENDING_OFFICIAL_NT", + "sources": [ + "Ato Conjunto RFB/CGIBS n 4/2026 (DOU 31/07/2026) art. 1 I, II and par. 1", + "NT 2025.002-RTC v1.51 (Portal NF-e, 04/08/2026): CRT 1/2/4 orientations in a future NT", + "LC 214/2025 art. 348" + ] + }, + "catalog_integrity": { + "classes": 145, + "cst": 18, + "orphan_classes": 0, + "bad_class_format": 0, + "bad_cst_format": 0, + "duplicates": 0, + "valid": true + }, + "crt": "1", + "products_evaluated": 521, + "pis_cofins_applicability": { + "NOT_APPLICABLE": 519, + "REQUIRED": 2 + }, + "rtc_resolution": { + "total": 521, + "valid_existing": 0, + "ready_to_apply": 0, + "suggestion_only": 0, + "ambiguous": 0, + "insufficient": 521, + "conflicts": 0, + "official_mismatch": 0, + "catalog_incompatible": 0, + "not_applicable": 0, + "other_blocked": 0, + "by_rule": { + "RTC-R1": 521 + }, + "by_reason": { + "SIMPLES_ORIENTATION_PENDING_OFFICIAL_NT": 521 + }, + "catalog_compatibility": { + "compatibility": "MATERIAL_MISMATCH", + "counts": { + "MATCH_SAFE": 131, + "MATCH_WITH_NON_MATERIAL_DIFFERENCE": 0, + "MISMATCH": 11, + "EXPIRED": 3, + "MISSING_LOCAL": 19, + "MISSING_OFFICIAL": 0 + }, + "expired_present_locally": 3 + } + }, + "local_catalog_hash": "1da77aec27fbde88488d1edf562f3af315ab2b5d06efb2e0b2f1ed606585d459", + "official_catalog": { + "sha256": "1448cb63a41bdb67ea30b4e11f4dc200d9568542c6b9335b6cff87a4fd664654", + "publication": "2026-06-22", + "file": "cClassTrib 2026-06-22.xlsx" + }, + "non_canonical_warnings": { + "products": 1, + "by_type": { + "CST_COFINS_NON_CANONICAL_FORMAT": 2, + "CST_PIS_NON_CANONICAL_FORMAT": 2 + }, + "samples": [ + { + "product_code": "001434", + "type": "CST_PIS_NON_CANONICAL_FORMAT", + "reason": "ENTRY:2->02" + }, + { + "product_code": "001434", + "type": "CST_PIS_NON_CANONICAL_FORMAT", + "reason": "EXIT:2->02" + }, + { + "product_code": "001434", + "type": "CST_COFINS_NON_CANONICAL_FORMAT", + "reason": "ENTRY:2->02" + }, + { + "product_code": "001434", + "type": "CST_COFINS_NON_CANONICAL_FORMAT", + "reason": "EXIT:2->02" + } + ] + } + } + }, + "RTC_OFF_SIMULATION": { + "rtc_enabled": false, + "TOTAL_PRODUCTS": 521, + "COMPLETE_PRODUCTS": 494, + "SAFE_BLOCKED_PRODUCTS": 27, + "FAILED_PRODUCTS": 0, + "UNCLASSIFIED_PRODUCTS": 0, + "COVERAGE_PERCENT": 94.82, + "INVARIANT_PASS": true, + "PIS_BLOCKERS": 1, + "COFINS_BLOCKERS": 1, + "RTC_BLOCKERS": 0, + "OTHER_BLOCKERS": 0, + "blockers_by_type": { + "COFINS_CST_INCIDENCE_MISMATCH": 1, + "PIS_CST_INCIDENCE_MISMATCH": 1 + }, + "applicability": { + "NOT_APPLICABLE": 519, + "REQUIRED": 2 + }, + "rtc_applicability": { + "NOT_APPLICABLE": 521 + }, + "changed_products": 1, + "examples": [ + { + "product": "000700", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "COFINS_CST_INCIDENCE_MISMATCH", + "PIS_CST_INCIDENCE_MISMATCH" + ] + } + ], + "non_canonical_warnings": 1 + }, + "RTC_ON_SIMULATION": { + "rtc_enabled": true, + "TOTAL_PRODUCTS": 521, + "COMPLETE_PRODUCTS": 0, + "SAFE_BLOCKED_PRODUCTS": 521, + "FAILED_PRODUCTS": 0, + "UNCLASSIFIED_PRODUCTS": 0, + "COVERAGE_PERCENT": 0.0, + "INVARIANT_PASS": true, + "PIS_BLOCKERS": 1, + "COFINS_BLOCKERS": 1, + "RTC_BLOCKERS": 521, + "OTHER_BLOCKERS": 0, + "blockers_by_type": { + "CCLASSTRIB_MISSING_UNRESOLVED": 521, + "COFINS_CST_INCIDENCE_MISMATCH": 1, + "PIS_CST_INCIDENCE_MISMATCH": 1 + }, + "applicability": { + "NOT_APPLICABLE": 519, + "REQUIRED": 2 + }, + "rtc_applicability": { + "REQUIRED": 521 + }, + "changed_products": 495, + "examples": [ + { + "product": "000004", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000005", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000006", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000008", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000009", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000010", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000011", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000013", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000015", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000017", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000018", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000019", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000021", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000022", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000023", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000024", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000025", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000026", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000027", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000028", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000029", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000032", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000033", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000034", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000035", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000036", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000038", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000040", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000041", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000042", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + } + ], + "non_canonical_warnings": 1 + } + }, + "SAFETY": { + "FIREBIRD_WRITES": 0, + "WRITE_ATTEMPTS": 0, + "WRITE_SUCCESSES": 0, + "connection_mode": "READ COMMITTED READ ONLY (Agent reader); no write-capable connection opened" + } +} \ No newline at end of file diff --git a/docs/runs/final_corpus/unified_coverage_UNIAO.json b/docs/runs/final_corpus/unified_coverage_UNIAO.json new file mode 100644 index 0000000..5de7505 --- /dev/null +++ b/docs/runs/final_corpus/unified_coverage_UNIAO.json @@ -0,0 +1,393 @@ +{ + "mode": "FULL (Hub decision + fiscal)", + "database": "UNIAO", + "crt": "1", + "products": 8942, + "fiscal_products_read": 8942, + "BEFORE": { + "COMPLETE_PRODUCTS": 8851, + "SAFE_BLOCKED_PRODUCTS": 91, + "COVERAGE_PERCENT": 98.98, + "UNKNOWN_APPLICABILITY_previous_model": 8170 + }, + "runs": { + "ERP_AS_FOUND": { + "rtc_enabled": false, + "TOTAL_PRODUCTS": 8942, + "COMPLETE_PRODUCTS": 8851, + "SAFE_BLOCKED_PRODUCTS": 91, + "FAILED_PRODUCTS": 0, + "UNCLASSIFIED_PRODUCTS": 0, + "COVERAGE_PERCENT": 98.98, + "INVARIANT_PASS": true, + "PIS_BLOCKERS": 0, + "COFINS_BLOCKERS": 0, + "RTC_BLOCKERS": 0, + "OTHER_BLOCKERS": 0, + "blockers_by_type": {}, + "applicability": { + "NOT_APPLICABLE": 8942 + }, + "rtc_applicability": { + "NOT_APPLICABLE": 8942 + }, + "changed_products": 0, + "examples": [], + "non_canonical_warnings": 2, + "context": { + "rtc_enabled": false, + "erp_rtc_enabled": false, + "rtc_supported": true, + "rtc_catalog_valid": true, + "rtc_param": "0", + "rtc_source": "PARAMETROS.USAR_REFORMA_TRIBUTARIA", + "rtc_param_rows": 1, + "rtc_param_conflict": false, + "rtc_observed_at": "2026-09-25T11:35:07+00:00", + "legal_effective_context": { + "crt": "1", + "informational_only": true, + "ibs_cbs_in_documents": "MANDATORY_FROM_2027-01-01", + "cclasstrib_orientation": "PENDING_OFFICIAL_NT", + "sources": [ + "Ato Conjunto RFB/CGIBS n 4/2026 (DOU 31/07/2026) art. 1 I, II and par. 1", + "NT 2025.002-RTC v1.51 (Portal NF-e, 04/08/2026): CRT 1/2/4 orientations in a future NT", + "LC 214/2025 art. 348" + ] + }, + "catalog_integrity": { + "classes": 145, + "cst": 18, + "orphan_classes": 0, + "bad_class_format": 0, + "bad_cst_format": 0, + "duplicates": 0, + "valid": true + }, + "crt": "1", + "products_evaluated": 8942, + "pis_cofins_applicability": { + "NOT_APPLICABLE": 8942 + }, + "rtc_resolution": null, + "local_catalog_hash": "be8c5899fff3e236c6c77bbb887087c0a2db048aeff763a5823676c7b478a151", + "official_catalog": null, + "non_canonical_warnings": { + "products": 2, + "by_type": { + "CST_COFINS_INVALID_IGNORED": 2 + }, + "samples": [ + { + "product_code": "000304", + "type": "CST_COFINS_INVALID_IGNORED", + "reason": "ENTRY:000" + }, + { + "product_code": "003090", + "type": "CST_COFINS_INVALID_IGNORED", + "reason": "EXIT:060" + } + ] + } + } + }, + "RTC_OFF_SIMULATION": { + "rtc_enabled": false, + "TOTAL_PRODUCTS": 8942, + "COMPLETE_PRODUCTS": 8851, + "SAFE_BLOCKED_PRODUCTS": 91, + "FAILED_PRODUCTS": 0, + "UNCLASSIFIED_PRODUCTS": 0, + "COVERAGE_PERCENT": 98.98, + "INVARIANT_PASS": true, + "PIS_BLOCKERS": 0, + "COFINS_BLOCKERS": 0, + "RTC_BLOCKERS": 0, + "OTHER_BLOCKERS": 0, + "blockers_by_type": {}, + "applicability": { + "NOT_APPLICABLE": 8942 + }, + "rtc_applicability": { + "NOT_APPLICABLE": 8942 + }, + "changed_products": 0, + "examples": [], + "non_canonical_warnings": 2 + }, + "RTC_ON_SIMULATION": { + "rtc_enabled": true, + "TOTAL_PRODUCTS": 8942, + "COMPLETE_PRODUCTS": 0, + "SAFE_BLOCKED_PRODUCTS": 8942, + "FAILED_PRODUCTS": 0, + "UNCLASSIFIED_PRODUCTS": 0, + "COVERAGE_PERCENT": 0.0, + "INVARIANT_PASS": true, + "PIS_BLOCKERS": 0, + "COFINS_BLOCKERS": 0, + "RTC_BLOCKERS": 8942, + "OTHER_BLOCKERS": 0, + "blockers_by_type": { + "CCLASSTRIB_MISSING_UNRESOLVED": 8942 + }, + "applicability": { + "NOT_APPLICABLE": 8942 + }, + "rtc_applicability": { + "REQUIRED": 8942 + }, + "changed_products": 8851, + "examples": [ + { + "product": "000008", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000009", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000014", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000015", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000016", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000017", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000018", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000019", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000020", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000021", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000022", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000023", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000024", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000025", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000026", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000027", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000028", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000029", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000030", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000031", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000032", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000033", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000034", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000035", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000036", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000037", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000038", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000039", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000040", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000041", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + } + ], + "non_canonical_warnings": 2 + } + }, + "SAFETY": { + "FIREBIRD_WRITES": 0, + "WRITE_ATTEMPTS": 0, + "WRITE_SUCCESSES": 0, + "connection_mode": "READ COMMITTED READ ONLY (Agent reader); no write-capable connection opened" + } +} \ No newline at end of file diff --git a/docs/runs/rtc_copy_write_e2e.json b/docs/runs/rtc_copy_write_e2e.json index c9a51f5..321102f 100644 --- a/docs/runs/rtc_copy_write_e2e.json +++ b/docs/runs/rtc_copy_write_e2e.json @@ -151,7 +151,7 @@ "lc214_sha256": "5c7d59b3c49e5b7c066c2ad28bedf32791193a676ec1a163bec14bea5fa2f680" }, "local_catalog_hash": "1da77aec27fbde88488d1edf562f3af315ab2b5d06efb2e0b2f1ed606585d459", - "timestamp": "2026-09-25T01:06:30+00:00", + "timestamp": "2026-09-25T11:28:55+00:00", "job_id": 2, "rowcount": 1, "verified_after": true, @@ -196,7 +196,7 @@ "lc214_sha256": "5c7d59b3c49e5b7c066c2ad28bedf32791193a676ec1a163bec14bea5fa2f680" }, "local_catalog_hash": "1da77aec27fbde88488d1edf562f3af315ab2b5d06efb2e0b2f1ed606585d459", - "timestamp": "2026-09-25T01:06:30+00:00", + "timestamp": "2026-09-25T11:28:55+00:00", "job_id": 2, "rowcount": 1, "verified_after": true, diff --git a/docs/runs/rtc_resolution_audit_sample.csv b/docs/runs/rtc_resolution_audit_sample.csv index 1ffde67..3bc4c2a 100644 --- a/docs/runs/rtc_resolution_audit_sample.csv +++ b/docs/runs/rtc_resolution_audit_sample.csv @@ -39,26 +39,6 @@ CONSTRUCAO,000115,87141000,,,AMBIGUOUS,RTC-A3,SPECIAL_REGIME_DEPENDS_ON_NATURE_O CONSTRUCAO,000116,87141000,,,AMBIGUOUS,RTC-A3,SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD,NONE,"WHATIF_NORMAL_ON (regime normal, RTC on)" CONSTRUCAO,000117,87141000,,,AMBIGUOUS,RTC-A3,SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD,NONE,"WHATIF_NORMAL_ON (regime normal, RTC on)" CONSTRUCAO,000118,87141000,,,AMBIGUOUS,RTC-A3,SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD,NONE,"WHATIF_NORMAL_ON (regime normal, RTC on)" -MMMODAS,000002,19022000,,200034,RESOLVED_WITH_EXPLICIT_RULE,RTC-R3,ANNEX_VII_CLEAN_ITEM_UNIQUE_DEFAULT_CLASS,ANNEX_TEXT_MATCH,"WHATIF_NORMAL_ON (regime normal, RTC on)" -MMMODAS,000729,90041000,,,AMBIGUOUS,RTC-A3,SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD,NONE,"WHATIF_NORMAL_ON (regime normal, RTC on)" -MMMODAS,000730,90041000,,,AMBIGUOUS,RTC-A3,SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD,NONE,"WHATIF_NORMAL_ON (regime normal, RTC on)" -MMMODAS,000731,90031990,,,AMBIGUOUS,RTC-A3,SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD,NONE,"WHATIF_NORMAL_ON (regime normal, RTC on)" -MMMODAS,000732,90041000,,,AMBIGUOUS,RTC-A3,SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD,NONE,"WHATIF_NORMAL_ON (regime normal, RTC on)" -MMMODAS,000733,90041000,,,AMBIGUOUS,RTC-A3,SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD,NONE,"WHATIF_NORMAL_ON (regime normal, RTC on)" -MMMODAS,000735,90041000,,,AMBIGUOUS,RTC-A3,SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD,NONE,"WHATIF_NORMAL_ON (regime normal, RTC on)" -MMMODAS,000736,90041000,,,AMBIGUOUS,RTC-A3,SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD,NONE,"WHATIF_NORMAL_ON (regime normal, RTC on)" -MMMODAS,001248,71171900,,,AMBIGUOUS,RTC-A3,SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD,NONE,"WHATIF_NORMAL_ON (regime normal, RTC on)" -MMMODAS,001259,71171900,,,AMBIGUOUS,RTC-A3,SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD,NONE,"WHATIF_NORMAL_ON (regime normal, RTC on)" -MMMODAS,001260,71171900,,,AMBIGUOUS,RTC-A3,SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD,NONE,"WHATIF_NORMAL_ON (regime normal, RTC on)" -MMMODAS,001261,71171900,,,AMBIGUOUS,RTC-A3,SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD,NONE,"WHATIF_NORMAL_ON (regime normal, RTC on)" -MMMODAS,001262,71132000,,,AMBIGUOUS,RTC-A3,SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD,NONE,"WHATIF_NORMAL_ON (regime normal, RTC on)" -MMMODAS,001263,71171900,,,AMBIGUOUS,RTC-A3,SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD,NONE,"WHATIF_NORMAL_ON (regime normal, RTC on)" -MMMODAS,001264,71132000,,,AMBIGUOUS,RTC-A3,SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD,NONE,"WHATIF_NORMAL_ON (regime normal, RTC on)" -MMMODAS,001265,71132000,,,AMBIGUOUS,RTC-A3,SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD,NONE,"WHATIF_NORMAL_ON (regime normal, RTC on)" -MMMODAS,001266,71132000,,,AMBIGUOUS,RTC-A3,SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD,NONE,"WHATIF_NORMAL_ON (regime normal, RTC on)" -MMMODAS,001267,71132000,,,AMBIGUOUS,RTC-A3,SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD,NONE,"WHATIF_NORMAL_ON (regime normal, RTC on)" -MMMODAS,001270,71132000,,,AMBIGUOUS,RTC-A3,SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD,NONE,"WHATIF_NORMAL_ON (regime normal, RTC on)" -MMMODAS,001272,71132000,,,AMBIGUOUS,RTC-A3,SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD,NONE,"WHATIF_NORMAL_ON (regime normal, RTC on)" RINCAO,000004,17041000,,,AMBIGUOUS,RTC-A1,ANNEX_X_NEEDS_OPERATION_OR_CONDITION,NONE,"WHATIF_NORMAL_ON (regime normal, RTC on)" RINCAO,000005,17041000,,,AMBIGUOUS,RTC-A1,ANNEX_X_NEEDS_OPERATION_OR_CONDITION,NONE,"WHATIF_NORMAL_ON (regime normal, RTC on)" RINCAO,000006,17041000,,,AMBIGUOUS,RTC-A1,ANNEX_X_NEEDS_OPERATION_OR_CONDITION,NONE,"WHATIF_NORMAL_ON (regime normal, RTC on)" @@ -99,3 +79,23 @@ UNIAO,000056,20081100,,,AMBIGUOUS,RTC-A1,ANNEX_VII_NEEDS_OPERATION_OR_CONDITION, UNIAO,000058,15121911,,,AMBIGUOUS,RTC-A1,ANNEX_VII_NEEDS_OPERATION_OR_CONDITION,NONE,"WHATIF_NORMAL_ON (regime normal, RTC on)" UNIAO,000064,02101200,,,AMBIGUOUS,RTC-A2,LISTED_IN_MORE_THAN_ONE_ANNEX,NONE,"WHATIF_NORMAL_ON (regime normal, RTC on)" UNIAO,000077,20089900,,200034,RESOLVED_WITH_EXPLICIT_RULE,RTC-R3,ANNEX_VII_CLEAN_ITEM_UNIQUE_DEFAULT_CLASS,ANNEX_TEXT_MATCH,"WHATIF_NORMAL_ON (regime normal, RTC on)" +MMMODAS,000002,19022000,,200034,RESOLVED_WITH_EXPLICIT_RULE,RTC-R3,ANNEX_VII_CLEAN_ITEM_UNIQUE_DEFAULT_CLASS,ANNEX_TEXT_MATCH,"WHATIF_NORMAL_ON (regime normal, RTC on)" +MMMODAS,000729,90041000,,,AMBIGUOUS,RTC-A3,SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD,NONE,"WHATIF_NORMAL_ON (regime normal, RTC on)" +MMMODAS,000730,90041000,,,AMBIGUOUS,RTC-A3,SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD,NONE,"WHATIF_NORMAL_ON (regime normal, RTC on)" +MMMODAS,000731,90031990,,,AMBIGUOUS,RTC-A3,SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD,NONE,"WHATIF_NORMAL_ON (regime normal, RTC on)" +MMMODAS,000732,90041000,,,AMBIGUOUS,RTC-A3,SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD,NONE,"WHATIF_NORMAL_ON (regime normal, RTC on)" +MMMODAS,000733,90041000,,,AMBIGUOUS,RTC-A3,SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD,NONE,"WHATIF_NORMAL_ON (regime normal, RTC on)" +MMMODAS,000735,90041000,,,AMBIGUOUS,RTC-A3,SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD,NONE,"WHATIF_NORMAL_ON (regime normal, RTC on)" +MMMODAS,000736,90041000,,,AMBIGUOUS,RTC-A3,SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD,NONE,"WHATIF_NORMAL_ON (regime normal, RTC on)" +MMMODAS,001248,71171900,,,AMBIGUOUS,RTC-A3,SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD,NONE,"WHATIF_NORMAL_ON (regime normal, RTC on)" +MMMODAS,001259,71171900,,,AMBIGUOUS,RTC-A3,SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD,NONE,"WHATIF_NORMAL_ON (regime normal, RTC on)" +MMMODAS,001260,71171900,,,AMBIGUOUS,RTC-A3,SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD,NONE,"WHATIF_NORMAL_ON (regime normal, RTC on)" +MMMODAS,001261,71171900,,,AMBIGUOUS,RTC-A3,SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD,NONE,"WHATIF_NORMAL_ON (regime normal, RTC on)" +MMMODAS,001262,71132000,,,AMBIGUOUS,RTC-A3,SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD,NONE,"WHATIF_NORMAL_ON (regime normal, RTC on)" +MMMODAS,001263,71171900,,,AMBIGUOUS,RTC-A3,SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD,NONE,"WHATIF_NORMAL_ON (regime normal, RTC on)" +MMMODAS,001264,71132000,,,AMBIGUOUS,RTC-A3,SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD,NONE,"WHATIF_NORMAL_ON (regime normal, RTC on)" +MMMODAS,001265,71132000,,,AMBIGUOUS,RTC-A3,SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD,NONE,"WHATIF_NORMAL_ON (regime normal, RTC on)" +MMMODAS,001266,71132000,,,AMBIGUOUS,RTC-A3,SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD,NONE,"WHATIF_NORMAL_ON (regime normal, RTC on)" +MMMODAS,001267,71132000,,,AMBIGUOUS,RTC-A3,SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD,NONE,"WHATIF_NORMAL_ON (regime normal, RTC on)" +MMMODAS,001270,71132000,,,AMBIGUOUS,RTC-A3,SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD,NONE,"WHATIF_NORMAL_ON (regime normal, RTC on)" +MMMODAS,001272,71132000,,,AMBIGUOUS,RTC-A3,SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD,NONE,"WHATIF_NORMAL_ON (regime normal, RTC on)" diff --git a/docs/runs/unified_coverage_e2e_MMMODAS_full_hub_decision_20260925.json b/docs/runs/unified_coverage_e2e_MMMODAS_full_hub_decision_20260925.json new file mode 100644 index 0000000..c9f63a4 --- /dev/null +++ b/docs/runs/unified_coverage_e2e_MMMODAS_full_hub_decision_20260925.json @@ -0,0 +1,380 @@ +{ + "mode": "FULL (Hub decision + fiscal)", + "database": "MMMODAS", + "crt": "1", + "products": 20997, + "fiscal_products_read": 20997, + "BEFORE": { + "COMPLETE_PRODUCTS": 20881, + "SAFE_BLOCKED_PRODUCTS": 116, + "COVERAGE_PERCENT": 99.45, + "UNKNOWN_APPLICABILITY_previous_model": 20996 + }, + "runs": { + "ERP_AS_FOUND": { + "rtc_enabled": false, + "TOTAL_PRODUCTS": 20997, + "COMPLETE_PRODUCTS": 20881, + "SAFE_BLOCKED_PRODUCTS": 116, + "FAILED_PRODUCTS": 0, + "UNCLASSIFIED_PRODUCTS": 0, + "COVERAGE_PERCENT": 99.45, + "INVARIANT_PASS": true, + "PIS_BLOCKERS": 0, + "COFINS_BLOCKERS": 0, + "RTC_BLOCKERS": 0, + "OTHER_BLOCKERS": 0, + "blockers_by_type": {}, + "applicability": { + "NOT_APPLICABLE": 20996 + }, + "rtc_applicability": { + "NOT_APPLICABLE": 20996 + }, + "changed_products": 0, + "examples": [], + "non_canonical_warnings": 0, + "context": { + "rtc_enabled": false, + "erp_rtc_enabled": false, + "rtc_supported": true, + "rtc_catalog_valid": true, + "rtc_param": "0", + "rtc_source": "PARAMETROS.USAR_REFORMA_TRIBUTARIA", + "rtc_param_rows": 1, + "rtc_param_conflict": false, + "rtc_observed_at": "2026-09-25T03:18:13+00:00", + "legal_effective_context": { + "crt": "1", + "informational_only": true, + "ibs_cbs_in_documents": "MANDATORY_FROM_2027-01-01", + "cclasstrib_orientation": "PENDING_OFFICIAL_NT", + "sources": [ + "Ato Conjunto RFB/CGIBS n 4/2026 (DOU 31/07/2026) art. 1 I, II and par. 1", + "NT 2025.002-RTC v1.51 (Portal NF-e, 04/08/2026): CRT 1/2/4 orientations in a future NT", + "LC 214/2025 art. 348" + ] + }, + "catalog_integrity": { + "classes": 145, + "cst": 18, + "orphan_classes": 0, + "bad_class_format": 0, + "bad_cst_format": 0, + "duplicates": 0, + "valid": true + }, + "crt": "1", + "products_evaluated": 20997, + "pis_cofins_applicability": { + "NOT_APPLICABLE": 20997 + }, + "rtc_resolution": null, + "local_catalog_hash": "1da77aec27fbde88488d1edf562f3af315ab2b5d06efb2e0b2f1ed606585d459", + "official_catalog": null, + "non_canonical_warnings": { + "products": 0, + "by_type": {}, + "samples": [] + } + } + }, + "RTC_OFF_SIMULATION": { + "rtc_enabled": false, + "TOTAL_PRODUCTS": 20997, + "COMPLETE_PRODUCTS": 20881, + "SAFE_BLOCKED_PRODUCTS": 116, + "FAILED_PRODUCTS": 0, + "UNCLASSIFIED_PRODUCTS": 0, + "COVERAGE_PERCENT": 99.45, + "INVARIANT_PASS": true, + "PIS_BLOCKERS": 0, + "COFINS_BLOCKERS": 0, + "RTC_BLOCKERS": 0, + "OTHER_BLOCKERS": 0, + "blockers_by_type": {}, + "applicability": { + "NOT_APPLICABLE": 20996 + }, + "rtc_applicability": { + "NOT_APPLICABLE": 20996 + }, + "changed_products": 0, + "examples": [], + "non_canonical_warnings": 0 + }, + "RTC_ON_SIMULATION": { + "rtc_enabled": true, + "TOTAL_PRODUCTS": 20997, + "COMPLETE_PRODUCTS": 0, + "SAFE_BLOCKED_PRODUCTS": 20997, + "FAILED_PRODUCTS": 0, + "UNCLASSIFIED_PRODUCTS": 0, + "COVERAGE_PERCENT": 0.0, + "INVARIANT_PASS": true, + "PIS_BLOCKERS": 0, + "COFINS_BLOCKERS": 0, + "RTC_BLOCKERS": 20996, + "OTHER_BLOCKERS": 0, + "blockers_by_type": { + "CCLASSTRIB_MISSING_UNRESOLVED": 20996 + }, + "applicability": { + "NOT_APPLICABLE": 20996 + }, + "rtc_applicability": { + "REQUIRED": 20996 + }, + "changed_products": 20881, + "examples": [ + { + "product": "000002", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000003", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000006", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000008", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000011", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000013", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000014", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000016", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000017", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000018", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000019", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000020", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000022", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000023", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000024", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000025", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000026", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000027", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000028", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000029", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000030", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000031", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000032", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000033", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000034", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000038", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000039", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000040", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000041", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + }, + { + "product": "000042", + "BEFORE_STATUS": "COMPLETE", + "AFTER_STATUS": "BLOCKED_FISCAL_DATA", + "REASON": [ + "CCLASSTRIB_MISSING_UNRESOLVED" + ] + } + ], + "non_canonical_warnings": 0 + } + }, + "SAFETY": { + "FIREBIRD_WRITES": 0, + "WRITE_ATTEMPTS": 0, + "WRITE_SUCCESSES": 0, + "connection_mode": "READ COMMITTED READ ONLY (Agent reader); no write-capable connection opened" + } +} \ No newline at end of file diff --git a/release/RELEASE_MANIFEST.json b/release/RELEASE_MANIFEST.json index a4a0548..ba66f36 100644 --- a/release/RELEASE_MANIFEST.json +++ b/release/RELEASE_MANIFEST.json @@ -1,14 +1,14 @@ { "artifact": "RELEASE_MANIFEST", - "GTI_FISCAL_VERSION": "1.2.0", - "generated_at": "2026-09-24T14:13:15+00:00", + "GTI_FISCAL_VERSION": "1.2.1", + "generated_at": "2026-09-25T11:54:55+00:00", "hub": { - "version": "1.2.0", + "version": "1.2.1", "api_compat": "1.0", "engine_version": "0.3.0", "decision_version": "mission-04c-ipi-ex-split" }, - "agent_version": "1.2.0", + "agent_version": "1.2.1", "fiscal_engine": { "ENGINE_VERSION": "0.3.0", "DECISION_VERSION": "mission-04c-ipi-ex-split", @@ -19,7 +19,7 @@ "migrations": { "alembic_head_in_repo": "0028_rtc_write_modes", "applied_revision": "0028_rtc_write_modes", - "applied_revision_source": "production Hub 10.0.10.117 (gti-fiscal-hub-fiscal-hub-1), verified 2026-09-24", + "applied_revision_source": "production Hub 10.0.10.117 (gti-fiscal-hub-fiscal-hub-1), verified 2026-09-25", "count": 28 }, "datasets_active": [ diff --git a/release/VERSION b/release/VERSION index 26aaba0..6085e94 100644 --- a/release/VERSION +++ b/release/VERSION @@ -1 +1 @@ -1.2.0 +1.2.1 diff --git a/scripts/measure_scale_agent.py b/scripts/measure_scale_agent.py new file mode 100644 index 0000000..a51f229 --- /dev/null +++ b/scripts/measure_scale_agent.py @@ -0,0 +1,50 @@ +"""READ-ONLY phase timing of the Agent pipeline on a real database (default MMMODAS ~21k products) against the local dev Hub. Reports wall time per phase and peak RSS. + python scripts/measure_scale_agent.py [--db MMMODAS]""" +import argparse +import json +import os +import sys +import time +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +sys.path[:0] = [str(ROOT), str(ROOT / "scripts"), str(ROOT / "agent" / "src")] +from dotenv import load_dotenv # noqa: E402 + +load_dotenv(ROOT / ".env") +import local_completion as lc # noqa: E402 +from central.app.operational_state import classify_product_state, summarize_operational_states # noqa: E402 +from gti_fiscal_agent import firebird_reader, unified_fiscal # noqa: E402 +from gti_fiscal_agent.client import HubClient # noqa: E402 +from gti_fiscal_agent.runner import to_hub_product # noqa: E402 + + +def rss_mb(): + try: + import psutil + return round(psutil.Process().memory_info().rss / 1e6, 1) + except Exception: # noqa: BLE001 + return None + + +def main(): + ap = argparse.ArgumentParser(); ap.add_argument("--db", default="MMMODAS"); a = ap.parse_args() + path = lc.allowlist()[a.db]; env = lc.env_for(path) + out = {"database": a.db, "phases_seconds": {}} + t = time.time(); products = firebird_reader.read_products(env); out["phases_seconds"]["firebird_read"] = round(time.time() - t, 2); out["products"] = len(products) + t = time.time(); decisions = HubClient(os.environ.get("HUB_URL", lc.HUB), os.environ["AGENT_DEV_TOKEN"]).classify_batch([to_hub_product(p) for p in products]); out["phases_seconds"]["hub_classification"] = round(time.time() - t, 2) + t = time.time(); states = [classify_product_state(p, d) for p, d in zip(products, decisions)]; summarize_operational_states(states); out["phases_seconds"]["operational_states"] = round(time.time() - t, 2) + t = time.time(); conn = firebird_reader._connect(env) + try: + assessed = unified_fiscal.assess_from_connection(conn, {"crt": "1"}, rtc_override=None) + finally: + conn.close() + out["phases_seconds"]["fiscal_rtc_pis_cofins_assessment"] = round(time.time() - t, 2) + t = time.time(); payload = json.dumps({"operational": summarize_operational_states(states), "findings": len(assessed.get("findings", {}))}); out["phases_seconds"]["payload_generation"] = round(time.time() - t, 3) + out["total_seconds"] = round(sum(out["phases_seconds"].values()), 2); out["peak_rss_mb"] = rss_mb(); out["products_per_second"] = round(len(products) / max(out["total_seconds"], 0.01), 1) + print(json.dumps(out, indent=1)) + (ROOT / "docs" / "runs" / "final_corpus" / f"scale_agent_{a.db}.json").write_text(json.dumps(out, indent=1), encoding="utf-8") + + +if __name__ == "__main__": + main() diff --git a/tests/test_release_candidate.py b/tests/test_release_candidate.py index 99c5f3c..36cb78f 100644 --- a/tests/test_release_candidate.py +++ b/tests/test_release_candidate.py @@ -14,11 +14,11 @@ sys.path.insert(0, str(ROOT)) def test_versions_are_coherent_across_hub_agent_and_packages(): from central.app.version import GTI_FISCAL_VERSION v = (ROOT / "release" / "VERSION").read_text(encoding="utf-8").strip() - assert v == GTI_FISCAL_VERSION == "1.2.0" + assert v == GTI_FISCAL_VERSION == "1.2.1" pep = v.replace("-rc", "rc") for pp in ("central/pyproject.toml", "agent/pyproject.toml"): assert f'version = "{pep}"' in (ROOT / pp).read_text(encoding="utf-8") - assert '"AGENT_VERSION", "1.2.0"' in (ROOT / "agent" / "scripts" / "run_agent_service.py").read_text(encoding="utf-8") + assert '"AGENT_VERSION", "1.2.1"' in (ROOT / "agent" / "scripts" / "run_agent_service.py").read_text(encoding="utf-8") manifest = ROOT / "release" / "RELEASE_MANIFEST.json" if manifest.exists(): m = json.loads(manifest.read_text(encoding="utf-8"))