diff --git a/.gitlab/ci/api.yml b/.gitlab/ci/api.yml
index db0adf8388c264697ae28c81d7df5d5ee48cf7f3..028ed0ee5ddfec89e897f157fe2aea6da33c9ab9 100644
--- a/.gitlab/ci/api.yml
+++ b/.gitlab/ci/api.yml
@@ -21,7 +21,7 @@ api/test/integration:
       alias: postgres
   stage: test
   script:
-    - ./.gitlab/wait-for-it.sh -h ${PGHOST} -p ${PGPORT} -t 30 -- echo 'done'
+    - ./.gitlab/wait-for-it.sh -h ${PGHOST} -p ${PGPORT} -t 60 -- echo 'done'
     - make test/api-integration
 api/type:
   extends: .prepare-node-run
@@ -45,7 +45,7 @@ api/check-queries:
   script:
     - set -a
     - source .env-example
-    - ./.gitlab/wait-for-it.sh -h ${PGHOST} -p ${PGPORT} -t 30 -- make db/migrate
+    - ./.gitlab/wait-for-it.sh -h ${PGHOST} -p ${PGPORT} -t 60 -- make db/migrate
     - make db/check-queries
     - |
       if [ ! -z  "$(git status --porcelain)" ]; then
diff --git a/packages/api/src/api/rest/etapes.ts b/packages/api/src/api/rest/etapes.ts
index 59aab30db8dc04853add41eaf8728f91cf8d83ee..65e27b30656f06f32dcaa6cc91342e5e2b3ddc7c 100644
--- a/packages/api/src/api/rest/etapes.ts
+++ b/packages/api/src/api/rest/etapes.ts
@@ -801,6 +801,7 @@ export const updateEtape: RestNewPutCall<'/rest/etapes'> = (rootPipe): Effect.Ef
         isBrouillon,
         etape.etapeAvis,
         etape.typeId,
+        flattenEtapeAndPerimetre.flattenEtape.contenu,
         titreTypeId,
         titreDemarche.typeId,
         titreDemarche.id,
diff --git a/packages/api/src/api/rest/titres.queries.ts b/packages/api/src/api/rest/titres.queries.ts
index c5019bc62a5c408eccf58ce5ee18e19e55ce7ade..f5875858cc6a15191cb5391c5fd0e557b5183d45 100644
--- a/packages/api/src/api/rest/titres.queries.ts
+++ b/packages/api/src/api/rest/titres.queries.ts
@@ -49,7 +49,7 @@ import { TitreIdOrSlug, titreIdValidator, titreSlugValidator, TitreId } from 'ca
 import { EntrepriseId, entrepriseIdValidator } from 'camino-common/src/entreprise'
 import { AdministrationId } from 'camino-common/src/static/administrations'
 import { secteurMaritimeValidator } from 'camino-common/src/static/facades'
-import { getAvisTypes } from 'camino-common/src/permissions/etape-form'
+import { getAvisTypes, isArmMecanise } from 'camino-common/src/permissions/etape-form'
 import { callAndExit } from '../../tools/fp-tools'
 
 type SuperEtapeDemarcheTitreGet = OmitDistributive<DemarcheEtape, 'etape_documents' | 'avis_documents'>
@@ -257,9 +257,10 @@ export const getTitre = async (pool: Pool, user: User, idOrSlug: TitreIdOrSlug):
               superDemarche.demarche_type_id,
               superDemarche.id,
               isNotNullNorUndefined(firstEtapeDate) ? firstEtapeDate : firstEtapeDateValidator.parse(superEtape.date),
-              perimetre?.communes.map(({ id }) => id) ?? []
+              perimetre?.communes.map(({ id }) => id) ?? [],
+              isArmMecanise(superEtape.sections_with_values)
             )
-            if (isNotNullNorUndefinedNorEmpty(avisTypes)) {
+            if (isNotNullNorUndefinedNorEmpty(Object.keys(avisTypes))) {
               const avisWithLargeObjectId = await getEtapeAvisLargeObjectIdsByEtapeId(
                 superEtape.id,
                 pool,
diff --git a/packages/api/src/database/queries/titres-etapes.queries.ts b/packages/api/src/database/queries/titres-etapes.queries.ts
index 034086e3fde823e357a838be42e5720befb3a1af..2a5bfc6fc7ba86cc72814536c548f7eb7f082397 100644
--- a/packages/api/src/database/queries/titres-etapes.queries.ts
+++ b/packages/api/src/database/queries/titres-etapes.queries.ts
@@ -62,7 +62,7 @@ import { getEtapeDataForEdition } from '../../api/rest/etapes.queries'
 import { etapeAvisStepIsComplete } from 'camino-common/src/permissions/etape-form'
 import { CommuneId } from 'camino-common/src/static/communes'
 import { EtapeStatutId, etapeStatutIdValidator } from 'camino-common/src/static/etapesStatuts'
-import { contenuValidator, heritageContenuValidator } from 'camino-common/src/etape-form'
+import { contenuValidator, FlattenedContenu, heritageContenuValidator } from 'camino-common/src/etape-form'
 import { DemarcheTypeId, demarcheTypeIdValidator } from 'camino-common/src/static/demarchesTypes'
 import { Effect, Option, pipe } from 'effect'
 import { CaminoError } from 'camino-common/src/zod-tools'
@@ -296,6 +296,7 @@ export const updateEtapeAvis = (
   isBrouillon: EtapeBrouillon,
   etapeAvis: EtapeAvisModification[],
   etapeTypeId: EtapeTypeId,
+  etapeContenu: FlattenedContenu,
   titreTypeId: TitreTypeId,
   demarcheTypeId: DemarcheTypeId,
   demarcheId: DemarcheId,
@@ -304,7 +305,9 @@ export const updateEtapeAvis = (
 ): Effect.Effect<Option.Option<never>, CaminoError<UpdateEtapeAvisErrors>> => {
   return Effect.Do.pipe(
     Effect.filterOrFail(
-      () => isBrouillon === ETAPE_IS_BROUILLON || etapeAvisStepIsComplete({ typeId: etapeTypeId }, etapeAvis, titreTypeId, demarcheTypeId, demarcheId, firstEtapeDate, communeIds).valid,
+      () =>
+        isBrouillon === ETAPE_IS_BROUILLON ||
+        etapeAvisStepIsComplete({ typeId: etapeTypeId, contenu: etapeContenu }, etapeAvis, titreTypeId, demarcheTypeId, demarcheId, firstEtapeDate, communeIds).valid,
       () => ({ message: avisIncomplets })
     ),
     Effect.bind('avisInDb', () => effectDbQueryAndValidate(getAvisByEtapeIdQuery, { titre_etape_id }, pool, etapeAvisDbValidator)),
@@ -420,7 +423,7 @@ const etapeAvisDbValidator = z
       avis_visibility_id: avisVisibilityIdValidator,
     })
   )
-type EtapeAvisDb = z.infer<typeof etapeAvisDbValidator>
+export type EtapeAvisDb = z.infer<typeof etapeAvisDbValidator>
 const getAvisByEtapeIdQuery = sql<Redefine<IGetAvisByEtapeIdQueryQuery, { titre_etape_id: EtapeId }, EtapeAvisDb>>`
 select
     a.id,
diff --git a/packages/api/src/knex/migrations/20241211085607_migrate-dep-to-avis.ts b/packages/api/src/knex/migrations/20241211085607_migrate-dep-to-avis.ts
new file mode 100644
index 0000000000000000000000000000000000000000..148ff5bc3118b1b864aaf6b06766689bc0501000
--- /dev/null
+++ b/packages/api/src/knex/migrations/20241211085607_migrate-dep-to-avis.ts
@@ -0,0 +1,48 @@
+/* eslint-disable sql/no-unsafe-query */
+import { CaminoDate } from 'camino-common/src/date'
+import { etapeAvisIdValidator, EtapeDocumentId, EtapeId } from 'camino-common/src/etape'
+import { DATE_DEBUT_PROCEDURE_SPECIFIQUE_AXM_ARM } from 'camino-common/src/machines'
+import { AvisTypes, AvisVisibilityIds } from 'camino-common/src/static/avisTypes'
+import { ETAPES_TYPES } from 'camino-common/src/static/etapesTypes'
+import { TITRES_TYPES_IDS } from 'camino-common/src/static/titresTypes'
+import { Knex } from 'knex'
+import { EtapeAvisDb } from '../../database/queries/titres-etapes.queries'
+import { LargeObjectId } from '../../database/largeobjects'
+import { DOCUMENTS_TYPES_IDS } from 'camino-common/src/static/documentsTypes'
+
+export const up = async (knex: Knex): Promise<void> => {
+  const etapes: { rows: { id: EtapeId; date: CaminoDate }[] } = await knex.raw(`SELECT te.id, te.date FROM titres_etapes te
+    JOIN titres_demarches td on te.titre_demarche_id = td.id
+    JOIN titres t on td.titre_id = t.id
+    WHERE te.type_id = '${ETAPES_TYPES.demande}'
+    AND date >= '${DATE_DEBUT_PROCEDURE_SPECIFIQUE_AXM_ARM}'
+    AND te.archive is false
+    AND td.archive is false
+    AND t.type_id='${TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX}'`)
+
+  for (const etape of etapes.rows) {
+    const documents: { rows: { id: EtapeDocumentId; public_lecture: boolean; entreprises_lecture: boolean; description: string; largeobject_id: LargeObjectId }[] } = await knex.raw(
+      `SELECT id, public_lecture, entreprises_lecture, description, largeobject_id FROM etapes_documents WHERE etape_id = :etapeId AND etape_document_type_id = '${DOCUMENTS_TYPES_IDS.decisionCasParCas}'`,
+      { etapeId: etape.id }
+    )
+    for (const document of documents.rows) {
+      const avis: EtapeAvisDb & { etape_id: EtapeId } = {
+        id: etapeAvisIdValidator.parse(document.id),
+        etape_id: etape.id,
+        avis_type_id: AvisTypes.avisCasParCas.id,
+        avis_statut_id: 'Exempté',
+        avis_visibility_id: document.public_lecture ? AvisVisibilityIds.Public : document.entreprises_lecture ? AvisVisibilityIds.TitulairesEtAdministrations : AvisVisibilityIds.Administrations,
+        description: document.description,
+        date: etape.date,
+        largeobject_id: document.largeobject_id,
+      }
+      await knex.raw(
+        'INSERT INTO etape_avis (id, avis_type_id, avis_statut_id, avis_visibility_id, etape_id, description, date, largeobject_id) VALUES(:id, :avis_type_id, :avis_statut_id, :avis_visibility_id, :etape_id, :description, :date, :largeobject_id)',
+        avis
+      )
+      await knex.raw('DELETE FROM etapes_documents WHERE id = :id', { id: document.id })
+    }
+  }
+}
+
+export const down = (): void => {}
diff --git a/packages/common/src/permissions/__snapshots__/etape-form.test.ts.snap b/packages/common/src/permissions/__snapshots__/etape-form.test.ts.snap
index 08b2801f3be2b17f51447da96dba4e6385a67a5a..88105b0d42bf908f92f575fec4769357bcf99e42 100644
--- a/packages/common/src/permissions/__snapshots__/etape-form.test.ts.snap
+++ b/packages/common/src/permissions/__snapshots__/etape-form.test.ts.snap
@@ -1,6 +1,6 @@
 // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
 
-exports[`getDocumentsTypes 4`] = `
+exports[`getDocumentsTypes 5`] = `
 [
   {
     "id": "cam",
@@ -153,7 +153,7 @@ demandeur
 ]
 `;
 
-exports[`getDocumentsTypes 5`] = `
+exports[`getDocumentsTypes 6`] = `
 [
   {
     "id": "cam",
@@ -306,7 +306,7 @@ demandeur
 ]
 `;
 
-exports[`getDocumentsTypes 6`] = `
+exports[`getDocumentsTypes 7`] = `
 [
   {
     "id": "cam",
diff --git a/packages/common/src/permissions/etape-form.test.ts b/packages/common/src/permissions/etape-form.test.ts
index 250ffff6310988203191f1d6250bec2f0eb949a1..314d32a3102a1404a443d8e9723bd807878c7bf9 100644
--- a/packages/common/src/permissions/etape-form.test.ts
+++ b/packages/common/src/permissions/etape-form.test.ts
@@ -11,6 +11,9 @@ import {
   fondamentaleStepIsVisible,
   getAvisTypes,
   getDocumentsTypes,
+  IS_ARM_MECANISE,
+  IS_ARM_NON_MECANISE,
+  isArmMecanise,
   perimetreStepIsComplete,
   perimetreStepIsVisible,
   sectionsStepIsComplete,
@@ -28,6 +31,8 @@ import { DEMARCHES_TYPES_IDS } from '../static/demarchesTypes'
 import { TITRES_TYPES_IDS } from '../static/titresTypes'
 import { ETAPES_TYPES } from '../static/etapesTypes'
 import { demarcheIdValidator } from '../demarche'
+import { DOCUMENTS_TYPES_IDS } from '../static/documentsTypes'
+import { ETAPES_STATUTS } from '../static/etapesStatuts'
 
 describe('dateTypeStepIsComplete', () => {
   test.each<User>([
@@ -39,8 +44,8 @@ describe('dateTypeStepIsComplete', () => {
       dateTypeStepIsComplete(
         {
           date: toCaminoDate('2024-01-01'),
-          typeId: 'mfr',
-          statutId: 'fai',
+          typeId: ETAPES_TYPES.demande,
+          statutId: ETAPES_STATUTS.FAIT,
         },
         user
       ).valid
@@ -51,8 +56,8 @@ describe('dateTypeStepIsComplete', () => {
     const result = dateTypeStepIsComplete(
       {
         date: toCaminoDate('2024-01-01'),
-        typeId: 'mfr',
-        statutId: 'fai',
+        typeId: ETAPES_TYPES.demande,
+        statutId: ETAPES_STATUTS.FAIT,
       },
       {
         ...testBlankUser,
@@ -66,8 +71,8 @@ describe('dateTypeStepIsComplete', () => {
     const result = dateTypeStepIsComplete(
       {
         date: toCaminoDate('2024-01-01'),
-        typeId: 'mfr',
-        statutId: 'fai',
+        typeId: ETAPES_TYPES.demande,
+        statutId: ETAPES_STATUTS.FAIT,
       },
       {
         ...testBlankUser,
@@ -96,8 +101,8 @@ describe('dateTypeStepIsComplete', () => {
 })
 
 test('fondamentaleStepIsVisible', () => {
-  expect(fondamentaleStepIsVisible('mfr')).toBe(true)
-  expect(fondamentaleStepIsVisible('acg')).toBe(false)
+  expect(fondamentaleStepIsVisible(ETAPES_TYPES.demande)).toBe(true)
+  expect(fondamentaleStepIsVisible(ETAPES_TYPES.avisDuConseilGeneralDeLeconomie_CGE_)).toBe(false)
 })
 
 test('fondamentaleStepIsComplete', () => {
@@ -106,12 +111,12 @@ test('fondamentaleStepIsComplete', () => {
       {
         duree: { value: 0, heritee: false, etapeHeritee: null },
         substances: { value: [], heritee: false, etapeHeritee: null },
-        typeId: 'acg',
+        typeId: ETAPES_TYPES.avisDuConseilGeneralDeLeconomie_CGE_,
         titulaires: { value: [], heritee: false, etapeHeritee: null },
         amodiataires: { value: [], heritee: false, etapeHeritee: null },
       },
-      'amo',
-      'prr',
+      DEMARCHES_TYPES_IDS.Amodiation,
+      TITRES_TYPES_IDS.PERMIS_EXCLUSIF_DE_RECHERCHES_RADIOACTIF,
       { ...testBlankUser, role: 'super' }
     ).valid
   ).toBe(true)
@@ -121,12 +126,12 @@ test('fondamentaleStepIsComplete', () => {
       {
         duree: { value: 0, heritee: false, etapeHeritee: null },
         substances: { value: [], heritee: false, etapeHeritee: null },
-        typeId: 'dpu',
+        typeId: ETAPES_TYPES.publicationDeDecisionAuJORF,
         titulaires: { value: [], heritee: false, etapeHeritee: null },
         amodiataires: { value: [], heritee: false, etapeHeritee: null },
       },
-      'amo',
-      'prr',
+      DEMARCHES_TYPES_IDS.Amodiation,
+      TITRES_TYPES_IDS.PERMIS_EXCLUSIF_DE_RECHERCHES_RADIOACTIF,
       { ...testBlankUser, role: 'super' }
     )
   ).toMatchInlineSnapshot(`
@@ -144,12 +149,12 @@ test('fondamentaleStepIsComplete', () => {
       {
         duree: { value: 0, heritee: false, etapeHeritee: null },
         substances: { value: [], heritee: false, etapeHeritee: null },
-        typeId: 'mfr',
+        typeId: ETAPES_TYPES.demande,
         titulaires: { value: [], heritee: false, etapeHeritee: null },
         amodiataires: { value: [], heritee: false, etapeHeritee: null },
       },
-      'amo',
-      'prr',
+      DEMARCHES_TYPES_IDS.Amodiation,
+      TITRES_TYPES_IDS.PERMIS_EXCLUSIF_DE_RECHERCHES_RADIOACTIF,
       { ...testBlankUser, role: 'super' }
     )
   ).toMatchInlineSnapshot(`
@@ -168,12 +173,12 @@ test('fondamentaleStepIsComplete', () => {
       {
         duree: { value: 0, heritee: false, etapeHeritee: null },
         substances: { value: ['auru'], heritee: false, etapeHeritee: null },
-        typeId: 'mfr',
+        typeId: ETAPES_TYPES.demande,
         titulaires: { value: [], heritee: false, etapeHeritee: null },
         amodiataires: { value: [], heritee: false, etapeHeritee: null },
       },
-      'oct',
-      'prr',
+      DEMARCHES_TYPES_IDS.Octroi,
+      TITRES_TYPES_IDS.PERMIS_EXCLUSIF_DE_RECHERCHES_RADIOACTIF,
       { ...testBlankUser, role: 'super' }
     )
   ).toMatchInlineSnapshot(`
@@ -190,12 +195,12 @@ test('fondamentaleStepIsComplete', () => {
       {
         duree: { value: 0, heritee: false, etapeHeritee: null },
         substances: { value: ['auru'], heritee: false, etapeHeritee: null },
-        typeId: 'mfr',
+        typeId: ETAPES_TYPES.demande,
         titulaires: { value: [entreprise1Id], heritee: false, etapeHeritee: null },
         amodiataires: { value: [], heritee: false, etapeHeritee: null },
       },
-      'oct',
-      'prr',
+      DEMARCHES_TYPES_IDS.Octroi,
+      TITRES_TYPES_IDS.PERMIS_EXCLUSIF_DE_RECHERCHES_RADIOACTIF,
       { ...testBlankUser, role: 'super' }
     )
   ).toMatchInlineSnapshot(`
@@ -211,12 +216,12 @@ test('fondamentaleStepIsComplete', () => {
       {
         duree: { value: 2, heritee: false, etapeHeritee: null },
         substances: { value: ['auru'], heritee: false, etapeHeritee: null },
-        typeId: 'mfr',
+        typeId: ETAPES_TYPES.demande,
         titulaires: { value: [], heritee: false, etapeHeritee: null },
         amodiataires: { value: [], heritee: false, etapeHeritee: null },
       },
-      'oct',
-      'arm',
+      DEMARCHES_TYPES_IDS.Octroi,
+      TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX,
       { ...testBlankUser, role: 'super' }
     )
   ).toMatchInlineSnapshot(`
@@ -232,12 +237,12 @@ test('fondamentaleStepIsComplete', () => {
       {
         duree: { value: 0, heritee: false, etapeHeritee: null },
         substances: { value: ['auru'], heritee: false, etapeHeritee: null },
-        typeId: 'mfr',
+        typeId: ETAPES_TYPES.demande,
         titulaires: { value: [], heritee: false, etapeHeritee: null },
         amodiataires: { value: [], heritee: false, etapeHeritee: null },
       },
-      'oct',
-      'arm',
+      DEMARCHES_TYPES_IDS.Octroi,
+      TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX,
       { ...testBlankUser, role: 'super' }
     )
   ).toMatchInlineSnapshot(`
@@ -254,12 +259,12 @@ test('fondamentaleStepIsComplete', () => {
       {
         duree: { value: 2, heritee: false, etapeHeritee: null },
         substances: { value: [], heritee: false, etapeHeritee: null },
-        typeId: 'mfr',
+        typeId: ETAPES_TYPES.demande,
         titulaires: { value: [], heritee: false, etapeHeritee: null },
         amodiataires: { value: [], heritee: false, etapeHeritee: null },
       },
-      'oct',
-      'arm',
+      DEMARCHES_TYPES_IDS.Octroi,
+      TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX,
       { ...testBlankUser, role: 'super' }
     )
   ).toMatchInlineSnapshot(`
@@ -277,12 +282,12 @@ test('fondamentaleStepIsComplete', () => {
       {
         duree: { value: 2, heritee: false, etapeHeritee: null },
         substances: { value: ['auru'], heritee: false, etapeHeritee: null },
-        typeId: 'mfr',
+        typeId: ETAPES_TYPES.demande,
         titulaires: { value: [entreprise1Id], heritee: false, etapeHeritee: null },
         amodiataires: { value: [], heritee: false, etapeHeritee: null },
       },
-      'mut',
-      'arm',
+      DEMARCHES_TYPES_IDS.Mutation,
+      TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX,
       { ...testBlankUser, role: 'super' }
     )
   ).toMatchInlineSnapshot(`
@@ -295,12 +300,12 @@ test('fondamentaleStepIsComplete', () => {
       {
         duree: { value: 0, heritee: false, etapeHeritee: null },
         substances: { value: [], heritee: false, etapeHeritee: null },
-        typeId: 'mfr',
+        typeId: ETAPES_TYPES.demande,
         titulaires: { value: [], heritee: false, etapeHeritee: null },
         amodiataires: { value: [], heritee: false, etapeHeritee: null },
       },
-      'mut',
-      'arm',
+      DEMARCHES_TYPES_IDS.Mutation,
+      TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX,
       { ...testBlankUser, role: 'super' }
     )
   ).toMatchInlineSnapshot(`
@@ -317,12 +322,12 @@ test('fondamentaleStepIsComplete', () => {
       {
         duree: { value: 3, heritee: false, etapeHeritee: null },
         substances: { value: [SUBSTANCES_FISCALES_IDS.or], heritee: false, etapeHeritee: null },
-        typeId: 'mfr',
+        typeId: ETAPES_TYPES.demande,
         titulaires: { value: [entreprise1Id], heritee: false, etapeHeritee: null },
         amodiataires: { value: [], heritee: false, etapeHeritee: null },
       },
-      'oct',
-      'arm',
+      DEMARCHES_TYPES_IDS.Octroi,
+      TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX,
       { ...testBlankUser, role: 'entreprise', entrepriseIds: [entreprise1Id] }
     )
   ).toMatchInlineSnapshot(`
@@ -335,7 +340,7 @@ test('fondamentaleStepIsComplete', () => {
       {
         duree: { value: 2, heritee: false, etapeHeritee: null },
         substances: { value: [SUBSTANCES_FISCALES_IDS.or], heritee: false, etapeHeritee: null },
-        typeId: 'mfr',
+        typeId: ETAPES_TYPES.demande,
         titulaires: { value: [], heritee: false, etapeHeritee: null },
         amodiataires: { value: [entreprise1Id], heritee: false, etapeHeritee: null },
       },
@@ -353,7 +358,7 @@ test('fondamentaleStepIsComplete', () => {
       {
         duree: { value: 0, heritee: false, etapeHeritee: null },
         substances: { value: [SUBSTANCES_FISCALES_IDS.or], heritee: false, etapeHeritee: null },
-        typeId: 'mfr',
+        typeId: ETAPES_TYPES.demande,
         titulaires: { value: [], heritee: false, etapeHeritee: null },
         amodiataires: { value: [], heritee: false, etapeHeritee: null },
       },
@@ -372,28 +377,36 @@ test('fondamentaleStepIsComplete', () => {
   `)
 })
 test('sectionsStepIsVisible', () => {
-  expect(sectionsStepIsVisible({ typeId: 'mfr' }, 'oct', 'arm')).toBe(true)
-  expect(sectionsStepIsVisible({ typeId: 'aca' }, 'oct', 'axm')).toBe(false)
+  expect(sectionsStepIsVisible({ typeId: ETAPES_TYPES.demande }, DEMARCHES_TYPES_IDS.Octroi, TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX)).toBe(true)
+  expect(
+    sectionsStepIsVisible({ typeId: ETAPES_TYPES.avisDeLaCommissionDesAutorisationsDeRecherchesMinieres_CARM_ }, DEMARCHES_TYPES_IDS.Octroi, TITRES_TYPES_IDS.AUTORISATION_D_EXPLOITATION_METAUX)
+  ).toBe(false)
 })
 
 test('sectionsStepIsComplete', () => {
-  expect(sectionsStepIsComplete({ typeId: 'mfr', contenu: {} }, 'oct', 'arm').valid).toBe(false)
-  expect(sectionsStepIsComplete({ typeId: 'mfr', contenu: { arm: { mecanise: { value: true, heritee: false, etapeHeritee: null } } } }, 'oct', 'arm').valid).toBe(true)
+  expect(sectionsStepIsComplete({ typeId: ETAPES_TYPES.demande, contenu: {} }, DEMARCHES_TYPES_IDS.Octroi, TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX).valid).toBe(false)
+  expect(
+    sectionsStepIsComplete(
+      { typeId: ETAPES_TYPES.demande, contenu: { arm: { mecanise: { value: true, heritee: false, etapeHeritee: null } } } },
+      DEMARCHES_TYPES_IDS.Octroi,
+      TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX
+    ).valid
+  ).toBe(true)
 })
 
 test('perimetreStepIsVisible', () => {
-  expect(perimetreStepIsVisible({ typeId: 'mfr' }, DEMARCHES_TYPES_IDS.Octroi)).toBe(true)
-  expect(perimetreStepIsVisible({ typeId: 'acg' }, DEMARCHES_TYPES_IDS.Octroi)).toBe(false)
+  expect(perimetreStepIsVisible({ typeId: ETAPES_TYPES.demande }, DEMARCHES_TYPES_IDS.Octroi)).toBe(true)
+  expect(perimetreStepIsVisible({ typeId: ETAPES_TYPES.avisDuConseilGeneralDeLeconomie_CGE_ }, DEMARCHES_TYPES_IDS.Octroi)).toBe(false)
 
-  expect(perimetreStepIsVisible({ typeId: 'mfr' }, DEMARCHES_TYPES_IDS.Mutation)).toBe(false)
-  expect(perimetreStepIsVisible({ typeId: 'acg' }, DEMARCHES_TYPES_IDS.Mutation)).toBe(false)
+  expect(perimetreStepIsVisible({ typeId: ETAPES_TYPES.demande }, DEMARCHES_TYPES_IDS.Mutation)).toBe(false)
+  expect(perimetreStepIsVisible({ typeId: ETAPES_TYPES.avisDuConseilGeneralDeLeconomie_CGE_ }, DEMARCHES_TYPES_IDS.Mutation)).toBe(false)
 })
 
 test('perimetreStepIsComplete', () => {
   expect(
     perimetreStepIsComplete(
       {
-        typeId: 'mfr',
+        typeId: ETAPES_TYPES.demande,
         perimetre: {
           value: {
             geojson4326Perimetre: null,
@@ -422,7 +435,7 @@ test('perimetreStepIsComplete', () => {
   expect(
     perimetreStepIsComplete(
       {
-        typeId: 'mfr',
+        typeId: ETAPES_TYPES.demande,
         perimetre: {
           value: {
             geojson4326Perimetre: { type: 'Feature', properties: {}, geometry: { type: 'MultiPolygon', coordinates: [] } },
@@ -444,7 +457,7 @@ test('perimetreStepIsComplete', () => {
   expect(
     perimetreStepIsComplete(
       {
-        typeId: 'acg',
+        typeId: ETAPES_TYPES.avisDuConseilGeneralDeLeconomie_CGE_,
         perimetre: {
           value: {
             geojson4326Perimetre: null,
@@ -466,7 +479,7 @@ test('perimetreStepIsComplete', () => {
   expect(
     perimetreStepIsComplete(
       {
-        typeId: 'dpu',
+        typeId: ETAPES_TYPES.publicationDeDecisionAuJORF,
         perimetre: {
           value: {
             geojson4326Perimetre: null,
@@ -495,7 +508,7 @@ test('perimetreStepIsComplete', () => {
   expect(
     perimetreStepIsComplete(
       {
-        typeId: 'dpu',
+        typeId: ETAPES_TYPES.publicationDeDecisionAuJORF,
         perimetre: {
           value: {
             geojson4326Perimetre: { type: 'Feature', properties: {}, geometry: { type: 'MultiPolygon', coordinates: [] } },
@@ -522,32 +535,32 @@ test('etapeDocumentsStepIsVisible', () => {
 
 const axmDocumentsComplete: Pick<EtapeDocument | TempEtapeDocument, 'etape_document_type_id'>[] = [
   {
-    etape_document_type_id: 'car',
+    etape_document_type_id: DOCUMENTS_TYPES_IDS.documentsCartographiques,
   },
 
   {
-    etape_document_type_id: 'lem',
+    etape_document_type_id: DOCUMENTS_TYPES_IDS.lettreDeDemande,
   },
 
   {
-    etape_document_type_id: 'idm',
+    etape_document_type_id: DOCUMENTS_TYPES_IDS.identificationDeMateriel,
   },
 
   {
-    etape_document_type_id: 'mes',
+    etape_document_type_id: DOCUMENTS_TYPES_IDS.mesuresPrevuesPourRehabiliterLeSite,
   },
   {
-    etape_document_type_id: 'met',
+    etape_document_type_id: DOCUMENTS_TYPES_IDS.methodesPourLExecutionDesTravaux,
   },
   {
-    etape_document_type_id: 'nip',
+    etape_document_type_id: DOCUMENTS_TYPES_IDS.noticeDImpact,
   },
 
   {
-    etape_document_type_id: 'prg',
+    etape_document_type_id: DOCUMENTS_TYPES_IDS.programmeDesTravaux,
   },
   {
-    etape_document_type_id: 'sch',
+    etape_document_type_id: DOCUMENTS_TYPES_IDS.schemaDePenetrationDuMassifForestier,
   },
 ]
 
@@ -559,7 +572,7 @@ test('etapeDocumentsStepIsComplete avec mecanisation', () => {
       DEMARCHES_TYPES_IDS.Octroi,
       TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX,
       demarcheIdValidator.parse('demarcheId'),
-      [{ etape_document_type_id: 'dec' }],
+      [{ etape_document_type_id: DOCUMENTS_TYPES_IDS.decret }],
       [],
       firstEtapeDateValidator.parse('2022-01-01')
     )
@@ -582,7 +595,7 @@ test('etapeDocumentsStepIsComplete avec mecanisation', () => {
       DEMARCHES_TYPES_IDS.Octroi,
       TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX,
       demarcheIdValidator.parse('demarcheId'),
-      [{ etape_document_type_id: 'dec' }],
+      [{ etape_document_type_id: DOCUMENTS_TYPES_IDS.decret }],
       [],
       firstEtapeDateValidator.parse('2022-01-01')
     )
@@ -601,11 +614,11 @@ test('etapeDocumentsStepIsComplete avec mecanisation', () => {
 test('etapeDocumentsStepIsComplete', () => {
   expect(
     etapeDocumentsStepIsComplete(
-      { typeId: 'cac', contenu: {}, isBrouillon: ETAPE_IS_NOT_BROUILLON },
-      'oct',
-      'arm',
+      { typeId: ETAPES_TYPES.consultationDesAdministrationsCentrales, contenu: {}, isBrouillon: ETAPE_IS_NOT_BROUILLON },
+      DEMARCHES_TYPES_IDS.Octroi,
+      TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX,
       demarcheIdValidator.parse('demarcheId'),
-      [{ etape_document_type_id: 'dec' }],
+      [{ etape_document_type_id: DOCUMENTS_TYPES_IDS.decret }],
       [],
       firstEtapeDateValidator.parse('2022-01-01')
     )
@@ -620,9 +633,9 @@ test('etapeDocumentsStepIsComplete', () => {
 
   expect(
     etapeDocumentsStepIsComplete(
-      { typeId: 'mfr', contenu: {}, isBrouillon: ETAPE_IS_BROUILLON },
-      'oct',
-      'axm',
+      { typeId: ETAPES_TYPES.demande, contenu: {}, isBrouillon: ETAPE_IS_BROUILLON },
+      DEMARCHES_TYPES_IDS.Octroi,
+      TITRES_TYPES_IDS.AUTORISATION_D_EXPLOITATION_METAUX,
       demarcheIdValidator.parse('demarcheId'),
       axmDocumentsComplete,
       [],
@@ -636,9 +649,9 @@ test('etapeDocumentsStepIsComplete', () => {
 
   expect(
     etapeDocumentsStepIsComplete(
-      { typeId: 'pqr', contenu: {}, isBrouillon: ETAPE_IS_BROUILLON },
-      'oct',
-      'axm',
+      { typeId: ETAPES_TYPES.publicationDansUnJournalLocalOuNational, contenu: {}, isBrouillon: ETAPE_IS_BROUILLON },
+      DEMARCHES_TYPES_IDS.Octroi,
+      TITRES_TYPES_IDS.AUTORISATION_D_EXPLOITATION_METAUX,
       demarcheIdValidator.parse('demarcheId'),
       [],
       [],
@@ -652,41 +665,50 @@ test('etapeDocumentsStepIsComplete', () => {
 })
 
 test('entrepriseDocumentsStepIsVisible', () => {
-  expect(entrepriseDocumentsStepIsVisible({ typeId: 'cac' }, 'oct', 'axm')).toBe(false)
-  expect(entrepriseDocumentsStepIsVisible({ typeId: 'mfr' }, 'oct', 'axm')).toBe(true)
-  expect(entrepriseDocumentsStepIsVisible({ typeId: 'pqr' }, 'oct', 'axm')).toBe(false)
+  expect(entrepriseDocumentsStepIsVisible({ typeId: ETAPES_TYPES.consultationDesAdministrationsCentrales }, DEMARCHES_TYPES_IDS.Octroi, TITRES_TYPES_IDS.AUTORISATION_D_EXPLOITATION_METAUX)).toBe(
+    false
+  )
+  expect(entrepriseDocumentsStepIsVisible({ typeId: ETAPES_TYPES.demande }, DEMARCHES_TYPES_IDS.Octroi, TITRES_TYPES_IDS.AUTORISATION_D_EXPLOITATION_METAUX)).toBe(true)
+  expect(entrepriseDocumentsStepIsVisible({ typeId: ETAPES_TYPES.publicationDansUnJournalLocalOuNational }, DEMARCHES_TYPES_IDS.Octroi, TITRES_TYPES_IDS.AUTORISATION_D_EXPLOITATION_METAUX)).toBe(
+    false
+  )
 })
 test('entrepriseDocumentsStepIsComplete', () => {
   expect(
     entrepriseDocumentsStepIsComplete(
-      { typeId: 'cac', titulaires: { value: [], heritee: false, etapeHeritee: null }, amodiataires: { value: [], heritee: false, etapeHeritee: null }, contenu: {} },
-      'oct',
-      'axm',
+      {
+        typeId: ETAPES_TYPES.consultationDesAdministrationsCentrales,
+        titulaires: { value: [], heritee: false, etapeHeritee: null },
+        amodiataires: { value: [], heritee: false, etapeHeritee: null },
+        contenu: {},
+      },
+      DEMARCHES_TYPES_IDS.Octroi,
+      TITRES_TYPES_IDS.AUTORISATION_D_EXPLOITATION_METAUX,
       []
     ).valid
   ).toBe(true)
   expect(
     entrepriseDocumentsStepIsComplete(
-      { typeId: 'mfr', titulaires: { value: [], heritee: false, etapeHeritee: null }, amodiataires: { value: [], heritee: false, etapeHeritee: null }, contenu: {} },
-      'oct',
-      'axm',
+      { typeId: ETAPES_TYPES.demande, titulaires: { value: [], heritee: false, etapeHeritee: null }, amodiataires: { value: [], heritee: false, etapeHeritee: null }, contenu: {} },
+      DEMARCHES_TYPES_IDS.Octroi,
+      TITRES_TYPES_IDS.AUTORISATION_D_EXPLOITATION_METAUX,
       []
     ).valid
   ).toBe(false)
 
   expect(
     entrepriseDocumentsStepIsComplete(
-      { typeId: 'mfr', titulaires: { value: [entreprise1Id], heritee: false, etapeHeritee: null }, amodiataires: { value: [], heritee: false, etapeHeritee: null }, contenu: {} },
-      'oct',
-      'axm',
+      { typeId: ETAPES_TYPES.demande, titulaires: { value: [entreprise1Id], heritee: false, etapeHeritee: null }, amodiataires: { value: [], heritee: false, etapeHeritee: null }, contenu: {} },
+      DEMARCHES_TYPES_IDS.Octroi,
+      TITRES_TYPES_IDS.AUTORISATION_D_EXPLOITATION_METAUX,
       []
     ).valid
   ).toBe(false)
   expect(
     entrepriseDocumentsStepIsComplete(
-      { typeId: 'mfr', titulaires: { value: [], heritee: false, etapeHeritee: null }, amodiataires: { value: [entreprise1Id], heritee: false, etapeHeritee: null }, contenu: {} },
-      'oct',
-      'axm',
+      { typeId: ETAPES_TYPES.demande, titulaires: { value: [], heritee: false, etapeHeritee: null }, amodiataires: { value: [entreprise1Id], heritee: false, etapeHeritee: null }, contenu: {} },
+      DEMARCHES_TYPES_IDS.Octroi,
+      TITRES_TYPES_IDS.AUTORISATION_D_EXPLOITATION_METAUX,
       []
     ).valid
   ).toBe(false)
@@ -694,37 +716,37 @@ test('entrepriseDocumentsStepIsComplete', () => {
   expect(
     entrepriseDocumentsStepIsComplete(
       {
-        typeId: 'mfr',
+        typeId: ETAPES_TYPES.demande,
         titulaires: { value: [], heritee: false, etapeHeritee: null },
         amodiataires: { value: [entreprise1Id], heritee: false, etapeHeritee: null },
         contenu: { arm: { mecanise: { value: false, heritee: false, etapeHeritee: null } } },
       },
-      'oct',
-      'arm',
+      DEMARCHES_TYPES_IDS.Octroi,
+      TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX,
       [
         {
-          documentTypeId: 'atf',
+          documentTypeId: DOCUMENTS_TYPES_IDS.attestationFiscale,
           entrepriseId: entreprise1Id,
         },
         {
-          documentTypeId: 'cur',
+          documentTypeId: DOCUMENTS_TYPES_IDS.curriculumVitae,
           entrepriseId: entreprise1Id,
         },
 
         {
-          documentTypeId: 'jid',
+          documentTypeId: DOCUMENTS_TYPES_IDS.justificatifDIdentite,
           entrepriseId: entreprise1Id,
         },
         {
-          documentTypeId: 'jct',
+          documentTypeId: DOCUMENTS_TYPES_IDS.justificatifDesCapacitesTechniques,
           entrepriseId: entreprise1Id,
         },
         {
-          documentTypeId: 'kbi',
+          documentTypeId: DOCUMENTS_TYPES_IDS.kbis,
           entrepriseId: entreprise1Id,
         },
         {
-          documentTypeId: 'jcf',
+          documentTypeId: DOCUMENTS_TYPES_IDS.justificatifDesCapacitesFinancieres,
           entrepriseId: entreprise1Id,
         },
       ]
@@ -733,7 +755,17 @@ test('entrepriseDocumentsStepIsComplete', () => {
 })
 
 test('getDocumentsTypes', () => {
-  expect(getDocumentsTypes({ typeId: 'cac' }, 'oct', 'axm', demarcheIdValidator.parse('demarcheId'), [], false, firstEtapeDateValidator.parse('2022-01-01'))).toMatchInlineSnapshot(`
+  expect(
+    getDocumentsTypes(
+      { typeId: ETAPES_TYPES.consultationDesAdministrationsCentrales },
+      DEMARCHES_TYPES_IDS.Octroi,
+      TITRES_TYPES_IDS.AUTORISATION_D_EXPLOITATION_METAUX,
+      demarcheIdValidator.parse('demarcheId'),
+      [],
+      IS_ARM_NON_MECANISE,
+      firstEtapeDateValidator.parse('2022-01-01')
+    )
+  ).toMatchInlineSnapshot(`
     [
       {
         "id": "lcm",
@@ -748,7 +780,17 @@ test('getDocumentsTypes', () => {
     ]
   `)
 
-  expect(getDocumentsTypes({ typeId: 'mfr' }, 'oct', 'arm', demarcheIdValidator.parse('demarcheId'), [], false, firstEtapeDateValidator.parse('2022-01-01'))).toMatchInlineSnapshot(`
+  expect(
+    getDocumentsTypes(
+      { typeId: ETAPES_TYPES.demande },
+      DEMARCHES_TYPES_IDS.Octroi,
+      TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX,
+      demarcheIdValidator.parse('demarcheId'),
+      [],
+      IS_ARM_NON_MECANISE,
+      firstEtapeDateValidator.parse('2022-01-01')
+    )
+  ).toMatchInlineSnapshot(`
     [
       {
         "id": "cam",
@@ -849,7 +891,17 @@ test('getDocumentsTypes', () => {
     ]
   `)
 
-  expect(getDocumentsTypes({ typeId: 'mfr' }, 'oct', 'arm', demarcheIdValidator.parse('demarcheId'), [], true, firstEtapeDateValidator.parse('2022-01-01'))).toMatchInlineSnapshot(`
+  expect(
+    getDocumentsTypes(
+      { typeId: ETAPES_TYPES.demande },
+      DEMARCHES_TYPES_IDS.Octroi,
+      TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX,
+      demarcheIdValidator.parse('demarcheId'),
+      [],
+      IS_ARM_MECANISE,
+      firstEtapeDateValidator.parse('2022-01-01')
+    )
+  ).toMatchInlineSnapshot(`
     [
       {
         "id": "cam",
@@ -949,37 +1001,184 @@ test('getDocumentsTypes', () => {
       },
     ]
   `)
-
-  expect(getDocumentsTypes({ typeId: 'mfr' }, 'oct', 'axm', demarcheIdValidator.parse('demarcheId'), ['1'], false, firstEtapeDateValidator.parse('2022-01-01'))).toMatchSnapshot()
-  expect(getDocumentsTypes({ typeId: 'mfr' }, 'oct', 'axm', demarcheIdValidator.parse('demarcheId'), ['2'], false, firstEtapeDateValidator.parse('2022-01-01'))).toMatchSnapshot()
-  expect(getDocumentsTypes({ typeId: 'mfr' }, 'oct', 'axm', demarcheIdValidator.parse('demarcheId'), ['2'], false, firstEtapeDateValidator.parse('2024-12-01'))).toMatchSnapshot()
+  expect(
+    getDocumentsTypes(
+      { typeId: ETAPES_TYPES.demande },
+      DEMARCHES_TYPES_IDS.Octroi,
+      TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX,
+      demarcheIdValidator.parse('demarcheId'),
+      [],
+      IS_ARM_MECANISE,
+      firstEtapeDateValidator.parse('2024-10-01')
+    )
+  ).toMatchInlineSnapshot(`
+      [
+        {
+          "id": "cam",
+          "nom": "Contrat d'amodiation",
+          "optionnel": true,
+        },
+        {
+          "description": undefined,
+          "id": "car",
+          "nom": "Documents cartographiques",
+          "optionnel": false,
+        },
+        {
+          "id": "cnt",
+          "nom": "Contrat",
+          "optionnel": true,
+        },
+        {
+          "id": "cod",
+          "nom": "Compléments au dossier de demande",
+          "optionnel": true,
+        },
+        {
+          "description": undefined,
+          "id": "dep",
+          "nom": "Décision cas par cas",
+          "optionnel": true,
+        },
+        {
+          "description": undefined,
+          "id": "doe",
+          "nom": "Dossier "Loi sur l'eau"",
+          "optionnel": false,
+        },
+        {
+          "description": undefined,
+          "id": "dom",
+          "nom": "Dossier de demande",
+          "optionnel": false,
+        },
+        {
+          "id": "dos",
+          "nom": "Dossier",
+          "optionnel": true,
+        },
+        {
+          "id": "fac",
+          "nom": "Facture",
+          "optionnel": true,
+        },
+        {
+          "id": "fic",
+          "nom": "Fiche de complétude",
+          "optionnel": true,
+        },
+        {
+          "id": "fip",
+          "nom": "Fiche de présentation",
+          "optionnel": true,
+        },
+        {
+          "description": undefined,
+          "id": "for",
+          "nom": "Formulaire de demande",
+          "optionnel": false,
+        },
+        {
+          "description": undefined,
+          "id": "jpa",
+          "nom": "Justificatif de paiement",
+          "optionnel": true,
+        },
+        {
+          "id": "lem",
+          "nom": "Lettre de demande",
+          "optionnel": true,
+        },
+        {
+          "id": "let",
+          "nom": "Lettre",
+          "optionnel": true,
+        },
+        {
+          "id": "noi",
+          "nom": "Notice d'incidence",
+          "optionnel": true,
+        },
+        {
+          "id": "rec",
+          "nom": "Récépissé "Loi sur l'eau"",
+          "optionnel": true,
+        },
+        {
+          "id": "aut",
+          "nom": "Autre document",
+          "optionnel": true,
+        },
+      ]
+    `)
+  expect(
+    getDocumentsTypes(
+      { typeId: ETAPES_TYPES.demande },
+      DEMARCHES_TYPES_IDS.Octroi,
+      TITRES_TYPES_IDS.AUTORISATION_D_EXPLOITATION_METAUX,
+      demarcheIdValidator.parse('demarcheId'),
+      ['1'],
+      IS_ARM_NON_MECANISE,
+      firstEtapeDateValidator.parse('2022-01-01')
+    )
+  ).toMatchSnapshot()
+  expect(
+    getDocumentsTypes(
+      { typeId: ETAPES_TYPES.demande },
+      DEMARCHES_TYPES_IDS.Octroi,
+      TITRES_TYPES_IDS.AUTORISATION_D_EXPLOITATION_METAUX,
+      demarcheIdValidator.parse('demarcheId'),
+      ['2'],
+      IS_ARM_NON_MECANISE,
+      firstEtapeDateValidator.parse('2022-01-01')
+    )
+  ).toMatchSnapshot()
+  expect(
+    getDocumentsTypes(
+      { typeId: ETAPES_TYPES.demande },
+      DEMARCHES_TYPES_IDS.Octroi,
+      TITRES_TYPES_IDS.AUTORISATION_D_EXPLOITATION_METAUX,
+      demarcheIdValidator.parse('demarcheId'),
+      ['2'],
+      IS_ARM_NON_MECANISE,
+      firstEtapeDateValidator.parse('2024-12-01')
+    )
+  ).toMatchSnapshot()
 })
 
 const demarcheId = demarcheIdValidator.parse('demarcheId')
 const firstEtapeDate = firstEtapeDateValidator.parse('2022-01-01')
 test("getAvisType avis de l'office national des forêts est optionnel pour la procédure spécifique", () => {
-  const avis = getAvisTypes('asc', 'arm', 'oct', demarcheId, firstEtapeDateValidator.parse('2024-11-01'), [])
-  expect(avis.find(unAvis => unAvis.id === 'avisOfficeNationalDesForets' && unAvis.optionnel)).toMatchInlineSnapshot(`
-      {
-        "id": "avisOfficeNationalDesForets",
-        "nom": "Avis de l'Office National des Forêts",
-        "optionnel": true,
+  const avis = getAvisTypes(
+    ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives,
+    TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX,
+    DEMARCHES_TYPES_IDS.Octroi,
+    demarcheId,
+    firstEtapeDateValidator.parse('2024-11-01'),
+    [],
+    IS_ARM_MECANISE
+  )
+  expect(avis.avisOfficeNationalDesForets?.optionnel).toBe(true)
+})
+test("getAvisType: avis au cas par cas et avis du propriétaire du sol sont obligatoires pour les demandes d'ARM mécanisée de la procédure spécifique", () => {
+  expect(getAvisTypes(ETAPES_TYPES.demande, TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX, DEMARCHES_TYPES_IDS.Octroi, demarcheId, firstEtapeDate, [], IS_ARM_MECANISE)).toMatchInlineSnapshot(`{}`)
+  expect(
+    getAvisTypes(ETAPES_TYPES.demande, TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX, DEMARCHES_TYPES_IDS.Octroi, demarcheId, firstEtapeDateValidator.parse('2025-01-01'), [], IS_ARM_MECANISE)
+  ).toMatchInlineSnapshot(`
+    {
+      "avisCasParCas": {
+        "id": "avisCasParCas",
+        "nom": "Décision au cas par cas",
+        "optionnel": false,
         "statutIds": [
-          "Favorable",
-          "Défavorable",
-          "Favorable avec réserves",
-          "Non renseigné",
+          "Exempté",
+          "Requis",
         ],
-      }
-    `)
-})
-test('getAvisType', () => {
-  expect(getAvisTypes(ETAPES_TYPES.avisDesCollectivites, 'arm', 'oct', demarcheId, firstEtapeDate, [])).toMatchInlineSnapshot(`
-    [
-      {
-        "id": "avisDUneCollectivite",
-        "nom": "Avis d'une collectivité",
-        "optionnel": true,
+      },
+      "avisProprietaireDuSol": {
+        "id": "avisProprietaireDuSol",
+        "nom": "avis du propriétaire du sol",
+        "optionnel": false,
         "statutIds": [
           "Favorable",
           "Défavorable",
@@ -987,14 +1186,34 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-    ]
+    }
   `)
-  expect(getAvisTypes('mfr', 'arm', 'oct', demarcheId, firstEtapeDate, [])).toMatchInlineSnapshot('[]')
-  expect(getAvisTypes('asc', 'arm', 'oct', demarcheId, firstEtapeDate, [])).toMatchInlineSnapshot(`
-    [
-      {
-        "id": "avisDirectionRegionaleDesAffairesCulturelles",
-        "nom": "Avis de la Direction Régionale Des Affaires Culturelles (DRAC)",
+})
+test('getAvisType', () => {
+  expect(getAvisTypes(ETAPES_TYPES.avisDesCollectivites, TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX, DEMARCHES_TYPES_IDS.Octroi, demarcheId, firstEtapeDate, [], IS_ARM_MECANISE))
+    .toMatchInlineSnapshot(`
+      {
+        "avisDUneCollectivite": {
+          "id": "avisDUneCollectivite",
+          "nom": "Avis d'une collectivité",
+          "optionnel": true,
+          "statutIds": [
+            "Favorable",
+            "Défavorable",
+            "Favorable avec réserves",
+            "Non renseigné",
+          ],
+        },
+      }
+    `)
+  expect(getAvisTypes(ETAPES_TYPES.demande, TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX, DEMARCHES_TYPES_IDS.Octroi, demarcheId, firstEtapeDate, [], IS_ARM_MECANISE)).toMatchInlineSnapshot(`{}`)
+  expect(
+    getAvisTypes(ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives, TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX, DEMARCHES_TYPES_IDS.Octroi, demarcheId, firstEtapeDate, [], IS_ARM_MECANISE)
+  ).toMatchInlineSnapshot(`
+    {
+      "autreAvis": {
+        "id": "autreAvis",
+        "nom": "Autre avis",
         "optionnel": true,
         "statutIds": [
           "Favorable",
@@ -1003,9 +1222,9 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-      {
-        "id": "avisConseilDepartementalEnvironnementRisquesSanitairesTechnologiques",
-        "nom": "Avis du Conseil Départemental de l'Environnement et des Risques Sanitaires et Technologiques (CODERST)",
+      "avisAgenceRegionaleSante": {
+        "id": "avisAgenceRegionaleSante",
+        "nom": "Avis de l'Agence Régionale de Santé (ARS)",
         "optionnel": true,
         "statutIds": [
           "Favorable",
@@ -1014,9 +1233,9 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-      {
-        "id": "avisDirectionsRégionalesEconomieEmploiTravailSolidarités",
-        "nom": "Avis de la Direction régionale de l'économie, de l'emploi, du travail et des solidarités",
+      "avisAutoriteMilitaire": {
+        "id": "avisAutoriteMilitaire",
+        "nom": "Avis de l'Autorité militaire",
         "optionnel": true,
         "statutIds": [
           "Favorable",
@@ -1025,9 +1244,9 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-      {
-        "id": "avisDirectionRegionaleFinancesPubliques",
-        "nom": "Avis de la Direction Regionale Des Finances Publiques",
+      "avisCaisseGeneraleSecuriteSociale": {
+        "id": "avisCaisseGeneraleSecuriteSociale",
+        "nom": "Avis de la Caisse Générale de Sécurité Sociale",
         "optionnel": true,
         "statutIds": [
           "Favorable",
@@ -1036,9 +1255,9 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-      {
-        "id": "avisGendarmerieNationale",
-        "nom": "Avis de la Gendarmerie Nationale",
+      "avisConseilDepartementalEnvironnementRisquesSanitairesTechnologiques": {
+        "id": "avisConseilDepartementalEnvironnementRisquesSanitairesTechnologiques",
+        "nom": "Avis du Conseil Départemental de l'Environnement et des Risques Sanitaires et Technologiques (CODERST)",
         "optionnel": true,
         "statutIds": [
           "Favorable",
@@ -1047,9 +1266,9 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-      {
-        "id": "avisIFREMER",
-        "nom": "Avis de l'IFREMER",
+      "avisDirectionDepartementaleTerritoiresMer": {
+        "id": "avisDirectionDepartementaleTerritoiresMer",
+        "nom": "Avis de la Direction Départementale des Territoires et de la Mer (DDTM)",
         "optionnel": true,
         "statutIds": [
           "Favorable",
@@ -1058,9 +1277,9 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-      {
-        "id": "avisInstitutNationalOrigineQualite",
-        "nom": "Avis de l'Institut National de l'origine et de la Qualité",
+      "avisDirectionRegionaleDesAffairesCulturelles": {
+        "id": "avisDirectionRegionaleDesAffairesCulturelles",
+        "nom": "Avis de la Direction Régionale Des Affaires Culturelles (DRAC)",
         "optionnel": true,
         "statutIds": [
           "Favorable",
@@ -1069,9 +1288,9 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-      {
-        "id": "avisServiceAdministratifLocal",
-        "nom": "Avis d'un Service Administratif Local",
+      "avisDirectionRegionaleFinancesPubliques": {
+        "id": "avisDirectionRegionaleFinancesPubliques",
+        "nom": "Avis de la Direction Regionale Des Finances Publiques",
         "optionnel": true,
         "statutIds": [
           "Favorable",
@@ -1080,9 +1299,9 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-      {
-        "id": "avisAutoriteMilitaire",
-        "nom": "Avis de l'Autorité militaire",
+      "avisDirectionsRégionalesEconomieEmploiTravailSolidarités": {
+        "id": "avisDirectionsRégionalesEconomieEmploiTravailSolidarités",
+        "nom": "Avis de la Direction régionale de l'économie, de l'emploi, du travail et des solidarités",
         "optionnel": true,
         "statutIds": [
           "Favorable",
@@ -1091,9 +1310,9 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-      {
-        "id": "avisParcNational",
-        "nom": "Avis du Parc National",
+      "avisGendarmerieNationale": {
+        "id": "avisGendarmerieNationale",
+        "nom": "Avis de la Gendarmerie Nationale",
         "optionnel": true,
         "statutIds": [
           "Favorable",
@@ -1102,9 +1321,9 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-      {
-        "id": "avisDirectionDepartementaleTerritoiresMer",
-        "nom": "Avis de la Direction Départementale des Territoires et de la Mer (DDTM)",
+      "avisIFREMER": {
+        "id": "avisIFREMER",
+        "nom": "Avis de l'IFREMER",
         "optionnel": true,
         "statutIds": [
           "Favorable",
@@ -1113,9 +1332,9 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-      {
-        "id": "avisAgenceRegionaleSante",
-        "nom": "Avis de l'Agence Régionale de Santé (ARS)",
+      "avisInstitutNationalOrigineQualite": {
+        "id": "avisInstitutNationalOrigineQualite",
+        "nom": "Avis de l'Institut National de l'origine et de la Qualité",
         "optionnel": true,
         "statutIds": [
           "Favorable",
@@ -1124,10 +1343,10 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-      {
-        "id": "avisCaisseGeneraleSecuriteSociale",
-        "nom": "Avis de la Caisse Générale de Sécurité Sociale",
-        "optionnel": true,
+      "avisOfficeNationalDesForets": {
+        "id": "avisOfficeNationalDesForets",
+        "nom": "Avis de l'Office National des Forêts",
+        "optionnel": false,
         "statutIds": [
           "Favorable",
           "Défavorable",
@@ -1135,9 +1354,9 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-      {
-        "id": "autreAvis",
-        "nom": "Autre avis",
+      "avisParcNational": {
+        "id": "avisParcNational",
+        "nom": "Avis du Parc National",
         "optionnel": true,
         "statutIds": [
           "Favorable",
@@ -1146,10 +1365,10 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-      {
-        "id": "avisOfficeNationalDesForets",
-        "nom": "Avis de l'Office National des Forêts",
-        "optionnel": false,
+      "avisParcNaturelMarin": {
+        "id": "avisParcNaturelMarin",
+        "nom": "Avis du Parc Naturel Marin",
+        "optionnel": true,
         "statutIds": [
           "Favorable",
           "Défavorable",
@@ -1157,9 +1376,9 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-      {
-        "id": "expertiseOfficeNationalDesForets",
-        "nom": "Expertise de l'Office National des Forêts",
+      "avisServiceAdministratifLocal": {
+        "id": "avisServiceAdministratifLocal",
+        "nom": "Avis d'un Service Administratif Local",
         "optionnel": true,
         "statutIds": [
           "Favorable",
@@ -1168,9 +1387,9 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-      {
-        "id": "avisParcNaturelMarin",
-        "nom": "Avis du Parc Naturel Marin",
+      "expertiseOfficeNationalDesForets": {
+        "id": "expertiseOfficeNationalDesForets",
+        "nom": "Expertise de l'Office National des Forêts",
         "optionnel": true,
         "statutIds": [
           "Favorable",
@@ -1179,13 +1398,23 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-    ]
+    }
   `)
-  expect(getAvisTypes('asc', 'arm', 'oct', demarcheId, firstEtapeDate, [communeIdValidator.parse('97302')])).toMatchInlineSnapshot(`
-    [
-      {
-        "id": "avisDirectionRegionaleDesAffairesCulturelles",
-        "nom": "Avis de la Direction Régionale Des Affaires Culturelles (DRAC)",
+  expect(
+    getAvisTypes(
+      ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives,
+      TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX,
+      DEMARCHES_TYPES_IDS.Octroi,
+      demarcheId,
+      firstEtapeDate,
+      [communeIdValidator.parse('97302')],
+      IS_ARM_MECANISE
+    )
+  ).toMatchInlineSnapshot(`
+    {
+      "autreAvis": {
+        "id": "autreAvis",
+        "nom": "Autre avis",
         "optionnel": true,
         "statutIds": [
           "Favorable",
@@ -1194,9 +1423,9 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-      {
-        "id": "avisConseilDepartementalEnvironnementRisquesSanitairesTechnologiques",
-        "nom": "Avis du Conseil Départemental de l'Environnement et des Risques Sanitaires et Technologiques (CODERST)",
+      "avisAgenceRegionaleSante": {
+        "id": "avisAgenceRegionaleSante",
+        "nom": "Avis de l'Agence Régionale de Santé (ARS)",
         "optionnel": true,
         "statutIds": [
           "Favorable",
@@ -1205,9 +1434,9 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-      {
-        "id": "avisDirectionsRégionalesEconomieEmploiTravailSolidarités",
-        "nom": "Avis de la Direction régionale de l'économie, de l'emploi, du travail et des solidarités",
+      "avisAutoriteMilitaire": {
+        "id": "avisAutoriteMilitaire",
+        "nom": "Avis de l'Autorité militaire",
         "optionnel": true,
         "statutIds": [
           "Favorable",
@@ -1216,9 +1445,9 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-      {
-        "id": "avisDirectionRegionaleFinancesPubliques",
-        "nom": "Avis de la Direction Regionale Des Finances Publiques",
+      "avisCaisseGeneraleSecuriteSociale": {
+        "id": "avisCaisseGeneraleSecuriteSociale",
+        "nom": "Avis de la Caisse Générale de Sécurité Sociale",
         "optionnel": true,
         "statutIds": [
           "Favorable",
@@ -1227,9 +1456,9 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-      {
-        "id": "avisGendarmerieNationale",
-        "nom": "Avis de la Gendarmerie Nationale",
+      "avisConseilDepartementalEnvironnementRisquesSanitairesTechnologiques": {
+        "id": "avisConseilDepartementalEnvironnementRisquesSanitairesTechnologiques",
+        "nom": "Avis du Conseil Départemental de l'Environnement et des Risques Sanitaires et Technologiques (CODERST)",
         "optionnel": true,
         "statutIds": [
           "Favorable",
@@ -1238,9 +1467,9 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-      {
-        "id": "avisIFREMER",
-        "nom": "Avis de l'IFREMER",
+      "avisDirectionAlimentationAgricultureForet": {
+        "id": "avisDirectionAlimentationAgricultureForet",
+        "nom": "Avis de la Direction de l'Alimentation de l'Agriculture et de la Forêt (DRAF)",
         "optionnel": true,
         "statutIds": [
           "Favorable",
@@ -1249,9 +1478,9 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-      {
-        "id": "avisInstitutNationalOrigineQualite",
-        "nom": "Avis de l'Institut National de l'origine et de la Qualité",
+      "avisDirectionDepartementaleTerritoiresMer": {
+        "id": "avisDirectionDepartementaleTerritoiresMer",
+        "nom": "Avis de la Direction Départementale des Territoires et de la Mer (DDTM)",
         "optionnel": true,
         "statutIds": [
           "Favorable",
@@ -1260,9 +1489,9 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-      {
-        "id": "avisServiceAdministratifLocal",
-        "nom": "Avis d'un Service Administratif Local",
+      "avisDirectionRegionaleDesAffairesCulturelles": {
+        "id": "avisDirectionRegionaleDesAffairesCulturelles",
+        "nom": "Avis de la Direction Régionale Des Affaires Culturelles (DRAC)",
         "optionnel": true,
         "statutIds": [
           "Favorable",
@@ -1271,9 +1500,9 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-      {
-        "id": "avisAutoriteMilitaire",
-        "nom": "Avis de l'Autorité militaire",
+      "avisDirectionRegionaleFinancesPubliques": {
+        "id": "avisDirectionRegionaleFinancesPubliques",
+        "nom": "Avis de la Direction Regionale Des Finances Publiques",
         "optionnel": true,
         "statutIds": [
           "Favorable",
@@ -1282,9 +1511,9 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-      {
-        "id": "avisParcNational",
-        "nom": "Avis du Parc National",
+      "avisDirectionsRégionalesEconomieEmploiTravailSolidarités": {
+        "id": "avisDirectionsRégionalesEconomieEmploiTravailSolidarités",
+        "nom": "Avis de la Direction régionale de l'économie, de l'emploi, du travail et des solidarités",
         "optionnel": true,
         "statutIds": [
           "Favorable",
@@ -1293,9 +1522,9 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-      {
-        "id": "avisDirectionDepartementaleTerritoiresMer",
-        "nom": "Avis de la Direction Départementale des Territoires et de la Mer (DDTM)",
+      "avisEtatMajorOrpaillagePecheIllicite": {
+        "id": "avisEtatMajorOrpaillagePecheIllicite",
+        "nom": "Avis de l'État-major Orpaillage et Pêche Illicite (EMOPI)",
         "optionnel": true,
         "statutIds": [
           "Favorable",
@@ -1304,9 +1533,9 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-      {
-        "id": "avisAgenceRegionaleSante",
-        "nom": "Avis de l'Agence Régionale de Santé (ARS)",
+      "avisGendarmerieNationale": {
+        "id": "avisGendarmerieNationale",
+        "nom": "Avis de la Gendarmerie Nationale",
         "optionnel": true,
         "statutIds": [
           "Favorable",
@@ -1315,9 +1544,9 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-      {
-        "id": "avisCaisseGeneraleSecuriteSociale",
-        "nom": "Avis de la Caisse Générale de Sécurité Sociale",
+      "avisIFREMER": {
+        "id": "avisIFREMER",
+        "nom": "Avis de l'IFREMER",
         "optionnel": true,
         "statutIds": [
           "Favorable",
@@ -1326,9 +1555,9 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-      {
-        "id": "autreAvis",
-        "nom": "Autre avis",
+      "avisInstitutNationalOrigineQualite": {
+        "id": "avisInstitutNationalOrigineQualite",
+        "nom": "Avis de l'Institut National de l'origine et de la Qualité",
         "optionnel": true,
         "statutIds": [
           "Favorable",
@@ -1337,7 +1566,7 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-      {
+      "avisOfficeNationalDesForets": {
         "id": "avisOfficeNationalDesForets",
         "nom": "Avis de l'Office National des Forêts",
         "optionnel": false,
@@ -1348,9 +1577,9 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-      {
-        "id": "expertiseOfficeNationalDesForets",
-        "nom": "Expertise de l'Office National des Forêts",
+      "avisParcNational": {
+        "id": "avisParcNational",
+        "nom": "Avis du Parc National",
         "optionnel": true,
         "statutIds": [
           "Favorable",
@@ -1359,7 +1588,7 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-      {
+      "avisParcNaturelMarin": {
         "id": "avisParcNaturelMarin",
         "nom": "Avis du Parc Naturel Marin",
         "optionnel": true,
@@ -1370,9 +1599,9 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-      {
-        "id": "avisDirectionAlimentationAgricultureForet",
-        "nom": "Avis de la Direction de l'Alimentation de l'Agriculture et de la Forêt (DRAF)",
+      "avisServiceAdministratifLocal": {
+        "id": "avisServiceAdministratifLocal",
+        "nom": "Avis d'un Service Administratif Local",
         "optionnel": true,
         "statutIds": [
           "Favorable",
@@ -1381,9 +1610,9 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-      {
-        "id": "avisEtatMajorOrpaillagePecheIllicite",
-        "nom": "Avis de l'État-major Orpaillage et Pêche Illicite (EMOPI)",
+      "expertiseOfficeNationalDesForets": {
+        "id": "expertiseOfficeNationalDesForets",
+        "nom": "Expertise de l'Office National des Forêts",
         "optionnel": true,
         "statutIds": [
           "Favorable",
@@ -1392,13 +1621,23 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-    ]
+    }
   `)
-  expect(getAvisTypes('asc', 'axm', 'oct', demarcheId, firstEtapeDate, [communeIdValidator.parse('97302')])).toMatchInlineSnapshot(`
-    [
-      {
-        "id": "avisDirectionRegionaleDesAffairesCulturelles",
-        "nom": "Avis de la Direction Régionale Des Affaires Culturelles (DRAC)",
+  expect(
+    getAvisTypes(
+      ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives,
+      TITRES_TYPES_IDS.AUTORISATION_D_EXPLOITATION_METAUX,
+      DEMARCHES_TYPES_IDS.Octroi,
+      demarcheId,
+      firstEtapeDate,
+      [communeIdValidator.parse('97302')],
+      IS_ARM_MECANISE
+    )
+  ).toMatchInlineSnapshot(`
+    {
+      "autreAvis": {
+        "id": "autreAvis",
+        "nom": "Autre avis",
         "optionnel": true,
         "statutIds": [
           "Favorable",
@@ -1407,9 +1646,9 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-      {
-        "id": "avisConseilDepartementalEnvironnementRisquesSanitairesTechnologiques",
-        "nom": "Avis du Conseil Départemental de l'Environnement et des Risques Sanitaires et Technologiques (CODERST)",
+      "avisAgenceRegionaleSante": {
+        "id": "avisAgenceRegionaleSante",
+        "nom": "Avis de l'Agence Régionale de Santé (ARS)",
         "optionnel": true,
         "statutIds": [
           "Favorable",
@@ -1418,9 +1657,9 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-      {
-        "id": "avisDirectionsRégionalesEconomieEmploiTravailSolidarités",
-        "nom": "Avis de la Direction régionale de l'économie, de l'emploi, du travail et des solidarités",
+      "avisAutoriteMilitaire": {
+        "id": "avisAutoriteMilitaire",
+        "nom": "Avis de l'Autorité militaire",
         "optionnel": true,
         "statutIds": [
           "Favorable",
@@ -1429,9 +1668,9 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-      {
-        "id": "avisDirectionRegionaleFinancesPubliques",
-        "nom": "Avis de la Direction Regionale Des Finances Publiques",
+      "avisCaisseGeneraleSecuriteSociale": {
+        "id": "avisCaisseGeneraleSecuriteSociale",
+        "nom": "Avis de la Caisse Générale de Sécurité Sociale",
         "optionnel": true,
         "statutIds": [
           "Favorable",
@@ -1440,9 +1679,9 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-      {
-        "id": "avisGendarmerieNationale",
-        "nom": "Avis de la Gendarmerie Nationale",
+      "avisConseilDepartementalEnvironnementRisquesSanitairesTechnologiques": {
+        "id": "avisConseilDepartementalEnvironnementRisquesSanitairesTechnologiques",
+        "nom": "Avis du Conseil Départemental de l'Environnement et des Risques Sanitaires et Technologiques (CODERST)",
         "optionnel": true,
         "statutIds": [
           "Favorable",
@@ -1451,9 +1690,9 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-      {
-        "id": "avisIFREMER",
-        "nom": "Avis de l'IFREMER",
+      "avisDirectionAlimentationAgricultureForet": {
+        "id": "avisDirectionAlimentationAgricultureForet",
+        "nom": "Avis de la Direction de l'Alimentation de l'Agriculture et de la Forêt (DRAF)",
         "optionnel": true,
         "statutIds": [
           "Favorable",
@@ -1462,9 +1701,9 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-      {
-        "id": "avisInstitutNationalOrigineQualite",
-        "nom": "Avis de l'Institut National de l'origine et de la Qualité",
+      "avisDirectionDepartementaleTerritoiresMer": {
+        "id": "avisDirectionDepartementaleTerritoiresMer",
+        "nom": "Avis de la Direction Départementale des Territoires et de la Mer (DDTM)",
         "optionnel": true,
         "statutIds": [
           "Favorable",
@@ -1473,9 +1712,9 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-      {
-        "id": "avisServiceAdministratifLocal",
-        "nom": "Avis d'un Service Administratif Local",
+      "avisDirectionRegionaleDesAffairesCulturelles": {
+        "id": "avisDirectionRegionaleDesAffairesCulturelles",
+        "nom": "Avis de la Direction Régionale Des Affaires Culturelles (DRAC)",
         "optionnel": true,
         "statutIds": [
           "Favorable",
@@ -1484,9 +1723,9 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-      {
-        "id": "avisAutoriteMilitaire",
-        "nom": "Avis de l'Autorité militaire",
+      "avisDirectionRegionaleFinancesPubliques": {
+        "id": "avisDirectionRegionaleFinancesPubliques",
+        "nom": "Avis de la Direction Regionale Des Finances Publiques",
         "optionnel": true,
         "statutIds": [
           "Favorable",
@@ -1495,9 +1734,9 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-      {
-        "id": "avisParcNational",
-        "nom": "Avis du Parc National",
+      "avisDirectionsRégionalesEconomieEmploiTravailSolidarités": {
+        "id": "avisDirectionsRégionalesEconomieEmploiTravailSolidarités",
+        "nom": "Avis de la Direction régionale de l'économie, de l'emploi, du travail et des solidarités",
         "optionnel": true,
         "statutIds": [
           "Favorable",
@@ -1506,9 +1745,9 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-      {
-        "id": "avisDirectionDepartementaleTerritoiresMer",
-        "nom": "Avis de la Direction Départementale des Territoires et de la Mer (DDTM)",
+      "avisEtatMajorOrpaillagePecheIllicite": {
+        "id": "avisEtatMajorOrpaillagePecheIllicite",
+        "nom": "Avis de l'État-major Orpaillage et Pêche Illicite (EMOPI)",
         "optionnel": true,
         "statutIds": [
           "Favorable",
@@ -1517,9 +1756,9 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-      {
-        "id": "avisAgenceRegionaleSante",
-        "nom": "Avis de l'Agence Régionale de Santé (ARS)",
+      "avisGendarmerieNationale": {
+        "id": "avisGendarmerieNationale",
+        "nom": "Avis de la Gendarmerie Nationale",
         "optionnel": true,
         "statutIds": [
           "Favorable",
@@ -1528,9 +1767,9 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-      {
-        "id": "avisCaisseGeneraleSecuriteSociale",
-        "nom": "Avis de la Caisse Générale de Sécurité Sociale",
+      "avisIFREMER": {
+        "id": "avisIFREMER",
+        "nom": "Avis de l'IFREMER",
         "optionnel": true,
         "statutIds": [
           "Favorable",
@@ -1539,9 +1778,9 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-      {
-        "id": "autreAvis",
-        "nom": "Autre avis",
+      "avisInstitutNationalOrigineQualite": {
+        "id": "avisInstitutNationalOrigineQualite",
+        "nom": "Avis de l'Institut National de l'origine et de la Qualité",
         "optionnel": true,
         "statutIds": [
           "Favorable",
@@ -1550,7 +1789,7 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-      {
+      "avisOfficeNationalDesForets": {
         "id": "avisOfficeNationalDesForets",
         "nom": "Avis de l'Office National des Forêts",
         "optionnel": true,
@@ -1561,9 +1800,9 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-      {
-        "id": "expertiseOfficeNationalDesForets",
-        "nom": "Expertise de l'Office National des Forêts",
+      "avisParcNational": {
+        "id": "avisParcNational",
+        "nom": "Avis du Parc National",
         "optionnel": true,
         "statutIds": [
           "Favorable",
@@ -1572,7 +1811,7 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-      {
+      "avisParcNaturelMarin": {
         "id": "avisParcNaturelMarin",
         "nom": "Avis du Parc Naturel Marin",
         "optionnel": true,
@@ -1583,9 +1822,9 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-      {
-        "id": "avisDirectionAlimentationAgricultureForet",
-        "nom": "Avis de la Direction de l'Alimentation de l'Agriculture et de la Forêt (DRAF)",
+      "avisServiceAdministratifLocal": {
+        "id": "avisServiceAdministratifLocal",
+        "nom": "Avis d'un Service Administratif Local",
         "optionnel": true,
         "statutIds": [
           "Favorable",
@@ -1594,9 +1833,9 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-      {
-        "id": "avisEtatMajorOrpaillagePecheIllicite",
-        "nom": "Avis de l'État-major Orpaillage et Pêche Illicite (EMOPI)",
+      "confirmationAccordProprietaireDuSol": {
+        "id": "confirmationAccordProprietaireDuSol",
+        "nom": "Confirmation de l'accord du propriétaire du sol",
         "optionnel": true,
         "statutIds": [
           "Favorable",
@@ -1605,9 +1844,9 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-      {
-        "id": "confirmationAccordProprietaireDuSol",
-        "nom": "Confirmation de l'accord du propriétaire du sol",
+      "expertiseOfficeNationalDesForets": {
+        "id": "expertiseOfficeNationalDesForets",
+        "nom": "Expertise de l'Office National des Forêts",
         "optionnel": true,
         "statutIds": [
           "Favorable",
@@ -1616,11 +1855,21 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-    ]
+    }
   `)
-  expect(getAvisTypes('cac', 'prw', 'oct', demarcheId, firstEtapeDate, [])).toMatchInlineSnapshot(`
-    [
-      {
+  expect(
+    getAvisTypes(
+      ETAPES_TYPES.consultationDesAdministrationsCentrales,
+      TITRES_TYPES_IDS.PERMIS_EXCLUSIF_DE_RECHERCHES_GRANULATS_MARINS,
+      DEMARCHES_TYPES_IDS.Octroi,
+      demarcheId,
+      firstEtapeDate,
+      [],
+      IS_ARM_MECANISE
+    )
+  ).toMatchInlineSnapshot(`
+    {
+      "autreAvis": {
         "id": "autreAvis",
         "nom": "Autre avis",
         "optionnel": true,
@@ -1631,16 +1880,68 @@ test('getAvisType', () => {
           "Non renseigné",
         ],
       },
-    ]
+    }
   `)
 })
 
 test('etapeAvisStepIsVisible', () => {
-  expect(etapeAvisStepIsVisible({ typeId: 'mfr' }, 'arm', 'oct', demarcheId, firstEtapeDate, [])).toBe(false)
-  expect(etapeAvisStepIsVisible({ typeId: 'asc' }, 'arm', 'oct', demarcheId, firstEtapeDate, [])).toBe(true)
+  expect(etapeAvisStepIsVisible({ typeId: ETAPES_TYPES.demande, contenu: {} }, TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX, DEMARCHES_TYPES_IDS.Octroi, demarcheId, firstEtapeDate, [])).toBe(
+    false
+  )
+  expect(
+    etapeAvisStepIsVisible(
+      { typeId: ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives, contenu: {} },
+      TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX,
+      DEMARCHES_TYPES_IDS.Octroi,
+      demarcheId,
+      firstEtapeDate,
+      []
+    )
+  ).toBe(true)
 })
 
 test('etapeAvisStepIsComplete', () => {
-  expect(etapeAvisStepIsComplete({ typeId: ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives }, [{ avis_type_id: 'autreAvis' }], 'arm', 'oct', demarcheId, firstEtapeDate, []).valid).toBe(false)
-  expect(etapeAvisStepIsComplete({ typeId: ETAPES_TYPES.avisDesCollectivites }, [{ avis_type_id: 'autreAvis' }], 'arm', 'oct', demarcheId, firstEtapeDate, []).valid).toBe(true)
+  expect(
+    etapeAvisStepIsComplete(
+      { typeId: ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives, contenu: {} },
+      [{ avis_type_id: 'autreAvis' }],
+      TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX,
+      DEMARCHES_TYPES_IDS.Octroi,
+      demarcheId,
+      firstEtapeDate,
+      []
+    ).valid
+  ).toBe(false)
+  expect(
+    etapeAvisStepIsComplete(
+      { typeId: ETAPES_TYPES.avisDesCollectivites, contenu: {} },
+      [{ avis_type_id: 'autreAvis' }],
+      TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX,
+      DEMARCHES_TYPES_IDS.Octroi,
+      demarcheId,
+      firstEtapeDate,
+      []
+    ).valid
+  ).toBe(true)
+})
+
+describe('isArmMecanise', () => {
+  test('retourne false pour un flattened contenu vide', () => {
+    expect(isArmMecanise({})).toBe(IS_ARM_NON_MECANISE)
+  })
+  test('retourne false pour une ARM non mécanisée (flattened contenu)', () => {
+    expect(isArmMecanise({ arm: { mecanise: { value: false, heritee: false, etapeHeritee: null } } })).toBe(IS_ARM_NON_MECANISE)
+  })
+  test('retourne true pour une ARM mécanisée (flattened contenu)', () => {
+    expect(isArmMecanise({ arm: { mecanise: { value: true, heritee: false, etapeHeritee: null } } })).toBe(IS_ARM_MECANISE)
+  })
+  test('retourne false pour des sections with value vides', () => {
+    expect(isArmMecanise([])).toBe(IS_ARM_NON_MECANISE)
+  })
+  test('retourne false pour une ARM non mécanisée (sections with value)', () => {
+    expect(isArmMecanise([{ id: 'arm', elements: [{ id: 'mecanise', type: 'checkbox', optionnel: false, value: false }] }])).toBe(IS_ARM_NON_MECANISE)
+  })
+  test('retourne true pour une ARM mécanisée (sections with value)', () => {
+    expect(isArmMecanise([{ id: 'arm', elements: [{ id: 'mecanise', type: 'checkbox', optionnel: false, value: true }] }])).toBe(IS_ARM_MECANISE)
+  })
 })
diff --git a/packages/common/src/permissions/etape-form.ts b/packages/common/src/permissions/etape-form.ts
index 8909255e0d31a77546564f3518d8b4e9b312fb4f..2c17b27befcaa92d4923a7abf88d7fb43216d0bb 100644
--- a/packages/common/src/permissions/etape-form.ts
+++ b/packages/common/src/permissions/etape-form.ts
@@ -1,5 +1,5 @@
 import { EntrepriseDocumentId, EntrepriseId } from '../entreprise'
-import { FlattenEtape } from '../etape-form'
+import { FlattenedContenu, FlattenEtape } from '../etape-form'
 import { EtapeAvis, EtapeDocument, TempEtapeAvis, TempEtapeDocument } from '../etape'
 import { User, isAdministrationAdmin, isAdministrationEditeur, isSuper } from '../roles'
 import { AvisTypeId, AvisTypes } from '../static/avisTypes'
@@ -21,6 +21,8 @@ import { canEditAmodiataires, canEditDuree, canEditPerimetre, canEditTitulaires
 import { machineIdFind } from '../machines'
 import { DemarcheId } from '../demarche'
 import { FirstEtapeDate } from '../date'
+import { z } from 'zod'
+import { SectionWithValue } from '../sections'
 
 type ValidReturn = { valid: true } | { valid: false; errors: NonEmptyArray<string> }
 
@@ -135,13 +137,19 @@ export const perimetreStepIsComplete = (etape: Pick<FlattenEtape, 'typeId' | 'pe
   return { valid: true }
 }
 
+const isArmMecaniseValidator = z.boolean().brand('ARM_MECANISE')
+type IsArmMecanise = z.infer<typeof isArmMecaniseValidator>
+
+export const IS_ARM_MECANISE = true as const as IsArmMecanise
+export const IS_ARM_NON_MECANISE = false as const as IsArmMecanise
+
 export const getDocumentsTypes = (
   etape: Pick<FlattenEtape, 'typeId'>,
   demarcheTypeId: DemarcheTypeId,
   titreTypeId: TitreTypeId,
   demarcheId: DemarcheId,
   sdomZoneIds: SDOMZoneId[],
-  isArmMecanise: boolean,
+  isArmMecanise: IsArmMecanise,
   firstEtapeDate: FirstEtapeDate
 ): (DocumentType | AutreDocumentType)[] => {
   const dts = getDocuments(titreTypeId, demarcheTypeId, etape.typeId)
@@ -160,9 +168,9 @@ export const getDocumentsTypes = (
     }
   }
   // si la démarche est mécanisée il faut ajouter des documents obligatoires
-  if (isArmMecanise) {
+  if (isArmMecanise === IS_ARM_MECANISE) {
     for (const documentType of dts) {
-      if ([DOCUMENTS_TYPES_IDS.dossierLoiSurLEau, DOCUMENTS_TYPES_IDS.decisionCasParCas].includes(documentType.id)) {
+      if ([DOCUMENTS_TYPES_IDS.dossierLoiSurLEau, machineId !== 'ProcedureSpecifique' ? DOCUMENTS_TYPES_IDS.decisionCasParCas : null].includes(documentType.id)) {
         documentType.optionnel = false
       }
     }
@@ -186,55 +194,56 @@ export const getAvisTypes = (
   demarcheTypeId: DemarcheTypeId,
   demarcheId: DemarcheId,
   firstEtapeDate: FirstEtapeDate,
-  communeIds: CommuneId[]
-): { id: AvisTypeId; optionnel: boolean }[] => {
-  const avis: { id: AvisTypeId; optionnel: boolean }[] = []
-  if (etapeTypeId === ETAPES_TYPES.demande && titreTypeId === TITRES_TYPES_IDS.AUTORISATION_D_EXPLOITATION_METAUX) {
-    avis.push({ ...AvisTypes.avisProprietaireDuSol, optionnel: false }, { ...AvisTypes.avisDeLaMissionAutoriteEnvironnementale, optionnel: false })
+  communeIds: CommuneId[],
+  isArmMecanise: IsArmMecanise
+): { [key in AvisTypeId]?: { id: key; optionnel: boolean } } => {
+  const avis: { [key in AvisTypeId]?: { id: key; optionnel: boolean } } = {}
+  const machineId = machineIdFind(titreTypeId, demarcheTypeId, demarcheId, firstEtapeDate)
+
+  if (etapeTypeId === ETAPES_TYPES.demande) {
+    if (titreTypeId === TITRES_TYPES_IDS.AUTORISATION_D_EXPLOITATION_METAUX) {
+      avis[AvisTypes.avisProprietaireDuSol.id] = { ...AvisTypes.avisProprietaireDuSol, optionnel: false }
+      avis[AvisTypes.avisDeLaMissionAutoriteEnvironnementale.id] = { ...AvisTypes.avisDeLaMissionAutoriteEnvironnementale, optionnel: false }
+    } else if (titreTypeId === TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX && machineId === 'ProcedureSpecifique') {
+      avis[AvisTypes.avisCasParCas.id] = { ...AvisTypes.avisCasParCas, optionnel: isArmMecanise === IS_ARM_NON_MECANISE }
+      avis[AvisTypes.avisProprietaireDuSol.id] = { ...AvisTypes.avisProprietaireDuSol, optionnel: false }
+    }
   }
+
   if (etapeTypeId === ETAPES_TYPES.avisDesCollectivites) {
-    avis.push({ ...AvisTypes.avisDUneCollectivite, optionnel: true })
+    avis[AvisTypes.avisDUneCollectivite.id] = { ...AvisTypes.avisDUneCollectivite, optionnel: true }
   } else if (etapeTypeId === ETAPES_TYPES.avisDesServicesEtCommissionsConsultatives) {
-    const machineId = machineIdFind(titreTypeId, demarcheTypeId, demarcheId, firstEtapeDate)
-    avis.push(
-      ...[
-        { ...AvisTypes.avisDirectionRegionaleDesAffairesCulturelles, optionnel: true },
-        { ...AvisTypes.avisConseilDepartementalEnvironnementRisquesSanitairesTechnologiques, optionnel: true },
-        { ...AvisTypes.avisDirectionsRégionalesEconomieEmploiTravailSolidarités, optionnel: true },
-        { ...AvisTypes.avisDirectionRegionaleFinancesPubliques, optionnel: true },
-        { ...AvisTypes.avisGendarmerieNationale, optionnel: true },
-        { ...AvisTypes.avisIFREMER, optionnel: true },
-        { ...AvisTypes.avisInstitutNationalOrigineQualite, optionnel: true },
-        { ...AvisTypes.avisServiceAdministratifLocal, optionnel: true },
-        { ...AvisTypes.avisAutoriteMilitaire, optionnel: true },
-        { ...AvisTypes.avisParcNational, optionnel: true },
-        { ...AvisTypes.avisDirectionDepartementaleTerritoiresMer, optionnel: true },
-        { ...AvisTypes.avisAgenceRegionaleSante, optionnel: true },
-        { ...AvisTypes.avisCaisseGeneraleSecuriteSociale, optionnel: true },
-        { ...AvisTypes.autreAvis, optionnel: true },
-        // L'avis de l'onf est obligatoire que pour les ARM
-        { ...AvisTypes.avisOfficeNationalDesForets, optionnel: machineId === 'ProcedureSpecifique' || titreTypeId !== 'arm' },
-        { ...AvisTypes.expertiseOfficeNationalDesForets, optionnel: true },
-        // TODO 2024-05-14: rendre obligatoire pour les PNMs quand ces derniers seront implémentés
-        { ...AvisTypes.avisParcNaturelMarin, optionnel: true },
-      ]
-    )
+    avis[AvisTypes.avisDirectionRegionaleDesAffairesCulturelles.id] = { ...AvisTypes.avisDirectionRegionaleDesAffairesCulturelles, optionnel: true }
+    avis[AvisTypes.avisConseilDepartementalEnvironnementRisquesSanitairesTechnologiques.id] = { ...AvisTypes.avisConseilDepartementalEnvironnementRisquesSanitairesTechnologiques, optionnel: true }
+    avis[AvisTypes.avisDirectionsRégionalesEconomieEmploiTravailSolidarités.id] = { ...AvisTypes.avisDirectionsRégionalesEconomieEmploiTravailSolidarités, optionnel: true }
+    avis[AvisTypes.avisDirectionRegionaleFinancesPubliques.id] = { ...AvisTypes.avisDirectionRegionaleFinancesPubliques, optionnel: true }
+    avis[AvisTypes.avisGendarmerieNationale.id] = { ...AvisTypes.avisGendarmerieNationale, optionnel: true }
+    avis[AvisTypes.avisIFREMER.id] = { ...AvisTypes.avisIFREMER, optionnel: true }
+    avis[AvisTypes.avisInstitutNationalOrigineQualite.id] = { ...AvisTypes.avisInstitutNationalOrigineQualite, optionnel: true }
+    avis[AvisTypes.avisServiceAdministratifLocal.id] = { ...AvisTypes.avisServiceAdministratifLocal, optionnel: true }
+    avis[AvisTypes.avisAutoriteMilitaire.id] = { ...AvisTypes.avisAutoriteMilitaire, optionnel: true }
+    avis[AvisTypes.avisParcNational.id] = { ...AvisTypes.avisParcNational, optionnel: true }
+    avis[AvisTypes.avisDirectionDepartementaleTerritoiresMer.id] = { ...AvisTypes.avisDirectionDepartementaleTerritoiresMer, optionnel: true }
+    avis[AvisTypes.avisAgenceRegionaleSante.id] = { ...AvisTypes.avisAgenceRegionaleSante, optionnel: true }
+    avis[AvisTypes.avisCaisseGeneraleSecuriteSociale.id] = { ...AvisTypes.avisCaisseGeneraleSecuriteSociale, optionnel: true }
+    avis[AvisTypes.autreAvis.id] = { ...AvisTypes.autreAvis, optionnel: true }
+    // L'avis de l'onf est obligatoire que pour les ARM
+    avis[AvisTypes.avisOfficeNationalDesForets.id] = { ...AvisTypes.avisOfficeNationalDesForets, optionnel: machineId === 'ProcedureSpecifique' || titreTypeId !== 'arm' }
+    avis[AvisTypes.expertiseOfficeNationalDesForets.id] = { ...AvisTypes.expertiseOfficeNationalDesForets, optionnel: true }
+    // TODO 2024-05-14: rendre obligatoire pour les PNMs quand ces derniers seront implémentés
+    avis[AvisTypes.avisParcNaturelMarin.id] = { ...AvisTypes.avisParcNaturelMarin, optionnel: true }
 
     if (communeIds.some(id => toDepartementId(id) === DEPARTEMENT_IDS.Guyane)) {
-      avis.push(
-        ...[
-          { ...AvisTypes.avisDirectionAlimentationAgricultureForet, optionnel: true },
-          { ...AvisTypes.avisEtatMajorOrpaillagePecheIllicite, optionnel: true },
-        ]
-      )
+      avis[AvisTypes.avisDirectionAlimentationAgricultureForet.id] = { ...AvisTypes.avisDirectionAlimentationAgricultureForet, optionnel: true }
+      avis[AvisTypes.avisEtatMajorOrpaillagePecheIllicite.id] = { ...AvisTypes.avisEtatMajorOrpaillagePecheIllicite, optionnel: true }
     }
 
     // TODO 2024-06-18 Normalement c'est obligatoire si avis propriétaire du sol est favorable avec réserve,  optionnel pour le moment
     if (TitresTypes[titreTypeId].typeId === TITRES_TYPES_TYPES_IDS.AUTORISATION_D_EXPLOITATION) {
-      avis.push({ ...AvisTypes.confirmationAccordProprietaireDuSol, optionnel: true })
+      avis[AvisTypes.confirmationAccordProprietaireDuSol.id] = { ...AvisTypes.confirmationAccordProprietaireDuSol, optionnel: true }
     }
   } else if (etapeTypeId === ETAPES_TYPES.consultationDesAdministrationsCentrales) {
-    avis.push({ ...AvisTypes.autreAvis, optionnel: true })
+    avis[AvisTypes.autreAvis.id] = { ...AvisTypes.autreAvis, optionnel: true }
   }
 
   return avis
@@ -244,6 +253,17 @@ export const etapeDocumentsStepIsVisible = (): boolean => {
   return true // il y'a forcément au moins le document "Autre" que l'on peut saisir, donc si on a le droit d'éditer une étape, on peut voir les documents dans la page d'édition d'une étape
 }
 
+export const isArmMecanise = (contenu: FlattenedContenu | SectionWithValue[]): IsArmMecanise => {
+  let result: boolean = false
+  if (Array.isArray(contenu)) {
+    result = contenu.some(({ id, elements }) => id === 'arm' && elements.some(({ id: idElement, value }) => idElement === 'mecanise' && value === true))
+  } else {
+    result = contenu['arm']?.['mecanise']?.value === true
+  }
+
+  return isArmMecaniseValidator.parse(result)
+}
+
 export const etapeDocumentsStepIsComplete = (
   etape: Pick<FlattenEtape, 'typeId' | 'contenu' | 'isBrouillon'>,
   demarcheTypeId: DemarcheTypeId,
@@ -254,7 +274,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, isArmMecanise(etape.contenu), firstEtapeDate)
 
   errors.push(
     ...documentTypes
@@ -270,18 +290,18 @@ export const etapeDocumentsStepIsComplete = (
 }
 
 export const etapeAvisStepIsVisible = (
-  etape: Pick<FlattenEtape, 'typeId'>,
+  etape: Pick<FlattenEtape, 'typeId' | 'contenu'>,
   titreTypeId: TitreTypeId,
   demarcheTypeId: DemarcheTypeId,
   demarcheId: DemarcheId,
   firstEtapeDate: FirstEtapeDate,
   communeIds: CommuneId[]
 ): boolean => {
-  return getAvisTypes(etape.typeId, titreTypeId, demarcheTypeId, demarcheId, firstEtapeDate, communeIds).length > 0
+  return Object.keys(getAvisTypes(etape.typeId, titreTypeId, demarcheTypeId, demarcheId, firstEtapeDate, communeIds, isArmMecanise(etape.contenu))).length > 0
 }
 
 export const etapeAvisStepIsComplete = (
-  etape: Pick<FlattenEtape, 'typeId'>,
+  etape: Pick<FlattenEtape, 'typeId' | 'contenu'>,
   etapeAvis: Pick<EtapeAvis | TempEtapeAvis, 'avis_type_id'>[],
   titreTypeId: TitreTypeId,
   demarcheTypeId: DemarcheTypeId,
@@ -293,8 +313,8 @@ export const etapeAvisStepIsComplete = (
     return { valid: true }
   }
 
-  const avisTypes = getAvisTypes(etape.typeId, titreTypeId, demarcheTypeId, demarcheId, firstEtapeDate, communeIds)
-  if (avisTypes.some(avisType => !avisType.optionnel && etapeAvis.every(avis => avis.avis_type_id !== avisType.id))) {
+  const avisTypes = getAvisTypes(etape.typeId, titreTypeId, demarcheTypeId, demarcheId, firstEtapeDate, communeIds, isArmMecanise(etape.contenu))
+  if (Object.values(avisTypes).some(avisType => !avisType.optionnel && etapeAvis.every(avis => avis.avis_type_id !== avisType.id))) {
     return { valid: false, errors: ['Il manque des avis obligatoires'] }
   }
 
diff --git a/packages/common/src/static/avisTypes.ts b/packages/common/src/static/avisTypes.ts
index 423ecc5c5288924d2a61b9e44c332b7ccf9af138..cd0d35f85a69b1e1f28930de2460fcf78f705c68 100644
--- a/packages/common/src/static/avisTypes.ts
+++ b/packages/common/src/static/avisTypes.ts
@@ -6,7 +6,7 @@ interface Definition<T> {
   statutIds: AvisStatutId[]
 }
 // prettier-ignore
-const AVIS_TYPES_IDS_WITHOUT_AUTRE = [ "confirmationAccordProprietaireDuSol", "avisDirectionRegionaleDesAffairesCulturelles", "avisDirectionAlimentationAgricultureForet", "avisConseilDepartementalEnvironnementRisquesSanitairesTechnologiques", "avisDirectionsRégionalesEconomieEmploiTravailSolidarités", "avisDirectionRegionaleFinancesPubliques", "avisGendarmerieNationale", "avisParcNaturelMarin", "avisIFREMER", "avisInstitutNationalOrigineQualite", "avisEtatMajorOrpaillagePecheIllicite", "avisServiceAdministratifLocal", "avisAutoriteMilitaire", "avisParcNational", "avisDirectionDepartementaleTerritoiresMer", "avisAgenceRegionaleSante", "avisCaisseGeneraleSecuriteSociale", "avisServiceMilieuxNaturelsBiodiversiteSitesPaysages", "avisOfficeNationalDesForets", "expertiseOfficeNationalDesForets", "avisDUneCollectivite", "avisDeLaMissionAutoriteEnvironnementale", "avisProprietaireDuSol"] as const
+const AVIS_TYPES_IDS_WITHOUT_AUTRE = [ "confirmationAccordProprietaireDuSol", "avisDirectionRegionaleDesAffairesCulturelles", "avisDirectionAlimentationAgricultureForet", "avisConseilDepartementalEnvironnementRisquesSanitairesTechnologiques", "avisDirectionsRégionalesEconomieEmploiTravailSolidarités", "avisDirectionRegionaleFinancesPubliques", "avisGendarmerieNationale", "avisParcNaturelMarin", "avisIFREMER", "avisInstitutNationalOrigineQualite", "avisEtatMajorOrpaillagePecheIllicite", "avisServiceAdministratifLocal", "avisAutoriteMilitaire", "avisParcNational", "avisDirectionDepartementaleTerritoiresMer", "avisAgenceRegionaleSante", "avisCaisseGeneraleSecuriteSociale", "avisServiceMilieuxNaturelsBiodiversiteSitesPaysages", "avisOfficeNationalDesForets", "expertiseOfficeNationalDesForets", "avisDUneCollectivite", "avisDeLaMissionAutoriteEnvironnementale", "avisProprietaireDuSol", "avisCasParCas"] as const
 const AVIS_TYPE_IDS_AUTRE = ['autreAvis'] as const
 
 const AVIS_TYPES_IDS = [...AVIS_TYPES_IDS_WITHOUT_AUTRE, ...AVIS_TYPE_IDS_AUTRE] as const
@@ -66,6 +66,7 @@ export const AvisTypes = {
   avisDUneCollectivite: { id: 'avisDUneCollectivite', nom: "Avis d'une collectivité", statutIds: defaultStatutIds },
   avisDeLaMissionAutoriteEnvironnementale: { id: 'avisDeLaMissionAutoriteEnvironnementale', nom: 'avis de la mission autorité environnementale', statutIds: ['Exempté', 'Requis'] },
   avisProprietaireDuSol: { id: 'avisProprietaireDuSol', nom: 'avis du propriétaire du sol', statutIds: defaultStatutIds },
+  avisCasParCas: { id: 'avisCasParCas', nom: 'Décision au cas par cas', statutIds: ['Exempté', 'Requis'] },
   autreAvis: { id: 'autreAvis', nom: 'Autre avis', statutIds: defaultStatutIds },
 } as const satisfies { [key in AvisTypeId]: Definition<key> }
 
diff --git a/packages/common/src/static/documentsTypes.ts b/packages/common/src/static/documentsTypes.ts
index 2a212684ad378c46e67e34f89a52de047709a203..065e0ef6a560448c86b8c849358a88dfe03d8db7 100644
--- a/packages/common/src/static/documentsTypes.ts
+++ b/packages/common/src/static/documentsTypes.ts
@@ -35,26 +35,21 @@ export type PerimetreUploadType = z.infer<typeof perimetreFileUploadTypeValidato
 export type FileUploadType = z.infer<typeof fileUploadTypeValidator>
 
 // prettier-ignore
-const IDS_WITHOUT_AUTRE = ["aac","acc","acd","acg","acm","acr","adr","aep","aot","apd","apf","apm","apu","are","arm","arp","arr","atf","avc","ave","avi","bil","cam","car","cco","cdc","cnr","cnt","cod","con","cou","csp","cur","dcl","deb","dec","dei","dep","doe","dom","dos","erd","fac","fic","fip","for","idm","jac","jcf","jct","jeg","jid","jpa","kbi","lac","lce","lcg","lcm","ldc","lem","let","lis","lpf","mes","met","mot","nas","ndc","ndd","nip","nir","noi","not","ocd","odr","ord","prg","pro","pub","pvr","rac","rad","rce","rcr","rdr","rdt","rec","ree","ref","rfe","rgr","rie","rse","sch","sir" ] as const
+const IDS_WITHOUT_AUTRE = ["aac","acd","acg","acr","adr","aep","apd","apf","apu","arm","arp","arr","atf","avc","ave","avi","bil","cam","car","cco","cdc","cnr","cnt","cod","con","cou","csp","cur","dcl","deb","dec","dei","dep","doe","dom","dos","erd","fac","fic","fip","for","idm","jac","jcf","jct","jeg","jid","jpa","kbi","lac","lce","lcg","lcm","ldc","lem","let","lis","lpf","mes","met","mot","nas","ndd","nip","nir","noi","not","odr","ord","prg","pro","pub","pvr","rac","rad","rce","rcr","rdr","rec","ree","ref","rfe","rgr","rie","rse","sch","sir" ] as const
 
 const AUTRE_IDS = ['aut'] as const
 const IDS = [...IDS_WITHOUT_AUTRE, ...AUTRE_IDS] as const
 export const DOCUMENTS_TYPES_IDS = {
   autreDocument: 'aut',
   avisDUnServiceDeLAdministrationCentrale: 'aac',
-  accordDuProprietaireDuSolOuDuGestionnaire: 'acc',
   avisDeLaCommissionDepartementaleDesMines: 'acd',
   avisDuConseilGeneralDeLEconomie_cge: 'acg',
-  avisDesServicesCivilsEtMilitaires: 'acm',
   accuseDeReceptionDUneDemande: 'acr',
   avisDuDirecteurRegionalChargeDesMines: 'adr',
   avisDEnquetePublique: 'aep',
-  arreteAutorisantLOuvertureDeTravauxMiniers: 'aot',
   arreteDeSecondDonneActe_ap2: 'apd',
   avisDuPrefet: 'apf',
-  arreteDePoliceDesMines: 'apm',
   arreteDePremierDonneActe_ap1: 'apu',
-  arreteDeRefus: 'are',
   arreteMinisteriel: 'arm',
   arretePrefectoral: 'arp',
   arrete: 'arr',
@@ -108,13 +103,11 @@ export const DOCUMENTS_TYPES_IDS = {
   methodesPourLExecutionDesTravaux: 'met',
   motif: 'mot',
   noteALAutoriteSignataire: 'nas',
-  notificationDeDemandeConcurrente: 'ndc',
   notificationDeDecision: 'ndd',
   noticeDImpact: 'nip',
   noticeDImpactRenforcee: 'nir',
   noticeDIncidence: 'noi',
   notes: 'not',
-  ordreDuJourDeLaCommissionDepartementaleDesMines: 'ocd',
   ordonnanceDuRoi: 'odr',
   ordonnance: 'ord',
   programmeDesTravaux: 'prg',
@@ -126,7 +119,6 @@ export const DOCUMENTS_TYPES_IDS = {
   rapportDuCommissaireEnqueteur: 'rce',
   rapportDeRecevabilite: 'rcr',
   rapportDeLaDirectionRegionaleChargeeDesMines: 'rdr',
-  recepisseDeDeclarationDOuvertureDesTravauxMiniers: 'rdt',
   recepisse_LoiSurLEau: 'rec',
   rapportEnvironnementalDExploration: 'ree',
   referencesProfessionnelles: 'ref',
@@ -178,19 +170,14 @@ export type AutreDocumentTypeId = z.infer<typeof autreDocumentTypeIdValidator>
 export const DocumentsTypes: { [key in DocumentTypeId | AutreDocumentTypeId]: Definition<key> } = {
   aut: { id: 'aut', nom: 'Autre document' },
   aac: { id: 'aac', nom: "Avis d'un service de l'administration centrale" },
-  acc: { id: 'acc', nom: 'Accord du propriétaire du sol ou du gestionnaire' },
   acd: { id: 'acd', nom: 'Avis de la commission départementale des mines' },
   acg: { id: 'acg', nom: "Avis du conseil général de l'économie (CGE)" },
-  acm: { id: 'acm', nom: 'Avis des services civils et militaires' },
   acr: { id: 'acr', nom: "Accusé de réception d'une demande" },
   adr: { id: 'adr', nom: 'Avis du directeur régional chargé des mines' },
   aep: { id: 'aep', nom: "Avis d'enquête publique" },
-  aot: { id: 'aot', nom: "Arrêté autorisant l'ouverture de travaux miniers" },
   apd: { id: 'apd', nom: 'Arrêté de second donné acte (AP2)' },
   apf: { id: 'apf', nom: 'Avis du préfet' },
-  apm: { id: 'apm', nom: 'Arrêté de police des mines' },
   apu: { id: 'apu', nom: 'Arrêté de premier donné acte (AP1)' },
-  are: { id: 'are', nom: 'Arrêté de refus ' },
   arm: { id: 'arm', nom: 'Arrêté ministériel' },
   arp: { id: 'arp', nom: 'Arrêté préfectoral' },
   arr: { id: 'arr', nom: 'Arrêté' },
@@ -244,13 +231,11 @@ export const DocumentsTypes: { [key in DocumentTypeId | AutreDocumentTypeId]: De
   met: { id: 'met', nom: "Méthodes pour l'exécution des travaux" },
   mot: { id: 'mot', nom: 'Motif' },
   nas: { id: 'nas', nom: "Note à l'autorité signataire" },
-  ndc: { id: 'ndc', nom: 'Notification de demande concurrente' },
   ndd: { id: 'ndd', nom: 'Notification de décision' },
   nip: { id: 'nip', nom: "Notice d'impact" },
   nir: { id: 'nir', nom: "Notice d'impact renforcée" },
   noi: { id: 'noi', nom: "Notice d'incidence" },
   not: { id: 'not', nom: 'Notes' },
-  ocd: { id: 'ocd', nom: 'Ordre du jour de la commission départementale des mines' },
   odr: { id: 'odr', nom: 'Ordonnance du Roi' },
   ord: { id: 'ord', nom: 'Ordonnance' },
   prg: { id: 'prg', nom: 'Programme des travaux ' },
@@ -262,7 +247,6 @@ export const DocumentsTypes: { [key in DocumentTypeId | AutreDocumentTypeId]: De
   rce: { id: 'rce', nom: 'Rapport du commissaire enquêteur' },
   rcr: { id: 'rcr', nom: 'Rapport de recevabilité' },
   rdr: { id: 'rdr', nom: 'Rapport de la direction régionale chargée des mines' },
-  rdt: { id: 'rdt', nom: "Récépissé de déclaration d'ouverture des travaux miniers" },
   rec: { id: 'rec', nom: 'Récépissé "Loi sur l\'eau"' },
   ree: { id: 'ree', nom: "Rapport environnemental d'exploration" },
   ref: { id: 'ref', nom: 'Références professionnelles ', description: 'Références professionnelles du demandeur ou celles des cadres chargés du suivi et de la conduite des travaux' },
diff --git a/packages/ui/src/components/_common/storybook.spec.ts b/packages/ui/src/components/_common/storybook.spec.ts
index debfc058c6312386b2e56fcad6c472b42919811a..f2170550a4823502c830a3f068c42aaa714435ff 100644
--- a/packages/ui/src/components/_common/storybook.spec.ts
+++ b/packages/ui/src/components/_common/storybook.spec.ts
@@ -46,6 +46,7 @@ describe('Common Storybook Tests', async () => {
         .filter(env => (name ?? '').includes('NoStoryshots') || !(env.name ?? '').includes('NoSnapshot'))
     )('$name', async value => {
       setSeed(12)
+      let html: string | undefined = undefined
       try {
         // @ts-ignore
         window.dsfr = null
@@ -65,6 +66,7 @@ describe('Common Storybook Tests', async () => {
         }
 
         global.ResizeObserver = ResizeObserver
+
         const storyComponent = value.story()
 
         const mounted = render('type' in storyComponent && typeof storyComponent.type === 'function' ? storyComponent.type() : storyComponent, {
@@ -74,9 +76,14 @@ describe('Common Storybook Tests', async () => {
         })
 
         await new Promise<void>(resolve => setTimeout(() => resolve(), 1))
-        await expect(mounted.html()).toMatchFileSnapshot(`./${filePath.replace(/\.[^/.]+$/, '')}_snapshots_${value.name}.html`)
+        html = mounted.html()
       } catch (e) {
         throw new Error(`le test ${name} du fichier ${filePath} plante ${e}`)
+      } finally {
+        if (html === undefined) {
+          throw new Error('le test ne génère pas de html')
+        }
+        await expect(html).toMatchFileSnapshot(`./${filePath.replace(/\.[^/.]+$/, '')}_snapshots_${value.name}.html`)
       }
     })
   })
diff --git a/packages/ui/src/components/_ui/storybook.spec.ts b/packages/ui/src/components/_ui/storybook.spec.ts
index e1698b62c1434d80ce7ed7b9115b845f3d87cbcd..6eeaf8f787e97f83c4db9b61d4292a4b9a451aec 100644
--- a/packages/ui/src/components/_ui/storybook.spec.ts
+++ b/packages/ui/src/components/_ui/storybook.spec.ts
@@ -44,9 +44,11 @@ describe('UI Storybook Tests', async () => {
         .filter(env => (name ?? '').includes('NoStoryshots') || !(env.name ?? '').includes('NoSnapshot'))
     )('$name', async value => {
       setSeed(12)
+      let html: string | undefined = undefined
       try {
         // @ts-ignore
         window.dsfr = null
+
         class ResizeObserver {
           observe() {
             // do nothing
@@ -62,6 +64,7 @@ describe('UI Storybook Tests', async () => {
         }
 
         global.ResizeObserver = ResizeObserver
+
         const storyComponent = value.story()
 
         const mounted = render('type' in storyComponent && typeof storyComponent.type === 'function' ? storyComponent.type() : storyComponent, {
@@ -71,9 +74,14 @@ describe('UI Storybook Tests', async () => {
         })
 
         await new Promise<void>(resolve => setTimeout(() => resolve(), 1))
-        await expect(mounted.html()).toMatchFileSnapshot(`./${filePath.replace(/\.[^/.]+$/, '')}_snapshots_${value.name}.html`)
+        html = mounted.html()
       } catch (e) {
         throw new Error(`le test ${name} du fichier ${filePath} plante ${e}`)
+      } finally {
+        if (html === undefined) {
+          throw new Error('le test ne génère pas de html')
+        }
+        await expect(html).toMatchFileSnapshot(`./${filePath.replace(/\.[^/.]+$/, '')}_snapshots_${value.name}.html`)
       }
     })
   })
diff --git a/packages/ui/src/components/demarche/demarche-etape.stories.tsx b/packages/ui/src/components/demarche/demarche-etape.stories.tsx
index 04cf5277a67319b6c048917310be27f95d74b843..46f2404164c001042bde6705ec0d1b8f01bcb4bb 100644
--- a/packages/ui/src/components/demarche/demarche-etape.stories.tsx
+++ b/packages/ui/src/components/demarche/demarche-etape.stories.tsx
@@ -162,7 +162,7 @@ const documents: EtapeDocument[] = [
   },
   {
     id: etapeDocumentIdValidator.parse('id2'),
-    etape_document_type_id: 'acm',
+    etape_document_type_id: 'acr',
     description: null,
     public_lecture: false,
     entreprises_lecture: true,
diff --git a/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_AvisDesServices.html b/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_AvisDesServices.html
index ad54cb54f20d1c0fcb1c864edd3b57614370c2da..256bf7fab4652d00e78c80ae422ed96a2f6238c5 100644
--- a/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_AvisDesServices.html
+++ b/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_AvisDesServices.html
@@ -35,14 +35,14 @@
         </thead>
         <tbody>
           <tr>
-            <td><a href="/apiUrl/download/fichiers/id" title="Télécharger le document Une description - nouvelle fenêtre" target="_blank">Une description</a></td>
+            <td><a href="/apiUrl/download/fichiers/id2" title="Télécharger le document Accusé de réception d'une demande - nouvelle fenêtre" target="_blank">Accusé de réception d'une demande</a></td>
             <td></td>
-            <td>Visible par les administrations</td>
+            <td>Visible par les administrations et les entreprises titulaires</td>
           </tr>
           <tr>
-            <td><a href="/apiUrl/download/fichiers/id2" title="Télécharger le document Avis des services civils et militaires - nouvelle fenêtre" target="_blank">Avis des services civils et militaires</a></td>
+            <td><a href="/apiUrl/download/fichiers/id" title="Télécharger le document Une description - nouvelle fenêtre" target="_blank">Une description</a></td>
             <td></td>
-            <td>Visible par les administrations et les entreprises titulaires</td>
+            <td>Visible par les administrations</td>
           </tr>
           <tr>
             <td><a href="/apiUrl/download/fichiers/id2" title="Télécharger le document Avis du conseil général de l'économie (CGE) - nouvelle fenêtre" target="_blank">Avis du conseil général de l'économie (CGE)</a></td>
diff --git a/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_DemandeMultipleEntreprisesDocuments.html b/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_DemandeMultipleEntreprisesDocuments.html
index 3f11d50745db60d8788e0717dfc83f29619b8d3d..c2857c68448c406c70c74c791a158f7b2805ba39 100644
--- a/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_DemandeMultipleEntreprisesDocuments.html
+++ b/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_DemandeMultipleEntreprisesDocuments.html
@@ -97,14 +97,14 @@
         </thead>
         <tbody>
           <tr>
-            <td><a href="/apiUrl/download/fichiers/id" title="Télécharger le document Une description - nouvelle fenêtre" target="_blank">Une description</a></td>
+            <td><a href="/apiUrl/download/fichiers/id2" title="Télécharger le document Accusé de réception d'une demande - nouvelle fenêtre" target="_blank">Accusé de réception d'une demande</a></td>
             <td></td>
-            <td>Visible par les administrations</td>
+            <td>Visible par les administrations et les entreprises titulaires</td>
           </tr>
           <tr>
-            <td><a href="/apiUrl/download/fichiers/id2" title="Télécharger le document Avis des services civils et militaires - nouvelle fenêtre" target="_blank">Avis des services civils et militaires</a></td>
+            <td><a href="/apiUrl/download/fichiers/id" title="Télécharger le document Une description - nouvelle fenêtre" target="_blank">Une description</a></td>
             <td></td>
-            <td>Visible par les administrations et les entreprises titulaires</td>
+            <td>Visible par les administrations</td>
           </tr>
           <tr>
             <td><a href="/apiUrl/download/fichiers/id2" title="Télécharger le document Avis du conseil général de l'économie (CGE) - nouvelle fenêtre" target="_blank">Avis du conseil général de l'économie (CGE)</a></td>
diff --git a/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_DemandeNoMap.html b/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_DemandeNoMap.html
index ceae82b89aff01db7c4a3d766df71f41260f08d2..0c74f9a9a1d7cc35fa2a5bee3f5f75a9209a2771 100644
--- a/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_DemandeNoMap.html
+++ b/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_DemandeNoMap.html
@@ -94,14 +94,14 @@
         </thead>
         <tbody>
           <tr>
-            <td><a href="/apiUrl/download/fichiers/id" title="Télécharger le document Une description - nouvelle fenêtre" target="_blank">Une description</a></td>
+            <td><a href="/apiUrl/download/fichiers/id2" title="Télécharger le document Accusé de réception d'une demande - nouvelle fenêtre" target="_blank">Accusé de réception d'une demande</a></td>
             <td></td>
-            <td>Visible par les administrations</td>
+            <td>Visible par les administrations et les entreprises titulaires</td>
           </tr>
           <tr>
-            <td><a href="/apiUrl/download/fichiers/id2" title="Télécharger le document Avis des services civils et militaires - nouvelle fenêtre" target="_blank">Avis des services civils et militaires</a></td>
+            <td><a href="/apiUrl/download/fichiers/id" title="Télécharger le document Une description - nouvelle fenêtre" target="_blank">Une description</a></td>
             <td></td>
-            <td>Visible par les administrations et les entreprises titulaires</td>
+            <td>Visible par les administrations</td>
           </tr>
           <tr>
             <td><a href="/apiUrl/download/fichiers/id2" title="Télécharger le document Avis du conseil général de l'économie (CGE) - nouvelle fenêtre" target="_blank">Avis du conseil général de l'économie (CGE)</a></td>
diff --git a/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_Depot.html b/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_Depot.html
index bf63a4a36a476c026fbc56487ff46e760ed1d25d..e1720de23120f3a627b480ea5adfe1f8dfb0e653 100644
--- a/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_Depot.html
+++ b/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_Depot.html
@@ -36,14 +36,14 @@
         </thead>
         <tbody>
           <tr>
-            <td><a href="/apiUrl/download/fichiers/id" title="Télécharger le document Une description - nouvelle fenêtre" target="_blank">Une description</a></td>
+            <td><a href="/apiUrl/download/fichiers/id2" title="Télécharger le document Accusé de réception d'une demande - nouvelle fenêtre" target="_blank">Accusé de réception d'une demande</a></td>
             <td></td>
-            <td>Visible par les administrations</td>
+            <td>Visible par les administrations et les entreprises titulaires</td>
           </tr>
           <tr>
-            <td><a href="/apiUrl/download/fichiers/id2" title="Télécharger le document Avis des services civils et militaires - nouvelle fenêtre" target="_blank">Avis des services civils et militaires</a></td>
+            <td><a href="/apiUrl/download/fichiers/id" title="Télécharger le document Une description - nouvelle fenêtre" target="_blank">Une description</a></td>
             <td></td>
-            <td>Visible par les administrations et les entreprises titulaires</td>
+            <td>Visible par les administrations</td>
           </tr>
           <tr>
             <td><a href="/apiUrl/download/fichiers/id2" title="Télécharger le document Avis du conseil général de l'économie (CGE) - nouvelle fenêtre" target="_blank">Avis du conseil général de l'économie (CGE)</a></td>
diff --git a/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_EtapeAvecNoteAvertissement.html b/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_EtapeAvecNoteAvertissement.html
index 848c817f0c817c8116ebcf74bb614700d4d9a8dc..bfc18677ab11e4282bfbf8dfab1626f2b3af5466 100644
--- a/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_EtapeAvecNoteAvertissement.html
+++ b/packages/ui/src/components/demarche/demarche-etape.stories_snapshots_EtapeAvecNoteAvertissement.html
@@ -41,14 +41,14 @@
         </thead>
         <tbody>
           <tr>
-            <td><a href="/apiUrl/download/fichiers/id" title="Télécharger le document Une description - nouvelle fenêtre" target="_blank">Une description</a></td>
+            <td><a href="/apiUrl/download/fichiers/id2" title="Télécharger le document Accusé de réception d'une demande - nouvelle fenêtre" target="_blank">Accusé de réception d'une demande</a></td>
             <td></td>
-            <td>Visible par les administrations</td>
+            <td>Visible par les administrations et les entreprises titulaires</td>
           </tr>
           <tr>
-            <td><a href="/apiUrl/download/fichiers/id2" title="Télécharger le document Avis des services civils et militaires - nouvelle fenêtre" target="_blank">Avis des services civils et militaires</a></td>
+            <td><a href="/apiUrl/download/fichiers/id" title="Télécharger le document Une description - nouvelle fenêtre" target="_blank">Une description</a></td>
             <td></td>
-            <td>Visible par les administrations et les entreprises titulaires</td>
+            <td>Visible par les administrations</td>
           </tr>
           <tr>
             <td><a href="/apiUrl/download/fichiers/id2" title="Télécharger le document Avis du conseil général de l'économie (CGE) - nouvelle fenêtre" target="_blank">Avis du conseil général de l'économie (CGE)</a></td>
diff --git a/packages/ui/src/components/etape-edition.stories_snapshots_AxmEnZoneDuSdom.html b/packages/ui/src/components/etape-edition.stories_snapshots_AxmEnZoneDuSdom.html
index 2da80c2a1bfac35434026a2409fafb44eb3b0cd0..141f5c9594ed4675074e3f3e5b99658767878da5 100644
--- a/packages/ui/src/components/etape-edition.stories_snapshots_AxmEnZoneDuSdom.html
+++ b/packages/ui/src/components/etape-edition.stories_snapshots_AxmEnZoneDuSdom.html
@@ -210,22 +210,22 @@
               </thead>
               <tbody>
                 <tr>
-                  <td class="fr-label--disabled">avis du propriétaire du sol</td>
+                  <td class="fr-label--disabled">Avis du propriétaire du sol</td>
                   <td>-</td>
                   <td>-</td>
                   <td>-</td>
                   <td>-</td>
-                  <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document avis du propriétaire du sol" aria-label="Ajouter un document avis du propriétaire du sol" type="button">
+                  <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document 'Avis du propriétaire du sol'" aria-label="Ajouter un document 'Avis du propriétaire du sol'" type="button">
                       <!---->
                     </button></td>
                 </tr>
                 <tr>
-                  <td class="fr-label--disabled">avis de la mission autorité environnementale</td>
+                  <td class="fr-label--disabled">Avis de la mission autorité environnementale</td>
                   <td>-</td>
                   <td>-</td>
                   <td>-</td>
                   <td>-</td>
-                  <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document avis de la mission autorité environnementale" aria-label="Ajouter un document avis de la mission autorité environnementale" type="button">
+                  <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document 'Avis de la mission autorité environnementale'" aria-label="Ajouter un document 'Avis de la mission autorité environnementale'" type="button">
                       <!---->
                     </button></td>
                 </tr>
diff --git a/packages/ui/src/components/etape/etape-avis-edit.stories.tsx b/packages/ui/src/components/etape/etape-avis-edit.stories.tsx
index 390ad0d1592ce6af7f4671b385fc9483955d4b8f..0497e138b4352258c3eac6685443bd61b04aa265 100644
--- a/packages/ui/src/components/etape/etape-avis-edit.stories.tsx
+++ b/packages/ui/src/components/etape/etape-avis-edit.stories.tsx
@@ -65,6 +65,7 @@ export const Empty: StoryFn = () => (
     tde={{ titreTypeId: 'arm', demarcheTypeId: 'oct', etapeTypeId: 'mfr', demarcheId: demarcheIdValidator.parse('demarcheId'), firstEtapeDate: firstEtapeDateValidator.parse('2022-01-01') }}
     onChange={completeUpdateAction}
     user={{ ...testBlankUser, role: 'super' }}
+    contenu={{}}
   />
 )
 export const Rempli: StoryFn = () => (
@@ -75,6 +76,18 @@ export const Rempli: StoryFn = () => (
     tde={{ titreTypeId: 'axm', demarcheTypeId: 'oct', etapeTypeId: 'asc', demarcheId: demarcheIdValidator.parse('demarcheId'), firstEtapeDate: firstEtapeDateValidator.parse('2022-01-01') }}
     onChange={completeUpdateAction}
     user={{ ...testBlankUser, role: 'super' }}
+    contenu={{}}
+  />
+)
+export const DemandeARMProcedureSpecifique: StoryFn = () => (
+  <EtapeAvisEdit
+    apiClient={apiClient}
+    etapeId={etapeIdValidator.parse('etapeId')}
+    communeIds={[]}
+    tde={{ titreTypeId: 'arm', demarcheTypeId: 'oct', etapeTypeId: 'mfr', demarcheId: demarcheIdValidator.parse('demarcheId'), firstEtapeDate: firstEtapeDateValidator.parse('2025-01-01') }}
+    onChange={completeUpdateAction}
+    user={{ ...testBlankUser, role: 'super' }}
+    contenu={{ arm: { mecanise: { value: true, heritee: false, etapeHeritee: null } } }}
   />
 )
 export const AvisEnGuyane: StoryFn = () => (
@@ -101,5 +114,6 @@ export const AvisEnGuyane: StoryFn = () => (
     tde={{ titreTypeId: 'arm', demarcheTypeId: 'oct', etapeTypeId: 'asc', demarcheId: demarcheIdValidator.parse('demarcheId'), firstEtapeDate: firstEtapeDateValidator.parse('2022-01-01') }}
     onChange={completeUpdateAction}
     user={{ ...testBlankUser, role: 'super' }}
+    contenu={{}}
   />
 )
diff --git a/packages/ui/src/components/etape/etape-avis-edit.stories_snapshots_AvisEnGuyane.html b/packages/ui/src/components/etape/etape-avis-edit.stories_snapshots_AvisEnGuyane.html
index 93ec4be86d0b2f1c1e1c49927149e9e3ae234c8e..6b343135b860ba2f34791c9ca596aad667b6fae0 100644
--- a/packages/ui/src/components/etape/etape-avis-edit.stories_snapshots_AvisEnGuyane.html
+++ b/packages/ui/src/components/etape/etape-avis-edit.stories_snapshots_AvisEnGuyane.html
@@ -19,7 +19,7 @@
           <td>-</td>
           <td>-</td>
           <td>-</td>
-          <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document Avis de l'Office National des Forêts" aria-label="Ajouter un document Avis de l'Office National des Forêts" type="button">
+          <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document 'Avis de l'Office National des Forêts'" aria-label="Ajouter un document 'Avis de l'Office National des Forêts'" type="button">
               <!---->
             </button></td>
         </tr>
diff --git a/packages/ui/src/components/etape/etape-avis-edit.stories_snapshots_DemandeARMProcedureSpecifique.html b/packages/ui/src/components/etape/etape-avis-edit.stories_snapshots_DemandeARMProcedureSpecifique.html
new file mode 100644
index 0000000000000000000000000000000000000000..8321200c1ec243a930a02539040786e5502890ae
--- /dev/null
+++ b/packages/ui/src/components/etape/etape-avis-edit.stories_snapshots_DemandeARMProcedureSpecifique.html
@@ -0,0 +1,41 @@
+<div class="dsfr">
+  <div class="fr-table fr-mb-0">
+    <table style="display: table;">
+      <caption>Avis obligatoires</caption>
+      <thead>
+        <tr>
+          <th scope="col">Nom</th>
+          <th scope="col">Date</th>
+          <th scope="col">Description</th>
+          <th scope="col">Statut</th>
+          <th scope="col">Visibilité</th>
+          <th scope="col" style="display: flex; justify-content: end;">Action</th>
+        </tr>
+      </thead>
+      <tbody>
+        <tr>
+          <td class="fr-label--disabled">Décision au cas par cas</td>
+          <td>-</td>
+          <td>-</td>
+          <td>-</td>
+          <td>-</td>
+          <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document 'Décision au cas par cas'" aria-label="Ajouter un document 'Décision au cas par cas'" type="button">
+              <!---->
+            </button></td>
+        </tr>
+        <tr>
+          <td class="fr-label--disabled">Avis du propriétaire du sol</td>
+          <td>-</td>
+          <td>-</td>
+          <td>-</td>
+          <td>-</td>
+          <td style="display: flex; justify-content: end;"><button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-add-line" title="Ajouter un document 'Avis du propriétaire du sol'" aria-label="Ajouter un document 'Avis du propriétaire du sol'" type="button">
+              <!---->
+            </button></td>
+        </tr>
+      </tbody>
+    </table>
+  </div>
+  <!---->
+  <!---->
+</div>
\ No newline at end of file
diff --git a/packages/ui/src/components/etape/etape-avis-edit.tsx b/packages/ui/src/components/etape/etape-avis-edit.tsx
index 796beef8719330f6a7d40e59af95896081b00f5e..e8e4e585008828d4470ff849e99bccc1148716e7 100644
--- a/packages/ui/src/components/etape/etape-avis-edit.tsx
+++ b/packages/ui/src/components/etape/etape-avis-edit.tsx
@@ -9,7 +9,7 @@ import { LoadingElement } from '../_ui/functional-loader'
 import { AsyncData } from '../../api/client-rest'
 import { DsfrButtonIcon } from '../_ui/dsfr-button'
 import { AddEtapeAvisPopup } from './add-etape-avis-popup'
-import { getAvisTypes } from 'camino-common/src/permissions/etape-form'
+import { getAvisTypes, isArmMecanise } from 'camino-common/src/permissions/etape-form'
 import { dateFormat, FirstEtapeDate } from 'camino-common/src/date'
 import { AvisStatut } from '../_common/etape-statut'
 import { AvisTypeId, AvisTypes } from 'camino-common/src/static/avisTypes'
@@ -17,6 +17,8 @@ import { CommuneId } from 'camino-common/src/static/communes'
 import { getAvisVisibilityLabel } from './etape-avis'
 import { User } from 'camino-common/src/roles'
 import { DemarcheId } from 'camino-common/src/demarche'
+import { FlattenedContenu } from 'camino-common/src/etape-form'
+import { capitalize } from 'camino-common/src/strings'
 
 interface Props {
   tde: {
@@ -28,6 +30,7 @@ interface Props {
   }
   onChange: (etapeAvis: (EtapeAvis | TempEtapeAvis)[]) => void
   etapeId: EtapeId | null
+  contenu: FlattenedContenu
   communeIds: CommuneId[]
   apiClient: Pick<ApiClient, 'uploadTempDocument' | 'getEtapeAvisByEtapeId'>
   user: User
@@ -79,7 +82,9 @@ const EtapeAvisLoaded = defineComponent<EtapeAvisLoadedProps>(props => {
   const addOrEditPopupOpen = ref<{ open: true; avisTypeIds: NonEmptyArray<AvisTypeId>; etapeAvis?: (EtapeAvis | TempEtapeAvis) & WithIndex } | { open: false }>({ open: false })
 
   const avisTypes = computed(() => {
-    return getAvisTypes(props.tde.etapeTypeId, props.tde.titreTypeId, props.tde.demarcheTypeId, props.tde.demarcheId, props.tde.firstEtapeDate, props.communeIds)
+    return Object.values(
+      getAvisTypes(props.tde.etapeTypeId, props.tde.titreTypeId, props.tde.demarcheTypeId, props.tde.demarcheId, props.tde.firstEtapeDate, props.communeIds, isArmMecanise(props.contenu))
+    )
   })
 
   const completeRequiredAvis = computed<PropsTable['avis']>(() => {
@@ -132,7 +137,7 @@ const EtapeAvisLoaded = defineComponent<EtapeAvisLoadedProps>(props => {
   }
 
   const getNom = (avisTypeId: AvisTypeId) => {
-    return AvisTypes[avisTypeId].nom
+    return capitalize(AvisTypes[avisTypeId].nom)
   }
 
   return () => (
@@ -238,7 +243,7 @@ const EtapeAvisTable: FunctionalComponent<PropsTable> = (props: PropsTable) => {
               <td>-</td>
               <td>-</td>
               <td style={{ display: 'flex', justifyContent: 'end' }}>
-                <DsfrButtonIcon icon="fr-icon-add-line" title={`Ajouter un document ${props.getNom(avisTypeId)}`} onClick={() => props.add(avisTypeId)} buttonType="secondary" buttonSize="sm" />
+                <DsfrButtonIcon icon="fr-icon-add-line" title={`Ajouter un document '${props.getNom(avisTypeId)}'`} onClick={() => props.add(avisTypeId)} buttonType="secondary" buttonSize="sm" />
               </td>
             </tr>
           ))}
@@ -249,6 +254,6 @@ const EtapeAvisTable: FunctionalComponent<PropsTable> = (props: PropsTable) => {
 }
 
 // @ts-ignore waiting for https://github.com/vuejs/core/issues/7833
-EtapeAvisEdit.props = ['tde', 'onChange', 'etapeId', 'apiClient', 'communeIds', 'user']
+EtapeAvisEdit.props = ['tde', 'onChange', 'etapeId', 'contenu', 'apiClient', 'communeIds', 'user']
 // @ts-ignore waiting for https://github.com/vuejs/core/issues/7833
-EtapeAvisLoaded.props = ['tde', 'onChange', 'etapeId', 'apiClient', 'avis', 'communeIds', 'user']
+EtapeAvisLoaded.props = ['tde', 'onChange', 'etapeId', 'contenu', 'apiClient', 'avis', 'communeIds', 'user']
diff --git a/packages/ui/src/components/etape/etape-documents-edit.stories.tsx b/packages/ui/src/components/etape/etape-documents-edit.stories.tsx
index fbec07a1e8aa58636236a12febb7e8e68b0b5e9b..a3a852ad792a6ea3ab9296a1a12b317808232898 100644
--- a/packages/ui/src/components/etape/etape-documents-edit.stories.tsx
+++ b/packages/ui/src/components/etape/etape-documents-edit.stories.tsx
@@ -152,7 +152,7 @@ export const Complet: StoryFn = () => (
 export const ArmMecanise: StoryFn = () => (
   <EtapeDocumentsEdit
     apiClient={apiClient}
-    contenu={{ arm: { mecanise: { value: true } } }}
+    contenu={{ arm: { mecanise: { value: true, heritee: false, etapeHeritee: null } } }}
     etapeId={etapeIdValidator.parse('etapeId')}
     sdomZoneIds={[]}
     tde={{ titreTypeId: 'arm', demarcheTypeId: 'oct', etapeTypeId: 'mfr', demarcheId, firstEtapeDate }}
@@ -171,7 +171,7 @@ export const ArmMecaniseDynamicNoSnapshot: StoryObj<{ mecanise: boolean }> = {
         <button onClick={() => setArgs({ mecanise: !args.mecanise })}> Change la mécanisation </button>
         <EtapeDocumentsEdit
           apiClient={apiClient}
-          contenu={{ arm: { mecanise: { value: args.mecanise } } }}
+          contenu={{ arm: { mecanise: { value: args.mecanise, heritee: false, etapeHeritee: null } } }}
           etapeId={etapeIdValidator.parse('etapeId')}
           sdomZoneIds={[]}
           tde={{ titreTypeId: 'arm', demarcheTypeId: 'oct', etapeTypeId: 'mfr', demarcheId, firstEtapeDate }}
@@ -190,7 +190,7 @@ export const ArmMecaniseDynamicNoSnapshot: StoryObj<{ mecanise: boolean }> = {
 export const EnConstruction: StoryFn = () => (
   <EtapeDocumentsEdit
     apiClient={apiClient}
-    contenu={{ arm: { mecanise: { value: true } } }}
+    contenu={{ arm: { mecanise: { value: true, heritee: false, etapeHeritee: null } } }}
     etapeId={etapeIdValidator.parse('etapeId')}
     sdomZoneIds={[]}
     tde={{ titreTypeId: 'arm', demarcheTypeId: 'oct', etapeTypeId: 'mfr', demarcheId, firstEtapeDate }}
@@ -286,7 +286,7 @@ export const OctroiAxmUtilisateurEntrepriseComplet: StoryFn = () => (
 export const SdomZone: StoryFn = () => (
   <EtapeDocumentsEdit
     apiClient={apiClient}
-    contenu={{ arm: { mecanise: { value: true } } }}
+    contenu={{ arm: { mecanise: { value: true, heritee: false, etapeHeritee: null } } }}
     etapeId={etapeIdValidator.parse('etapeId')}
     sdomZoneIds={['1', '2']}
     tde={{ titreTypeId: 'axm', demarcheTypeId: 'oct', etapeTypeId: 'mfr', demarcheId, firstEtapeDate }}
diff --git a/packages/ui/src/components/etape/etape-documents-edit.tsx b/packages/ui/src/components/etape/etape-documents-edit.tsx
index 38b06b6cab2d2931a56469a9d204c700189b64d6..ddbca4605e64024aa914dc31be7f73042615f35a 100644
--- a/packages/ui/src/components/etape/etape-documents-edit.tsx
+++ b/packages/ui/src/components/etape/etape-documents-edit.tsx
@@ -13,9 +13,10 @@ import { DsfrButtonIcon } from '../_ui/dsfr-button'
 import { getVisibilityLabel, sortDocumentsColumn } from './etape-documents'
 import { AddEtapeDocumentPopup } from './add-etape-document-popup'
 import { User } from 'camino-common/src/roles'
-import { getDocumentsTypes } from 'camino-common/src/permissions/etape-form'
+import { getDocumentsTypes, isArmMecanise } from 'camino-common/src/permissions/etape-form'
 import { FirstEtapeDate } from 'camino-common/src/date'
 import { DemarcheId } from 'camino-common/src/demarche'
+import { FlattenedContenu } from 'camino-common/src/etape-form'
 
 interface Props {
   tde: {
@@ -30,7 +31,7 @@ interface Props {
   completeUpdate: (etapeDocuments: (EtapeDocument | TempEtapeDocument)[]) => void
   etapeId: EtapeId | null
   apiClient: Pick<ApiClient, 'uploadTempDocument' | 'getEtapeDocumentsByEtapeId'>
-  contenu: { arm?: { mecanise?: { value: boolean } } }
+  contenu: FlattenedContenu
   user: User
 }
 
@@ -88,7 +89,7 @@ const EtapeDocumentsLoaded = defineComponent<EtapeDocumentsLoadedProps>(props =>
       props.tde.titreTypeId,
       props.tde.demarcheId,
       props.sdomZoneIds,
-      props.contenu.arm?.mecanise?.value === true,
+      isArmMecanise(props.contenu),
       props.tde.firstEtapeDate
     )
   })
diff --git a/packages/ui/src/components/etape/etape-edit-form.tsx b/packages/ui/src/components/etape/etape-edit-form.tsx
index a571af63969d5b1ac7ea1f15371e969b61ade364..ebf139777404898098d27dff710b1db516140cdf 100644
--- a/packages/ui/src/components/etape/etape-edit-form.tsx
+++ b/packages/ui/src/components/etape/etape-edit-form.tsx
@@ -672,6 +672,7 @@ const EtapeEditFormInternal = defineComponent<
               firstEtapeDate: firstEtapeDate.value,
             }}
             etapeId={props.etape.id}
+            contenu={props.etape.contenu}
             communeIds={props.perimetre.communes}
             onChange={avisCompleteUpdate}
             user={props.user}
diff --git a/packages/ui/src/storybook.spec.ts b/packages/ui/src/storybook.spec.ts
index 9d7cb5b9da0427d9e0b8f8207b7112b2beda06f3..5a64c38dfe96491a306d7052c82ab995af362883 100644
--- a/packages/ui/src/storybook.spec.ts
+++ b/packages/ui/src/storybook.spec.ts
@@ -47,6 +47,7 @@ describe('Storybook Tests', async () => {
         .filter(env => (name ?? '').includes('NoStoryshots') || !(env.name ?? '').includes('NoSnapshot'))
     )('$name', async value => {
       setSeed(12)
+      let html: string | undefined = undefined
       try {
         // @ts-ignore
         window.dsfr = null
@@ -76,9 +77,14 @@ describe('Storybook Tests', async () => {
         })
 
         await new Promise<void>(resolve => setTimeout(() => resolve(), 1))
-        await expect(mounted.html()).toMatchFileSnapshot(`./${filePath.replace(/\.[^/.]+$/, '')}_snapshots_${value.name}.html`)
+        html = mounted.html()
       } catch (e) {
         throw new Error(`le test ${name} du fichier ${filePath} plante ${e}`)
+      } finally {
+        if (html === undefined) {
+          throw new Error('le test ne génère pas de html')
+        }
+        await expect(html).toMatchFileSnapshot(`./${filePath.replace(/\.[^/.]+$/, '')}_snapshots_${value.name}.html`)
       }
     })
   })