Add 'fiscal/' from commit '102ba84500dbd9655a0471288c3e278652593ca9'

git-subtree-dir: fiscal
git-subtree-mainline: d95165fc8f
git-subtree-split: 102ba84500
This commit is contained in:
gti
2026-09-29 14:43:23 -03:00
868 changed files with 566394 additions and 0 deletions
+53
View File
@@ -0,0 +1,53 @@
# GTI Fiscal 1.0.0-rc1 — Release Candidate
Status: **COMPLETE_LOCAL_RC**. Nothing was installed on a real client host and no real client database received a write (`FIREBIRD_WRITES=0`, `FISCAL_MODE=DRY_RUN`).
## Architecture
```
Hub central (Docker: Hub + PostgreSQL)
^ HTTPS
Agent Windows (service GTIFiscalAgent)
| local, read-only
SGV Firebird (C000025 / C000004)
```
The Hub never accesses Firebird and never stores Firebird credentials or paths.
## Frozen versions (`release/RELEASE_MANIFEST.json`)
| item | value |
|---|---|
| GTI_FISCAL_VERSION (Hub, Agent, packages) | 1.0.0-rc1 (`release/VERSION`, `central/app/version.py`, `GET /version`) |
| fiscal engine (`ENGINE_VERSION`) / decision (`DECISION_VERSION`) | 0.3.0 / mission-04c-ipi-ex-split (unchanged: no fiscal semantics touched) |
| decision engines | fiscal-decision-v1, product-defaults-v1, icms-context-v1 |
| migrations | 0001..0022 (head `0022_agent_releases_enrollment`, applied in production 2026-09-23; a fresh database is initialized by `alembic upgrade head` alone) |
| datasets | 13 ACTIVE kinds with sha256/record_count in the manifest |
## What RC1 adds (no fiscal rule changes)
- Agent config: `FISCAL_MODE` (DRY_RUN | AUTO_APPLY), `COMPANY_CODE`, `COMPANY_CNPJ`, `COMPANY_CRT_SOURCE` (AUTO | EMISSOR | C000004), `COMPANY_UF` as an explicit, non-substituting override; `AGENT_VERSION` default 1.0.0-rc1.
- Single preflight (`agent/scripts/preflight.py`, enforced at service start): Hub reachability/auth/version, Firebird version + ODS, C000004/C000025, capabilities (NCM, IPI, CEST), company context (UF/CRT), schema/type guards, SQLite, log directory, mode/write consistency -> `PREFLIGHT=PASS|FAIL` + blockers.
- Technical zero-write in DRY_RUN: effective writes are `FIREBIRD_WRITES=1 AND FISCAL_MODE=AUTO_APPLY`; `open_write_connection` refuses otherwise; tests cover it (`agent/tests/test_preflight_and_dry_run.py`); `scripts/prove_zero_write.py` proves it on a database.
- REPROCESS_ALL result now carries the coverage report (NCM/IPI/CEST/CFOP/CSOSN/ST/role/company context) computed on the Agent from Hub decisions (`gti_fiscal_agent/coverage.py`, shared with the multi-database tooling).
- Windows package (`deploy/agent-windows`, `scripts/build_agent_package.py`): install / configure / preflight / start / stop / restart / status / uninstall; no secrets inside; secret-scanned zip with SHA-256 manifest.
- Hub production package (`deploy/hub`): compose with PostgreSQL on an internal network (no published port), persistent volume, healthchecks, restart policy, log rotation, required secrets, `backup.sh`, `restore.sh`, dataset seed export/import; `APP_ENV=production` refuses `AGENT_DEV_TOKEN`.
- Pilot profile `pilot-construcao.env.example`; planned (not installed) `profiles/mmmodas|rincao|uniao.env.example` with `COMPANY_CRT_SOURCE=EMISSOR`.
## Profiles
| client | company context | required config |
|---|---|---|
| CONSTRUCAO (first pilot) | company 000001, UF BA, CRT 1, AUTO_RESOLVED, HIGH | `COMPANY_CODE=000001`, `COMPANY_CRT_SOURCE=AUTO`; host preflight must confirm UF=BA / CRT=1 |
| MMMODAS | CRT conflict (EMISSOR 1 / C000004 2) | `COMPANY_CRT_SOURCE=EMISSOR` required |
| RINCAO | company resolved via EMISSOR CNPJ (3 C000004 rows); CRT conflict (EMISSOR 3 / C000004 1) | `COMPANY_CODE=000001`, `COMPANY_CRT_SOURCE=EMISSOR` required |
| UNIAO | CRT conflict (EMISSOR 1 / C000004 3) | `COMPANY_CRT_SOURCE=EMISSOR` required |
## Follow-ups (explicitly not in RC1)
- `dataset_versions()` (~11 queries per classification request) can be memoized/cached; it dominates the ~15 ms cache-hit latency.
- Auto-apply stays disabled everywhere; enabling it for any real client needs the two pilot authorization layers and a separate decision.
- No dashboard, no Kubernetes/Redis/RabbitMQ.
## External requirements for the first real pilot
1. Hub URL (or the Proxmox host / VM to deploy it on) and shell access to deploy `deploy/hub`, plus the public HTTPS name and the reverse proxy/TLS certificate.
2. The Windows host of the CONSTRUCAO client (remote access + administrator rights).
3. The real path of the client's SGV `.FDB` on that host (not the local copy's path).
4. A read-only Firebird account (user/password) entered locally on that host.
5. Explicit authorization to install the Windows Service `GTIFiscalAgent` there.
6. An Agent token generated with `register_agent.py` on the production Hub.