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

6.0 KiB
Raw Permalink Blame History

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); the rules live here, dated and justified. Shipped by erp#54 per the PRD document surface and ADC framework.

Layout

File Role
fiscal.yaml fiscal profile: entity, VAT position, rules — regime, VAT treatments, bookkeeping methods
fiscal.schema.json JSON Schema for fiscal.yaml
calendar.yaml compliance calendar: dated obligations the T11 reminder loop (erp#60) reads
calendar.schema.json JSON Schema for calendar.yaml
scripts/validate.py stdlib-only validator: schema + referential integrity (rule → ADC)
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. 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; capital path → erp#51).

Validation

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.
  • BOI-BIC-CHG-20-30-10 tolerance cite (adc-003) and CCA formalities (adc-005) — general doctrine, queued for the expert-comptable.