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
This commit is contained in:
+113
-1
@@ -1 +1,113 @@
|
||||
The machine-readable fiscal profile (`fiscal.yaml` + `calendar.yaml` + the ADC register, every rule dated `effective_from`) lands with [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).
|
||||
# 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.
|
||||
|
||||
Reference in New Issue
Block a user