# fleet/profile/ — fiscal profile, compliance calendar, ADC register The machine-readable **business-rules surface** the fleet reads (T10 TVA preparation, T03 VAT ventilation, T11 calendar & reminders): prompts stay thin and rule-free ([fleet/README.md](../README.md)); the rules live here, dated and justified. Shipped by [erp#54](https://gitea.arcodange.lab/arcodange-org/erp/issues/54) per the PRD [document surface](https://gitea.arcodange.lab/arcodange-org/factory/src/branch/main/vibe/PRD/ai-back-office/agent-catalog.md#the-document-surface-agents-read) and [ADC framework](https://gitea.arcodange.lab/arcodange-org/factory/src/branch/main/vibe/PRD/ai-back-office/compliance.md#accounting-decision-records-adc). ## Layout | File | Role | | --- | --- | | [`fiscal.yaml`](fiscal.yaml) | fiscal profile: entity, VAT position, **rules** — regime, VAT treatments, bookkeeping methods | | [`fiscal.schema.json`](fiscal.schema.json) | JSON Schema for `fiscal.yaml` | | [`calendar.yaml`](calendar.yaml) | compliance calendar: dated obligations the T11 reminder loop ([erp#60](https://gitea.arcodange.lab/arcodange-org/erp/issues/60)) reads | | [`calendar.schema.json`](calendar.schema.json) | JSON Schema for `calendar.yaml` | | [`scripts/validate.py`](scripts/validate.py) | stdlib-only validator: schema + referential integrity (rule → ADC) | | [`decisions/`](decisions/) | the **ADC register** (*accounting decision records*): `adc-template.md` + `adc-NNN-.md` | ## The rule contract Every `fiscal.yaml` rule carries: - **`effective_from` / `effective_until`** — dated validity (`null` until = in force until superseded); - **`decision: adc-NNN`** — the record in `decisions/` that justifies it. So the chain **écriture → règle → ADC → base légale** resolves in four hops, identically every time (PRD compliance § ADC rule 2, challenge C6). Dates in both YAML files cite their source anchor as an inline comment (`PRD § `, verified against factory `origin/main`). ## The ADC register (`decisions/`) MADR-lite + accounting fields — see [`adc-template.md`](decisions/adc-template.md). Frontmatter is machine-parsed (id, status, decided, effective dates, supersedes/superseded_by); the body carries Context (*fait générateur*), Decision, **Base légale & doctrine**, Alternatives rejected, Consequences, QA & validation, References. Status flow: **Proposed → Accepted → Superseded-by-NNN**, with four rules (PRD compliance § ADC): 1. **Immutable once Accepted** (merged on main) — supersede, never edit (permanence des méthodes, PCG art. 121-5). 2. **Every fiscal.yaml rule cites its ADC** — enforced by `scripts/validate.py`, which also refuses a rule citing a non-Accepted record. 3. **The annexe writes itself at close** from the records Accepted and in force during the exercice. 4. **Proposed ADCs are the expert-comptable agenda. Agents draft, the operator Accepts — never the reverse.** Seed state: **adc-001…005 are Accepted as formalizations** of decisions the operator already made in practice (their sanity read is the erp#54 human gate — pre-merge amendments are draft edits, not supersedes); **adc-006/adc-007 are Proposed stubs** (retainer currency → [erp#53](https://gitea.arcodange.lab/arcodange-org/erp/issues/53); capital path → [erp#51](https://gitea.arcodange.lab/arcodange-org/erp/issues/51)). ## Validation ```sh python3 fleet/profile/scripts/validate.py ``` Stdlib-only (no PyYAML, no jsonschema — runs anywhere, CI-able). It checks: both YAML files against their schemas; every rule's `decision` resolves to exactly one existing, **Accepted** ADC; unique ids; `effective_from <= effective_until`; calendar entries carry exactly one of `due`|`recurrence` (unless `pending-definition`/`conditional`); ADC frontmatter/section hygiene. Exit 0 = pass; warnings list what awaits operator verification (month-precision dates, estimated entries). To stay parseable, both YAML files are written in a **strict subset**: block maps/lists, single-line scalars, one-line `[flow]` lists of scalars, comments — no anchors, no multi-line scalars, no nested flow. Calendar date precision: `YYYY-MM-DD` = exact; `YYYY-MM` = month window — the source gives no day; verify on the authority's notice, **never invent one**. ## Mutation policy Changes arrive **as PRs only** — the T12 regulatory watch *proposes* a diff (what changed, source links, effective dates); a **human reviews and merges** (PRD task-inventory § T11 guardrail: "the calendar file is reviewed like code"; § T12: "the watch proposes, the human adopts"). Calendar entries sourced from mail content are human-confirmed (mail is untrusted input). **No agent edits these files directly.** A rule change moves its ADC in the same PR (supersede, never edit), and a schema change moves the validator with it — the repo-wide same-change freshness rule. ## Facts not corroborated by the PRD Flagged here honestly (and inline where used) — the PRD wins on conflict; these await operator/expert verification: - **SIREN 999657455** — from erp#54 + agent memory `arcodange-tva-fiscal`; no PRD leaf states it. - **Exact incorporation day** — PRD says "mid-January 2026" only; rules use a conservative `2026-01-01` exercice-start bound. - **July 2026 acompte exact day** — PRD gives the month only (T10 trigger). - **CFE exact day + creation-year exoneration / initial 1447-C declaration** — PRD says "December" only; the rest is to verify with the SIE. - **CA3 July/October/January windows** — only the April window is PRD-anchored (roadmap, 2027-04-20); the others come from the erp#54 issue text. - **TVA credit amount (~223–267 EUR)** — ERP reads (skill + memory); the PRD only says "in TVA credit — verify, don't assume". - **URSSAF échéancier cadence/nature** — one known debit (2026-05-22, 493.00 EUR, erp#57); the PRD's "payroll dormant" assumption is under revisit in [erp#57](https://gitea.arcodange.lab/arcodange-org/erp/issues/57). - **BOI-BIC-CHG-20-30-10 tolerance cite** (adc-003) and **CCA formalities** (adc-005) — general doctrine, queued for the expert-comptable.