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:
@@ -0,0 +1,59 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"$id": "fleet/profile/fiscal.schema.json",
|
||||
"title": "Arcodange fiscal profile (fleet/profile/fiscal.yaml)",
|
||||
"description": "Machine-readable fiscal profile per PRD agent-catalog 'The document surface agents read': schema'd YAML; every rule carries effective_from/effective_until AND decision: adc-NNN. The bundled validator (scripts/validate.py, stdlib-only) implements the subset {type, properties, required, additionalProperties, items, enum, pattern} used here.",
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": ["version", "entity", "vat_position", "rules"],
|
||||
"properties": {
|
||||
"version": { "type": "integer", "enum": [1] },
|
||||
"entity": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": ["name", "legal_form", "siren", "incorporated", "fiscal_year_end", "vat_registered", "b2b_only"],
|
||||
"properties": {
|
||||
"name": { "type": "string" },
|
||||
"legal_form": { "type": "string" },
|
||||
"siren": { "type": "string", "pattern": "^[0-9]{9}$" },
|
||||
"incorporated": { "type": "string", "pattern": "^[0-9]{4}-[0-9]{2}(-[0-9]{2})?$" },
|
||||
"fiscal_year_end": { "type": "string", "pattern": "^[0-9]{2}-[0-9]{2}$" },
|
||||
"vat_registered": { "type": "boolean" },
|
||||
"b2b_only": { "type": "boolean" }
|
||||
}
|
||||
},
|
||||
"vat_position": {
|
||||
"type": "object",
|
||||
"description": "Informational ERP-read position, NOT a rule (no decision field): verify before any filing, never assume (PRD task-inventory T10).",
|
||||
"additionalProperties": false,
|
||||
"required": ["stance", "as_of", "note"],
|
||||
"properties": {
|
||||
"stance": { "type": "string", "enum": ["credit", "payable", "nil"] },
|
||||
"net_credit_eur_approx_min": { "type": "number" },
|
||||
"net_credit_eur_approx_max": { "type": "number" },
|
||||
"as_of": { "type": "string", "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$" },
|
||||
"note": { "type": "string" }
|
||||
}
|
||||
},
|
||||
"rules": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": ["id", "title", "category", "statement", "effective_from", "effective_until", "decision", "legal_basis", "source"],
|
||||
"properties": {
|
||||
"id": { "type": "string", "pattern": "^[a-z0-9][a-z0-9-]*$" },
|
||||
"title": { "type": "string" },
|
||||
"category": { "type": "string", "enum": ["vat-regime", "vat-treatment", "bookkeeping"] },
|
||||
"statement": { "type": "string" },
|
||||
"effective_from": { "type": "string", "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$" },
|
||||
"effective_until": { "type": ["string", "null"], "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$" },
|
||||
"decision": { "type": "string", "pattern": "^adc-[0-9]{3}$" },
|
||||
"legal_basis": { "type": "array", "items": { "type": "string" } },
|
||||
"source": { "type": "string" },
|
||||
"notes": { "type": "string" }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user