# 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-<slug>.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 <leaf>
§ <anchor>`, 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.
