diff --git a/packages/api/tsconfig.json b/packages/api/tsconfig.json
index 2d007a8e0ca497c30a33a686c5535bafe3c46f64..c6696bd975783742c66e7b43ce7c68af2424b883 100644
--- a/packages/api/tsconfig.json
+++ b/packages/api/tsconfig.json
@@ -26,6 +26,10 @@
     "resolveJsonModule": true,
     "noUnusedLocals": true,
     "noUnusedParameters": true,
+    // TODO 2024-12-04 mettre les deux options suivantes à true génère beaucoup d'erreurs
+    "noPropertyAccessFromIndexSignature": false,
+    "noUncheckedIndexedAccess": false,
+    "noUncheckedSideEffectImports": true,
     "noEmit": true,
     "paths": {
       "graphql-fields": ["./src/@types/graphql-fields"],
diff --git a/packages/common/src/etape.ts b/packages/common/src/etape.ts
index 4459ed007326f38f29637f658edaa55820935560..245c939f489e75df1aaf88b816d9c77a4e1c2775 100644
--- a/packages/common/src/etape.ts
+++ b/packages/common/src/etape.ts
@@ -134,7 +134,7 @@ export const getStatutId = (etape: Pick<FlattenEtape, 'date' | 'contenu' | 'type
     return etape.statutId
   }
 
-  const duree = etape.contenu[sectionDureeIds[etape.typeId]]?.duree?.value ?? 0
+  const duree = etape.contenu[sectionDureeIds[etape.typeId]]?.['duree']?.value ?? 0
 
   if (isBefore(currentDate, etape.date)) {
     return ETAPES_STATUTS.PROGRAMME
diff --git a/packages/common/src/permissions/etape-form.test.ts b/packages/common/src/permissions/etape-form.test.ts
index 4e107edad025a35180877f13e8684a3252bec8fe..250ffff6310988203191f1d6250bec2f0eb949a1 100644
--- a/packages/common/src/permissions/etape-form.test.ts
+++ b/packages/common/src/permissions/etape-form.test.ts
@@ -552,6 +552,52 @@ const axmDocumentsComplete: Pick<EtapeDocument | TempEtapeDocument, 'etape_docum
 ]
 
 const entreprise1Id = entrepriseIdValidator.parse('id1')
+test('etapeDocumentsStepIsComplete avec mecanisation', () => {
+  expect(
+    etapeDocumentsStepIsComplete(
+      { typeId: ETAPES_TYPES.demande, contenu: { arm: { mecanise: { value: true, etapeHeritee: null, heritee: false } } }, isBrouillon: ETAPE_IS_NOT_BROUILLON },
+      DEMARCHES_TYPES_IDS.Octroi,
+      TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX,
+      demarcheIdValidator.parse('demarcheId'),
+      [{ etape_document_type_id: 'dec' }],
+      [],
+      firstEtapeDateValidator.parse('2022-01-01')
+    )
+  ).toMatchInlineSnapshot(`
+    {
+      "errors": [
+        "le document "Documents cartographiques" (car) est obligatoire",
+        "le document "Décision cas par cas" (dep) est obligatoire",
+        "le document "Dossier "Loi sur l'eau"" (doe) est obligatoire",
+        "le document "Dossier de demande" (dom) est obligatoire",
+        "le document "Formulaire de demande" (for) est obligatoire",
+      ],
+      "valid": false,
+    }
+  `)
+
+  expect(
+    etapeDocumentsStepIsComplete(
+      { typeId: ETAPES_TYPES.demande, contenu: { arm: { mecanise: { value: false, etapeHeritee: null, heritee: false } } }, isBrouillon: ETAPE_IS_NOT_BROUILLON },
+      DEMARCHES_TYPES_IDS.Octroi,
+      TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX,
+      demarcheIdValidator.parse('demarcheId'),
+      [{ etape_document_type_id: 'dec' }],
+      [],
+      firstEtapeDateValidator.parse('2022-01-01')
+    )
+  ).toMatchInlineSnapshot(`
+    {
+      "errors": [
+        "le document "Documents cartographiques" (car) est obligatoire",
+        "le document "Dossier de demande" (dom) est obligatoire",
+        "le document "Formulaire de demande" (for) est obligatoire",
+      ],
+      "valid": false,
+    }
+  `)
+})
+
 test('etapeDocumentsStepIsComplete', () => {
   expect(
     etapeDocumentsStepIsComplete(
diff --git a/packages/common/src/permissions/etape-form.ts b/packages/common/src/permissions/etape-form.ts
index 1842ded65fd46c36c0c0c2243102f6c57b17a0ff..8909255e0d31a77546564f3518d8b4e9b312fb4f 100644
--- a/packages/common/src/permissions/etape-form.ts
+++ b/packages/common/src/permissions/etape-form.ts
@@ -254,7 +254,7 @@ export const etapeDocumentsStepIsComplete = (
   firstEtapeDate: FirstEtapeDate
 ): ValidReturn => {
   const errors: string[] = []
-  const documentTypes = getDocumentsTypes({ typeId: etape.typeId }, demarcheTypeId, titreTypeId, demarcheId, sdomZoneIds, etape.contenu.arm?.mecanise?.value === true, firstEtapeDate)
+  const documentTypes = getDocumentsTypes({ typeId: etape.typeId }, demarcheTypeId, titreTypeId, demarcheId, sdomZoneIds, etape.contenu['arm']?.['mecanise']?.value === true, firstEtapeDate)
 
   errors.push(
     ...documentTypes
diff --git a/packages/common/tsconfig.json b/packages/common/tsconfig.json
index 33ad6d6e5dfcf1be1c82c6f085fbcd7eb4bb5b30..9a700bc806548ed7acd11486e0995ad521112839 100644
--- a/packages/common/tsconfig.json
+++ b/packages/common/tsconfig.json
@@ -22,7 +22,10 @@
     "resolveJsonModule": true,
     "noUnusedLocals": true,
     "noUnusedParameters": true,
-    "noEmit": true
+    "noEmit": true,
+    "noPropertyAccessFromIndexSignature": true,
+    "noUncheckedIndexedAccess": true,
+    "noUncheckedSideEffectImports": true,
   },
   "exclude": ["vitest.config.ts"]
 }
diff --git a/packages/ui/tsconfig.json b/packages/ui/tsconfig.json
index 09ff23dcf031ffc70f12969dcf6423621b70be1b..3f4bd78f47b1657a6e1ca8e745b055651fa0ddbc 100644
--- a/packages/ui/tsconfig.json
+++ b/packages/ui/tsconfig.json
@@ -14,6 +14,10 @@
     "noUnusedLocals": true,
     "noUnusedParameters": true,
     "noErrorTruncation": false,
+    // TODO 2024-12-04 mettre les deux options suivantes à true génère beaucoup d'erreurs
+    "noPropertyAccessFromIndexSignature": false,
+    "noUncheckedIndexedAccess": false,
+    "noUncheckedSideEffectImports": true,
     "lib": [
       "esnext",
       "dom",