Files
erp/fleet/profile/README.md
arcodangeandClaude Fable 5 a482bb18c4 feat(fleet): fiscal profile + compliance calendar + ADC register (erp#54, T11 data)
fleet/profile/ goes from stub to the machine-readable business-rules surface
the fleet reads (PRD agent-catalog document surface + compliance ADC framework):

- fiscal.yaml — entity, VAT position, 8 rules (regime reel simplifie until
  2026-12-31 -> quarterly CA3 from 2027-01-01 per LF 2025 art. 38; KM export
  autoliquidation 259-1 CGI box E2; FR 20% deductible; intra-EU reverse
  charge; FX 766/666; SaaS expensed; CCA 455 lane). Every rule carries
  effective_from/effective_until AND decision: adc-NNN; every date cites its
  PRD anchor as an inline comment (verified against factory origin/main).
- calendar.yaml — 15 entries: acomptes TVA (2026-07 month-window, 2026-12-15),
  last CA12 FY-2026 (2027-05-04), CA3 quarterly windows, CFE (December),
  AG comptes annuels (2027-06-30), e-invoicing milestones (2026-09-01
  reception, 2027-09-01 emission/e-reporting), URSSAF echeancier with the
  in-file NOTE that a real direct debit exists since May 2026 (erp#57 revisit
  of the payroll-dormant assumption), KM deferred due dates + renewal stub.
- JSON Schemas for both + scripts/validate.py (stdlib-only: strict YAML-subset
  parser, JSON-Schema-subset checker, rule->ADC resolution, calendar checks).
- decisions/ — ADC register: template + adc-001..005 Accepted formalizations
  (autoliquidation KM, FX->766/666, SaaS expensed, reel simplifie until
  abolition, CCA personal-card lane) + adc-006/007 Proposed stubs (retainer
  currency -> erp#53; capital path -> erp#51). Agents draft, the operator
  Accepts — never the reverse; immutable once merged, supersede never edit.
- Mutation policy in-file: PRs only (T12 proposes, human merges).
- Same-change: profile README stub -> real doc; fleet/README.md layout line
  and AGENTS.md fleet row updated (profile no longer a stub).

Validation: PASS — 8 rules, 15 entries, 7 ADCs, 0 errors, 7 warnings (the
warnings list exactly what awaits operator verification). Human gate left
open on purpose: operator sanity-read of the calendar + Acceptance of
adc-001..005.

Co-Authored-By: Claude Fable 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01VRShc4QhLLU73FLHx9vskh
2026-07-18 23:45:00 +02:00

114 lines
6.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 (~223267 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.