Un fichier .cursorrules pour les ingénieurs construisant des intégrations contre des plateformes de contract-lifecycle-management (Ironclad, Juro, LinkSquares, ContractPodAi, Agiloft) — la colle Python ou TypeScript entre le CLM, l’entrepôt de données, les tableaux de bord CMRR / cash-pacing du cabinet, et les surfaces d’administration legal-ops. L’ingénierie CLM a la même forme que l’ingénierie du recrutement (règle Cursor ingénieur recrutement) : chaque ligne touche des données commercialement confidentielles ; la journalisation d’audit et le contrôle des modifications sont la seule chose entre un ingénieur CLM et un conseil demandant « montrez-moi ce qui a changé et quand. »
Quand utiliser
Un ingénieur legal-ops ou contrats construit des intégrations contre une plateforme CLM et souhaite que Cursor pousse en arrière quand le code dérive vers les anti-patterns classiques de l’ingénierie CLM (écritures silencieuses, erreurs avalées, audit faible, idempotence cassée).
L’équipe dispose d’une architecture de flux de données CLM documentée et l’applique dans le code ; les règles remontent les valeurs par défaut de l’architecture au moment de la génération de code.
Onboarding de nouveaux ingénieurs — les règles lisent comme un primer d’ingénierie CLM avec les valeurs par défaut du cabinet intégrées.
Quand NE PAS utiliser
Travail d’administration CLM qui n’implique pas de code. Configurer des modèles de workflow dans l’interface CLM, construire des matrices d’approbation, etc. — cette règle concerne le code d’intégration, pas la configuration propre à la plateforme.
Travail contractuel général — les règles supposent un travail d’ingénierie ; les prompts du conseil commercial relèvent d’une catégorie différente.
Projets de migration d’un CLM à un autre. Préoccupations différentes (fidélité des données, préservation des enregistrements historiques, temps d’indisponibilité) ; un engagement ponctuel nécessitant une planification pilotée par le conseil plutôt que des règles empiriques continues.
Configuration
Déposer le bundle. Copiez apps/web/public/artifacts/cursor-rules-clm-engineer/.cursorrules à la racine de votre dépôt d’ingénierie CLM (Cursor lit .cursorrules automatiquement).
Personnaliser la section spécifique à l’outil. Les règles livrées couvrent les API Ironclad, Juro, et LinkSquares. Ajoutez ou supprimez selon la stack CLM du cabinet.
Personnaliser la destination d’audit. La règle par défaut indique « le journal d’audit atterrit dans la table Postgres clm_audit du cabinet. » Modifiez selon l’infrastructure d’audit du cabinet (Datadog / Splunk / Snowflake).
Utiliser. Cursor lit les règles automatiquement lors de la génération de code dans le dépôt. L’ingénieur prompt Cursor ; les règles poussent vers les valeurs par défaut du cabinet.
Ce que les règles appliquent
Les règles poussent en arrière au moment de la génération de code sur ces patterns :
Questions avant d’écrire du code
Quelles données contractuelles sont impliquées ? (Les contrats exécutés sont des enregistrements d’obligation juridique ; les brouillons peuvent être privilégiés.)
Quelles juridictions touchent les données ? (Les contrats US ≠ les contrats UE sous le RGPD.)
Lecture ou écriture ? (Le défaut est la lecture ; les écritures nécessitent une justification écrite et une attribution d’audit.)
Que se passe-t-il lors d’une nouvelle tentative ? (Idempotence sur chaque gestionnaire de webhook.)
Où atterrit l’entrée du journal d’audit ?
Guidance spécifique aux outils
Ironclad : Spécificités de l’API Workflow — les IDs de workflow sont des GUIDs pas des entiers ; la pagination est basée sur un curseur ; les signatures webhook sont HMAC-SHA256.
Juro : API de modélisation de documents — les templates Liquid nécessitent un bac à sable ; ne pas évaluer les chaînes de template.
LinkSquares : API de recherche d’enregistrements — la pagination est basée sur un offset avec un plafond fixe de 10 000.
ContractPodAi / Agiloft : particularités par outil documentées quand le cabinet les utilise.
Valeurs par défaut à appliquer
Piste d’audit — chaque lecture et chaque écriture produit une entrée avec timestamp, user_identity, system, action, contract_id, fields_changed.
Idempotence — les gestionnaires de webhook s’appuient sur (event_type, contract_id, source_event_id) et ignorent à la deuxième arrivée.
Validation de schéma — analyser chaque réponse API dans un schéma Pydantic / Zod avant utilisation.
Secrets — les clés API vivent dans un gestionnaire de secrets ; clés séparées pour la portée lecture vs écriture.
Confidentialité / consentement — les informations personnelles de la contrepartie ont leur propre politique de rétention ; les demandes d’accès aux données ont un chemin de réponse défini.
Tests — staging uniquement ; pas d’appels API en production dans le CI.
Anti-patterns à refuser
Les écritures sans l’équivalent d’un en-tête On-Behalf-Of (les systèmes CLM varient sur l’en-tête, mais le principe est le même — chaque mutation attribuable à un utilisateur nommé).
La modification de champs de contrat en production sans double contrôle (certains cabinets exigent un second approbateur pour des champs comme la date d’exécution, l’expiration, les conditions de renouvellement).
L’approbation automatique des étapes de workflow basée sur des données entrantes — la matrice d’approbation du cabinet est la source de vérité, pas le code d’intégration.
Les IDs de contrat codés en dur dans le code de production — ils dérivent ; charger depuis la configuration.
Réalité des coûts
Tokens LLM — aucun directement. Cursor lit les règles localement ; aucun coût de tokens au-delà du coût de complétion propre à Cursor.
Temps d’onboarding des ingénieurs — le gain. Les nouveaux ingénieurs CLM sans les règles dérivent vers les mêmes anti-patterns ; avec les règles, Cursor pousse en arrière au moment de la génération de code.
Temps de configuration — 20 minutes pour déposer le fichier et personnaliser les sections spécifiques aux outils.
Mesure de succès
Taux de revert des révisions de code — part des PRs d’intégration CLM revertis ou substantiellement refactorisés après fusion pour un problème d’audit / idempotence / schéma. Devrait baisser après la mise en place des règles.
Incidents de lacune dans le journal d’audit — incidents où le conseil ne peut pas reproduire un changement d’état contractuel. Devrait descendre à zéro.
Temps de montée en compétence des nouveaux ingénieurs — qualitatif ; combien de temps un nouvel ingénieur CLM met pour livrer une intégration sûre en production. Les règles sont la partie la plus partageable de « comment nous construisons le CLM dans ce cabinet. »
Par rapport aux alternatives
vs wiki d’ingénierie interne. Le wiki a le même contenu mais est lu à la demande. Les règles dans .cursorrules sont lues au moment de la génération de code, c’est-à-dire quand elles comptent.
vs application par révision de code. La révision de code attrape les problèmes mais tardivement. Les règles remontent le standard au moment du brouillon, ce qui est moins coûteux.
vs aucune valeur par défaut. La valeur par défaut et la source de code d’intégration incohérent entre les membres de l’équipe.
Points de vigilance
Dérive des règles par rapport à la pratique réelle.Garde : les règles portent une date last_reviewed dans l’en-tête du fichier. Les ingénieurs de l’équipe revisitent trimestriellement.
Cursor ne lit pas les règles.Garde : le fichier doit être à la racine du dépôt et nommé exactement .cursorrules. Le README du bundle le précise.
Valeurs par défaut trop restrictives bloquant un travail légitime.Garde : les règles indiquent « si vous devez enfreindre cette règle, documentez pourquoi dans la description du PR et informez le responsable de l’ingénierie legal-ops. » Les règles strictes avec des soupapes d’échappement explicites fonctionnent mieux que les règles souples sans.
Dérive des API des outils.Garde : les sections spécifiques aux outils incluent l’URL de la documentation API et une date last_verified. Vérification trimestrielle.
Stack
Le bundle se trouve dans apps/web/public/artifacts/cursor-rules-clm-engineer/ :
.cursorrules — le fichier de règles
Outils : Cursor (le consommateur des règles), Claude (le modèle sous-jacent de Cursor dans de nombreuses configurations). Plus le CLM contre lequel l’équipe s’intègre : Ironclad, Juro, LinkSquares, ContractPodAi, Agiloft.
# CLM Engineer — Cursor rules
last_reviewed: 2026-05-03
You are pairing with a CLM engineer (or contracts engineer who codes) building integrations against contract-lifecycle-management platforms (Ironclad, Juro, LinkSquares, ContractPodAi, Agiloft) plus the Python or TypeScript glue between CLM, the data warehouse, the firm's CMRR / cash-pacing dashboards, and the legal-ops admin surfaces. The defining property of CLM code is that **every line touches commercial-confidential data, often privileged at the draft stage and binding at the executed stage**. Audit logging, idempotence, schema validation, and change-control are not nice-to-haves; they are the only thing standing between a CLM engineer and counsel asking "show me what changed and when, and prove it can't have been edited."
## Before writing code, ask
CLM engineering is integration work plus commercial-record work in disguise. Before generating any script that touches a CLM, confirm:
1. **What contract data is involved?** Drafts (may be privileged work product if prepared with counsel), executed contracts (records of binding obligation), counterparty data (PII for individual counterparties; commercial-confidential for company counterparties). Different retention rules and consent posture per category. If the user can't name the data class, stop and ask.
2. **What jurisdictions are involved?** US contracts → state contract law; EU contracts → GDPR for any personal data; UK contracts → UK GDPR + DPA 2018; cross-border → choice-of-law and venue terms. The right answer depends on this.
3. **Read or write?** Default is read. A write request needs a written rationale: "this can't be done in the CLM UI because…". If the answer is "it would be faster," that's not sufficient. Writes to executed contracts almost always need dual-control (a second human approver).
4. **What happens on retry?** CLM webhooks retry on timeouts and ambiguous 5xx responses. If the same payload arrives twice, what ends up in the system? If the answer isn't "the same as if it arrived once," the code is wrong.
5. **Where does the audit log entry land?** Not "we'll add logging later." Name the destination (`clm_audit` table, Datadog log stream, audit object) and the retention policy (typically 7+ years for executed-contract changes, longer for litigation-implicated matters).
If any answer is missing, ask. Do not guess defaults — CLM defaults vary across firms in ways that matter legally and commercially.
## Tool-specific guidance
### Ironclad
Doc URL: https://developer.ironcladapp.com/ · last_verified: 2026-04-01
- Workflow IDs are GUIDs (not integers). Don't assume ordering.
- Pagination: cursor-based via `nextPageToken` in the response. Loop until absent.
- Rate limit: 100 req/min per workspace; 429 returns `Retry-After` header — honor it.
- Webhook payloads include HMAC-SHA256 signature in `X-Ironclad-Signature`. Verify on every receive.
- The `Records` API is read-write; the `Workflows` API is mostly write but has read endpoints for status. Don't conflate.
- `metadata.fields` is a flat list of `{name, value}` objects. Don't assume field order.
### Juro
Doc URL: https://docs.juro.com/ · last_verified: 2026-04-01
- API is GraphQL. Pagination via `pageInfo.endCursor`.
- Document templating uses Liquid; if you're rendering Liquid templates server-side, **sandbox the renderer**. Don't `eval` template strings.
- Webhook signatures: HMAC-SHA256 in `X-Juro-Signature`.
- Rate limit: 60 req/min for the standard plan; higher tiers vary.
- The `documentVersions` query lets you reconstruct edit history. Useful for audit; expensive — paginate.
### LinkSquares
Doc URL: https://help.linksquares.com/api · last_verified: 2026-04-01
- Records search API is offset-based with a hard 10K offset cap. For full enumeration, use the `since` filter to chunk by date range, not deep offset paging.
- Custom fields appear in `metadata.custom` as `{key, value, type}`. Type matters — date fields stored as ISO-8601 strings; number fields stored as JSON numbers; boolean as boolean.
- Rate limit: 50 req/sec per API key.
- Authentication: bearer token. Rotate quarterly.
### ContractPodAi
Doc URL: https://contractpodai.com/api-docs/ (login-gated) · last_verified: 2026-04-01
- API access is enterprise-tier; not all customers have it.
- Workflow IDs are integers; per-instance unique. Don't assume cross-instance stability.
- Rate limit varies by tenant; contact ContractPodAi support for the contracted limit.
### Agiloft
Doc URL: https://wiki.agiloft.com/display/HELP/REST+API · last_verified: 2026-04-01
- REST API; SOAP also available (don't use SOAP unless required).
- Per-table queries; the table schema is the source of truth.
- Authentication: session-cookie (not stateless). Cookie expires; handle refresh.
### MCP servers for CLM tools
- Default to read-only tool definitions. Writes require a separate tool name (`create_*`, `update_*`) and per-tool security review.
- Never expose `delete_*` tools through MCP. Deletes happen in the CLM UI with the audit trail that produces.
- Tool results that include contract terms: the calling LLM session has access to commercial-confidential data; the audit log captures the call but NOT the response payload (PII / commercial-sensitive). Audit `(timestamp, user, tool, contract_id)` only, not field values.
## Defaults to enforce
### Audit trail
- Every read and every write produces an entry: `timestamp, user_identity, system, action, contract_id, fields_changed`. No exceptions.
- For writes, capture before-and-after of changed fields in a separate `clm_audit_field_changes` table. This is what counsel uses to prove "the renewal date was X before the change and Y after."
- The audit log's retention is at least as long as the longest contract retention (typically 7+ years post-termination; longer for litigation-implicated matters).
- If the audit infrastructure doesn't exist, build it before the first integration. Reject the user's request to "skip audit for the prototype" — there is no CLM prototype, only unaccountable production.
### Idempotence
- Every webhook handler keys on `(event_type, contract_id, source_event_id)` and skips on second arrival.
- Every API write checks for existence first when an upsert is semantically valid; otherwise wraps in a transaction with a unique constraint to prevent duplicates.
- Cron-scheduled syncs tolerate replay. Two runs in a 5-minute window produce the same DB state as one run.
### Schema validation
- Parse every API response into a Pydantic model (Python) or Zod schema (TypeScript) before doing anything with it. Reject on validation failure; surface to the engineer; do not silently coerce.
- CLM vendors ship breaking changes; the schema is your canary. Failed validation is more valuable than silent corruption.
### Secrets and access
- API keys live in a secret manager (1Password CLI, Doppler, AWS Secrets Manager, Vault). Never inline. Never in `.env` committed to git.
- Separate keys for read scope and write scope. The write key is used by exactly one named service account, attributed via `On-Behalf-Of`-style headers where the CLM supports them.
- Tokens have a documented rotation cadence (quarterly default). Implementations include graceful rotation (read the new token from secrets manager on each request, no boot-time cache).
### Privacy and consent
- Consent for processing of counterparty PII is recorded explicitly per counterparty. If the firm processes counterparty individuals' personal data (e.g. notice contacts in EU contracts), GDPR Art. 6 lawful basis applies.
- Data subject access requests (DSAR): every system must be able to export and delete the data subject's data. When integrating a new CLM, document the DSAR procedure alongside the integration.
- Retention enforcement: terminated-contract data has different retention than active-contract data; the firm's records-retention policy governs. Code that backfills old contracts must respect retention.
### Dual control on executed-contract mutations
- Executed contracts are records of legal obligation. Mutating fields (renewal date, expiration, parties) requires dual control — a second human approver via the firm's CLM admin workflow.
- The integration code can SUGGEST the change (write to a `pending_changes` table that the legal-ops admin reviews). The integration code does NOT execute the change without the second human's approval.
- This is enforced at the integration-code level, NOT only at the CLM platform level. Some platforms allow API-direct writes that bypass UI workflows; the integration must respect dual-control regardless.
### Testing
- All integration tests run against CLM staging instances or vendor-provided sandboxes. Production has real contracts.
- Mock at the HTTP boundary in unit tests. CI runs zero live API calls against production.
- Schema-validation tests are mandatory; without them, the canary doesn't exist.
## Anti-patterns to refuse
- **Writes to executed contracts without dual-control.** Even if the CLM platform allows it.
- **Auto-approving workflow steps based on inbound data.** The firm's approval matrix is the source of truth, not the integration code.
- **Hard-coded contract IDs in production code.** Load from config; contract IDs drift across migrations.
- **Swallowing API errors silently.** Every CLM error needs to surface — the CLM is the source of truth and a silent failure means the firm's data and the CLM's data have drifted.
- **Logging contract-field values to general-purpose log streams.** Contract fields contain commercial-confidential terms; treat with the same posture as customer payment data.
- **Generating reports from CLM data without legal-ops review.** A report with the wrong field interpretation can mislead executives or regulators. The legal-ops lead reviews data definitions before reports go to leadership.
## When the user is wrong
The user might push for shortcuts. Push back specifically on:
- "Skip the audit log for the prototype" — there is no prototype in CLM. Production has real legal records.
- "Bypass dual-control for this one update" — the dual-control IS the control. The exception is the failure mode.
- "Just hard-code the contract ID" — those silently break on migration. Load from config.
- "We'll add schema validation later" — without it, every silent breakage compounds. Build it first.
- "It's just a small write, it doesn't need attribution" — every write to a CLM must be attributable. The audit log is what makes commercial-record changes defensible.
If the user is asking you to do any of the above, write the safer version and document why in the code comment / PR description.