add dolibarr api skills for read-only inspection

First two of an expected family of dolibarr-* skills:

- dolibarr/: platform reference — DOLAPIKEY auth, the voir_tous ACL
  trap, endpoint catalogue, the dol-curl.sh wrapper, .env credentials
  layout (gitignored, mode 600). Every future workflow skill depends
  on this one.
- dolibarr-invoice-audit/: first workflow — list KissMetrics invoices,
  audit one invoice end-to-end (JSON facts + PDF mandatory-mention
  checklist against the French legal corpus), audit the KissMetrics
  thirdparty record.

Live captures in examples/ include real audit findings to surface
to the Arcodange × KissMetrics cohort review: PDFs are missing
capital social, L.441-10 penalties, 40 € indemnity, L.123-22 / R.123-237;
KissMetrics thirdparty has no EIN (idprof1..6 all empty);
static/config/company.json holds placeholder values and a wrong
forme juridique (claims SAS, the real Dolibarr is SARL).

.gitignore hardened with *.credentials, secrets/, *.key, and an
explicit .claude/skills/**/.env pattern.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-28 18:43:39 +02:00
parent e90ac2df80
commit bbfa50c3eb
18 changed files with 2811 additions and 1 deletions

View File

@@ -0,0 +1,25 @@
{
"_captured_when": "2026-05-28, before the four voir_tous permission flags were ticked on ai_agent. Kept here as the reference signature of the ACL trap. Re-occurrence means the permissions regressed.",
"_curl": "curl -H 'DOLAPIKEY: <key>' https://erp.arcodange.lab/api/index.php/thirdparties/1",
"_http_status": 403,
"error": {
"code": 403,
"message": "Forbidden: Access not allowed for login ai_agent on this thirdparty"
},
"debug": {
"source": "api_thirdparties.class.php:2403 at call stage",
"stages": {
"success": [
"get",
"route",
"negotiate",
"authenticate",
"validate"
],
"failure": [
"call",
"message"
]
}
}
}

View File

@@ -0,0 +1,7 @@
{
"filename": "FAC002-CL0001002.pdf",
"content-type": "application/pdf",
"filesize": 62345,
"content": "JVBERi0xLjcKJeLjz9MKNiAwIG9iago8PCAvVHlwZSAvUGFnZSAvUGFyZW50IDEgMCBSIC9MYXN0TW9kaWZpZWQgKEQ6MjAyNjAzMTMxNTIxNTcrMDEnMDAn...[truncated for repo; 62345-byte PDF]",
"encoding": "base64"
}

View File

@@ -0,0 +1,273 @@
{
"module": null,
"id": "12",
"entity": "1",
"import_key": null,
"array_options": [],
"array_languages": null,
"contacts_ids": [],
"contacts_ids_internal": null,
"linkedObjectsIds": [],
"fk_project": null,
"contact_id": null,
"user": null,
"origin_type": null,
"origin_id": null,
"ref": "FAC002-CL0001002",
"ref_ext": null,
"statut": "2",
"status": "2",
"country_id": null,
"country_code": null,
"state_id": null,
"region_id": null,
"mode_reglement_id": "2",
"cond_reglement_id": "10",
"demand_reason_id": null,
"transport_mode_id": null,
"shipping_method_id": null,
"shipping_method": null,
"fk_multicurrency": "0",
"multicurrency_code": "EUR",
"multicurrency_tx": "1.00000000",
"multicurrency_total_ht": "5100.00000000",
"multicurrency_total_tva": "0.00000000",
"multicurrency_total_localtax1": null,
"multicurrency_total_localtax2": null,
"multicurrency_total_ttc": "5100.00000000",
"last_main_doc": "facture/FAC002-CL0001002/FAC002-CL0001002.pdf",
"fk_account": "2",
"note_public": null,
"note_private": "G&eacute;n&eacute;r&eacute; depuis la facture mod&egrave;le r&eacute;currente Kiss Metrics Invoice",
"total_ht": "5100.00000000",
"total_tva": "0.00000000",
"total_localtax1": "0.00000000",
"total_localtax2": "0.00000000",
"total_ttc": "5100.00000000",
"lines": [
{
"module": null,
"id": "12",
"entity": null,
"import_key": null,
"array_options": [],
"array_languages": null,
"contacts_ids": null,
"contacts_ids_internal": null,
"linkedObjectsIds": null,
"origin_type": null,
"origin_id": null,
"ref": "KM-cloud-devops",
"ref_ext": "",
"statut": null,
"status": null,
"state_id": null,
"region_id": null,
"demand_reason_id": null,
"transport_mode_id": null,
"shipping_method": null,
"multicurrency_tx": null,
"multicurrency_total_ht": "5100.00000000",
"multicurrency_total_tva": "0.00000000",
"multicurrency_total_localtax1": null,
"multicurrency_total_localtax2": null,
"multicurrency_total_ttc": "5100.00000000",
"last_main_doc": null,
"fk_account": null,
"total_ht": "5100.00000000",
"total_tva": "0.00000000",
"total_localtax1": "0.00000000",
"total_localtax2": "0.00000000",
"total_ttc": "5100.00000000",
"lines": null,
"actiontypecode": null,
"civility_code": null,
"date_creation": null,
"date_validation": null,
"date_modification": null,
"tms": null,
"date_cloture": null,
"user_author": null,
"user_creation": null,
"user_creation_id": null,
"user_valid": null,
"user_validation": null,
"user_validation_id": null,
"user_closing_id": null,
"user_modification": null,
"user_modification_id": null,
"fk_user_creat": null,
"fk_user_modif": null,
"specimen": 0,
"totalpaid": null,
"extraparams": [],
"product": null,
"cond_reglement_supplier_id": null,
"deposit_percent": null,
"retained_warranty_fk_cond_reglement": null,
"warehouse_id": null,
"parent_element": "",
"fk_parent_attribute": "",
"rowid": "12",
"fk_unit": null,
"date_debut_prevue": null,
"date_debut_reel": null,
"date_fin_prevue": null,
"date_fin_reel": null,
"weight": null,
"weight_units": null,
"length": null,
"length_units": null,
"width": null,
"width_units": null,
"height": null,
"height_units": null,
"surface": null,
"surface_units": null,
"volume": null,
"volume_units": null,
"multilangs": null,
"product_type": "1",
"fk_product": "2",
"desc": "TVA non applicable &ndash; Article 259-1 du CGI &ndash; Prestation de services localis&eacute;e hors de France (USA)",
"description": "TVA non applicable &ndash; Article 259-1 du CGI &ndash; Prestation de services localis&eacute;e hors de France (USA)",
"product_ref": "KM-cloud-devops",
"product_label": "KissMetrics - Cloud Devops - 1 day",
"product_barcode": null,
"product_desc": "",
"fk_product_type": "1",
"qty": "10",
"duree": null,
"remise_percent": "0",
"info_bits": "0",
"special_code": "0",
"subprice": "510.00000000",
"subprice_ttc": null,
"tva_tx": "0.0000",
"multicurrency_subprice": "510.00000000",
"multicurrency_subprice_ttc": null,
"label": null,
"libelle": "KissMetrics - Cloud Devops - 1 day",
"price": null,
"vat_src_code": "",
"localtax1_tx": "0.0000",
"localtax2_tx": "0.0000",
"localtax1_type": "0",
"localtax2_type": "0",
"remise": null,
"revenuestamp": null,
"date_start_fill": null,
"date_end_fill": null,
"buy_price_ht": null,
"buyprice": null,
"pa_ht": "0.00000000",
"marge_tx": "",
"marque_tx": "100",
"fk_user_author": null,
"fk_accounting_account": "7",
"fk_facture": "12",
"fk_parent_line": null,
"fk_remise_except": null,
"rang": "1",
"fk_fournprice": null,
"tva_npr": null,
"batch": "",
"fk_warehouse": "0",
"fk_code_ventilation": 0,
"date_start": 1769986800,
"date_end": 1770937200,
"situation_percent": "100",
"fk_prev_id": null,
"packaging": null
}
],
"actiontypecode": null,
"name": null,
"lastname": null,
"firstname": null,
"civility_id": null,
"civility_code": null,
"date_creation": 1771929906,
"date_validation": 1771887600,
"date_modification": 1773408117,
"tms": null,
"date_cloture": null,
"user_author": null,
"user_creation": null,
"user_creation_id": "2",
"user_valid": null,
"user_validation": null,
"user_validation_id": "2",
"user_closing_id": null,
"user_modification": null,
"user_modification_id": null,
"fk_user_creat": null,
"fk_user_modif": null,
"specimen": 0,
"totalpaid": 5100,
"extraparams": [],
"product": null,
"cond_reglement_supplier_id": null,
"deposit_percent": null,
"retained_warranty_fk_cond_reglement": "0",
"warehouse_id": null,
"title": null,
"type": "0",
"subtype": null,
"fk_soc": null,
"socid": "1",
"paye": "1",
"date": 1771887600,
"date_lim_reglement": 1774908000,
"cond_reglement_code": "10DENDMONTH",
"cond_reglement_label": null,
"cond_reglement_doc": "Due in 10 days, end of month",
"mode_reglement_code": "VIR",
"revenuestamp": "0.00000000",
"totaldeposits": null,
"totalcreditnotes": null,
"sumpayed": "5100.00000000",
"sumpayed_multicurrency": null,
"sumdeposit": null,
"sumdeposit_multicurrency": null,
"sumcreditnote": null,
"sumcreditnote_multicurrency": null,
"remaintopay": "0",
"nbofopendirectdebitorcredittransfer": null,
"creditnote_ids": [],
"stripechargedone": null,
"stripechargeerror": null,
"description": null,
"ref_client": null,
"situation_cycle_ref": null,
"close_code": null,
"close_note": null,
"postactionmessages": null,
"fk_incoterms": "0",
"label_incoterms": null,
"location_incoterms": "",
"fk_user_author": "2",
"fk_user_valid": "2",
"datem": 1773408117,
"delivery_date": null,
"ref_customer": null,
"resteapayer": null,
"module_source": null,
"pos_source": null,
"fk_fac_rec_source": "1",
"fk_facture_source": null,
"line": null,
"fac_rec": null,
"date_pointoftax": "",
"situation_counter": null,
"situation_final": "0",
"tab_previous_situation_invoice": [],
"tab_next_situation_invoice": [],
"retained_warranty": "0",
"retained_warranty_date_limit": "",
"availability_id": null,
"date_closing": null,
"source": null,
"remise_percent": null,
"online_payment_url": "https://erp.arcodange.lab/public/payment/newpayment.php?source=invoice&ref=FAC002-CL0001002"
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,7 @@
{
"success": {
"code": 200,
"dolibarr_version": "22.0.4",
"access_locked": "0"
}
}

View File

@@ -0,0 +1,167 @@
{
"module": "societe",
"id": "1",
"entity": "1",
"import_key": null,
"array_options": [],
"array_languages": null,
"contacts_ids": null,
"contacts_ids_internal": null,
"linkedObjectsIds": null,
"canvas": null,
"fk_project": null,
"contact_id": null,
"user": null,
"origin_type": null,
"origin_id": null,
"ref": "KissMetrics",
"ref_ext": null,
"statut": null,
"status": "1",
"country_id": "11",
"country_code": "US",
"state_id": "1167",
"region_id": "297",
"barcode_type": null,
"barcode_type_coder": null,
"mode_reglement_id": null,
"cond_reglement_id": null,
"demand_reason_id": null,
"transport_mode_id": null,
"shipping_method_id": null,
"shipping_method": null,
"fk_multicurrency": "0",
"multicurrency_code": "",
"multicurrency_tx": null,
"multicurrency_total_ht": null,
"multicurrency_total_tva": null,
"multicurrency_total_localtax1": null,
"multicurrency_total_localtax2": null,
"multicurrency_total_ttc": null,
"last_main_doc": null,
"fk_account": "0",
"note_public": null,
"note_private": null,
"actiontypecode": null,
"name": "KissMetrics",
"lastname": null,
"firstname": null,
"civility_id": null,
"civility_code": null,
"date_creation": 1769898064,
"date_validation": null,
"date_modification": 1771926531,
"tms": null,
"date_cloture": null,
"user_author": null,
"user_creation": null,
"user_creation_id": "1",
"user_valid": null,
"user_validation": null,
"user_validation_id": null,
"user_closing_id": null,
"user_modification": null,
"user_modification_id": "1",
"fk_user_creat": null,
"fk_user_modif": null,
"specimen": 0,
"totalpaid": null,
"extraparams": [],
"product": null,
"cond_reglement_supplier_id": null,
"deposit_percent": null,
"retained_warranty_fk_cond_reglement": null,
"warehouse_id": null,
"SupplierCategories": [],
"prefixCustomerIsRequired": null,
"name_alias": "",
"phone": null,
"phone_mobile": null,
"fax": null,
"email": "evan@kissmetrics.io",
"no_email": null,
"skype": null,
"twitter": null,
"facebook": null,
"linkedin": null,
"url": null,
"barcode": null,
"idprof1": "",
"idprof2": "",
"idprof3": "",
"idprof4": "",
"idprof5": "",
"idprof6": "",
"idprof7": null,
"idprof8": null,
"idprof9": null,
"idprof10": null,
"socialobject": null,
"tva_assuj": "0",
"tva_intra": "",
"vat_reverse_charge": 0,
"localtax1_assuj": null,
"localtax1_value": "0.0000",
"localtax2_assuj": null,
"localtax2_value": "0.0000",
"managers": null,
"capital": null,
"typent_id": "3",
"typent_code": "TE_MEDIUM",
"effectif": "1 - 5",
"effectif_id": "1",
"forme_juridique_code": null,
"forme_juridique": "",
"remise_percent": 0,
"remise_supplier_percent": "0",
"mode_reglement_supplier_id": null,
"transport_mode_supplier_id": null,
"fk_prospectlevel": "",
"client": "1",
"prospect": 0,
"fournisseur": "0",
"code_client": "CL0001",
"code_fournisseur": null,
"code_compta_client": "411KISSME",
"accountancy_code_customer_general": null,
"accountancy_code_customer": null,
"code_compta_fournisseur": null,
"accountancy_code_supplier_general": null,
"accountancy_code_supplier": null,
"code_compta_product": null,
"stcomm_id": "0",
"stcomm_picto": null,
"status_prospect_label": "Never contacted",
"price_level": null,
"outstanding_limit": null,
"order_min_amount": null,
"supplier_order_min_amount": null,
"parent": null,
"default_lang": null,
"ip": null,
"webservices_url": null,
"webservices_key": null,
"logo": null,
"logo_small": null,
"logo_mini": null,
"logo_squarred": null,
"logo_squarred_small": null,
"logo_squarred_mini": null,
"accountancy_code_sell": "",
"accountancy_code_buy": "",
"currency_code": null,
"fk_warehouse": null,
"termsofsale": null,
"partnerships": [],
"bank_account": null,
"code_compta": null,
"fk_incoterms": "0",
"label_incoterms": null,
"location_incoterms": null,
"socialnetworks": [],
"address": "2850 34th Street North, 307",
"zip": "33713",
"town": "St. Petersburg",
"absolute_discount": "0",
"absolute_creditnote": "0"
}

View File

@@ -0,0 +1,146 @@
{
"module": null,
"id": "3",
"entity": "1",
"import_key": null,
"array_options": [],
"array_languages": null,
"contacts_ids": null,
"contacts_ids_internal": null,
"linkedObjectsIds": null,
"canvas": null,
"fk_project": null,
"contact_id": null,
"user": null,
"origin_type": null,
"origin_id": null,
"ref": "3",
"ref_ext": null,
"statut": "1",
"status": "1",
"country_id": null,
"country_code": "",
"state_id": null,
"region_id": null,
"barcode_type": null,
"barcode_type_coder": null,
"mode_reglement_id": null,
"cond_reglement_id": null,
"demand_reason_id": null,
"transport_mode_id": null,
"shipping_method": null,
"fk_multicurrency": null,
"multicurrency_code": null,
"multicurrency_tx": null,
"multicurrency_total_ht": null,
"multicurrency_total_tva": null,
"multicurrency_total_localtax1": null,
"multicurrency_total_localtax2": null,
"multicurrency_total_ttc": null,
"last_main_doc": null,
"fk_account": null,
"note_public": "",
"note_private": "",
"actiontypecode": null,
"name": null,
"lastname": "AI Agent",
"firstname": "",
"civility_id": null,
"civility_code": "",
"date_creation": null,
"date_validation": null,
"date_modification": null,
"tms": null,
"date_cloture": null,
"user_author": null,
"user_creation": null,
"user_creation_id": null,
"user_valid": null,
"user_validation": null,
"user_validation_id": null,
"user_closing_id": null,
"user_modification": null,
"user_modification_id": null,
"fk_user_creat": null,
"fk_user_modif": null,
"specimen": 0,
"totalpaid": null,
"extraparams": [],
"product": null,
"cond_reglement_supplier_id": null,
"deposit_percent": null,
"retained_warranty_fk_cond_reglement": null,
"warehouse_id": null,
"employee": "1",
"fullname": null,
"gender": null,
"birth": "",
"email": "",
"email_oauth2": null,
"personal_email": "",
"socialnetworks": [],
"job": "AI Agent",
"signature": "Claude AI",
"office_phone": "",
"office_fax": "",
"user_mobile": "",
"personal_mobile": "",
"admin": "0",
"login": "ai_agent",
"pass_crypted": null,
"datec": 1779984197,
"datem": 1779977142,
"socid": null,
"fk_member": null,
"fk_user": null,
"fk_user_expense_validator": null,
"fk_user_holiday_validator": null,
"clicktodial_url": null,
"clicktodial_login": null,
"clicktodial_poste": null,
"datelastpassvalidation": "2026-05-28 18:05:42",
"datelastlogin": "",
"datepreviouslogin": "",
"flagdelsessionsbefore": 1779984337,
"iplastlogin": null,
"ippreviouslogin": null,
"datestartvalidity": "",
"dateendvalidity": "",
"photo": null,
"lang": null,
"rights": {
"user": {
"user": {},
"self": {},
"user_advance": {},
"self_advance": {},
"group_advance": {}
}
},
"user_group_list": [],
"conf": {},
"users": [],
"parentof": null,
"accountancy_code_user_general": "",
"accountancy_code": "",
"thm": null,
"tjm": null,
"salary": null,
"salaryextra": null,
"weeklyhours": null,
"color": "ff7f00",
"dateemployment": "",
"dateemploymentend": "",
"default_c_exp_tax_cat": null,
"ref_employee": "",
"national_registration_number": "",
"default_range": null,
"fk_warehouse": null,
"fk_establishment": null,
"label_establishment": null,
"usergroup_entity": null,
"address": "",
"zip": "",
"town": "",
"url": null
}