feat: re-check central RTC authorization right before every write (GET /v1/agents/me/authorizations), human labels on the cClassTrib control page, final corpus/scale evidence; 1.2.1

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
gti
2026-09-25 08:57:45 -03:00
co-authored by Claude Sonnet 5
parent 42dc172763
commit 7063c8c161
39 changed files with 4231 additions and 58 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
[project] [project]
name = "gti-fiscal-agent" name = "gti-fiscal-agent"
version = "1.2.0" version = "1.2.1"
requires-python = ">=3.10" requires-python = ">=3.10"
dependencies = ["httpx>=0.27,<1"] dependencies = ["httpx>=0.27,<1"]
+29 -4
View File
@@ -106,7 +106,7 @@ class Config:
self.poll_interval_seconds = float(env.get("POLL_INTERVAL_SECONDS", "5")) 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. # 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.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.schema_fingerprint = env.get("SCHEMA_FINGERPRINT", REFERENCE_SCHEMA_V1)
self.state_db = env.get("AGENT_STATE_DB", str(AGENT_ROOT / "agent_state.sqlite")) 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 # Pilot write authorization: both must be explicitly set by the installer for
@@ -212,6 +212,31 @@ def _fiscal_blocked_products(products, findings):
return out 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): 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 """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.""" 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: if rollbacks:
summary["rollbacks"] = _rtc_apply.rollback_records(connection, rollbacks, now=now, job_id=job.get("job_id"))["rollbacks"] summary["rollbacks"] = _rtc_apply.rollback_records(connection, rollbacks, now=now, job_id=job.get("job_id"))["rollbacks"]
if gate["allowed"] and wanted: 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")}) summary.update({k: outcome[k] for k in ("applied", "aborted", "aborted_reasons", "write_attempts", "write_successes")})
finally: finally:
connection.close() connection.close()
@@ -323,7 +348,7 @@ def execute_job(job, config, executor, state, env):
"fiscal_context": fiscal_context, "fiscal_context": fiscal_context,
"rtc_auto_apply": rtc_apply, "rtc_auto_apply": rtc_apply,
"fiscal_mode": getattr(config, "fiscal_mode", None), "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_total": len(products),
"products_changed": len(to_process), "products_changed": len(to_process),
"products_processed": summary["processed"], "products_processed": summary["processed"],
@@ -481,7 +506,7 @@ def run(config, env, *, max_iterations=None, stopper=None):
def enforce_startup_preflight(env): def enforce_startup_preflight(env):
"""Full read-only preflight at startup (Hub, auth, Firebird, capabilities, company context, guards). Fail closed.""" """Full read-only preflight at startup (Hub, auth, Firebird, capabilities, company context, guards). Fail closed."""
from gti_fiscal_agent.preflight import run_preflight 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)) 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)) print(json.dumps({"PREFLIGHT": report["PREFLIGHT"], "blockers": report["blockers"]}, ensure_ascii=False))
if report["PREFLIGHT"] != "PASS": if report["PREFLIGHT"] != "PASS":
+1
View File
@@ -21,6 +21,7 @@ class HubClient:
response = httpx.get(f"{self.url}{path}", headers=self._headers(), timeout=30) response = httpx.get(f"{self.url}{path}", headers=self._headers(), timeout=30)
response.raise_for_status(); return response.json() response.raise_for_status(); return response.json()
def identity(self): return self.get_json("/v1/agents/me/identity") 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): def health(self):
response = httpx.get(f"{self.url}/health", timeout=10) response = httpx.get(f"{self.url}/health", timeout=10)
return response.status_code == 200 return response.status_code == 200
+1 -1
View File
@@ -9,7 +9,7 @@ import os
import sqlite3 import sqlite3
from pathlib import Path 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_ENV = ("GTI_HUB_URL", "AGENT_TOKEN", "FIREBIRD_DATABASE_PATH", "FB_USER", "FB_PASSWORD")
REQUIRED_CAPABILITIES = ("supports_ncm", "supports_ipi", "supports_cest") REQUIRED_CAPABILITIES = ("supports_ncm", "supports_ipi", "supports_cest")
FISCAL_MODES = ("DRY_RUN", "AUTO_APPLY") FISCAL_MODES = ("DRY_RUN", "AUTO_APPLY")
+10 -2
View File
@@ -147,10 +147,18 @@ def apply_candidate(conn, candidate: dict, *, company: dict, decision: dict, now
raise raise
def apply_candidates(conn, candidates: list[dict], *, company: dict, decision: dict, now: str, job_id=None, today: date | None = None) -> dict: 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.""" """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 = [], [], {} applied, aborted, reasons = [], [], {}
for candidate in candidates: 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: try:
applied.append(apply_candidate(conn, candidate, company=company, decision=decision, now=now, job_id=job_id, today=today)) applied.append(apply_candidate(conn, candidate, company=company, decision=decision, now=now, job_id=job_id, today=today))
except RtcApplyAborted as stop: except RtcApplyAborted as stop:
+38
View File
@@ -254,6 +254,16 @@ def test_catalog_hash_is_recorded_for_audit():
# ---------------------------------------------------------------- job integration (gates) # ---------------------------------------------------------------- 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(): def _service():
from test_run_agent_service import _config, service from test_run_agent_service import _config, service
return service, _config 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) 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) 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"] 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
+10
View File
@@ -252,6 +252,16 @@ def router(session_factory, bootstrap_token):
finally: finally:
session.close() 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") @routes.get("/agents/me")
def agent_status(identity=Depends(principal)): def agent_status(identity=Depends(principal)):
session, agent = identity session, agent = identity
+36 -2
View File
@@ -121,7 +121,7 @@ def job_kind_label(value):
_FISCAL_LABELS = { _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", "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", "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", "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 = { _REASON_LABELS = {
"INVALID_NCM": "NCM inválido", "LEGACY_NCM": "NCM legado", "LEGACY_NCM_NO_AUTOMATIC_SUCCESSOR": "NCM legado sem sucessor automático", "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", "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_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", "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", "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 {} 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 []), 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")} "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 ""
+1 -1
View File
@@ -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 once published — never a second, independent version number. Fiscal semantics
are versioned separately (ENGINE_VERSION/DECISION_VERSION in classification.py, are versioned separately (ENGINE_VERSION/DECISION_VERSION in classification.py,
DECISION_ENGINE_VERSION etc.) and are NOT changed by a release bump.""" 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 API_COMPAT_MAJOR_MINOR = "1.0" # an Agent 1.0.x/1.1.x talks to any Hub 1.0.x
+3 -2
View File
@@ -15,7 +15,7 @@ from .config import settings
from .blocker_resolution import BlockerResolutionUnavailable, _company_key, resolve_blocker_with_context from .blocker_resolution import BlockerResolutionUnavailable, _company_key, resolve_blocker_with_context
from .context_keys import ALLOWED_KEYS, ENUMS from .context_keys import ALLOWED_KEYS, ENUMS
from .installation_identity import reference_agent_version 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 .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 .human_auth import create_session, current_session, require_csrf, verify_password
from .panel_presentation import format_ui_datetime 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))) 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) 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, 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() finally: session.close()
@routes.post("/agents/{agent_id}/rtc-mode") @routes.post("/agents/{agent_id}/rtc-mode")
+1 -1
View File
@@ -1,6 +1,6 @@
[project] [project]
name = "gti-fiscal-hub" name = "gti-fiscal-hub"
version = "1.2.0" version = "1.2.1"
requires-python = ">=3.10" requires-python = ">=3.10"
dependencies = [ dependencies = [
"fastapi>=0.115,<1", "fastapi>=0.115,<1",
+4 -4
View File
@@ -25,9 +25,9 @@
<section class="panel"><div class="panel-title"><div><h2>Candidatos</h2><p class="muted">{{ total }} produto(s) neste filtro.</p></div></div> <section class="panel"><div class="panel-title"><div><h2>Candidatos</h2><p class="muted">{{ total }} produto(s) neste filtro.</p></div></div>
<nav class="tabs" aria-label="Filtro de candidatos">{% for st, label in [("PENDING","Pendentes"),("APPROVED","Aprovados"),("REJECTED","Rejeitados"),("APPLIED","Aplicados"),("STALE","Obsoletos")] %}<a class="{% if status==st %}active{% endif %}" href="?status={{ st }}">{{ label }} ({{ counts.get(st, 0) }})</a>{% endfor %}</nav> <nav class="tabs" aria-label="Filtro de candidatos">{% for st, label in [("PENDING","Pendentes"),("APPROVED","Aprovados"),("REJECTED","Rejeitados"),("APPLIED","Aplicados"),("STALE","Obsoletos")] %}<a class="{% if status==st %}active{% endif %}" href="?status={{ st }}">{{ label }} ({{ counts.get(st, 0) }})</a>{% endfor %}</nav>
<form method="post" action="/agents/{{ agent_id }}/rtc-candidates"><input type="hidden" name="csrf_token" value="{{ csrf_token }}"> <form method="post" action="/agents/{{ agent_id }}/rtc-candidates"><input type="hidden" name="csrf_token" value="{{ csrf_token }}">
<table><thead><tr><th></th><th>Produto</th><th>NCM</th><th>Atual</th><th>Proposto</th><th>CST IBS/CBS</th><th>Regra</th><th>Base</th><th>Status</th></tr></thead><tbody> <table><thead><tr><th></th><th>Produto</th><th>Descrição</th><th>NCM</th><th>cClassTrib atual</th><th>cClassTrib proposto</th><th>CST IBS/CBS</th><th>Regra</th><th>Fundamento</th><th>Catálogo</th><th>Situação</th></tr></thead><tbody>
{% for c in rows %}<tr><td><input type="checkbox" name="ids" value="{{ c.id }}" aria-label="Selecionar {{ c.product_code }}"></td><td>{{ c.product_code }} · {{ c.description or "" }}</td><td>{{ c.ncm }}</td><td>{{ c.current_value or "vazio" }}</td><td>{{ c.proposed }}</td><td>{{ c.cst_ibscbs }}</td><td>{{ c.rule_id }}</td><td>{{ c.basis }}</td><td>{{ c.status }}</td></tr> {% for c in rows %}<tr><td><input type="checkbox" name="ids" value="{{ c.id }}" aria-label="Selecionar {{ c.product_code }}"></td><td>{{ c.product_code }}</td><td>{{ c.description or "" }}</td><td>{{ c.ncm }}</td><td>{{ c.current_value or "vazio" }}</td><td>{{ c.proposed }}</td><td>{{ c.cst_ibscbs }}</td><td>{{ L.rule(c.rule_id) }}</td><td>{{ c.basis }}</td><td>{{ L.catalog("MATCH_SAFE") }}</td><td>{{ L.status(c.status) }}</td></tr>
{% else %}<tr><td colspan="9" class="muted">Nenhum candidato neste filtro.</td></tr>{% endfor %}</tbody></table> {% else %}<tr><td colspan="10" class="muted">Nenhum candidato neste filtro.</td></tr>{% endfor %}</tbody></table>
<p>Página {{ page }} de {{ pages }}{% if page > 1 %} · <a href="?status={{ status }}&amp;page={{ page - 1 }}">anterior</a>{% endif %}{% if page < pages %} · <a href="?status={{ status }}&amp;page={{ page + 1 }}">próxima</a>{% endif %}</p> <p>Página {{ page }} de {{ pages }}{% if page > 1 %} · <a href="?status={{ status }}&amp;page={{ page - 1 }}">anterior</a>{% endif %}{% if page < pages %} · <a href="?status={{ status }}&amp;page={{ page + 1 }}">próxima</a>{% endif %}</p>
<p><button type="submit" name="action" value="approve" class="secondary">Aprovar selecionados</button> <button type="submit" name="action" value="reject" class="caution">Rejeitar selecionados</button> <p><button type="submit" name="action" value="approve" class="secondary">Aprovar selecionados</button> <button type="submit" name="action" value="reject" class="caution">Rejeitar selecionados</button>
<button type="submit" name="action" value="approve" class="secondary" formaction="/agents/{{ agent_id }}/rtc-candidates?all=1">Aprovar todos os pendentes</button> <button type="submit" name="action" value="approve" class="secondary" formaction="/agents/{{ agent_id }}/rtc-candidates?all=1">Aprovar todos os pendentes</button>
@@ -35,7 +35,7 @@
<section class="panel"><div class="panel-title"><div><h2>Auditoria e reversão</h2><p class="muted">Cada preenchimento pode ser revertido individualmente, desde que o valor no ERP ainda seja o gravado.</p></div></div> <section class="panel"><div class="panel-title"><div><h2>Auditoria e reversão</h2><p class="muted">Cada preenchimento pode ser revertido individualmente, desde que o valor no ERP ainda seja o gravado.</p></div></div>
<table><thead><tr><th>#</th><th>Produto</th><th>Ação</th><th>Resultado</th><th>Antes → Depois</th><th>Regra</th><th>Origem</th><th>Reversão</th></tr></thead><tbody> <table><thead><tr><th>#</th><th>Produto</th><th>Ação</th><th>Resultado</th><th>Antes → Depois</th><th>Regra</th><th>Origem</th><th>Reversão</th></tr></thead><tbody>
{% for a in audits %}<tr><td>{{ a.id }}</td><td>{{ a.product_code }} · {{ a.description_snapshot or "" }}</td><td>{{ a.action or "APPLY" }}</td><td>{{ a.outcome }}{% if a.reason %} ({{ a.reason }}){% endif %}</td><td>{{ a.old_value or "vazio" }} → {{ a.new_value or "vazio" }}</td><td>{{ a.rule_id }}</td><td>{{ a.authorization_origin }}</td> {% for a in audits %}<tr><td>{{ a.id }}</td><td>{{ a.product_code }} · {{ a.description_snapshot or "" }}</td><td>{{ "Reversão" if a.action == "ROLLBACK" else "Preenchimento" }}</td><td>{{ L.outcome(a.outcome) }}{% if a.reason %} ({{ L.reason(a.reason) }}){% endif %}</td><td>{{ a.old_value or "vazio" }} → {{ a.new_value or "vazio" }}</td><td>{{ L.rule(a.rule_id) }}</td><td>{{ a.authorization_origin }}</td>
<td>{% if a.action == "APPLY" and a.outcome == "APPLIED" and not a.rollback_state %}<form method="post" action="/agents/{{ agent_id }}/rtc-rollback" style="display:inline"><input type="hidden" name="csrf_token" value="{{ csrf_token }}"><input type="hidden" name="audit_id" value="{{ a.id }}"><input type="text" name="confirm" placeholder="digite REVERTER" size="12" aria-label="Confirmar reversão"><button type="submit" class="caution">Reverter</button></form>{% else %}{{ a.rollback_state or "" }}{% endif %}</td></tr> <td>{% if a.action == "APPLY" and a.outcome == "APPLIED" and not a.rollback_state %}<form method="post" action="/agents/{{ agent_id }}/rtc-rollback" style="display:inline"><input type="hidden" name="csrf_token" value="{{ csrf_token }}"><input type="hidden" name="audit_id" value="{{ a.id }}"><input type="text" name="confirm" placeholder="digite REVERTER" size="12" aria-label="Confirmar reversão"><button type="submit" class="caution">Reverter</button></form>{% else %}{{ a.rollback_state or "" }}{% endif %}</td></tr>
{% else %}<tr><td colspan="8" class="muted">Nenhum preenchimento registrado.</td></tr>{% endfor %}</tbody></table></section> {% else %}<tr><td colspan="8" class="muted">Nenhum preenchimento registrado.</td></tr>{% endfor %}</tbody></table></section>
{% endblock %} {% endblock %}
+16
View File
@@ -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 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"): for legacy in ("Escopo anterior", "Escopo ampliado"):
assert legacy not in on 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</td>", "APPLIED</td>", "ABORTED"):
assert raw not in page
+1 -1
View File
@@ -17,7 +17,7 @@ def test_health_is_unavailable_when_database_is_down():
def test_version_endpoint_reports_release_and_fiscal_versions(): def test_version_endpoint_reports_release_and_fiscal_versions():
body = TestClient(create_app(database_probe=lambda: True)).get("/version").json() 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): def test_production_refuses_the_dev_token(monkeypatch):
+12
View File
@@ -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]) 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 "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) 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"}
+1 -1
View File
@@ -19,4 +19,4 @@ FB_PASSWORD=
FISCAL_MODE=DRY_RUN FISCAL_MODE=DRY_RUN
FIREBIRD_WRITES=0 FIREBIRD_WRITES=0
POLL_INTERVAL_SECONDS=5 POLL_INTERVAL_SECONDS=5
AGENT_VERSION=1.2.0 AGENT_VERSION=1.2.1
+1 -1
View File
@@ -164,7 +164,7 @@ switch ($Command) {
"GTI_HUB_URL=$hub", "AGENT_TOKEN=$token", "AGENT_ID=$agentId", "GTI_HUB_URL=$hub", "AGENT_TOKEN=$token", "AGENT_ID=$agentId",
"COMPANY_CODE=$code", "COMPANY_CNPJ=$cnpj", "COMPANY_CRT_SOURCE=$crtSource", "COMPANY_CODE=$code", "COMPANY_CNPJ=$cnpj", "COMPANY_CRT_SOURCE=$crtSource",
"FIREBIRD_DATABASE_PATH=$db", "FB_USER=$fbUser", "FB_PASSWORD=$fbPass", "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 Set-Content -Path $EnvFile -Value $lines -Encoding UTF8
} }
@@ -19,4 +19,4 @@ FB_PASSWORD=
FISCAL_MODE=DRY_RUN FISCAL_MODE=DRY_RUN
FIREBIRD_WRITES=0 FIREBIRD_WRITES=0
POLL_INTERVAL_SECONDS=5 POLL_INTERVAL_SECONDS=5
AGENT_VERSION=1.2.0 AGENT_VERSION=1.2.1
@@ -19,4 +19,4 @@ FB_PASSWORD=
FISCAL_MODE=DRY_RUN FISCAL_MODE=DRY_RUN
FIREBIRD_WRITES=0 FIREBIRD_WRITES=0
POLL_INTERVAL_SECONDS=5 POLL_INTERVAL_SECONDS=5
AGENT_VERSION=1.2.0 AGENT_VERSION=1.2.1
@@ -19,4 +19,4 @@ FB_PASSWORD=
FISCAL_MODE=DRY_RUN FISCAL_MODE=DRY_RUN
FIREBIRD_WRITES=0 FIREBIRD_WRITES=0
POLL_INTERVAL_SECONDS=5 POLL_INTERVAL_SECONDS=5
AGENT_VERSION=1.2.0 AGENT_VERSION=1.2.1
@@ -19,4 +19,4 @@ FB_PASSWORD=
FISCAL_MODE=DRY_RUN FISCAL_MODE=DRY_RUN
FIREBIRD_WRITES=0 FIREBIRD_WRITES=0
POLL_INTERVAL_SECONDS=5 POLL_INTERVAL_SECONDS=5
AGENT_VERSION=1.2.0 AGENT_VERSION=1.2.1
+1 -1
View File
@@ -1,5 +1,5 @@
# GTI Fiscal Hub — production environment (copy to .env, never commit .env) # 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 # REQUIRED. URL-safe secret (used inside a connection URL): openssl rand -hex 24
POSTGRES_PASSWORD= POSTGRES_PASSWORD=
+1 -1
View File
@@ -36,7 +36,7 @@ services:
build: build:
context: ../.. context: ../..
dockerfile: central/Dockerfile 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 restart: unless-stopped
depends_on: depends_on:
postgres: postgres:
+1 -1
View File
@@ -16,7 +16,7 @@ A variável de ambiente `GTI_SSH_PASSWORD`, se existir, tem prioridade. A senha
## Deploy ## Deploy
``` ```
powershell -ExecutionPolicy Bypass -File .\scripts\deploy_hub.ps1 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`. Parâmetros: `-Version` (padrão `release/VERSION`), `-PublishAgent`, `-SkipTests`, `-DryRun`.
+3
View File
@@ -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. 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 ## 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`. 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`.
@@ -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
}
}
}
}
}
}
}
@@ -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
}
@@ -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"
}
}
@@ -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"
}
}
@@ -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"
}
}
@@ -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"
}
}
@@ -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"
}
}
+2 -2
View File
@@ -151,7 +151,7 @@
"lc214_sha256": "5c7d59b3c49e5b7c066c2ad28bedf32791193a676ec1a163bec14bea5fa2f680" "lc214_sha256": "5c7d59b3c49e5b7c066c2ad28bedf32791193a676ec1a163bec14bea5fa2f680"
}, },
"local_catalog_hash": "1da77aec27fbde88488d1edf562f3af315ab2b5d06efb2e0b2f1ed606585d459", "local_catalog_hash": "1da77aec27fbde88488d1edf562f3af315ab2b5d06efb2e0b2f1ed606585d459",
"timestamp": "2026-09-25T01:06:30+00:00", "timestamp": "2026-09-25T11:28:55+00:00",
"job_id": 2, "job_id": 2,
"rowcount": 1, "rowcount": 1,
"verified_after": true, "verified_after": true,
@@ -196,7 +196,7 @@
"lc214_sha256": "5c7d59b3c49e5b7c066c2ad28bedf32791193a676ec1a163bec14bea5fa2f680" "lc214_sha256": "5c7d59b3c49e5b7c066c2ad28bedf32791193a676ec1a163bec14bea5fa2f680"
}, },
"local_catalog_hash": "1da77aec27fbde88488d1edf562f3af315ab2b5d06efb2e0b2f1ed606585d459", "local_catalog_hash": "1da77aec27fbde88488d1edf562f3af315ab2b5d06efb2e0b2f1ed606585d459",
"timestamp": "2026-09-25T01:06:30+00:00", "timestamp": "2026-09-25T11:28:55+00:00",
"job_id": 2, "job_id": 2,
"rowcount": 1, "rowcount": 1,
"verified_after": true, "verified_after": true,
+20 -20
View File
@@ -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,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,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)" 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,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,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)" 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,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,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)" 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)"
1 database product ncm current_cclasstrib proposed_cclasstrib status rule_id reason confidence_type scenario
39 CONSTRUCAO 000116 87141000 AMBIGUOUS RTC-A3 SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD NONE WHATIF_NORMAL_ON (regime normal, RTC on)
40 CONSTRUCAO 000117 87141000 AMBIGUOUS RTC-A3 SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD NONE WHATIF_NORMAL_ON (regime normal, RTC on)
41 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)
42 RINCAO 000004 17041000 AMBIGUOUS RTC-A1 ANNEX_X_NEEDS_OPERATION_OR_CONDITION NONE WHATIF_NORMAL_ON (regime normal, RTC on)
43 RINCAO 000005 17041000 AMBIGUOUS RTC-A1 ANNEX_X_NEEDS_OPERATION_OR_CONDITION NONE WHATIF_NORMAL_ON (regime normal, RTC on)
44 RINCAO 000006 17041000 AMBIGUOUS RTC-A1 ANNEX_X_NEEDS_OPERATION_OR_CONDITION NONE WHATIF_NORMAL_ON (regime normal, RTC on)
79 UNIAO 000058 15121911 AMBIGUOUS RTC-A1 ANNEX_VII_NEEDS_OPERATION_OR_CONDITION NONE WHATIF_NORMAL_ON (regime normal, RTC on)
80 UNIAO 000064 02101200 AMBIGUOUS RTC-A2 LISTED_IN_MORE_THAN_ONE_ANNEX NONE WHATIF_NORMAL_ON (regime normal, RTC on)
81 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)
82 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)
83 MMMODAS 000729 90041000 AMBIGUOUS RTC-A3 SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD NONE WHATIF_NORMAL_ON (regime normal, RTC on)
84 MMMODAS 000730 90041000 AMBIGUOUS RTC-A3 SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD NONE WHATIF_NORMAL_ON (regime normal, RTC on)
85 MMMODAS 000731 90031990 AMBIGUOUS RTC-A3 SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD NONE WHATIF_NORMAL_ON (regime normal, RTC on)
86 MMMODAS 000732 90041000 AMBIGUOUS RTC-A3 SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD NONE WHATIF_NORMAL_ON (regime normal, RTC on)
87 MMMODAS 000733 90041000 AMBIGUOUS RTC-A3 SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD NONE WHATIF_NORMAL_ON (regime normal, RTC on)
88 MMMODAS 000735 90041000 AMBIGUOUS RTC-A3 SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD NONE WHATIF_NORMAL_ON (regime normal, RTC on)
89 MMMODAS 000736 90041000 AMBIGUOUS RTC-A3 SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD NONE WHATIF_NORMAL_ON (regime normal, RTC on)
90 MMMODAS 001248 71171900 AMBIGUOUS RTC-A3 SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD NONE WHATIF_NORMAL_ON (regime normal, RTC on)
91 MMMODAS 001259 71171900 AMBIGUOUS RTC-A3 SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD NONE WHATIF_NORMAL_ON (regime normal, RTC on)
92 MMMODAS 001260 71171900 AMBIGUOUS RTC-A3 SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD NONE WHATIF_NORMAL_ON (regime normal, RTC on)
93 MMMODAS 001261 71171900 AMBIGUOUS RTC-A3 SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD NONE WHATIF_NORMAL_ON (regime normal, RTC on)
94 MMMODAS 001262 71132000 AMBIGUOUS RTC-A3 SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD NONE WHATIF_NORMAL_ON (regime normal, RTC on)
95 MMMODAS 001263 71171900 AMBIGUOUS RTC-A3 SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD NONE WHATIF_NORMAL_ON (regime normal, RTC on)
96 MMMODAS 001264 71132000 AMBIGUOUS RTC-A3 SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD NONE WHATIF_NORMAL_ON (regime normal, RTC on)
97 MMMODAS 001265 71132000 AMBIGUOUS RTC-A3 SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD NONE WHATIF_NORMAL_ON (regime normal, RTC on)
98 MMMODAS 001266 71132000 AMBIGUOUS RTC-A3 SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD NONE WHATIF_NORMAL_ON (regime normal, RTC on)
99 MMMODAS 001267 71132000 AMBIGUOUS RTC-A3 SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD NONE WHATIF_NORMAL_ON (regime normal, RTC on)
100 MMMODAS 001270 71132000 AMBIGUOUS RTC-A3 SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD NONE WHATIF_NORMAL_ON (regime normal, RTC on)
101 MMMODAS 001272 71132000 AMBIGUOUS RTC-A3 SPECIAL_REGIME_DEPENDS_ON_NATURE_OR_OPERATION_OF_THE_GOOD NONE WHATIF_NORMAL_ON (regime normal, RTC on)
@@ -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"
}
}
+5 -5
View File
@@ -1,14 +1,14 @@
{ {
"artifact": "RELEASE_MANIFEST", "artifact": "RELEASE_MANIFEST",
"GTI_FISCAL_VERSION": "1.2.0", "GTI_FISCAL_VERSION": "1.2.1",
"generated_at": "2026-09-24T14:13:15+00:00", "generated_at": "2026-09-25T11:54:55+00:00",
"hub": { "hub": {
"version": "1.2.0", "version": "1.2.1",
"api_compat": "1.0", "api_compat": "1.0",
"engine_version": "0.3.0", "engine_version": "0.3.0",
"decision_version": "mission-04c-ipi-ex-split" "decision_version": "mission-04c-ipi-ex-split"
}, },
"agent_version": "1.2.0", "agent_version": "1.2.1",
"fiscal_engine": { "fiscal_engine": {
"ENGINE_VERSION": "0.3.0", "ENGINE_VERSION": "0.3.0",
"DECISION_VERSION": "mission-04c-ipi-ex-split", "DECISION_VERSION": "mission-04c-ipi-ex-split",
@@ -19,7 +19,7 @@
"migrations": { "migrations": {
"alembic_head_in_repo": "0028_rtc_write_modes", "alembic_head_in_repo": "0028_rtc_write_modes",
"applied_revision": "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 "count": 28
}, },
"datasets_active": [ "datasets_active": [
+1 -1
View File
@@ -1 +1 @@
1.2.0 1.2.1
+50
View File
@@ -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()
+2 -2
View File
@@ -14,11 +14,11 @@ sys.path.insert(0, str(ROOT))
def test_versions_are_coherent_across_hub_agent_and_packages(): def test_versions_are_coherent_across_hub_agent_and_packages():
from central.app.version import GTI_FISCAL_VERSION from central.app.version import GTI_FISCAL_VERSION
v = (ROOT / "release" / "VERSION").read_text(encoding="utf-8").strip() 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") pep = v.replace("-rc", "rc")
for pp in ("central/pyproject.toml", "agent/pyproject.toml"): for pp in ("central/pyproject.toml", "agent/pyproject.toml"):
assert f'version = "{pep}"' in (ROOT / pp).read_text(encoding="utf-8") 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" manifest = ROOT / "release" / "RELEASE_MANIFEST.json"
if manifest.exists(): if manifest.exists():
m = json.loads(manifest.read_text(encoding="utf-8")) m = json.loads(manifest.read_text(encoding="utf-8"))