diff --git a/packages/api/src/api/graphql/resolvers/_titre-etape-email.ts b/packages/api/src/api/graphql/resolvers/_titre-etape-email.ts
index d1fcc7324e7d1f04ccbfe26853abe92b210d76d6..0152a884d1e038ef7977d83c41455809590ece53 100644
--- a/packages/api/src/api/graphql/resolvers/_titre-etape-email.ts
+++ b/packages/api/src/api/graphql/resolvers/_titre-etape-email.ts
@@ -6,7 +6,7 @@ import { titreUrlGet } from '../../../business/utils/urls-get'
 import { EmailAdministration } from '../../../tools/api-mailjet/types'
 import { UserNotNull } from 'camino-common/src/roles'
 import { EtapesTypes } from 'camino-common/src/static/etapesTypes'
-import { DeepReadonly, isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools'
+import { isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools'
 import { ETAPE_IS_BROUILLON, ETAPE_IS_NOT_BROUILLON } from 'camino-common/src/etape'
 import { TitreId } from 'camino-common/src/validators/titres'
 import { TITRES_TYPES_IDS, TitreTypeId } from 'camino-common/src/static/titresTypes'
@@ -14,7 +14,7 @@ import { DemarcheTypeId } from 'camino-common/src/static/demarchesTypes'
 import { getUtilisateursByTitreId } from '../../../database/queries/utilisateurs.queries'
 import { Pool } from 'pg'
 
-const emailForAdministrationContentFormat = (titreTypeId: TitreTypeId, etapeNom: string, titreId: TitreId, user: DeepReadonly<UserNotNull>) => {
+const emailForAdministrationContentFormat = (titreTypeId: TitreTypeId, etapeNom: string, titreId: TitreId, user: UserNotNull) => {
   const titreUrl = titreUrlGet(titreId)
 
   return `
@@ -34,7 +34,7 @@ export const emailsForAdministrationsGet = (
   demarcheTypeId: string,
   titreId: TitreId,
   titreTypeId: TitreTypeId,
-  user: DeepReadonly<UserNotNull>,
+  user: UserNotNull,
   oldEtape?: Pick<ITitreEtape, 'statutId' | 'isBrouillon'>
 ): { subject: string; content: string; emails: string[] } | null => {
   if (!etape) {
@@ -69,7 +69,7 @@ export const titreEtapeAdministrationsEmailsSend = async (
   demarcheTypeId: DemarcheTypeId,
   titreId: TitreId,
   titreTypeId: TitreTypeId,
-  user: DeepReadonly<UserNotNull>,
+  user: UserNotNull,
   oldEtape?: ITitreEtape
 ): Promise<void> => {
   const emailsForAdministrations = emailsForAdministrationsGet(etape, demarcheTypeId, titreId, titreTypeId, user, oldEtape)
diff --git a/packages/api/src/api/graphql/resolvers/_titre-etape.ts b/packages/api/src/api/graphql/resolvers/_titre-etape.ts
index 6f99bb8421aed4bfe2dc017130a092761349aaf5..b935d33c951c5cb860c5820d9c9f15e4575eab19 100644
--- a/packages/api/src/api/graphql/resolvers/_titre-etape.ts
+++ b/packages/api/src/api/graphql/resolvers/_titre-etape.ts
@@ -5,7 +5,7 @@ import { titreEtapeHeritageContenuFind } from '../../../business/utils/titre-eta
 import { titreEtapesSortAscByOrdre, titreEtapesSortDescByOrdre } from '../../../business/utils/titre-etapes-sort'
 import { DemarcheTypeId } from 'camino-common/src/static/demarchesTypes'
 import { TitreTypeId } from 'camino-common/src/static/titresTypes'
-import { DeepReadonly, getKeys, isNotNullNorUndefined, RecordPartial } from 'camino-common/src/typescript-tools'
+import { getKeys, isNotNullNorUndefined, RecordPartial } from 'camino-common/src/typescript-tools'
 import { getSections, Section } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections'
 import { ETAPE_HERITAGE_PROPS, isHeritageProps } from 'camino-common/src/heritage'
 import { EtapeTypeId, EtapesTypes } from 'camino-common/src/static/etapesTypes'
@@ -82,7 +82,7 @@ const titreEtapeHeritageContenuBuild = (
 
   titreEtapesFiltered.splice(0, 0, titreEtape)
 
-  const etapeSectionsDictionary = titreEtapesFiltered.reduce<RecordPartial<string, DeepReadonly<Section[]>>>((acc, e) => {
+  const etapeSectionsDictionary = titreEtapesFiltered.reduce<RecordPartial<string, Section[]>>((acc, e) => {
     acc[e.id] = getSections(titreTypeId, demarcheTypeId, e.typeId)
 
     return acc
diff --git a/packages/api/src/api/rest/activites.ts b/packages/api/src/api/rest/activites.ts
index 5be622bf213bfbecbef3966f731bec5bf80b3de2..16da6f62ae5141ae93f5a7463414087a0ca8712f 100644
--- a/packages/api/src/api/rest/activites.ts
+++ b/packages/api/src/api/rest/activites.ts
@@ -17,7 +17,7 @@ import {
   activiteDeleteQuery,
 } from './activites.queries'
 import { NewDownload } from './fichiers'
-import { DeepReadonly, SimplePromiseFn, isNonEmptyArray, isNullOrUndefined, memoize } from 'camino-common/src/typescript-tools'
+import { SimplePromiseFn, isNonEmptyArray, isNullOrUndefined, memoize } from 'camino-common/src/typescript-tools'
 import { canEditActivite, isActiviteDeposable } from 'camino-common/src/permissions/activites'
 import { SectionWithValue } from 'camino-common/src/sections'
 import { Section, getSectionsWithValue } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections'
@@ -31,7 +31,7 @@ import { EntrepriseId } from 'camino-common/src/entreprise'
 import { getCurrent } from 'camino-common/src/date'
 import { createLargeObject } from '../../database/largeobjects'
 
-const extractContenuFromSectionWithValue = (sections: DeepReadonly<Section[]>, sectionsWithValue: SectionWithValue[]): Contenu => {
+const extractContenuFromSectionWithValue = (sections: Section[], sectionsWithValue: SectionWithValue[]): Contenu => {
   const contenu: Contenu = {}
   sections.forEach(section => {
     const currentContent: Record<string, unknown> = {}
diff --git a/packages/api/src/api/rest/demarches.queries.ts b/packages/api/src/api/rest/demarches.queries.ts
index c1ef07277f7e22d9f1c5391ce891254b9bc70db3..8efabb6ebf5c1abb9bca956e17b3a8e07e412cd3 100644
--- a/packages/api/src/api/rest/demarches.queries.ts
+++ b/packages/api/src/api/rest/demarches.queries.ts
@@ -38,7 +38,7 @@ import { KM2, km2Validator, m2toKm2, m2Validator } from 'camino-common/src/numbe
 import { Effect, pipe } from 'effect'
 import { CaminoError } from 'camino-common/src/zod-tools'
 import { isAdministration, isSuper, User } from 'camino-common/src/roles'
-import { DeepReadonly, isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty, isNullOrUndefined } from 'camino-common/src/typescript-tools'
+import { isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty, isNullOrUndefined } from 'camino-common/src/typescript-tools'
 
 const getEtapesByDemarcheIdDbValidator = z.object({
   id: etapeIdValidator,
@@ -169,11 +169,7 @@ const getDemarchesEnConcurrenceDbValidator = z.object({
   demarche_id: demarcheIdValidator,
   demarche_public_lecture: z.boolean(),
 })
-export const getDemarchesEnConcurrenceQuery = (
-  pool: Pool,
-  demarcheIdPivot: DemarcheId,
-  user: DeepReadonly<User>
-): Effect.Effect<GetDemarcheMiseEnConcurrence[], CaminoError<EffectDbQueryAndValidateErrors>> => {
+export const getDemarchesEnConcurrenceQuery = (pool: Pool, demarcheIdPivot: DemarcheId, user: User): Effect.Effect<GetDemarcheMiseEnConcurrence[], CaminoError<EffectDbQueryAndValidateErrors>> => {
   return pipe(
     effectDbQueryAndValidate(getDemarchesEnConcurrenceDb, { demarcheIdPivot }, pool, getDemarchesEnConcurrenceDbValidator),
     Effect.map(demarches =>
@@ -228,7 +224,7 @@ const getDemarchePivotEnConcurrenceDbValidator = commonTitreEnConcurrenceValidat
 export const getDemarchePivotEnConcurrence = (
   pool: Pool,
   demarcheIdPivot: DemarcheId,
-  _user: DeepReadonly<User>
+  _user: User
 ): Effect.Effect<GetResultatMiseEnConcurrence, CaminoError<EffectDbQueryAndValidateErrors | "La démarche n'existe pas">> => {
   return Effect.Do.pipe(
     Effect.bind('pivots', () =>
@@ -327,7 +323,7 @@ const getDemarchesSatellitesEnConcurrenceDbValidator = commonTitreEnConcurrenceV
     surfaceEnCommun: m2Validator,
   })
 const getDemarchesSatellitesEnConcurrenceDb = sql<
-  Redefine<IGetDemarchesSatellitesEnConcurrenceDbQuery, { demarcheIdPivot: DemarcheId; perimetrePivot: DeepReadonly<MultiPolygon> }, z.infer<typeof getDemarchesSatellitesEnConcurrenceDbValidator>>
+  Redefine<IGetDemarchesSatellitesEnConcurrenceDbQuery, { demarcheIdPivot: DemarcheId; perimetrePivot: MultiPolygon }, z.infer<typeof getDemarchesSatellitesEnConcurrenceDbValidator>>
 >`
   select
     tmp."titreNom",
@@ -364,7 +360,7 @@ const getPerimetreSansSatelliteValidator = z.object({
   surface_sans_satellite: m2Validator,
 })
 const getPerimetreSansSatelliteDb = sql<
-  Redefine<IGetPerimetreSansSatelliteDbQuery, { perimetrePivot: DeepReadonly<MultiPolygon>; perimetreSatellite: DeepReadonly<MultiPolygon> }, z.infer<typeof getPerimetreSansSatelliteValidator>>
+  Redefine<IGetPerimetreSansSatelliteDbQuery, { perimetrePivot: MultiPolygon; perimetreSatellite: MultiPolygon }, z.infer<typeof getPerimetreSansSatelliteValidator>>
 >`
 SELECT
   ST_AREA(perimetre_geom_sans_satellite, TRUE) AS surface_sans_satellite,
diff --git a/packages/api/src/api/rest/entreprises.queries.ts b/packages/api/src/api/rest/entreprises.queries.ts
index afb0098e72059ed50b50b7e1d5758ac5b285b3d3..87c4c4dafe7a59d464fae5808c38a9cfd952d65e 100644
--- a/packages/api/src/api/rest/entreprises.queries.ts
+++ b/packages/api/src/api/rest/entreprises.queries.ts
@@ -21,7 +21,7 @@ import {
 } from 'camino-common/src/entreprise'
 import { EntrepriseDocumentTypeId } from 'camino-common/src/static/documentsTypes'
 import { CaminoDate } from 'camino-common/src/date'
-import { DeepReadonly, NonEmptyArray, isNonEmptyArray, isNonEmptyArrayAndDeepReadonly, onlyUnique } from 'camino-common/src/typescript-tools'
+import { NonEmptyArray, isNonEmptyArray, onlyUnique } from 'camino-common/src/typescript-tools'
 import { Pool } from 'pg'
 import { canSeeEntrepriseDocuments } from 'camino-common/src/permissions/entreprises'
 import { roleValidator, User } from 'camino-common/src/roles'
@@ -31,16 +31,16 @@ import { CaminoError } from 'camino-common/src/zod-tools'
 
 const dummy = ['dummy'] as const
 export const getEntrepriseDocuments = (
-  entrepriseDocumentIds: DeepReadonly<EntrepriseDocumentId[]>,
+  entrepriseDocumentIds: EntrepriseDocumentId[],
   entrepriseIds: EntrepriseId[],
   pool: Pool,
-  user: DeepReadonly<User>
+  user: User
 ): Effect.Effect<EntrepriseDocument[], CaminoError<EffectDbQueryAndValidateErrors>> => {
   return pipe(
     effectDbQueryAndValidate(
       getEntrepriseDocumentsInternal,
       {
-        entrepriseDocumentIds: isNonEmptyArrayAndDeepReadonly(entrepriseDocumentIds) ? entrepriseDocumentIds : dummy,
+        entrepriseDocumentIds: isNonEmptyArray(entrepriseDocumentIds) ? entrepriseDocumentIds : dummy,
         entrepriseIds: isNonEmptyArray(entrepriseIds) ? entrepriseIds : dummy,
       },
       pool,
@@ -53,7 +53,7 @@ export const getEntrepriseDocuments = (
 const getEntrepriseDocumentsInternal = sql<
   Redefine<
     IGetEntrepriseDocumentsInternalQuery,
-    { entrepriseDocumentIds: DeepReadonly<NonEmptyArray<EntrepriseDocumentId>> | typeof dummy; entrepriseIds: DeepReadonly<NonEmptyArray<EntrepriseId>> | typeof dummy },
+    { entrepriseDocumentIds: NonEmptyArray<EntrepriseDocumentId> | typeof dummy; entrepriseIds: NonEmptyArray<EntrepriseId> | typeof dummy },
     EntrepriseDocument
   >
 >`
@@ -242,7 +242,7 @@ where
 const checkEntreprisesExistValidator = z.object({ id: entrepriseIdValidator })
 const entreprisesNonExistantes = "certaines entreprises n'existent pas" as const
 export type CheckEntreprisesExistErrors = EffectDbQueryAndValidateErrors | typeof entreprisesNonExistantes
-export const checkEntreprisesExist = (pool: Pool, entrepriseIds: DeepReadonly<EntrepriseId[]>): Effect.Effect<DeepReadonly<EntrepriseId[]>, CaminoError<CheckEntreprisesExistErrors>> => {
+export const checkEntreprisesExist = (pool: Pool, entrepriseIds: EntrepriseId[]): Effect.Effect<EntrepriseId[], CaminoError<CheckEntreprisesExistErrors>> => {
   if (entrepriseIds.length === 0) {
     return Effect.succeed(entrepriseIds)
   }
@@ -257,7 +257,7 @@ export const checkEntreprisesExist = (pool: Pool, entrepriseIds: DeepReadonly<En
   )
 }
 
-const checkEntreprisesExistQuery = sql<Redefine<ICheckEntreprisesExistQueryQuery, { entrepriseIds: DeepReadonly<EntrepriseId[]> }, z.infer<typeof checkEntreprisesExistValidator>>>`
+const checkEntreprisesExistQuery = sql<Redefine<ICheckEntreprisesExistQueryQuery, { entrepriseIds: EntrepriseId[] }, z.infer<typeof checkEntreprisesExistValidator>>>`
 SELECT
     id
 FROM
diff --git a/packages/api/src/api/rest/etapes.ts b/packages/api/src/api/rest/etapes.ts
index 64ed2aedbd7f8de746f399e89fce568763da82b8..42671ad841990fe935bdcd7fb547860b62d89ce6 100644
--- a/packages/api/src/api/rest/etapes.ts
+++ b/packages/api/src/api/rest/etapes.ts
@@ -24,17 +24,7 @@ import { User, isBureauDEtudes, isEntreprise } from 'camino-common/src/roles'
 import { canCreateEtape, canDeposeEtape, canDeleteEtape, canEditEtape } from 'camino-common/src/permissions/titres-etapes'
 import { canBeBrouillon, ETAPES_TYPES, isEtapeTypeId } from 'camino-common/src/static/etapesTypes'
 
-import {
-  DeepReadonly,
-  NotNullableKeys,
-  getKeys,
-  isNonEmptyArray,
-  isNotNullNorUndefined,
-  isNotNullNorUndefinedNorEmpty,
-  isNullOrUndefined,
-  memoize,
-  onlyUnique,
-} from 'camino-common/src/typescript-tools'
+import { NotNullableKeys, getKeys, isNonEmptyArray, isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty, isNullOrUndefined, memoize, onlyUnique } from 'camino-common/src/typescript-tools'
 import { Pool } from 'pg'
 import { EntrepriseDocument, EntrepriseDocumentId, EtapeEntrepriseDocument } from 'camino-common/src/entreprise'
 import {
@@ -229,7 +219,7 @@ export const deleteEtape =
   }
 export const getEtape =
   (_pool: Pool) =>
-  async (req: CaminoRequest, res: CustomResponse<DeepReadonly<FlattenEtape>>): Promise<void> => {
+  async (req: CaminoRequest, res: CustomResponse<FlattenEtape>): Promise<void> => {
     const user = req.auth
 
     const etapeId = etapeIdOrSlugValidator.safeParse(req.params.etapeIdOrSlug)
@@ -269,8 +259,8 @@ type ValidateAndGetEntrepriseDocumentsErrors = typeof documentDEntrepriseIncorre
 const validateAndGetEntrepriseDocuments = (
   pool: Pool,
   etape: Pick<FlattenEtape, 'titulaires' | 'amodiataires'>,
-  entrepriseDocumentIds: DeepReadonly<EntrepriseDocumentId[]>,
-  user: DeepReadonly<User>
+  entrepriseDocumentIds: EntrepriseDocumentId[],
+  user: User
 ): Effect.Effect<EntrepriseDocument[], CaminoError<ValidateAndGetEntrepriseDocumentsErrors>> =>
   Effect.Do.pipe(
     Effect.filterOrFail(
@@ -292,7 +282,7 @@ const validateAndGetEntrepriseDocuments = (
     Effect.catchTag("pas de documents d'entreprise", _myError => Effect.succeed([]))
   )
 
-export const arePointsOnPerimeter = (perimetre: DeepReadonly<FeatureMultiPolygon>, points: DeepReadonly<FeatureCollectionPoints>): boolean => {
+export const arePointsOnPerimeter = (perimetre: FeatureMultiPolygon, points: FeatureCollectionPoints): boolean => {
   const coordinatesSet = new Set()
 
   perimetre.geometry.coordinates.forEach(geometry => geometry.forEach(sub => sub.forEach(coordinate => coordinatesSet.add(`${coordinate[0]}-${coordinate[1]}`))))
@@ -321,7 +311,7 @@ const lespointsdoiventetresurleperimetreerror = 'les points doivent être sur le
 type PerimetreInfosError = typeof lespointsdoiventetresurleperimetreerror | ConvertPointsErrors | GetGeojsonInformationErrorMessages
 type PerimetreInfos = {
   secteursMaritime: SecteursMaritimes[]
-  sdomZones: DeepReadonly<SDOMZoneId[]>
+  sdomZones: SDOMZoneId[]
   surface: KM2 | null
 } & Pick<GraphqlEtape, 'geojson4326Forages' | 'geojsonOrigineForages'> &
   Pick<GetGeojsonInformation, 'communes' | 'forets'>
@@ -1040,7 +1030,7 @@ const demarcheEtapesTypesGet = (
   titreDemarcheId: DemarcheId,
   date: CaminoDate,
   titreEtapeId: EtapeId | null,
-  user: DeepReadonly<User>
+  user: User
 ): Effect.Effect<EtapeTypeEtapeStatutWithMainStep, CaminoError<DemarcheEtapesTypesGetErrors>> => {
   return Effect.Do.pipe(
     Effect.bind('titreDemarche', () =>
diff --git a/packages/api/src/api/rest/format/titres-activites.ts b/packages/api/src/api/rest/format/titres-activites.ts
index ba1a41da760f093677c8b0b9219f536c7d573aca..1c2b7df16b9a78d172b8046991b4a2b94504cf6c 100644
--- a/packages/api/src/api/rest/format/titres-activites.ts
+++ b/packages/api/src/api/rest/format/titres-activites.ts
@@ -4,14 +4,14 @@ import { UniteId, Unites } from 'camino-common/src/static/unites'
 import { getPeriode } from 'camino-common/src/static/frequence'
 import { ActivitesStatuts } from 'camino-common/src/static/activitesStatuts'
 import { Section } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections'
-import { DeepReadonly, isNullOrUndefined } from 'camino-common/src/typescript-tools'
+import { isNullOrUndefined } from 'camino-common/src/typescript-tools'
 import { Pool } from 'pg'
 import { getCommunesIndex } from '../../../database/queries/communes'
 import { ActivitesTypes } from 'camino-common/src/static/activitesTypes'
 import { getEntreprises } from '../entreprises.queries'
 import { EntrepriseId } from 'camino-common/src/entreprise'
 
-const titreActiviteContenuFormat = (contenu: IContenu, sections: DeepReadonly<Section[]>) =>
+const titreActiviteContenuFormat = (contenu: IContenu, sections: Section[]) =>
   sections.reduce((resSections: Index<IContenuValeur>, section) => {
     const r = section.elements!.reduce((resElements: Index<IContenuValeur>, element) => {
       let key = `${section.id}_${element.id}`
diff --git a/packages/api/src/api/rest/perimetre.queries.ts b/packages/api/src/api/rest/perimetre.queries.ts
index 1df08fe239ecce5dfc11b4ec923a593708e1a2a1..95eb543c5a0c7b660daab660ae885ac2dc79d524 100644
--- a/packages/api/src/api/rest/perimetre.queries.ts
+++ b/packages/api/src/api/rest/perimetre.queries.ts
@@ -13,7 +13,7 @@ import { secteurDbIdValidator } from 'camino-common/src/static/facades'
 import { foretIdValidator } from 'camino-common/src/static/forets'
 import { sdomZoneIdValidator } from 'camino-common/src/static/sdom'
 import { KM2, M2, createM2Validator, km2Validator, m2Validator } from 'camino-common/src/number'
-import { DeepReadonly, isNullOrUndefined } from 'camino-common/src/typescript-tools'
+import { isNullOrUndefined } from 'camino-common/src/typescript-tools'
 import { ZodUnparseable, zodParseEffect, zodParseEffectCallback } from '../../tools/fp-tools'
 import { CaminoError } from 'camino-common/src/zod-tools'
 import { Effect, pipe } from 'effect'
@@ -35,7 +35,7 @@ const to4326GeoSystemeId: GeoSystemeId = GEO_SYSTEME_IDS.WGS84
 export const convertPoints = <T extends z.ZodTypeAny>(
   pool: Pool,
   fromGeoSystemeId: GeoSystemeId,
-  geojsonPoints: DeepReadonly<GenericFeatureCollection<T>>
+  geojsonPoints: GenericFeatureCollection<T>
 ): Effect.Effect<GenericFeatureCollection<T>, CaminoError<ConvertPointsErrors>> => {
   return pipe(
     Effect.try({
@@ -173,7 +173,7 @@ export const getTitresIntersectionWithGeojson = (
     getTitresIntersectionWithGeojsonValidator
   )
 }
-type GetTitresIntersectionWithGeojsonDb = DeepReadonly<{ titre_slug: TitreSlug; titre_statut_ids: TitreStatutId[]; geojson4326_perimetre: MultiPolygon; domaine_id: DomaineId }>
+type GetTitresIntersectionWithGeojsonDb = { titre_slug: TitreSlug; titre_statut_ids: TitreStatutId[]; geojson4326_perimetre: MultiPolygon; domaine_id: DomaineId }
 const getTitresIntersectionWithGeojsonDb = sql<Redefine<IGetTitresIntersectionWithGeojsonDbQuery, GetTitresIntersectionWithGeojsonDb, GetTitresIntersectionWithGeojson>>`
 select
     t.nom,
@@ -196,7 +196,7 @@ const m2ToKm2 = (value: M2): Effect.Effect<KM2, CaminoError<ZodUnparseable>> =>
 
 const requestError = 'Une erreur inattendue est survenue lors de la récupération des informations geojson en base' as const
 export type GetGeojsonInformationErrorMessages = ZodUnparseable | DbQueryAccessError | typeof requestError
-export const getGeojsonInformation = (pool: Pool, geojson4326_perimetre: DeepReadonly<MultiPolygon>): Effect.Effect<GetGeojsonInformation, CaminoError<GetGeojsonInformationErrorMessages>> => {
+export const getGeojsonInformation = (pool: Pool, geojson4326_perimetre: MultiPolygon): Effect.Effect<GetGeojsonInformation, CaminoError<GetGeojsonInformationErrorMessages>> => {
   return pipe(
     effectDbQueryAndValidate(getGeojsonInformationDb, { geojson4326_perimetre }, pool, getGeojsonInformationDbValidator),
     Effect.bind('response', result => (result.length === 1 ? Effect.succeed(result[0]) : Effect.fail({ message: requestError }))),
@@ -227,7 +227,7 @@ const getGeojsonInformationValidator = z.object({
 
 // Surface maximale acceptée pour un titre
 const SURFACE_M2_MAX = 100_000 * 1_000_000
-export type GetGeojsonInformation = DeepReadonly<z.infer<typeof getGeojsonInformationValidator>>
+export type GetGeojsonInformation = z.infer<typeof getGeojsonInformationValidator>
 const getGeojsonInformationCommuneDbValidator = z.object({ id: communeIdValidator, nom: z.string(), surface: m2Validator })
 
 const getGeojsonInformationDbValidator = z.object({
@@ -238,7 +238,7 @@ const getGeojsonInformationDbValidator = z.object({
   secteurs: z.array(secteurDbIdValidator).nullable().transform(nullToEmptyArray),
 })
 type GetGeojsonInformationDbValidator = z.infer<typeof getGeojsonInformationDbValidator>
-const getGeojsonInformationDb = sql<Redefine<IGetGeojsonInformationDbQuery, DeepReadonly<{ geojson4326_perimetre: MultiPolygon }>, GetGeojsonInformationDbValidator>>`
+const getGeojsonInformationDb = sql<Redefine<IGetGeojsonInformationDbQuery, { geojson4326_perimetre: MultiPolygon }, GetGeojsonInformationDbValidator>>`
 select
     (
         select
diff --git a/packages/api/src/api/rest/perimetre.ts b/packages/api/src/api/rest/perimetre.ts
index d4993f37e4004664c44ff0cec3637f29fa87326f..076007d0d3b00b861921c036d287552336a35d96 100644
--- a/packages/api/src/api/rest/perimetre.ts
+++ b/packages/api/src/api/rest/perimetre.ts
@@ -41,7 +41,7 @@ import {
 import { join } from 'node:path'
 import { readFileSync } from 'node:fs'
 import { parseShp } from 'shpjs'
-import { DeepReadonly, isNotNullNorUndefined, isNullOrUndefined, memoize } from 'camino-common/src/typescript-tools'
+import { isNotNullNorUndefined, isNullOrUndefined, memoize } from 'camino-common/src/typescript-tools'
 import { SDOMZoneId } from 'camino-common/src/static/sdom'
 import { TitreSlug } from 'camino-common/src/validators/titres'
 import { canReadEtape } from './permissions/etapes'
@@ -194,7 +194,7 @@ type GeojsonImportErrorMessages =
   | GetGeojsonByGeoSystemeIdErrorMessages
   | GetGeojsonInformationErrorMessages
   | ConvertPointsErrors
-export const geojsonImport: RestNewPostCall<'/rest/geojson/import/:geoSystemeId'> = (rootPipe): Effect.Effect<DeepReadonly<GeojsonInformations>, CaminoApiError<GeojsonImportErrorMessages>> => {
+export const geojsonImport: RestNewPostCall<'/rest/geojson/import/:geoSystemeId'> = (rootPipe): Effect.Effect<GeojsonInformations, CaminoApiError<GeojsonImportErrorMessages>> => {
   return rootPipe.pipe(
     Effect.let('pathFrom', ({ body }) => join(process.cwd(), `/files/tmp/${body.tempDocumentName}`)),
     Effect.bind('result', ({ body, pathFrom, params }) => {
@@ -565,7 +565,7 @@ const getAlertesSuperposition = (
   geojson4326_perimetre: MultiPolygon | null,
   titreTypeId: TitreTypeId,
   titreSlug: TitreSlug,
-  user: DeepReadonly<User>,
+  user: User,
   pool: Pool
 ): Effect.Effect<GetTitresIntersectionWithGeojson[], CaminoError<ZodUnparseable | DbQueryAccessError>> => {
   if (titreTypeId === 'axm' && (isSuper(user) || isAdministrationAdmin(user) || isAdministrationEditeur(user)) && geojson4326_perimetre !== null) {
diff --git a/packages/api/src/api/rest/titre-demande.queries.ts b/packages/api/src/api/rest/titre-demande.queries.ts
index 6e7cf21471b1d2baa898c67112059546ea34c70d..4e9a80f714973cecb846ead12e29d6c082644925 100644
--- a/packages/api/src/api/rest/titre-demande.queries.ts
+++ b/packages/api/src/api/rest/titre-demande.queries.ts
@@ -11,7 +11,6 @@ import { newDemarcheId, newDemarcheSlug, newTitreId, newTitreSlug } from '../../
 import { CaminoError } from 'camino-common/src/zod-tools.js'
 import { ICreateTitreDemarcheInternalQuery, ICreateTitreInternalQuery } from './titre-demande.queries.types.js'
 import { TitreDemande } from 'camino-common/src/titres.js'
-import { DeepReadonly } from 'camino-common/src/typescript-tools.js'
 import { DemarcheId, DemarcheSlug } from 'camino-common/src/demarche.js'
 import { DemarcheTypeId } from 'camino-common/src/static/demarchesTypes.js'
 
@@ -19,7 +18,7 @@ type CreateTitreInput = Omit<TitreDemande, 'titreFromIds' | 'entrepriseId'>
 
 const creationTitreImpossible = 'Création du titre impossible' as const
 export type CreateTitreErrors = DbQueryAccessError | ZodUnparseable | 'Accès interdit' | typeof creationTitreImpossible
-export const createTitre = (pool: Pool, user: DeepReadonly<User>, titreInput: DeepReadonly<CreateTitreInput>): Effect.Effect<TitreId, CaminoError<CreateTitreErrors>> =>
+export const createTitre = (pool: Pool, user: User, titreInput: CreateTitreInput): Effect.Effect<TitreId, CaminoError<CreateTitreErrors>> =>
   Effect.Do.pipe(
     Effect.filterOrFail(
       () => canCreateTitre(user, titreInput.titreTypeId),
@@ -36,7 +35,7 @@ export const createTitre = (pool: Pool, user: DeepReadonly<User>, titreInput: De
     Effect.map(({ id }) => id)
   )
 
-const createTitreInternal = sql<Redefine<ICreateTitreInternalQuery, DeepReadonly<{ id: TitreId; slug: TitreSlug; references: string } & Omit<CreateTitreInput, 'references'>>, void>>`
+const createTitreInternal = sql<Redefine<ICreateTitreInternalQuery, { id: TitreId; slug: TitreSlug; references: string } & Omit<CreateTitreInput, 'references'>, void>>`
 INSERT INTO titres (id, slug, nom, type_id, "references")
     VALUES ($ id !, $slug!, $ nom !, $ titreTypeId!, $references!)
 `
@@ -56,7 +55,7 @@ export const createDemarche = (pool: Pool, titreId: TitreId, demarcheTypeId: Dem
     Effect.map(({ id }) => id)
   )
 }
-const createTitreDemarcheInternal = sql<Redefine<ICreateTitreDemarcheInternalQuery, DeepReadonly<{ id: DemarcheId; slug: DemarcheSlug; titre_id: TitreId; demarcheTypeId: DemarcheTypeId }>, void>>`
+const createTitreDemarcheInternal = sql<Redefine<ICreateTitreDemarcheInternalQuery, { id: DemarcheId; slug: DemarcheSlug; titre_id: TitreId; demarcheTypeId: DemarcheTypeId }, void>>`
 INSERT INTO titres_demarches (id, slug, titre_id, type_id)
     VALUES ($ id !, $slug!, $ titre_id !, $demarcheTypeId)
 `
diff --git a/packages/api/src/api/rest/titre-demande.ts b/packages/api/src/api/rest/titre-demande.ts
index c8e068376d925d53464c34e45d23cc98a21b9240..3fa523b631768a91e7fdbce267618b9064fc4653 100644
--- a/packages/api/src/api/rest/titre-demande.ts
+++ b/packages/api/src/api/rest/titre-demande.ts
@@ -5,7 +5,7 @@ import { isEntrepriseOrBureauDEtude } from 'camino-common/src/roles'
 import { linkTitres } from '../../database/queries/titres-titres.queries'
 import { canCreateTitre } from 'camino-common/src/permissions/titres'
 import { checkTitreLinks } from '../../business/validations/titre-links-validate'
-import { DeepReadonly, isNotNullNorUndefinedNorEmpty, isNullOrUndefined, isNullOrUndefinedOrEmpty } from 'camino-common/src/typescript-tools'
+import { isNotNullNorUndefinedNorEmpty, isNullOrUndefined, isNullOrUndefinedOrEmpty } from 'camino-common/src/typescript-tools'
 import { createAutomaticallyEtapeWhenCreatingTitre, TitreDemandeOutput } from 'camino-common/src/titres'
 import { HTTP_STATUS } from 'camino-common/src/http'
 import { ETAPE_IS_BROUILLON } from 'camino-common/src/etape'
@@ -113,7 +113,7 @@ export const titreDemandeCreer: RestNewPostCall<'/rest/titres'> = (rootPipe): Ef
               if (isNullOrUndefinedOrEmpty(titreDemande.entrepriseId)) {
                 throw new Error('Ne devrait jamais se produire, réduction pour typescript qui ne voit pas le filterOrFail au dessus')
               }
-              const titreEtape: DeepReadonly<Omit<ITitreEtape, 'id' | 'concurrence' | 'hasTitreFrom'>> = {
+              const titreEtape: Omit<ITitreEtape, 'id' | 'concurrence' | 'hasTitreFrom'> = {
                 titreDemarcheId: demarcheId,
                 typeId: 'mfr',
                 statutId: 'fai',
diff --git a/packages/api/src/api/rest/titres.ts b/packages/api/src/api/rest/titres.ts
index f8e69ee5d6829d6a05609cce05e7c279f2e7b85e..0d6a8ae66b64bd131ef0775091a489535554d9dc 100644
--- a/packages/api/src/api/rest/titres.ts
+++ b/packages/api/src/api/rest/titres.ts
@@ -5,7 +5,7 @@ import { CaminoRequest, CustomResponse } from './express-type'
 import { userSuper } from '../../database/user-super'
 import { isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty, isNullOrUndefined, onlyUnique } from 'camino-common/src/typescript-tools'
 import { CaminoApiError } from '../../types'
-import { DeepReadonly, NotNullableKeys, isNullOrUndefinedOrEmpty } from 'camino-common/src/typescript-tools'
+import { NotNullableKeys, isNullOrUndefinedOrEmpty } from 'camino-common/src/typescript-tools'
 import TitresTitres from '../../database/models/titres--titres'
 import { titreAdministrationsGet } from '../_format/titres'
 import { canDeleteTitre, canEditTitre, canLinkTitres } from 'camino-common/src/permissions/titres'
@@ -266,7 +266,7 @@ export const postTitreLiaisons: RestNewPostCall<'/rest/titres/:id/titreLiaisons'
   )
 }
 
-const titreLinksGet = (titreId: string, link: 'titreToId' | 'titreFromId', user: DeepReadonly<User>): Effect.Effect<TitreLink[], CaminoError<DbQueryAccessError>> => {
+const titreLinksGet = (titreId: string, link: 'titreToId' | 'titreFromId', user: User): Effect.Effect<TitreLink[], CaminoError<DbQueryAccessError>> => {
   return pipe(
     Effect.tryPromise({
       try: async () => TitresTitres.query().where(link === 'titreToId' ? 'titreFromId' : 'titreToId', titreId),
diff --git a/packages/api/src/api/rest/utilisateurs.queries.ts b/packages/api/src/api/rest/utilisateurs.queries.ts
index 03c168db2a488b5ece8dbb5b97f2326c7c601f07..392508500128d279ef0474cab8317664abe8b7b6 100644
--- a/packages/api/src/api/rest/utilisateurs.queries.ts
+++ b/packages/api/src/api/rest/utilisateurs.queries.ts
@@ -1,5 +1,4 @@
 import { sql } from '@pgtyped/runtime'
-import { DeepReadonly } from 'camino-common/src/typescript-tools'
 import { QGISToken } from 'camino-common/src/utilisateur'
 import { CaminoError } from 'camino-common/src/zod-tools'
 import { Effect, pipe } from 'effect'
@@ -10,12 +9,10 @@ import { UserNotNull, UtilisateurId } from 'camino-common/src/roles'
 import bcrypt from 'bcryptjs'
 import { IUpdateQgisTokenInternalQuery } from './utilisateurs.queries.types'
 
-export const updateQgisToken = (pool: Pool, user: DeepReadonly<UserNotNull>, qgisToken: QGISToken): Effect.Effect<boolean, CaminoError<EffectDbQueryAndValidateErrors>> =>
+export const updateQgisToken = (pool: Pool, user: UserNotNull, qgisToken: QGISToken): Effect.Effect<boolean, CaminoError<EffectDbQueryAndValidateErrors>> =>
   pipe(
     effectDbQueryAndValidate(updateQgisTokenInternal, { user_id: user.id, qgisToken: bcrypt.hashSync(qgisToken, 10) }, pool, z.void()),
     Effect.map(() => true)
   )
 
-const updateQgisTokenInternal = sql<
-  Redefine<IUpdateQgisTokenInternalQuery, DeepReadonly<{ user_id: UtilisateurId; qgisToken: string }>, void>
->`UPDATE utilisateurs set qgis_token=$qgisToken! where id=$user_id!`
+const updateQgisTokenInternal = sql<Redefine<IUpdateQgisTokenInternalQuery, { user_id: UtilisateurId; qgisToken: string }, void>>`UPDATE utilisateurs set qgis_token=$qgisToken! where id=$user_id!`
diff --git a/packages/api/src/api/rest/utilisateurs.ts b/packages/api/src/api/rest/utilisateurs.ts
index b131ecb1062cd59275022dad2506be727c3ba2d6..77ff405d2a1915f6018c1cf3dea16836dd8c1418 100644
--- a/packages/api/src/api/rest/utilisateurs.ts
+++ b/packages/api/src/api/rest/utilisateurs.ts
@@ -11,7 +11,7 @@ import { idGenerate } from '../../database/models/_format/id-create'
 import { utilisateurUpdationValidate } from '../../business/validations/utilisateur-updation-validate'
 import { canDeleteUtilisateur } from 'camino-common/src/permissions/utilisateurs'
 import { Pool } from 'pg'
-import { DeepReadonly, isNotNullNorUndefined, isNullOrUndefined } from 'camino-common/src/typescript-tools'
+import { isNotNullNorUndefined, isNullOrUndefined } from 'camino-common/src/typescript-tools'
 import { config } from '../../config/index'
 import { Effect, Match } from 'effect'
 import { RestNewGetCall, RestNewPostCall } from '../../server/rest'
@@ -292,7 +292,7 @@ export const utilisateurs =
 
 type GetUtilisateursError = DbQueryAccessError | ZodUnparseable | "Impossible d'accéder à la liste des utilisateurs" | 'droits insuffisants'
 
-export const getUtilisateurs: RestNewGetCall<'/rest/utilisateurs'> = (rootPipe): Effect.Effect<DeepReadonly<UtilisateursTable>, CaminoApiError<GetUtilisateursError>> => {
+export const getUtilisateurs: RestNewGetCall<'/rest/utilisateurs'> = (rootPipe): Effect.Effect<UtilisateursTable, CaminoApiError<GetUtilisateursError>> => {
   return rootPipe.pipe(
     Effect.bind('utilisateurs', ({ pool, user, searchParams }) => getUtilisateursFilteredAndSorted(pool, user, searchParams)),
     Effect.map(({ utilisateurs, searchParams }) => {
@@ -313,7 +313,7 @@ export const getUtilisateurs: RestNewGetCall<'/rest/utilisateurs'> = (rootPipe):
 }
 
 type GetUtilisateurError = DbQueryAccessError | ZodUnparseable | 'droits insuffisants'
-export const getUtilisateur: RestNewGetCall<'/rest/utilisateurs/:id'> = (rootPipe): Effect.Effect<DeepReadonly<UserNotNull>, CaminoApiError<GetUtilisateurError>> => {
+export const getUtilisateur: RestNewGetCall<'/rest/utilisateurs/:id'> = (rootPipe): Effect.Effect<UserNotNull, CaminoApiError<GetUtilisateurError>> => {
   return rootPipe.pipe(
     Effect.flatMap(({ pool, params, user }) => newGetUtilisateurById(pool, params.id, user)),
     Effect.mapError(caminoError =>
diff --git a/packages/api/src/business/matrices.ts b/packages/api/src/business/matrices.ts
index f0439af663cf518897f7b5fbf89f23786449fe15..66343e629c116beba88ea37f9336e91bab1e5a9d 100644
--- a/packages/api/src/business/matrices.ts
+++ b/packages/api/src/business/matrices.ts
@@ -2,7 +2,7 @@ import '../init'
 import { FiscaliteFrance, decimalValidator, fiscaliteValidator, type Fiscalite } from 'camino-common/src/validators/fiscalite'
 import { ICommune, IContenuValeur } from '../types'
 import { departementIdValidator, Departements, toDepartementId } from 'camino-common/src/static/departement'
-import { DeepReadonly, isNotNullNorUndefined, isNullOrUndefined } from 'camino-common/src/typescript-tools'
+import { isNotNullNorUndefined, isNullOrUndefined } from 'camino-common/src/typescript-tools'
 import { Commune, CommuneId, communeIdValidator, communeValidator } from 'camino-common/src/static/communes'
 import { CaminoAnnee } from 'camino-common/src/date'
 
@@ -161,7 +161,7 @@ export const getRawLines = (
           const production = conversion(substancesFiscale, activite.contenu.substancesFiscales?.[substancesFiscale.id] ?? null)
 
           if (production.value.greaterThan(0)) {
-            const communes: DeepReadonly<ICommune[]> = titre.communes
+            const communes: ICommune[] = titre.communes
             if (isNullOrUndefined(titresToBuild[titre.id])) {
               const surfaceTotale = titre.communes.reduce((value, commune) => value.add(commune.surface ?? 0), new Decimal(0))
 
diff --git a/packages/api/src/business/processes/titres-etapes-areas-update.ts b/packages/api/src/business/processes/titres-etapes-areas-update.ts
index 6362966dd63eeda9b0cb627644309e79f13c4128..6a93e0f3b77a3de21e47d8bc1efb0c7ca94f334e 100644
--- a/packages/api/src/business/processes/titres-etapes-areas-update.ts
+++ b/packages/api/src/business/processes/titres-etapes-areas-update.ts
@@ -6,7 +6,7 @@ import { SecteursMaritimes, SecteursMaritimesIds, getSecteurMaritime } from 'cam
 import { knex } from '../../knex'
 import { ForetId } from 'camino-common/src/static/forets'
 import { CommuneId, toCommuneId } from 'camino-common/src/static/communes'
-import { DeepReadonly, isNotNullNorUndefined, onlyUnique } from 'camino-common/src/typescript-tools'
+import { isNotNullNorUndefined, onlyUnique } from 'camino-common/src/typescript-tools'
 import { getGeojsonInformation } from '../../api/rest/perimetre.queries'
 import type { Pool } from 'pg'
 import { SDOMZoneId } from 'camino-common/src/static/sdom'
@@ -53,7 +53,7 @@ export const titresEtapesAreasUpdate = async (pool: Pool, titresEtapesIds?: stri
     }
   }
 }
-async function intersectSdom(titreEtape: Pick<ITitreEtape, 'sdomZones' | 'id'>, sdomZonesIds: DeepReadonly<SDOMZoneId[]>) {
+async function intersectSdom(titreEtape: Pick<ITitreEtape, 'sdomZones' | 'id'>, sdomZonesIds: SDOMZoneId[]) {
   if (sdomZonesIds.length > 0) {
     const sortedSdomZonesIds = sdomZonesIds.toSorted()
 
@@ -64,7 +64,7 @@ async function intersectSdom(titreEtape: Pick<ITitreEtape, 'sdomZones' | 'id'>,
   }
 }
 
-async function intersectForets(titreEtape: Pick<ITitreEtape, 'forets' | 'id'>, foretsNew: DeepReadonly<ForetId[]>) {
+async function intersectForets(titreEtape: Pick<ITitreEtape, 'forets' | 'id'>, foretsNew: ForetId[]) {
   if (!titreEtape.forets) {
     throw new Error('les forêts de l’étape ne sont pas chargées')
   }
@@ -79,7 +79,7 @@ async function intersectForets(titreEtape: Pick<ITitreEtape, 'forets' | 'id'>, f
   }
 }
 
-async function intersectCommunes(titreEtape: Pick<ITitreEtape, 'communes' | 'id' | 'geojson4326Perimetre'>, communes: DeepReadonly<{ id: CommuneId; surface: M2 }[]>) {
+async function intersectCommunes(titreEtape: Pick<ITitreEtape, 'communes' | 'id' | 'geojson4326Perimetre'>, communes: { id: CommuneId; surface: M2 }[]) {
   const communesNew: { id: CommuneId; surface: M2 }[] = communes.map(({ id, surface }) => ({ id: toCommuneId(id), surface })).toSorted((a, b) => a.id.localeCompare(b.id))
   if (titreEtape.communes?.length !== communesNew.length || titreEtape.communes.some((value, index) => value.id !== communesNew[index].id || value.surface !== communesNew[index].surface)) {
     console.info(`Mise à jour des communes sur l'étape ${titreEtape.id}, ancien: '${JSON.stringify(titreEtape.communes)}', nouveaux: '${JSON.stringify(communesNew)}'`)
@@ -89,7 +89,7 @@ async function intersectCommunes(titreEtape: Pick<ITitreEtape, 'communes' | 'id'
   }
 }
 
-async function intersectSecteursMaritime(titreEtape: Pick<ITitreEtape, 'secteursMaritime' | 'id'>, secteursMaritime: DeepReadonly<SecteursMaritimesIds[]>) {
+async function intersectSecteursMaritime(titreEtape: Pick<ITitreEtape, 'secteursMaritime' | 'id'>, secteursMaritime: SecteursMaritimesIds[]) {
   const secteurMaritimeNew: SecteursMaritimes[] = secteursMaritime
     .map(id => getSecteurMaritime(id))
     .filter(onlyUnique)
diff --git a/packages/api/src/business/processes/titres-etapes-consentement.queries.ts b/packages/api/src/business/processes/titres-etapes-consentement.queries.ts
index 8790485c1014c015b782a09e427e4fb78017fe8a..ed402d3b37f3d5161a89daac4941420eeacfaf9e 100644
--- a/packages/api/src/business/processes/titres-etapes-consentement.queries.ts
+++ b/packages/api/src/business/processes/titres-etapes-consentement.queries.ts
@@ -12,7 +12,7 @@ import { sql } from '@pgtyped/runtime'
 import { shortCircuitError, ZodUnparseable } from '../../tools/fp-tools'
 import { etapeTypeIdValidator } from 'camino-common/src/static/etapesTypes'
 import { MultiPolygon, multiPolygonValidator } from 'camino-common/src/perimetre'
-import { DeepReadonly, isNotNullNorUndefined } from 'camino-common/src/typescript-tools'
+import { isNotNullNorUndefined } from 'camino-common/src/typescript-tools'
 import { SubstanceLegaleId, substanceLegaleIdValidator } from 'camino-common/src/static/substancesLegales'
 
 type GetEtapeConsentement = Omit<GetEtapeConsentementDb, 'geojson4326_perimetre'> & { geojson4326_perimetre: MultiPolygon }
@@ -102,7 +102,7 @@ type GetDemarchesEnSuperpositionPourConsentement = z.infer<typeof getDemarchesEn
 const getDemarchesEnSuperpositionPourConsentementDb = sql<
   Redefine<
     IGetDemarchesEnSuperpositionPourConsentementDbQuery,
-    { dateDemande: CaminoDate; perimetreDemande: DeepReadonly<MultiPolygon>; substancesDemande: DeepReadonly<SubstanceLegaleId[]> },
+    { dateDemande: CaminoDate; perimetreDemande: MultiPolygon; substancesDemande: SubstanceLegaleId[] },
     GetDemarchesEnSuperpositionPourConsentement
   >
 >`
@@ -131,5 +131,5 @@ const demarcheIdArrayStringifyValidator = z
 type DemarcheIdArrayStringify = z.infer<typeof demarcheIdArrayStringifyValidator>
 
 const updateEtapeConsentementDb = sql<
-  Redefine<IUpdateEtapeConsentementDbQuery, { etapeId: EtapeId; demarcheIds: DeepReadonly<DemarcheIdArrayStringify> }, void>
+  Redefine<IUpdateEtapeConsentementDbQuery, { etapeId: EtapeId; demarcheIds: DemarcheIdArrayStringify }, void>
 >`UPDATE titres_etapes SET demarche_ids_consentement = $demarcheIds! WHERE id = $etapeId!`
diff --git a/packages/api/src/business/processes/titres-etapes-heritage-contenu-update.ts b/packages/api/src/business/processes/titres-etapes-heritage-contenu-update.ts
index 6bddd8caffe6c8352458fd7923a4e1bf0b6a97f5..95ff787c237033b5d7146778769fef8fd8310dce 100644
--- a/packages/api/src/business/processes/titres-etapes-heritage-contenu-update.ts
+++ b/packages/api/src/business/processes/titres-etapes-heritage-contenu-update.ts
@@ -3,13 +3,13 @@ import { titreEtapeHeritageContenuFind } from '../utils/titre-etape-heritage-con
 import { titreEtapesSortAscByOrdre, titreEtapesSortDescByOrdre } from '../utils/titre-etapes-sort'
 import { UserNotNull } from 'camino-common/src/roles'
 import { getSections, Section } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections'
-import { DeepReadonly, isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools'
+import { isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools'
 import { DemarcheId } from 'camino-common/src/demarche'
 import { Pool } from 'pg'
 import { getDemarches } from './titres-etapes-heritage-contenu-update.queries'
 import { EtapeId } from 'camino-common/src/etape'
 
-export const titresEtapesHeritageContenuUpdate = async (pool: Pool, user: DeepReadonly<UserNotNull>, demarcheId?: DemarcheId): Promise<string[]> => {
+export const titresEtapesHeritageContenuUpdate = async (pool: Pool, user: UserNotNull, demarcheId?: DemarcheId): Promise<string[]> => {
   console.info()
   console.info('héritage des contenus des étapes…')
 
@@ -24,7 +24,7 @@ export const titresEtapesHeritageContenuUpdate = async (pool: Pool, user: DeepRe
   for (const titreDemarche of Object.values(titresDemarches)) {
     if (titreDemarche.etapes.length) {
       const etapeSectionsDictionary = titreDemarche.etapes.reduce<{
-        [etapeId in EtapeId]?: DeepReadonly<Section[]>
+        [etapeId in EtapeId]?: Section[]
       }>((acc, e) => {
         acc[e.id] = getSections(titreDemarche.titreTypeId, titreDemarche.typeId, e.typeId)
 
diff --git a/packages/api/src/business/processes/titres-etapes-heritage-props-update.ts b/packages/api/src/business/processes/titres-etapes-heritage-props-update.ts
index e9e326c913261a7d5a34ada0da9aca1f9b93bf51..9e28729d6763fbc0e52583123006723ccb249298 100644
--- a/packages/api/src/business/processes/titres-etapes-heritage-props-update.ts
+++ b/packages/api/src/business/processes/titres-etapes-heritage-props-update.ts
@@ -7,9 +7,8 @@ import { userSuper } from '../../database/user-super'
 import { titreEtapesSortAscByOrdre } from '../utils/titre-etapes-sort'
 import { UserNotNull } from 'camino-common/src/roles'
 import { EtapesTypes } from 'camino-common/src/static/etapesTypes'
-import { DeepReadonly } from 'camino-common/src/typescript-tools'
 
-export const titresEtapesHeritagePropsUpdate = async (user: DeepReadonly<UserNotNull>, titresDemarchesIds?: string[]): Promise<string[]> => {
+export const titresEtapesHeritagePropsUpdate = async (user: UserNotNull, titresDemarchesIds?: string[]): Promise<string[]> => {
   console.info()
   console.info('héritage des propriétés des étapes…')
 
@@ -39,7 +38,7 @@ export const titresEtapesHeritagePropsUpdate = async (user: DeepReadonly<UserNot
       const { hasChanged, titreEtape: newTitreEtape } = titreEtapeHeritagePropsFind(titreEtape, titreEtapePrecedente)
 
       if (hasChanged) {
-        await titreEtapeUpsert(newTitreEtape as DeepReadonly<ITitreEtape>, user, titreDemarche.titreId)
+        await titreEtapeUpsert(newTitreEtape as ITitreEtape, user, titreDemarche.titreId)
 
         console.info('titre / démarche / étape : héritage des propriétés (mise à jour) ->', titreEtape.id)
 
diff --git a/packages/api/src/business/processes/titres-etapes-ordre-update.ts b/packages/api/src/business/processes/titres-etapes-ordre-update.ts
index d6f7cecac88db786fff17966af1d5a266855028d..bba05deef33cacae5a25f4462b52422fa1064ded 100644
--- a/packages/api/src/business/processes/titres-etapes-ordre-update.ts
+++ b/packages/api/src/business/processes/titres-etapes-ordre-update.ts
@@ -8,9 +8,9 @@ import { DemarcheId } from 'camino-common/src/demarche'
 import { Pool } from 'pg'
 import { TitreId } from 'camino-common/src/validators/titres'
 import { TitreEtapeForMachine, titreEtapeForMachineValidator } from '../rules-demarches/machine-common'
-import { DeepReadonly, isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools'
+import { isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools'
 
-export const titresEtapesOrdreUpdate = async (pool: Pool, user: DeepReadonly<UserNotNull>, demarcheId?: DemarcheId): Promise<string[]> => {
+export const titresEtapesOrdreUpdate = async (pool: Pool, user: UserNotNull, demarcheId?: DemarcheId): Promise<string[]> => {
   console.info()
   console.info('ordre des étapes…')
 
@@ -20,7 +20,7 @@ export const titresEtapesOrdreUpdate = async (pool: Pool, user: DeepReadonly<Use
 }
 
 export const titresEtapesOrdreUpdateVisibleForTesting = async (
-  user: DeepReadonly<UserNotNull>,
+  user: UserNotNull,
   titresDemarches: {
     [key: DemarcheId]: {
       etapes: TitreEtapeForMachine[]
diff --git a/packages/api/src/business/rules-demarches/machine-common.ts b/packages/api/src/business/rules-demarches/machine-common.ts
index a05db00133b1f3c088ce2d0f66afb055dae2f905..5fc30cc19cc5da25ccc60db548c30ed7d119075b 100644
--- a/packages/api/src/business/rules-demarches/machine-common.ts
+++ b/packages/api/src/business/rules-demarches/machine-common.ts
@@ -11,7 +11,7 @@ import { PaysId } from 'camino-common/src/static/pays'
 import { communeIdValidator } from 'camino-common/src/static/communes'
 import { z } from 'zod'
 import { ETAPE_IS_NOT_BROUILLON, etapeBrouillonValidator, etapeIdValidator } from 'camino-common/src/etape'
-import { DeepReadonly, isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools'
+import { isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools'
 import { KM2, km2Validator } from 'camino-common/src/number'
 import { concurrenceValidator, Consentement, DemarcheVisibilite } from 'camino-common/src/etape-form'
 import { demarcheIdValidator } from 'camino-common/src/demarche'
@@ -73,7 +73,7 @@ export const titreEtapeForMachineValidator = z.object({
 
 export type TitreEtapeForMachine = z.infer<typeof titreEtapeForMachineValidator>
 
-export const toMachineEtapes = (etapes: DeepReadonly<(Pick<Partial<TitreEtapeForMachine>, 'ordre'> & Omit<TitreEtapeForMachine, 'id' | 'ordre'>)[]>): Etape[] => {
+export const toMachineEtapes = (etapes: (Pick<Partial<TitreEtapeForMachine>, 'ordre'> & Omit<TitreEtapeForMachine, 'id' | 'ordre'>)[]): Etape[] => {
   // TODO 2022-10-12 si on appelle titreEtapesSortAscByOrdre on se retrouve avec une grosse dépendance cyclique
   return etapes
     .filter(dbEtape => dbEtape.isBrouillon === ETAPE_IS_NOT_BROUILLON)
@@ -81,7 +81,7 @@ export const toMachineEtapes = (etapes: DeepReadonly<(Pick<Partial<TitreEtapeFor
     .map(dbEtape => toMachineEtape(dbEtape))
 }
 
-const toMachineEtape = (dbEtape: DeepReadonly<Omit<TitreEtapeForMachine, 'id' | 'ordre'>>): Etape => {
+const toMachineEtape = (dbEtape: Omit<TitreEtapeForMachine, 'id' | 'ordre'>): Etape => {
   let typeId
   if (isEtapeTypeId(dbEtape.typeId)) {
     typeId = dbEtape.typeId
diff --git a/packages/api/src/business/rules/titre-activites-build.ts b/packages/api/src/business/rules/titre-activites-build.ts
index 5145e6e7a8227be061bbb06e083346fafa4e3045..5759e8cd7399e06d66069f5dae080acf87bb3bad 100644
--- a/packages/api/src/business/rules/titre-activites-build.ts
+++ b/packages/api/src/business/rules/titre-activites-build.ts
@@ -9,14 +9,14 @@ import { FrequenceId, Frequences, getNumberOfMonths } from 'camino-common/src/st
 import { SubstanceLegaleId } from 'camino-common/src/static/substancesLegales'
 import { CaminoDate, toCaminoDate } from 'camino-common/src/date'
 import { TitreTypeId } from 'camino-common/src/static/titresTypes'
-import { DeepReadonly, isNotNullNorUndefinedNorEmpty, isNullOrUndefined } from 'camino-common/src/typescript-tools'
+import { isNotNullNorUndefinedNorEmpty, isNullOrUndefined } from 'camino-common/src/typescript-tools'
 import { ActiviteSection, ActiviteSectionElement, ActivitesTypes, ActivitesTypesId, isSubstancesFiscales } from 'camino-common/src/static/activitesTypes'
 import { TitreId } from 'camino-common/src/validators/titres'
 
 const substancesFiscalesFind = (substances: (SubstanceLegaleId | undefined)[]): SubstanceFiscale[] =>
   substances.filter(s => !!s).flatMap(substanceId => substancesFiscalesBySubstanceLegale(substanceId))
 
-const titreActiviteSectionElementsFormat = (elements: DeepReadonly<ActiviteSectionElement[]>, periodeId: number, date: CaminoDate) =>
+const titreActiviteSectionElementsFormat = (elements: ActiviteSectionElement[], periodeId: number, date: CaminoDate) =>
   elements.filter(
     e =>
       // ne conserve que les éléments dont
@@ -35,16 +35,9 @@ const titreActiviteSectionElementsFormat = (elements: DeepReadonly<ActiviteSecti
  * @param titreDemarches - démarches du titre
  * @param titreTypeId - le type id du titre
  */
-const titreActiviteSectionsBuild = (
-  activiteTypeId: string,
-  sections: DeepReadonly<ActiviteSection[]>,
-  periodeId: number,
-  date: CaminoDate,
-  titreDemarches: ITitreDemarche[],
-  titreTypeId: TitreTypeId
-) => {
-  return sections.reduce<DeepReadonly<ActiviteSection[]>>((newSections: DeepReadonly<ActiviteSection[]>, s) => {
-    let elements: DeepReadonly<ActiviteSectionElement[]> = []
+const titreActiviteSectionsBuild = (activiteTypeId: string, sections: ActiviteSection[], periodeId: number, date: CaminoDate, titreDemarches: ITitreDemarche[], titreTypeId: TitreTypeId) => {
+  return sections.reduce<ActiviteSection[]>((newSections: ActiviteSection[], s) => {
+    let elements: ActiviteSectionElement[] = []
 
     if (!isSubstancesFiscales(s) && isNotNullNorUndefinedNorEmpty(s.elements)) {
       elements = titreActiviteSectionElementsFormat(s.elements, periodeId, date)
@@ -56,7 +49,7 @@ const titreActiviteSectionsBuild = (
 
         elements = substancesFiscales.map(sf => {
           const unite = Unites[sf.uniteId]
-          const element: DeepReadonly<ActiviteSectionElement> = {
+          const element: ActiviteSectionElement = {
             id: sf.id,
             nom: `${sf.nom}`,
             type: 'number',
@@ -104,7 +97,7 @@ const titreActiviteFind = (activiteTypeId: ActivitesTypesId, annee: number, peri
 const titreActiviteBuild = (
   typeId: ActivitesTypesId,
   periodeId: number,
-  activiteTypeSections: DeepReadonly<ActiviteSection[]>,
+  activiteTypeSections: ActiviteSection[],
   annee: number,
   frequenceId: FrequenceId,
   aujourdhui: CaminoDate,
diff --git a/packages/api/src/business/rules/titre-demarche-statut-id-find.ts b/packages/api/src/business/rules/titre-demarche-statut-id-find.ts
index 33bd816e4e498b6acbd388ccb773d481dd95d94a..98254b8141e399dc9f3574e5c42905a3b60f77a3 100644
--- a/packages/api/src/business/rules/titre-demarche-statut-id-find.ts
+++ b/packages/api/src/business/rules/titre-demarche-statut-id-find.ts
@@ -9,8 +9,8 @@ import { TITRES_TYPES_IDS, TitreTypeId } from 'camino-common/src/static/titresTy
 import { DemarcheTypeId, TravauxIds } from 'camino-common/src/static/demarchesTypes'
 import { ETAPES_TYPES, EtapeTypeId } from 'camino-common/src/static/etapesTypes'
 import { isEtapeStatusRejete } from 'camino-common/src/static/etapesStatuts'
-import { isNotNullNorUndefined, RecordPartial } from 'camino-common/src/typescript-tools'
-import { CaminoMachines, machineFind } from '../rules-demarches/machines'
+import { isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty, RecordPartial } from 'camino-common/src/typescript-tools'
+import { machineFind } from '../rules-demarches/machines'
 
 const titreEtapesDecisivesCommunesTypes: EtapeTypeId[] = ['css', 'abd', 'and']
 
@@ -281,7 +281,7 @@ const titreDemarcheTravauxStatutIdFind = (titreDemarcheEtapes: Pick<ITitreEtape,
 export const titreDemarcheStatutIdFind = (demarcheTypeId: DemarcheTypeId, titreDemarcheEtapes: TitreEtapeForMachine[], titreTypeId: TitreTypeId, demarcheId: DemarcheId): DemarcheStatutId => {
   // si la démarche ne contient pas d'étapes
   // -> le statut est indétrminé
-  if (!titreDemarcheEtapes.length) return DemarchesStatutsIds.Indetermine
+  if (!isNotNullNorUndefinedNorEmpty(titreDemarcheEtapes)) return DemarchesStatutsIds.Indetermine
 
   // si la démarche est pour des travaux
   if (titreDemarchesTravauxTypes.includes(demarcheTypeId)) {
@@ -290,10 +290,7 @@ export const titreDemarcheStatutIdFind = (demarcheTypeId: DemarcheTypeId, titreD
 
   const firstEtapeDate = demarcheEnregistrementDemandeDateFind(titreDemarcheEtapes)
 
-  let machine: CaminoMachines | undefined
-  if (isNotNullNorUndefined(firstEtapeDate)) {
-    machine = machineFind(titreTypeId, demarcheTypeId, demarcheId, firstEtapeDate)
-  }
+  const machine = machineFind(titreTypeId, demarcheTypeId, demarcheId, firstEtapeDate)
 
   if (isNotNullNorUndefined(machine)) {
     return machine.demarcheStatut(toMachineEtapes(titreDemarcheEtapes)).demarcheStatut
diff --git a/packages/api/src/business/titre-etape-update.ts b/packages/api/src/business/titre-etape-update.ts
index c14939b7b4a1d8c5c4ed43fc0c2d6879e72bf8f2..8f99a0e14393e4734a9558540e35635ea6417d30 100644
--- a/packages/api/src/business/titre-etape-update.ts
+++ b/packages/api/src/business/titre-etape-update.ts
@@ -21,13 +21,12 @@ import { titresActivitesPropsUpdate } from './processes/titres-activites-props-u
 import { userSuper } from '../database/user-super'
 import type { UserNotNull } from 'camino-common/src/roles'
 import type { Pool } from 'pg'
-import { DeepReadonly } from 'camino-common/src/typescript-tools'
 import { callAndExit } from '../tools/fp-tools'
 import { etapeMiseEnConcurrenceUpdate } from './processes/titres-etapes-mise-en-concurrence'
 import { etapesFondamentaleIdUpdate } from './processes/titres-etapes-fondamentale-id-update'
 import { etapeConsentementUpdate } from './processes/titres-etapes-consentement'
 
-export const titreEtapeUpdateTask = async (pool: Pool, titreEtapeId: EtapeId | null, titreDemarcheId: DemarcheId, user: DeepReadonly<UserNotNull>): Promise<void> => {
+export const titreEtapeUpdateTask = async (pool: Pool, titreEtapeId: EtapeId | null, titreDemarcheId: DemarcheId, user: UserNotNull): Promise<void> => {
   try {
     console.info()
     console.info('- - -')
diff --git a/packages/api/src/business/utils/titre-etape-heritage-contenu-find.test.ts b/packages/api/src/business/utils/titre-etape-heritage-contenu-find.test.ts
index 523b20b6dc9f4ab696820fa447911cb0dff29c46..f235341af9796801aa4165dd44a005fe4e0a1a89 100644
--- a/packages/api/src/business/utils/titre-etape-heritage-contenu-find.test.ts
+++ b/packages/api/src/business/utils/titre-etape-heritage-contenu-find.test.ts
@@ -4,7 +4,6 @@ import { objectClone } from '../../tools/index'
 
 import { heritageContenuFind, titreEtapeHeritageContenuFind } from './titre-etape-heritage-contenu-find'
 import { describe, test, expect } from 'vitest'
-import { DeepReadonly } from 'camino-common/src/typescript-tools'
 import { Section } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections'
 import { newEtapeId } from '../../database/models/_format/id-create'
 
@@ -158,7 +157,7 @@ describe('retourne le contenu de l’étape en fonction de son héritage', () =>
     } as ITitreEtape
     titreEtape.heritageContenu!.section!.element!.actif = true
 
-    const dictionary: Record<string, DeepReadonly<Section>[]> = {
+    const dictionary: Record<string, Section[]> = {
       [prevTitreEtape.id]: [
         {
           id: 'section',
@@ -198,7 +197,7 @@ describe('retourne le contenu de l’étape en fonction de son héritage', () =>
     } as ITitreEtape
     titreEtape.heritageContenu!.section!.element!.actif = true
 
-    const dictionary: Record<string, DeepReadonly<Section>[]> = {
+    const dictionary: Record<string, Section[]> = {
       [prevTitreEtape.id]: [{ id: 'section', elements: [{ id: 'element', type: 'text', optionnel: false }] }],
       [titreEtape.id]: [{ id: 'section', elements: [{ id: 'element', type: 'text', optionnel: false }] }],
     }
@@ -230,7 +229,7 @@ describe('retourne le contenu de l’étape en fonction de son héritage', () =>
     titreEtape.heritageContenu!.section!.element!.actif = true
     titreEtape.heritageContenu!.section!.element!.etapeId = newEtapeId('prevEtapeId')
 
-    const dictionary: Record<string, DeepReadonly<Section>[]> = {
+    const dictionary: Record<string, Section[]> = {
       [prevTitreEtape.id]: [{ id: 'section', elements: [{ id: 'element', type: 'text', optionnel: false }] }],
       [titreEtape.id]: [{ id: 'section', elements: [{ id: 'element', type: 'text', optionnel: false }] }],
     }
@@ -262,7 +261,7 @@ describe('retourne le contenu de l’étape en fonction de son héritage', () =>
     titreEtape.heritageContenu!.section!.element!.actif = true
     titreEtape.heritageContenu!.section!.element!.etapeId = newEtapeId('prevEtapeId')
 
-    const dictionary: Record<string, DeepReadonly<Section>[]> = {
+    const dictionary: Record<string, Section[]> = {
       [prevTitreEtape.id]: [{ id: 'section', elements: [{ id: 'element', type: 'text', optionnel: false }] }],
       [titreEtape.id]: [{ id: 'section', elements: [{ id: 'element', type: 'text', optionnel: false }] }],
     }
diff --git a/packages/api/src/business/utils/titre-etape-heritage-contenu-find.ts b/packages/api/src/business/utils/titre-etape-heritage-contenu-find.ts
index c767f9b5b9636b7bd66bb55f1adbc8a945549568..c1f42feef4fdfaff9df6f444b132a63ba313f958 100644
--- a/packages/api/src/business/utils/titre-etape-heritage-contenu-find.ts
+++ b/packages/api/src/business/utils/titre-etape-heritage-contenu-find.ts
@@ -1,6 +1,6 @@
 import { IContenuValeur, ITitreEtape } from '../../types'
 
-import { DeepReadonly, RecordPartial } from 'camino-common/src/typescript-tools'
+import { RecordPartial } from 'camino-common/src/typescript-tools'
 import { Section } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections'
 
 export const heritageContenuFind = (
@@ -53,7 +53,7 @@ export const heritageContenuFind = (
 export const titreEtapeHeritageContenuFind = (
   titreEtapes: Omit<ITitreEtape, 'titreDemarcheId' | 'isBrouillon'>[],
   titreEtape: Pick<ITitreEtape, 'id' | 'contenu' | 'heritageContenu'>,
-  etapeSectionsDictionary: RecordPartial<string, DeepReadonly<Section[]>>
+  etapeSectionsDictionary: RecordPartial<string, Section[]>
 ) => {
   const sections = etapeSectionsDictionary[titreEtape.id]
 
diff --git a/packages/api/src/business/validations/titre-demarche-etat-validate.ts b/packages/api/src/business/validations/titre-demarche-etat-validate.ts
index 3b962594fa8133d332fa914a85a3877ae4295e83..fa5a105d86fa49040836a6662a321a69468d8218 100644
--- a/packages/api/src/business/validations/titre-demarche-etat-validate.ts
+++ b/packages/api/src/business/validations/titre-demarche-etat-validate.ts
@@ -1,5 +1,5 @@
 // valide la date et la position de l'étape en fonction des autres étapes
-import { DeepReadonly, NonEmptyArray, isNonEmptyArray, isNotNullNorUndefined, isNullOrUndefined, isNullOrUndefinedOrEmpty } from 'camino-common/src/typescript-tools'
+import { NonEmptyArray, isNonEmptyArray, isNotNullNorUndefined, isNullOrUndefined, isNullOrUndefinedOrEmpty } from 'camino-common/src/typescript-tools'
 import type { ITitreEtape } from '../../types'
 
 import { Etape, TitreEtapeForMachine, titreEtapeForMachineValidator, toMachineEtapes } from '../rules-demarches/machine-common'
@@ -15,14 +15,14 @@ import { getEtapesTDE, isTDEExist } from 'camino-common/src/static/titresTypes_d
 import { etapeTypeDateFinCheck } from '../../api/_format/etapes-types'
 import { getEtapesStatuts } from 'camino-common/src/static/etapesTypesEtapesStatuts'
 
-const titreDemarcheEtapesBuild = <T extends Pick<Partial<ITitreEtape>, 'id'>>(titreEtape: DeepReadonly<T>, suppression: boolean, titreDemarcheEtapes?: DeepReadonly<T[]> | null): DeepReadonly<T[]> => {
+const titreDemarcheEtapesBuild = <T extends Pick<Partial<ITitreEtape>, 'id'>>(titreEtape: T, suppression: boolean, titreDemarcheEtapes?: T[] | null): T[] => {
   if (isNullOrUndefinedOrEmpty(titreDemarcheEtapes)) {
     return [titreEtape]
   }
 
   // si nous n’ajoutons pas une nouvelle étape
   // on supprime l’étape en cours de modification ou de suppression
-  const titreEtapes = titreDemarcheEtapes.reduce((acc: DeepReadonly<T[]>, te) => {
+  const titreEtapes = titreDemarcheEtapes.reduce((acc: T[], te) => {
     if (te.id !== titreEtape.id) {
       acc = [...acc, te]
     }
diff --git a/packages/api/src/business/validations/titre-etape-updation-validate.ts b/packages/api/src/business/validations/titre-etape-updation-validate.ts
index fa398149171a96ba014a4c235360e66ae4cc68c9..eba3f87162534e4550b4b8d1a222e6392fe1976c 100644
--- a/packages/api/src/business/validations/titre-etape-updation-validate.ts
+++ b/packages/api/src/business/validations/titre-etape-updation-validate.ts
@@ -10,7 +10,7 @@ import { getSections } from 'camino-common/src/static/titresTypes_demarchesTypes
 import { EntrepriseDocument, EntrepriseId } from 'camino-common/src/entreprise'
 import { ETAPE_IS_NOT_BROUILLON, EtapeAvis, EtapeDocument } from 'camino-common/src/etape'
 import { CommuneId } from 'camino-common/src/static/communes'
-import { DeepReadonly, isNotNullNorUndefined, isNullOrUndefined } from 'camino-common/src/typescript-tools'
+import { isNotNullNorUndefined, isNullOrUndefined } from 'camino-common/src/typescript-tools'
 import { flattenContenuToSimpleContenu } from 'camino-common/src/sections'
 import { equalGeojson } from 'camino-common/src/perimetre'
 import { ApiFlattenEtape } from '../../api/_format/titres-etapes'
@@ -20,12 +20,12 @@ export const titreEtapeUpdationValidate = (
   etape: Pick<Partial<ApiFlattenEtape>, 'id'> & Omit<ApiFlattenEtape, 'id'>,
   titreDemarche: ITitreDemarche,
   titre: Pick<ITitre, 'typeId' | 'demarches'>,
-  documents: DeepReadonly<Pick<EtapeDocument, 'etape_document_type_id'>[]>,
-  etapeAvis: DeepReadonly<Pick<EtapeAvis, 'avis_type_id'>[]>,
+  documents: Pick<EtapeDocument, 'etape_document_type_id'>[],
+  etapeAvis: Pick<EtapeAvis, 'avis_type_id'>[],
   entrepriseDocuments: Pick<EntrepriseDocument, 'entreprise_document_type_id' | 'entreprise_id'>[],
-  sdomZones: DeepReadonly<SDOMZoneId[]> | null | undefined,
+  sdomZones: SDOMZoneId[] | null | undefined,
   communes: CommuneId[] | null | undefined,
-  user: DeepReadonly<User>,
+  user: User,
   firstEtapeDate: FirstEtapeDate,
   titreEtapeOld?: ITitreEtape
 ): string[] => {
diff --git a/packages/api/src/business/validations/utils/contenu-dates-check.test.ts b/packages/api/src/business/validations/utils/contenu-dates-check.test.ts
index f325a87e3e888e07a5c34c98c46f08c0e3669336..4e5e31bc4e7b18d3fa5b333f6ee753223fe51c27 100644
--- a/packages/api/src/business/validations/utils/contenu-dates-check.test.ts
+++ b/packages/api/src/business/validations/utils/contenu-dates-check.test.ts
@@ -1,10 +1,9 @@
 import { contenuDatesCheck } from './contenu-dates-check'
 import { describe, test, expect } from 'vitest'
 import { Section } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections'
-import { DeepReadonly } from 'camino-common/src/typescript-tools'
 import { CaminoDate } from 'camino-common/src/date'
 
-const sections: DeepReadonly<Section[]> = [
+const sections: Section[] = [
   {
     id: 'section',
     elements: [
diff --git a/packages/api/src/business/validations/utils/contenu-dates-check.ts b/packages/api/src/business/validations/utils/contenu-dates-check.ts
index fb86a52953477a506c94e1c4d2735d62981822a6..a9a0d5937ce418d7f9a12e317c457eb128b96327 100644
--- a/packages/api/src/business/validations/utils/contenu-dates-check.ts
+++ b/packages/api/src/business/validations/utils/contenu-dates-check.ts
@@ -1,9 +1,9 @@
 import { caminoDateValidator } from 'camino-common/src/date'
 import { Section } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections'
-import { DeepReadonly, isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty, RecordPartial } from 'camino-common/src/typescript-tools'
+import { isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty, RecordPartial } from 'camino-common/src/typescript-tools'
 import { FlattenedContenuElement } from 'camino-common/src/etape-form'
 
-export const contenuDatesCheck = (sections: DeepReadonly<Section[]>, contenu: RecordPartial<string, RecordPartial<string, Pick<FlattenedContenuElement, 'value'>>>): string | null => {
+export const contenuDatesCheck = (sections: Section[], contenu: RecordPartial<string, RecordPartial<string, Pick<FlattenedContenuElement, 'value'>>>): string | null => {
   const errors = sections.reduce(
     (errors: string[], section) =>
       isNotNullNorUndefinedNorEmpty(section.elements) && isNotNullNorUndefined(contenu[section.id])
diff --git a/packages/api/src/business/validations/utils/contenu-numbers-check.ts b/packages/api/src/business/validations/utils/contenu-numbers-check.ts
index b135f118d882f23e0b78741cea2d12f71722113a..f2a3f564300dd90ae42843425f909c60d0202a85 100644
--- a/packages/api/src/business/validations/utils/contenu-numbers-check.ts
+++ b/packages/api/src/business/validations/utils/contenu-numbers-check.ts
@@ -1,9 +1,9 @@
 import { Section } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections'
-import { DeepReadonly, isNotNullNorUndefined, isNullOrUndefinedOrEmpty, RecordPartial } from 'camino-common/src/typescript-tools'
+import { isNotNullNorUndefined, isNullOrUndefinedOrEmpty, RecordPartial } from 'camino-common/src/typescript-tools'
 import { numberElementValueValidator } from 'camino-common/src/sections'
 import { FlattenedContenuElement } from 'camino-common/src/etape-form'
 
-export const contenuNumbersCheck = (sections: DeepReadonly<Section[]>, contenu: RecordPartial<string, RecordPartial<string, Pick<FlattenedContenuElement, 'value'>>>): string | null => {
+export const contenuNumbersCheck = (sections: Section[], contenu: RecordPartial<string, RecordPartial<string, Pick<FlattenedContenuElement, 'value'>>>): string | null => {
   const errors = sections.reduce((errors: string[], section) => {
     if (isNullOrUndefinedOrEmpty(section.elements)) return errors
 
diff --git a/packages/api/src/database/queries/communes.queries.ts b/packages/api/src/database/queries/communes.queries.ts
index 23f6dd253f7842d9c54ce12db18618a3eba11107..b66a80f500fe7dacb733bd07d165e346f489be6f 100644
--- a/packages/api/src/database/queries/communes.queries.ts
+++ b/packages/api/src/database/queries/communes.queries.ts
@@ -2,7 +2,7 @@ import { sql } from '@pgtyped/runtime'
 import { EffectDbQueryAndValidateErrors, Redefine, dbQueryAndValidate, effectDbQueryAndValidate } from '../../pg-database'
 import { IGetCommuneIdsInternalQuery, IGetCommunesInternalQuery, IInsertCommuneInternalQuery } from './communes.queries.types'
 import { CommuneId, Commune, communeValidator } from 'camino-common/src/static/communes'
-import { DeepReadonly, NonEmptyArray } from 'camino-common/src/typescript-tools'
+import { NonEmptyArray } from 'camino-common/src/typescript-tools'
 import { Pool } from 'pg'
 import { z } from 'zod'
 import { CaminoError } from 'camino-common/src/zod-tools'
@@ -12,7 +12,7 @@ export const getCommunes = (pool: Pool, params: { ids: NonEmptyArray<CommuneId>
   return effectDbQueryAndValidate(getCommunesInternal, params, pool, communeValidator)
 }
 
-const getCommunesInternal = sql<Redefine<IGetCommunesInternalQuery, DeepReadonly<{ ids: NonEmptyArray<CommuneId> }>, Commune>>`
+const getCommunesInternal = sql<Redefine<IGetCommunesInternalQuery, { ids: NonEmptyArray<CommuneId> }, Commune>>`
 select
     id,
     nom
diff --git a/packages/api/src/database/queries/entreprises.ts b/packages/api/src/database/queries/entreprises.ts
index 17edb538c8ea72a91ccf89da1e635a787b260b8f..8035486f86e7cb94971fa5e4af90375e8d0f95e5 100644
--- a/packages/api/src/database/queries/entreprises.ts
+++ b/packages/api/src/database/queries/entreprises.ts
@@ -11,7 +11,7 @@ import Entreprises from '../models/entreprises'
 import { entreprisesQueryModify } from './permissions/entreprises'
 import { User } from 'camino-common/src/roles'
 import { EntrepriseId } from 'camino-common/src/entreprise'
-import { DeepReadonly, isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools'
+import { isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools'
 
 const entreprisesFiltersQueryModify = (
   {
@@ -47,7 +47,7 @@ const entreprisesFiltersQueryModify = (
   }
 }
 
-const entreprisesQueryBuild = ({ fields }: { fields?: FieldsEntreprise }, user: DeepReadonly<User>) => {
+const entreprisesQueryBuild = ({ fields }: { fields?: FieldsEntreprise }, user: User) => {
   const graph = fields ? graphBuild(fields, 'entreprises', fieldsFormat) : options.entreprises.graph
 
   const q = Entreprises.query().withGraphFetched(graph)
@@ -57,7 +57,7 @@ const entreprisesQueryBuild = ({ fields }: { fields?: FieldsEntreprise }, user:
   return q
 }
 
-export const entrepriseGet = async (id: EntrepriseId, { fields }: { fields?: FieldsEntreprise }, user: DeepReadonly<User>): Promise<IEntreprise | undefined> => {
+export const entrepriseGet = async (id: EntrepriseId, { fields }: { fields?: FieldsEntreprise }, user: User): Promise<IEntreprise | undefined> => {
   const q = entreprisesQueryBuild({ fields }, user)
 
   return (await q.findById(id)) as IEntreprise
diff --git a/packages/api/src/database/queries/permissions/entreprises.ts b/packages/api/src/database/queries/permissions/entreprises.ts
index bfa5bcd708eeb6091b3c37f7132cc86efd9dcc8e..1a402073b6d462124a027e206174403d299d7258 100644
--- a/packages/api/src/database/queries/permissions/entreprises.ts
+++ b/packages/api/src/database/queries/permissions/entreprises.ts
@@ -5,9 +5,8 @@ import { knex } from '../../../knex'
 import Entreprises from '../../models/entreprises'
 import { User } from 'camino-common/src/roles'
 import TitresEtapes from '../../models/titres-etapes'
-import { DeepReadonly } from 'camino-common/src/typescript-tools'
 
-export const entreprisesQueryModify = (q: QueryBuilder<Entreprises, Entreprises | Entreprises[]>, _user: DeepReadonly<User>): QueryBuilder<Entreprises, Entreprises | Entreprises[]> => {
+export const entreprisesQueryModify = (q: QueryBuilder<Entreprises, Entreprises | Entreprises[]>, _user: User): QueryBuilder<Entreprises, Entreprises | Entreprises[]> => {
   q.select('entreprises.*')
 
   return q
diff --git a/packages/api/src/database/queries/permissions/journaux.ts b/packages/api/src/database/queries/permissions/journaux.ts
index dfc86a6cb4fd159326ba60c32790b7f60d251f94..85b6f8948bc13653e0990eef321afa53c4f21bde 100644
--- a/packages/api/src/database/queries/permissions/journaux.ts
+++ b/packages/api/src/database/queries/permissions/journaux.ts
@@ -2,9 +2,8 @@ import { QueryBuilder } from 'objection'
 
 import Journaux from '../../models/journaux'
 import { isSuper, User } from 'camino-common/src/roles'
-import { DeepReadonly } from 'camino-common/src/typescript-tools'
 
-export const journauxQueryModify = (q: QueryBuilder<Journaux, Journaux | Journaux[]>, user: DeepReadonly<User>): QueryBuilder<Journaux, Journaux | Journaux[]> => {
+export const journauxQueryModify = (q: QueryBuilder<Journaux, Journaux | Journaux[]>, user: User): QueryBuilder<Journaux, Journaux | Journaux[]> => {
   q.select('journaux.*')
 
   // Les journaux sont uniquement visibles par les super
diff --git a/packages/api/src/database/queries/permissions/titres-activites.ts b/packages/api/src/database/queries/permissions/titres-activites.ts
index 85df25068fe6f6ed4843bfa040936075524b9ce0..57f9dd008a1a16916990fe5dcc63fc0a27a99da5 100644
--- a/packages/api/src/database/queries/permissions/titres-activites.ts
+++ b/packages/api/src/database/queries/permissions/titres-activites.ts
@@ -5,9 +5,8 @@ import TitresActivites from '../../models/titres-activites'
 import { administrationsTitresQuery } from './administrations'
 import { entreprisesTitresQuery } from './entreprises'
 import { isAdministration, isEntreprise, isSuper, User } from 'camino-common/src/roles'
-import { DeepReadonly } from 'camino-common/src/typescript-tools'
 
-export const titresActivitesQueryModify = (q: QueryBuilder<TitresActivites, TitresActivites | TitresActivites[]>, user: DeepReadonly<User>) => {
+export const titresActivitesQueryModify = (q: QueryBuilder<TitresActivites, TitresActivites | TitresActivites[]>, user: User) => {
   q.select('titresActivites.*')
 
   q.leftJoinRelated('titre')
diff --git a/packages/api/src/database/queries/permissions/titres-demarches.ts b/packages/api/src/database/queries/permissions/titres-demarches.ts
index 5c54c3638018cc2eb44e58b5cf83b0f3883fa1bb..ac3c8519e27a913cb90a4b57807f93dc2269210b 100644
--- a/packages/api/src/database/queries/permissions/titres-demarches.ts
+++ b/packages/api/src/database/queries/permissions/titres-demarches.ts
@@ -9,9 +9,8 @@ import { titresQueryModify } from './titres'
 import { administrationsTitresQuery } from './administrations'
 import { entreprisesTitresQuery } from './entreprises'
 import { isSuper, isAdministration, isEntreprise, isBureauDEtudes, User } from 'camino-common/src/roles'
-import { DeepReadonly } from 'camino-common/src/typescript-tools'
 
-export const titresDemarchesQueryModify = (q: QueryBuilder<TitresDemarches, TitresDemarches | TitresDemarches[]>, user: DeepReadonly<User>) => {
+export const titresDemarchesQueryModify = (q: QueryBuilder<TitresDemarches, TitresDemarches | TitresDemarches[]>, user: User) => {
   q.select('titresDemarches.*').where('titresDemarches.archive', false).leftJoinRelated('titre')
 
   if (!isSuper(user)) {
diff --git a/packages/api/src/database/queries/permissions/titres-etapes.ts b/packages/api/src/database/queries/permissions/titres-etapes.ts
index c65e08cbde70898e5706ac585892b91bdb3d8e0e..5d98c56fc412ca0f0326a4167888e160feb4e5cf 100644
--- a/packages/api/src/database/queries/permissions/titres-etapes.ts
+++ b/packages/api/src/database/queries/permissions/titres-etapes.ts
@@ -12,7 +12,6 @@ import { isAdministration, isBureauDEtudes, isEntreprise, isSuper, User } from '
 import { getAdministrationTitresTypesEtapesTypes } from 'camino-common/src/static/administrationsTitresTypesEtapesTypes'
 import { knex } from '../../../knex'
 import { EtapeTypeId, etapesTypes } from 'camino-common/src/static/etapesTypes'
-import { DeepReadonly } from 'camino-common/src/typescript-tools'
 
 /**
  * Modifie la requête d'étape(s) pour prendre en compte les permissions de l'utilisateur connecté
@@ -21,7 +20,7 @@ import { DeepReadonly } from 'camino-common/src/typescript-tools'
  * @params user - utilisateur connecté
  * @returns une requête d'étape(s)
  */
-export const titresEtapesQueryModify = (q: QueryBuilder<TitresEtapes, TitresEtapes | TitresEtapes[]>, user: DeepReadonly<User>) => {
+export const titresEtapesQueryModify = (q: QueryBuilder<TitresEtapes, TitresEtapes | TitresEtapes[]>, user: User) => {
   q.select('titresEtapes.*').where('titresEtapes.archive', false).leftJoinRelated('[demarche.titre]')
 
   if (!isSuper(user)) {
diff --git a/packages/api/src/database/queries/permissions/titres.ts b/packages/api/src/database/queries/permissions/titres.ts
index 1cccfde6b659e8877c3a04501b6a87ca2beeb3b4..72f8bb85bef4bad3cf022b8eced970182138df54 100644
--- a/packages/api/src/database/queries/permissions/titres.ts
+++ b/packages/api/src/database/queries/permissions/titres.ts
@@ -10,7 +10,7 @@ import { administrationsTitresQuery } from './administrations'
 import { entreprisesTitresQuery } from './entreprises'
 import TitresEtapes from '../../models/titres-etapes'
 import { isAdministration, isBureauDEtudes, isEntreprise, isSuper, User } from 'camino-common/src/roles'
-import { DeepReadonly, isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools'
+import { isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools'
 
 export const titresVisibleByEntrepriseQuery = (q: QueryBuilder<Titres, Titres | Titres[]>, entreprisesIds: string[]) => {
   // titres dont il est titulaire ou amodiataire
@@ -51,7 +51,7 @@ export const titresConfidentielSelect = (q: QueryBuilder<Titres, Titres | Titres
       .as('confidentiel')
   )
 
-export const titresQueryModify = (q: QueryBuilder<Titres, Titres | Titres[]>, user: DeepReadonly<User>, demandeEnCours?: boolean | null) => {
+export const titresQueryModify = (q: QueryBuilder<Titres, Titres | Titres[]>, user: User, demandeEnCours?: boolean | null) => {
   q.select('titres.*').where('titres.archive', false)
 
   // si
diff --git a/packages/api/src/database/queries/titres-demarches.ts b/packages/api/src/database/queries/titres-demarches.ts
index a493b340b84b83440d28991735850a3d2fc3444f..b39e23155c3aabc4b7867ed615432a976e4fdb69 100644
--- a/packages/api/src/database/queries/titres-demarches.ts
+++ b/packages/api/src/database/queries/titres-demarches.ts
@@ -14,7 +14,7 @@ import { titresFiltersQueryModify } from './_titres-filters'
 import TitresEtapes from '../models/titres-etapes'
 import { User } from 'camino-common/src/roles'
 import { sortedDemarchesTypes } from 'camino-common/src/static/demarchesTypes'
-import { DeepReadonly, isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools'
+import { isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools'
 
 const etapesIncluesExcluesBuild = (q: QueryBuilder<TitresDemarches, TitresDemarches[]>, etapes: ITitreEtapeFiltre[], mode: 'etapesInclues' | 'etapesExclues') => {
   const raw = etapes
@@ -126,7 +126,7 @@ const titresDemarchesFiltersQueryModify = (
   )
 }
 
-const titresDemarchesQueryBuild = ({ fields }: { fields?: FieldsDemarche }, user: DeepReadonly<User>) => {
+const titresDemarchesQueryBuild = ({ fields }: { fields?: FieldsDemarche }, user: User) => {
   const graph = fields ? graphBuild(fieldsTitreAdd(fields), 'demarches', fieldsFormat) : options.titresDemarches.graph
 
   const q = TitresDemarches.query().withGraphFetched(graph)
@@ -303,7 +303,7 @@ export const titresDemarchesGet = async (
   return q
 }
 
-export const titreDemarcheGet = async (titreDemarcheId: string, { fields }: { fields?: FieldsDemarche }, user: DeepReadonly<User>): Promise<ITitreDemarche | undefined> => {
+export const titreDemarcheGet = async (titreDemarcheId: string, { fields }: { fields?: FieldsDemarche }, user: User): Promise<ITitreDemarche | undefined> => {
   const q = titresDemarchesQueryBuild({ fields }, user)
 
   return q
diff --git a/packages/api/src/database/queries/titres-etapes.queries.ts b/packages/api/src/database/queries/titres-etapes.queries.ts
index d035f8a0bc9d6c972e63e9d44394d3aa09fe95e7..034086e3fde823e357a838be42e5720befb3a1af 100644
--- a/packages/api/src/database/queries/titres-etapes.queries.ts
+++ b/packages/api/src/database/queries/titres-etapes.queries.ts
@@ -51,7 +51,7 @@ import { canReadDocument } from '../../api/rest/permissions/documents'
 import { AdministrationId } from 'camino-common/src/static/administrations'
 import { ETAPES_WITH_AUTOMATIC_STATUTS, EtapeTypeId, etapeTypeIdValidator } from 'camino-common/src/static/etapesTypes'
 import { TitreTypeId, titreTypeIdValidator } from 'camino-common/src/static/titresTypes'
-import { DeepReadonly, isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty, SimplePromiseFn } from 'camino-common/src/typescript-tools'
+import { isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty, SimplePromiseFn } from 'camino-common/src/typescript-tools'
 import { CanReadDemarche } from '../../api/rest/permissions/demarches'
 import { newEtapeAvisId, newEtapeDocumentId } from '../models/_format/id-create'
 import { caminoDateValidator, FirstEtapeDate, getCurrent } from 'camino-common/src/date'
@@ -146,7 +146,7 @@ export type UpdateEtapeDocumentsErrors = EffectDbQueryAndValidateErrors | Insert
 export const updateEtapeDocuments = (
   pool: Pool,
   titre_etape_id: EtapeId,
-  etapeDocuments: DeepReadonly<EtapeDocumentModification[]>
+  etapeDocuments: EtapeDocumentModification[]
 ): Effect.Effect<Option.Option<never>, CaminoError<UpdateEtapeDocumentsErrors>> => {
   return Effect.Do.pipe(
     Effect.bind('documentsInDb', () => effectDbQueryAndValidate(getDocumentsByEtapeIdQuery, { titre_etape_id }, pool, getDocumentsByEtapeIdQueryValidator)),
@@ -214,14 +214,14 @@ set
 where
     id = $ id !
 `
-const deleteEtapeDocumentsDb = sql<Redefine<IDeleteEtapeDocumentsDbQuery, { ids: DeepReadonly<EtapeDocumentId[]> }, void>>`
+const deleteEtapeDocumentsDb = sql<Redefine<IDeleteEtapeDocumentsDbQuery, { ids: EtapeDocumentId[] }, void>>`
 delete from etapes_documents
 where id in $$ ids !
 `
 
 const largeObjectIdError = 'impossible de récupérer un large object id' as const
 export type InsertEtapeDocumentsErrors = EffectDbQueryAndValidateErrors | typeof largeObjectIdError
-export const insertEtapeDocuments = (pool: Pool, titre_etape_id: EtapeId, etapeDocuments: DeepReadonly<TempEtapeDocument[]>): Effect.Effect<true, CaminoError<InsertEtapeDocumentsErrors>> => {
+export const insertEtapeDocuments = (pool: Pool, titre_etape_id: EtapeId, etapeDocuments: TempEtapeDocument[]): Effect.Effect<true, CaminoError<InsertEtapeDocumentsErrors>> => {
   return Effect.Do.pipe(
     Effect.flatMap(() =>
       Effect.forEach(etapeDocuments, document => {
@@ -247,7 +247,7 @@ insert into etapes_documents (id, etape_document_type_id, etape_id, description,
 `
 const impossibleDeCreerUnLargeObjectId = 'impossible de créer un large object id' as const
 export type InsertEtapeAvisErrors = EffectDbQueryAndValidateErrors | typeof impossibleDeCreerUnLargeObjectId
-export const insertEtapeAvis = (pool: Pool, titre_etape_id: EtapeId, etapeAvis: DeepReadonly<TempEtapeAvis[]>): Effect.Effect<true, CaminoError<InsertEtapeAvisErrors>> =>
+export const insertEtapeAvis = (pool: Pool, titre_etape_id: EtapeId, etapeAvis: TempEtapeAvis[]): Effect.Effect<true, CaminoError<InsertEtapeAvisErrors>> =>
   Effect.Do.pipe(
     Effect.flatMap(() =>
       Effect.forEach(etapeAvis, avis => {
@@ -284,7 +284,7 @@ set
 where
     id = $ id !
 `
-const deleteEtapeAvisDb = sql<Redefine<IDeleteEtapeAvisDbQuery, { ids: DeepReadonly<EtapeAvisId[]> }, void>>`
+const deleteEtapeAvisDb = sql<Redefine<IDeleteEtapeAvisDbQuery, { ids: EtapeAvisId[] }, void>>`
 delete from etape_avis
 where id in $$ ids !
 `
@@ -294,13 +294,13 @@ export const updateEtapeAvis = (
   pool: Pool,
   titre_etape_id: EtapeId,
   isBrouillon: EtapeBrouillon,
-  etapeAvis: DeepReadonly<EtapeAvisModification[]>,
+  etapeAvis: EtapeAvisModification[],
   etapeTypeId: EtapeTypeId,
   titreTypeId: TitreTypeId,
   demarcheTypeId: DemarcheTypeId,
   demarcheId: DemarcheId,
   firstEtapeDate: FirstEtapeDate,
-  communeIds: DeepReadonly<CommuneId[]>
+  communeIds: CommuneId[]
 ): Effect.Effect<Option.Option<never>, CaminoError<UpdateEtapeAvisErrors>> => {
   return Effect.Do.pipe(
     Effect.filterOrFail(
diff --git a/packages/api/src/database/queries/titres-etapes.ts b/packages/api/src/database/queries/titres-etapes.ts
index e26f062d1f071aa9cfd3cb1858a4a9ef89dbba49..f00b7c068d60503f6f3e5b80c80f73c9db6eb4a7 100644
--- a/packages/api/src/database/queries/titres-etapes.ts
+++ b/packages/api/src/database/queries/titres-etapes.ts
@@ -9,10 +9,9 @@ import { createJournalCreate, patchJournalCreate, upsertJournalCreate } from './
 import { User, UserNotNull } from 'camino-common/src/roles'
 import { TitreId } from 'camino-common/src/validators/titres'
 import { EtapeId, EtapeIdOrSlug } from 'camino-common/src/etape'
-import { DeepReadonly } from 'camino-common/src/typescript-tools'
 import { DemarcheId } from 'camino-common/src/demarche'
 
-const titresEtapesQueryBuild = ({ fields }: { fields?: FieldsEtape }, user: DeepReadonly<User>) => {
+const titresEtapesQueryBuild = ({ fields }: { fields?: FieldsEtape }, user: User) => {
   const graph = fields ? graphBuild(fields, 'etapes', fieldsFormat) : '[]'
 
   const q = TitresEtapes.query().withGraphFetched(graph)
@@ -23,7 +22,7 @@ const titresEtapesQueryBuild = ({ fields }: { fields?: FieldsEtape }, user: Deep
 }
 
 // utilisé dans le daily et le resolver des documents uniquement
-export const titreEtapeGet = async (titreEtapeId: EtapeIdOrSlug, { fields, fetchHeritage }: { fields?: FieldsEtape; fetchHeritage?: boolean }, user: DeepReadonly<User>): Promise<ITitreEtape> => {
+export const titreEtapeGet = async (titreEtapeId: EtapeIdOrSlug, { fields, fetchHeritage }: { fields?: FieldsEtape; fetchHeritage?: boolean }, user: User): Promise<ITitreEtape> => {
   const q = titresEtapesQueryBuild({ fields }, user)
 
   q.context({ fetchHeritage })
@@ -81,13 +80,13 @@ export const titreEtapeCreate = async (
   return newValue
 }
 
-export const titreEtapeUpdate = async (id: EtapeId, titreEtape: Partial<DBTitresEtapes>, user: DeepReadonly<UserNotNull>, titreId: TitreId): Promise<TitresEtapes> => {
+export const titreEtapeUpdate = async (id: EtapeId, titreEtape: Partial<DBTitresEtapes>, user: UserNotNull, titreId: TitreId): Promise<TitresEtapes> => {
   return patchJournalCreate(id, titreEtape, user.id, titreId)
 }
 
 export const titreEtapeUpsert = async (
-  titreEtape: DeepReadonly<Partial<Pick<ITitreEtape, 'id'>> & Omit<ITitreEtape, 'id' | 'concurrence' | 'hasTitreFrom'>>,
-  user: DeepReadonly<UserNotNull>,
+  titreEtape: Partial<Pick<ITitreEtape, 'id'> & Omit<ITitreEtape, 'id' | 'concurrence' | 'hasTitreFrom'>>,
+  user: UserNotNull,
   titreId: TitreId
 ): Promise<ITitreEtape | undefined> =>
   upsertJournalCreate(
diff --git a/packages/api/src/database/queries/titres-titres.queries.ts b/packages/api/src/database/queries/titres-titres.queries.ts
index 2df3786aee903f7388b5d38b8c89d906ef92559f..5fa43ee2b079fc28d671e3319442002aaf72ab30 100644
--- a/packages/api/src/database/queries/titres-titres.queries.ts
+++ b/packages/api/src/database/queries/titres-titres.queries.ts
@@ -7,14 +7,13 @@ import { CaminoError } from 'camino-common/src/zod-tools.js'
 import { Pool } from 'pg'
 import { z } from 'zod'
 import { ZodUnparseable } from '../../tools/fp-tools.js'
-import { DeepReadonly } from 'camino-common/src/typescript-tools.js'
 
 interface LinkTitre {
   linkTo: TitreId
   linkFrom: TitreId[]
 }
 export type LinkTitresErrors = DbQueryAccessError | ZodUnparseable
-export const linkTitres = (pool: Pool, link: DeepReadonly<LinkTitre>): Effect.Effect<void, CaminoError<LinkTitresErrors>> => {
+export const linkTitres = (pool: Pool, link: LinkTitre): Effect.Effect<void, CaminoError<LinkTitresErrors>> => {
   return pipe(
     effectDbQueryAndValidate(deleteTitreTitreInternal, { linkTo: link.linkTo }, pool, z.void()),
     Effect.flatMap(() => {
diff --git a/packages/api/src/database/queries/titres.ts b/packages/api/src/database/queries/titres.ts
index 0e8ce29b7a35d0ce6b4a94a1da2fd2b6b14793ca..97bb0b7d8599d6612bb5a570a0386add13f46c15 100644
--- a/packages/api/src/database/queries/titres.ts
+++ b/packages/api/src/database/queries/titres.ts
@@ -19,7 +19,6 @@ import { DepartementId } from 'camino-common/src/static/departement'
 import { RegionId } from 'camino-common/src/static/region'
 import { FacadesMaritimes } from 'camino-common/src/static/facades'
 import { TitreId } from 'camino-common/src/validators/titres'
-import { DeepReadonly } from 'camino-common/src/typescript-tools'
 
 /**
  * Construit la requête pour récupérer certains champs de titres filtrés
@@ -30,7 +29,7 @@ import { DeepReadonly } from 'camino-common/src/typescript-tools'
  * @returns la requête
  *
  */
-const titresQueryBuild = ({ fields }: { fields?: FieldsTitre }, user: DeepReadonly<User>, demandeEnCours?: boolean | null) => {
+const titresQueryBuild = ({ fields }: { fields?: FieldsTitre }, user: User, demandeEnCours?: boolean | null) => {
   const graph = fields ? graphBuild(titresFieldsAdd(fields), 'titre', fieldsFormat) : options.titres.graph
 
   const q = Titres.query().withGraphFetched(graph)
@@ -49,7 +48,7 @@ const titresQueryBuild = ({ fields }: { fields?: FieldsTitre }, user: DeepReadon
  * @returns un titre
  *
  */
-export const titreGet = async (id: string, { fields }: { fields?: FieldsTitre }, user: DeepReadonly<User>): Promise<DBTitre | undefined> => {
+export const titreGet = async (id: string, { fields }: { fields?: FieldsTitre }, user: User): Promise<DBTitre | undefined> => {
   const q = titresQueryBuild({ fields }, user)
 
   return q
@@ -119,7 +118,7 @@ export const titresGet = async (
     demandeEnCours?: boolean | null
   } = {},
   { fields }: { fields?: FieldsTitre },
-  user: DeepReadonly<User>
+  user: User
 ): Promise<ITitre[]> => {
   const q = titresQueryBuild({ fields }, user, demandeEnCours)
 
diff --git a/packages/api/src/database/queries/utilisateurs.queries.ts b/packages/api/src/database/queries/utilisateurs.queries.ts
index 6170bfd20a8d98aa86afab3205cd7850e9ca8aa2..10b9426e1911f208b2de7c32a97adb34c81a95fe 100644
--- a/packages/api/src/database/queries/utilisateurs.queries.ts
+++ b/packages/api/src/database/queries/utilisateurs.queries.ts
@@ -35,7 +35,7 @@ import {
   IUpdateUtilisateurRoleDbQuery,
 } from './utilisateurs.queries.types'
 import { ZodUnparseable, callAndExit, zodParseEffect } from '../../tools/fp-tools'
-import { DeepReadonly, NonEmptyArray, Nullable, isNotNullNorUndefinedNorEmpty, isNullOrUndefinedOrEmpty } from 'camino-common/src/typescript-tools'
+import { NonEmptyArray, Nullable, isNotNullNorUndefinedNorEmpty, isNullOrUndefinedOrEmpty } from 'camino-common/src/typescript-tools'
 import { EntrepriseId, entrepriseIdValidator } from 'camino-common/src/entreprise'
 import { CaminoDate } from 'camino-common/src/date'
 import { TitreId } from 'camino-common/src/validators/titres'
@@ -54,11 +54,7 @@ const getUtilisateursValidator = z.object({
 export type GetUtilisateur = z.infer<typeof getUtilisateursValidator>
 
 type GetUtilisateursFilteredAndSortedErrors = DbQueryAccessError | ZodUnparseable | 'droits insuffisants'
-export const getUtilisateursFilteredAndSorted = (
-  pool: Pool,
-  user: DeepReadonly<User>,
-  searchParams: UtilisateursSearchParams
-): Effect.Effect<UserNotNull[], CaminoError<GetUtilisateursFilteredAndSortedErrors>> => {
+export const getUtilisateursFilteredAndSorted = (pool: Pool, user: User, searchParams: UtilisateursSearchParams): Effect.Effect<UserNotNull[], CaminoError<GetUtilisateursFilteredAndSortedErrors>> => {
   return Effect.Do.pipe(
     Effect.filterOrFail(
       () => canReadUtilisateurs(user),
@@ -164,17 +160,15 @@ export const getUtilisateurById = async (pool: Pool, id: UtilisateurId, user: Us
 }
 
 const userDbToUser = (
-  user: DeepReadonly<GetUtilisateur>
-): DeepReadonly<
-  Pick<UserNotNull, 'telephone_fixe' | 'telephone_mobile' | 'id' | 'nom' | 'prenom' | 'role' | 'email'> &
-    Nullable<Pick<AdminUserNotNull, 'administrationId'>> &
-    Pick<EntrepriseUserNotNull, 'entrepriseIds'>
-> => {
+  user: GetUtilisateur
+): Pick<UserNotNull, 'telephone_fixe' | 'telephone_mobile' | 'id' | 'nom' | 'prenom' | 'role' | 'email'> &
+  Nullable<Pick<AdminUserNotNull, 'administrationId'>> &
+  Pick<EntrepriseUserNotNull, 'entrepriseIds'> => {
   return { ...user, prenom: user.prenom ?? '', entrepriseIds: user.entreprise_ids ?? [], administrationId: user.administration_id }
 }
 
 export type GetUtilisateurByIdErrors = 'droits insuffisants' | DbQueryAccessError | ZodUnparseable
-export const newGetUtilisateurById = (pool: Pool, id: UtilisateurId, user: DeepReadonly<User>): Effect.Effect<UserNotNull, CaminoError<GetUtilisateurByIdErrors>> => {
+export const newGetUtilisateurById = (pool: Pool, id: UtilisateurId, user: User): Effect.Effect<UserNotNull, CaminoError<GetUtilisateurByIdErrors>> => {
   return pipe(
     effectDbQueryAndValidate(getUtilisateurByIdDb, { id }, pool, getUtilisateursValidator),
     Effect.filterOrFail(
@@ -338,7 +332,7 @@ const createUtilisateurEntrepriseDb = sql<Redefine<ICreateUtilisateurEntrepriseD
 const deleteUtilisateurEntrepriseDb = sql<Redefine<IDeleteUtilisateurEntrepriseDbQuery, { utilisateur_id: UtilisateurId }, void>>`
   delete from utilisateurs__entreprises where utilisateur_id = $utilisateur_id!`
 
-export const updateUtilisateur = async (pool: Pool, user: DeepReadonly<UserNotNull>): Promise<DeepReadonly<UserNotNull>> => {
+export const updateUtilisateur = async (pool: Pool, user: UserNotNull): Promise<UserNotNull> => {
   await dbQueryAndValidate(updateUtilisateurDb, user, pool, z.void())
 
   return user
@@ -348,7 +342,7 @@ const updateUtilisateurDb = sql<Redefine<IUpdateUtilisateurDbQuery, Pick<UserNot
   update utilisateurs set nom = $nom!, prenom = $prenom!, email = $email! where id = $id!
   `
 
-type UpdateUtilisateurRole = DeepReadonly<Pick<UserNotNull, 'id' | 'role'> & Nullable<Pick<AdminUserNotNull, 'administrationId'>> & Pick<EntrepriseUserNotNull, 'entrepriseIds'>>
+type UpdateUtilisateurRole = Pick<UserNotNull, 'id' | 'role'> & Nullable<Pick<AdminUserNotNull, 'administrationId'>> & Pick<EntrepriseUserNotNull, 'entrepriseIds'>
 export const updateUtilisateurRole = async (pool: Pool, user: UpdateUtilisateurRole): Promise<void> => {
   await dbQueryAndValidate(updateUtilisateurRoleDb, user, pool, z.void())
 
diff --git a/packages/api/src/pg-database.ts b/packages/api/src/pg-database.ts
index 44b9c4e43d21ca49c51b52b9c93ab3921e60e795..6a4a68801e15382735a265b39879d082a0ba7823 100644
--- a/packages/api/src/pg-database.ts
+++ b/packages/api/src/pg-database.ts
@@ -6,7 +6,6 @@ import type { ZodType, ZodTypeDef } from 'zod'
 import { CaminoError } from 'camino-common/src/zod-tools'
 import { ZodUnparseable, zodParseEffectCallback } from './tools/fp-tools'
 import { Effect, pipe } from 'effect'
-import { DeepReadonly } from 'camino-common/src/typescript-tools.js'
 export type Redefine<T, P, O> = T extends { params: infer A; result: infer B }
   ? { inputs: keyof A; outputs: keyof B } extends { inputs: keyof P; outputs: keyof O }
     ? { inputs: keyof P; outputs: keyof O } extends { inputs: keyof A; outputs: keyof B }
@@ -34,8 +33,8 @@ export type DBNotFound = typeof dbNotFoundError
 export type DbQueryAccessError = "Impossible d'exécuter la requête dans la base de données"
 export type EffectDbQueryAndValidateErrors = DbQueryAccessError | ZodUnparseable
 export const effectDbQueryAndValidate = <Params, Result, T extends ZodType<Result, ZodTypeDef, unknown>>(
-  query: TaggedQuery<{ params: DeepReadonly<Params>; result: Result }>,
-  params: DeepReadonly<Params>,
+  query: TaggedQuery<{ params: Params; result: Result }>,
+  params: Params,
   pool: Pool,
   validator: T
 ): Effect.Effect<Result[], CaminoError<EffectDbQueryAndValidateErrors>> => {
diff --git a/packages/api/src/server/rest.ts b/packages/api/src/server/rest.ts
index bfb7d3d6c2b985a49248e43aaf4cd4b5bd09ef6e..34b101efbd727d63e322475140317b1616a39784 100644
--- a/packages/api/src/server/rest.ts
+++ b/packages/api/src/server/rest.ts
@@ -57,7 +57,7 @@ import { ZodType, z } from 'zod'
 import { getCommunes } from '../api/rest/communes'
 import { SendFileOptions } from 'express-serve-static-core'
 import { activiteDocumentDownload, getActivite, updateActivite, deleteActivite } from '../api/rest/activites'
-import { DeepReadonly, isNotNullNorUndefined, isNullOrUndefined } from 'camino-common/src/typescript-tools'
+import { isNotNullNorUndefined, isNullOrUndefined } from 'camino-common/src/typescript-tools'
 import { getDemarcheByIdOrSlug, demarcheSupprimer, demarcheCreer, getDemarchesEnConcurrence, getResultatEnConcurrence } from '../api/rest/demarches'
 import { geojsonImport, geojsonImportPoints, getPerimetreInfos, geojsonImportForages } from '../api/rest/perimetre'
 import { getDataGouvStats } from '../api/rest/statistiques/datagouv'
@@ -89,31 +89,31 @@ type IRestResolver = (
 ) => Promise<IRestResolverResult | null>
 
 type CaminoRestRoutesType = typeof CaminoRestRoutes
-type RestGetCall<Route extends GetRestRoutes> = (pool: Pool) => (req: CaminoRequest, res: CustomResponse<DeepReadonly<z.infer<CaminoRestRoutesType[Route]['get']['output']>>>) => Promise<void>
+type RestGetCall<Route extends GetRestRoutes> = (pool: Pool) => (req: CaminoRequest, res: CustomResponse<z.infer<CaminoRestRoutesType[Route]['get']['output']>>) => Promise<void>
 export type RestNewPostCall<Route extends NewPostRestRoutes> = (
   data: Effect.Effect<
     {
       pool: Pool
-      user: DeepReadonly<UserNotNull>
-      body: DeepReadonly<z.infer<CaminoRestRoutesType[Route]['newPost']['input']>>
-      params: DeepReadonly<z.infer<CaminoRestRoutesType[Route]['params']>>
+      user: UserNotNull
+      body: z.infer<CaminoRestRoutesType[Route]['newPost']['input']>
+      params: z.infer<CaminoRestRoutesType[Route]['params']>
     },
     never,
     never
   >
-) => Effect.Effect<DeepReadonly<z.infer<CaminoRestRoutesType[Route]['newPost']['output']>>, CaminoApiError<string>>
+) => Effect.Effect<z.infer<CaminoRestRoutesType[Route]['newPost']['output']>, CaminoApiError<string>>
 export type RestNewPutCall<Route extends NewPutRestRoutes> = (
   data: Effect.Effect<
     {
       pool: Pool
-      user: DeepReadonly<UserNotNull>
-      body: DeepReadonly<z.infer<CaminoRestRoutesType[Route]['newPut']['input']>>
-      params: DeepReadonly<z.infer<CaminoRestRoutesType[Route]['params']>>
+      user: UserNotNull
+      body: z.infer<CaminoRestRoutesType[Route]['newPut']['input']>
+      params: z.infer<CaminoRestRoutesType[Route]['params']>
     },
     never,
     never
   >
-) => Effect.Effect<DeepReadonly<z.infer<CaminoRestRoutesType[Route]['newPut']['output']>>, CaminoApiError<string>>
+) => Effect.Effect<z.infer<CaminoRestRoutesType[Route]['newPut']['output']>, CaminoApiError<string>>
 type SearchParams<Route extends NewGetRestRoutes> = CaminoRestRoutesType[Route]['newGet'] extends { searchParams: ZodType }
   ? z.infer<CaminoRestRoutesType[Route]['newGet']['searchParams']>
   : Record<never, string>
@@ -125,15 +125,15 @@ export type RestNewGetCall<Route extends NewGetRestRoutes> = (
   data: Effect.Effect<
     {
       pool: Pool
-      user: DeepReadonly<User>
-      params: DeepReadonly<z.infer<CaminoRestRoutesType[Route]['params']>>
+      user: User
+      params: z.infer<CaminoRestRoutesType[Route]['params']>
       searchParams: SearchParams<Route>
       cookie: CookieParams
     },
     never,
     never
   >
-) => Effect.Effect<DeepReadonly<z.infer<CaminoRestRoutesType[Route]['newGet']['output']>>, CaminoApiError<string>>
+) => Effect.Effect<z.infer<CaminoRestRoutesType[Route]['newGet']['output']>, CaminoApiError<string>>
 
 type RestPostCall<Route extends PostRestRoutes> = (pool: Pool) => (req: CaminoRequest, res: CustomResponse<z.infer<CaminoRestRoutesType[Route]['post']['output']>>) => Promise<void>
 type RestPutCall<Route extends PutRestRoutes> = (pool: Pool) => (req: CaminoRequest, res: CustomResponse<z.infer<CaminoRestRoutesType[Route]['put']['output']>>) => Promise<void>
@@ -269,23 +269,20 @@ export const restWithPool = (dbPool: Pool): Router => {
                 return { ...caminoError, status: HTTP_STATUS.BAD_REQUEST }
               }),
               // TODO 2024-06-26 ici, si on ne met pas les params et les searchParams à any, on se retrouve avec une typescript union hell qui fait tout planter
-              Effect.bind<'result', { searchParams: any; params: any }, DeepReadonly<z.infer<(typeof maRoute)['newGet']['output']>>, CaminoApiError<string>, never>(
-                'result',
-                ({ searchParams, params }) => {
-                  return maRoute.newGetCall(
-                    Effect.Do.pipe(
-                      Effect.let('user', () => req.auth),
-                      Effect.let('pool', () => dbPool),
-                      Effect.let('params', () => params),
-                      Effect.let('searchParams', () => searchParams),
-                      Effect.let('cookie', () => ({
-                        clearConnectedCookie: () => res.clearCookie('shouldBeConnected'),
-                        addConnectedCookie: () => res.cookie('shouldBeConnected', 'anyValueIsGood, We just check the presence of this cookie'),
-                      }))
-                    )
+              Effect.bind<'result', { searchParams: any; params: any }, z.infer<(typeof maRoute)['newGet']['output']>, CaminoApiError<string>, never>('result', ({ searchParams, params }) => {
+                return maRoute.newGetCall(
+                  Effect.Do.pipe(
+                    Effect.let('user', () => req.auth),
+                    Effect.let('pool', () => dbPool),
+                    Effect.let('params', () => params),
+                    Effect.let('searchParams', () => searchParams),
+                    Effect.let('cookie', () => ({
+                      clearConnectedCookie: () => res.clearCookie('shouldBeConnected'),
+                      addConnectedCookie: () => res.cookie('shouldBeConnected', 'anyValueIsGood, We just check the presence of this cookie'),
+                    }))
                   )
-                }
-              ),
+                )
+              }),
               Effect.bind('parsedResult', ({ result }) =>
                 pipe(
                   zodParseEffect(maRoute.newGet.output, result),
@@ -349,17 +346,15 @@ export const restWithPool = (dbPool: Pool): Router => {
                 return caminoError
               }),
               // TODO 2024-06-26 ici, si on ne met pas le body et params à any, on se retrouve avec une typescript union hell qui fait tout planter
-              Effect.bind<'result', { body: any; user: UserNotNull; params: any }, DeepReadonly<z.infer<(typeof maRoute)['newPost']['output']>>, CaminoApiError<string>, never>(
-                'result',
-                ({ user, body, params }) =>
-                  maRoute.newPostCall(
-                    Effect.Do.pipe(
-                      Effect.let('user', () => user),
-                      Effect.let('pool', () => dbPool),
-                      Effect.let('params', () => params),
-                      Effect.let('body', () => body)
-                    )
+              Effect.bind<'result', { body: any; user: UserNotNull; params: any }, z.infer<(typeof maRoute)['newPost']['output']>, CaminoApiError<string>, never>('result', ({ user, body, params }) =>
+                maRoute.newPostCall(
+                  Effect.Do.pipe(
+                    Effect.let('user', () => user),
+                    Effect.let('pool', () => dbPool),
+                    Effect.let('params', () => params),
+                    Effect.let('body', () => body)
                   )
+                )
               ),
               Effect.bind('parsedResult', ({ result }) =>
                 pipe(
@@ -422,17 +417,15 @@ export const restWithPool = (dbPool: Pool): Router => {
                 return caminoError
               }),
               // TODO 2024-06-26 ici, si on ne met pas le body et params à any, on se retrouve avec une typescript union hell qui fait tout planter
-              Effect.bind<'result', { body: any; user: UserNotNull; params: any }, DeepReadonly<z.infer<(typeof maRoute)['newPut']['output']>>, CaminoApiError<string>, never>(
-                'result',
-                ({ user, body, params }) =>
-                  maRoute.newPutCall(
-                    Effect.Do.pipe(
-                      Effect.let('user', () => user),
-                      Effect.let('pool', () => dbPool),
-                      Effect.let('params', () => params),
-                      Effect.let('body', () => body)
-                    )
+              Effect.bind<'result', { body: any; user: UserNotNull; params: any }, z.infer<(typeof maRoute)['newPut']['output']>, CaminoApiError<string>, never>('result', ({ user, body, params }) =>
+                maRoute.newPutCall(
+                  Effect.Do.pipe(
+                    Effect.let('user', () => user),
+                    Effect.let('pool', () => dbPool),
+                    Effect.let('params', () => params),
+                    Effect.let('body', () => body)
                   )
+                )
               ),
               Effect.bind('parsedResult', ({ result }) =>
                 pipe(
diff --git a/packages/api/src/server/user-loader.ts b/packages/api/src/server/user-loader.ts
index 7923696ac4bbd04443f546d88cdf89ec61096cf6..27d0c3c5699cb14ea5353ce9474a5af31d531a27 100644
--- a/packages/api/src/server/user-loader.ts
+++ b/packages/api/src/server/user-loader.ts
@@ -3,7 +3,7 @@ import { Request as JWTRequest } from 'express-jwt'
 import { emailsSend, emailsWithTemplateSend } from '../tools/api-mailjet/emails'
 import { getCurrent } from 'camino-common/src/date'
 import { EmailTemplateId } from '../tools/api-mailjet/types'
-import { DeepReadonly, isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty, isNullOrUndefined, isNullOrUndefinedOrEmpty } from 'camino-common/src/typescript-tools'
+import { isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty, isNullOrUndefined, isNullOrUndefinedOrEmpty } from 'camino-common/src/typescript-tools'
 import { config } from '../config/index'
 import { Pool } from 'pg'
 import { createUtilisateur, getUtilisateurById, getUtilisateurByKeycloakId, updateUtilisateur } from '../database/queries/utilisateurs.queries'
@@ -29,7 +29,7 @@ export const userLoader =
     try {
       const reqUser: JWTUser | undefined = req.auth as JWTUser
       if (isNotNullNorUndefined(reqUser) && isNotNullNorUndefinedNorEmpty(reqUser.sub)) {
-        let user: DeepReadonly<User> = await getUtilisateurByKeycloakId(pool, reqUser.sub)
+        let user: User = await getUtilisateurByKeycloakId(pool, reqUser.sub)
         if (isNullOrUndefined(user)) {
           if (isNullOrUndefined(reqUser.family_name) || isNullOrUndefined(reqUser.given_name)) {
             next(new Error('utilisateur inconnu'))
diff --git a/packages/api/src/types.ts b/packages/api/src/types.ts
index b570fc352b988ff0f354f5b505c71d10b6e27512..5c04f0a11eeeb847f527af9fe5074572c7b116cc 100644
--- a/packages/api/src/types.ts
+++ b/packages/api/src/types.ts
@@ -12,7 +12,7 @@ import { TitreReference } from 'camino-common/src/titres-references'
 import { SecteursMaritimes } from 'camino-common/src/static/facades'
 import { CaminoDate } from 'camino-common/src/date'
 import { EntrepriseDocumentId, EntrepriseId } from 'camino-common/src/entreprise'
-import { DeepReadonly, RecordPartial } from 'camino-common/src/typescript-tools'
+import { RecordPartial } from 'camino-common/src/typescript-tools'
 import { SDOMZoneId } from 'camino-common/src/static/sdom'
 import { ActivitesStatutId } from 'camino-common/src/static/activitesStatuts'
 import { DemarcheId, DemarcheSlug } from 'camino-common/src/demarche'
@@ -170,9 +170,9 @@ export interface ITitre {
   administrationsLocales?: AdministrationId[] | null
   administrations?: AdministrationId[] | null
   surface?: number | null
-  communes?: DeepReadonly<ICommune[]> | null
-  forets?: DeepReadonly<ForetId[]> | null
-  sdomZones?: DeepReadonly<SDOMZoneId[]> | null
+  communes?: ICommune[] | null
+  forets?: ForetId[] | null
+  sdomZones?: SDOMZoneId[] | null
   pointsEtape?: ITitreEtape | null
   secteursMaritime?: SecteursMaritimes[] | null
   demarches?: ITitreDemarche[]
@@ -199,7 +199,7 @@ export interface ITitreActivite {
   utilisateurId?: string | null
   dateSaisie?: CaminoDate
   contenu?: IContenu | null
-  sections: DeepReadonly<Section[]>
+  sections: Section[]
   suppression?: boolean
 }
 
@@ -250,9 +250,9 @@ export type ITitreEtape = {
   administrationsLocales?: AdministrationId[] | null
   entrepriseDocumentIds?: EntrepriseDocumentId[] | null
   etapeDocuments?: unknown[]
-  communes?: DeepReadonly<ICommune[]> | null
-  forets?: DeepReadonly<ForetId[]> | null
-  sdomZones?: DeepReadonly<SDOMZoneId[]> | null
+  communes?: ICommune[] | null
+  forets?: ForetId[] | null
+  sdomZones?: SDOMZoneId[] | null
   secteursMaritime?: SecteursMaritimes[] | null
   heritageProps?: IHeritageProps | null
   heritageContenu?: IHeritageContenu | null
diff --git a/packages/api/tests/_utils/index.ts b/packages/api/tests/_utils/index.ts
index 4f4946a8646201bb896282536770e453037e8266..3a1fbe83ce1a25d834409f71c785d0b0776a4445 100644
--- a/packages/api/tests/_utils/index.ts
+++ b/packages/api/tests/_utils/index.ts
@@ -25,7 +25,7 @@ import {
 import { z } from 'zod'
 import { newUtilisateurId } from '../../src/database/models/_format/id-create'
 import { idUserKeycloakRecognised } from '../keycloak'
-import { DeepReadonly, isNotNullNorUndefined, isNullOrUndefined } from 'camino-common/src/typescript-tools'
+import { isNotNullNorUndefined, isNullOrUndefined } from 'camino-common/src/typescript-tools'
 import { config } from '../../src/config/index'
 import { createUtilisateur, getUtilisateurById } from '../../src/database/queries/utilisateurs.queries'
 
@@ -87,7 +87,7 @@ export const restPostCall = async <Route extends PostRestRoutes>(
   caminoRestRoute: Route,
   params: CaminoRestParams<Route>,
   user: TestUser | undefined,
-  body: DeepReadonly<z.infer<(typeof CaminoRestRoutes)[Route]['post']['input']>>
+  body: z.infer<(typeof CaminoRestRoutes)[Route]['post']['input']>
 ): Promise<request.Test> => {
   const req = request(app(pool)).post(getRestRoute(caminoRestRoute, params)).send(body)
 
@@ -98,7 +98,7 @@ export const restNewPostCall = async <Route extends NewPostRestRoutes>(
   caminoRestRoute: Route,
   params: CaminoRestParams<Route>,
   user: TestUser | undefined,
-  body: DeepReadonly<z.infer<(typeof CaminoRestRoutes)[Route]['newPost']['input']>>
+  body: z.infer<(typeof CaminoRestRoutes)[Route]['newPost']['input']>
 ): Promise<request.Test> => {
   const req = request(app(pool)).post(getRestRoute(caminoRestRoute, params)).send(body)
 
@@ -110,7 +110,7 @@ export const restNewPutCall = async <Route extends NewPutRestRoutes>(
   path: Route,
   params: CaminoRestParams<Route>,
   user: TestUser | undefined,
-  body: DeepReadonly<z.infer<(typeof CaminoRestRoutes)[Route]['newPut']['input']>>
+  body: z.infer<(typeof CaminoRestRoutes)[Route]['newPut']['input']>
 ): Promise<request.Test> => {
   const req = request(app(pool)).put(getRestRoute(path, params)).send(body)
 
diff --git a/packages/common/src/demarche.ts b/packages/common/src/demarche.ts
index 1062de06966912edac19198a3b40f6d35e465331..05dc717b6cb400ef221acc039f500b30f9112004 100644
--- a/packages/common/src/demarche.ts
+++ b/packages/common/src/demarche.ts
@@ -18,7 +18,7 @@ import { capitalize } from './strings'
 import { foretIdValidator } from './static/forets'
 import { featureCollectionForagesValidator, featureCollectionPointsValidator, featureMultiPolygonValidator } from './perimetre'
 import { geoSystemeIdValidator } from './static/geoSystemes'
-import { DeepReadonly, isNotNullNorUndefined, isNullOrUndefinedOrEmpty, toSorted } from './typescript-tools'
+import { isNotNullNorUndefined, isNullOrUndefinedOrEmpty, NonEmptyArray, toSorted } from './typescript-tools'
 import { proprietesGeothermieForagesElementIds } from './static/titresTypes_demarchesTypes_etapesTypes/sections'
 import { titreIdValidator, titreSlugValidator } from './validators/titres'
 import { DEMARCHES_TYPES_IDS, DemarcheTypeId, demarcheTypeIdValidator } from './static/demarchesTypes'
@@ -280,7 +280,11 @@ export type DemarcheCreationOutput = z.infer<typeof demarcheCreationOutputValida
 
 // TODO 2024-12-02 quand on a viré le DeepReadonly, on peut re-essayer d'avoir un typage plus concret, avec : si on a un tableau non vide, alors on a forcément un FirstEtapeDate
 // T extends [any, ...any[]] ? FirstEtapeDate : FirstEtapeDate | null
-export const demarcheEnregistrementDemandeDateFind = (titreEtapes: DeepReadonly<{ date: CaminoDate; typeId: EtapeTypeId }[]> | undefined): null | FirstEtapeDate => {
+type DemarcheEnregistrementDemandeDateFindEtape = { date: CaminoDate; typeId: EtapeTypeId }
+export function demarcheEnregistrementDemandeDateFind<T extends DemarcheEnregistrementDemandeDateFindEtape[] | NonEmptyArray<DemarcheEnregistrementDemandeDateFindEtape>>(
+  titreEtapes: T | undefined
+): T extends [DemarcheEnregistrementDemandeDateFindEtape, ...DemarcheEnregistrementDemandeDateFindEtape[]] ? FirstEtapeDate : FirstEtapeDate | null
+export function demarcheEnregistrementDemandeDateFind(titreEtapes: DemarcheEnregistrementDemandeDateFindEtape[] | undefined): null | FirstEtapeDate {
   if (isNullOrUndefinedOrEmpty(titreEtapes)) {
     return null
   }
diff --git a/packages/common/src/etape.ts b/packages/common/src/etape.ts
index f325858917afbaa8dc10bb594bd228ea02769339..4459ed007326f38f29637f658edaa55820935560 100644
--- a/packages/common/src/etape.ts
+++ b/packages/common/src/etape.ts
@@ -7,7 +7,6 @@ import { z } from 'zod'
 import { tempDocumentNameValidator } from './document'
 import { autreAvisTypeIdValidator, avisStatutIdValidator, avisTypeIdSansAutreValidator, avisVisibilityIdValidator } from './static/avisTypes'
 import { FlattenEtape, GraphqlEtape } from './etape-form'
-import { DeepReadonly } from './typescript-tools'
 import { sectionDureeIds } from './static/titresTypes_demarchesTypes_etapesTypes/sections'
 
 export const etapeBrouillonValidator = z.boolean().brand('EtapeBrouillon')
@@ -130,7 +129,7 @@ export type EtapeDocumentModification = z.infer<typeof etapeDocumentModification
 export const etapeNoteValidator = z.object({ valeur: z.string(), is_avertissement: z.boolean() })
 export type EtapeNote = z.infer<typeof etapeNoteValidator>
 
-export const getStatutId = (etape: Pick<DeepReadonly<FlattenEtape>, 'date' | 'contenu' | 'typeId' | 'statutId'>, currentDate: CaminoDate): EtapeStatutId => {
+export const getStatutId = (etape: Pick<FlattenEtape, 'date' | 'contenu' | 'typeId' | 'statutId'>, currentDate: CaminoDate): EtapeStatutId => {
   if (!isEtapeWithAutomaticStatuts(etape.typeId)) {
     return etape.statutId
   }
diff --git a/packages/common/src/filters.ts b/packages/common/src/filters.ts
index 2ec77019e02597e3644b3946706b440e517ab3c2..c343f74be0e5b51159c31b34f0a6cb897e380d90 100644
--- a/packages/common/src/filters.ts
+++ b/packages/common/src/filters.ts
@@ -224,7 +224,7 @@ export const caminoFiltres = {
     name: string
     placeholder?: string
     validator: ZodType
-    elements?: unknown[]
+    elements?: Readonly<unknown[]>
     component?: 'FiltresLabel' | 'FiltresTypes' | 'FiltreDomaine' | 'FiltresTitresStatuts' | 'FiltresActivitesStatuts' | 'FiltresDemarchesStatuts'
     lazy?: boolean
   }
diff --git a/packages/common/src/perimetre.ts b/packages/common/src/perimetre.ts
index c6ed2e1cb430bfbea417afe54c34fe971df38032..33eb6931de733e762ebf2aa984d4cd3f1ea74763 100644
--- a/packages/common/src/perimetre.ts
+++ b/packages/common/src/perimetre.ts
@@ -8,7 +8,7 @@ import { titreSlugValidator } from './validators/titres'
 import { tempDocumentNameValidator } from './document'
 import { titreTypeIdValidator } from './static/titresTypes'
 import { perimetreFileUploadTypeValidator } from './static/documentsTypes'
-import { DeepReadonly, isNullOrUndefined } from './typescript-tools'
+import { isNullOrUndefined } from './typescript-tools'
 import { km2Validator } from './number'
 import { GeoSystemeId, geoSystemeIdValidator } from './static/geoSystemes'
 
@@ -122,7 +122,7 @@ export const geojsonInformationsValidator = z.object({
   geojson_origine_geo_systeme_id: geoSystemeIdValidator,
 })
 
-export type GeojsonInformations = DeepReadonly<z.infer<typeof geojsonInformationsValidator>>
+export type GeojsonInformations = z.infer<typeof geojsonInformationsValidator>
 
 export const perimetreInformationsValidator = geojsonInformationsValidator.pick({ superposition_alertes: true, sdomZoneIds: true }).extend({ communes: z.array(communeIdValidator) })
 export type PerimetreInformations = z.infer<typeof perimetreInformationsValidator>
@@ -146,7 +146,7 @@ export type GeojsonImportForagesBody = z.infer<typeof geojsonImportForagesBodyVa
 export const geojsonImportForagesResponseValidator = z.object({ geojson4326: featureCollectionForagesValidator, origin: featureCollectionForagesValidator })
 export type GeojsonImportForagesResponse = z.infer<typeof geojsonImportForagesResponseValidator>
 
-const internalEqualGeojson = (geo1: DeepReadonly<MultiPolygon>, geo2: DeepReadonly<MultiPolygon>): boolean => {
+const internalEqualGeojson = (geo1: MultiPolygon, geo2: MultiPolygon): boolean => {
   return geo1.coordinates.every((level1, indexLevel1) => {
     return level1.every((level2, indexLevel2) => {
       return level2.every((level3, indexLevel3) => {
@@ -156,7 +156,7 @@ const internalEqualGeojson = (geo1: DeepReadonly<MultiPolygon>, geo2: DeepReadon
   })
 }
 
-export const equalGeojson = (geo1: DeepReadonly<MultiPolygon> | null, geo2: DeepReadonly<MultiPolygon> | null | undefined): boolean => {
+export const equalGeojson = (geo1: MultiPolygon | null, geo2: MultiPolygon | null | undefined): boolean => {
   if (isNullOrUndefined(geo1) && isNullOrUndefined(geo2)) {
     return true
   }
diff --git a/packages/common/src/permissions/administrations.ts b/packages/common/src/permissions/administrations.ts
index 8712566091967eea25227c4407d5539691af693a..87a7cdcb6586ec21e7851f754b47bcbcffe605bd 100644
--- a/packages/common/src/permissions/administrations.ts
+++ b/packages/common/src/permissions/administrations.ts
@@ -1,7 +1,6 @@
 import { isAdministration, isAdministrationAdmin, isAdministrationEditeur, isSuper, User } from '../roles'
 import { AdministrationId, Administrations, sortedAdministrations } from '../static/administrations'
 import { Departements } from '../static/departement'
-import { DeepReadonly } from '../typescript-tools'
 
 export const canReadActivitesTypesEmails = (user: User, administrationId: AdministrationId): boolean => {
   if (!canReadAdministrations(user)) {
@@ -34,7 +33,7 @@ export const canReadActivitesTypesEmails = (user: User, administrationId: Admini
   return false
 }
 
-export const canReadAdministrations = (user: DeepReadonly<User>): boolean => isSuper(user) || isAdministration(user)
+export const canReadAdministrations = (user: User): boolean => isSuper(user) || isAdministration(user)
 
 export const canEditEmails = (user: User, administrationId: AdministrationId): boolean => {
   if (isSuper(user) || ((isAdministrationAdmin(user) || isAdministrationEditeur(user)) && Administrations[user.administrationId].typeId === 'min')) {
diff --git a/packages/common/src/permissions/entreprises.ts b/packages/common/src/permissions/entreprises.ts
index acf99b28914bfc2db66acd9c79f8c0963089875a..bcf46c2124cd7eaf0af5284dcd436fc689525534 100644
--- a/packages/common/src/permissions/entreprises.ts
+++ b/packages/common/src/permissions/entreprises.ts
@@ -1,6 +1,5 @@
 import { EntrepriseId } from '../entreprise'
 import { isAdministrationAdmin, isAdministrationEditeur, isBureauDEtudes, isEntreprise, User, isSuper, isAdministration } from '../roles'
-import { DeepReadonly } from '../typescript-tools'
 
 export const canCreateEntreprise = (user: User): boolean => {
   if (isSuper(user) || isAdministrationAdmin(user) || isAdministrationEditeur(user)) {
@@ -10,7 +9,7 @@ export const canCreateEntreprise = (user: User): boolean => {
   return false
 }
 
-export const canEditEntreprise = (user: DeepReadonly<User>, entrepriseId?: EntrepriseId): boolean => {
+export const canEditEntreprise = (user: User, entrepriseId?: EntrepriseId): boolean => {
   if (isSuper(user) || isAdministrationAdmin(user) || isAdministrationEditeur(user)) {
     return true
   }
@@ -22,7 +21,7 @@ export const canEditEntreprise = (user: DeepReadonly<User>, entrepriseId?: Entre
   return false
 }
 
-export const canSeeEntrepriseDocuments = (user: DeepReadonly<User>, entrepriseId: EntrepriseId): boolean => {
+export const canSeeEntrepriseDocuments = (user: User, entrepriseId: EntrepriseId): boolean => {
   if (isSuper(user) || isAdministration(user)) {
     return true
   }
diff --git a/packages/common/src/permissions/etape-form.test.ts b/packages/common/src/permissions/etape-form.test.ts
index 50aa5c422a6573f737b5cc99f04d64e3fc486147..4e107edad025a35180877f13e8684a3252bec8fe 100644
--- a/packages/common/src/permissions/etape-form.test.ts
+++ b/packages/common/src/permissions/etape-form.test.ts
@@ -16,7 +16,7 @@ import {
   sectionsStepIsComplete,
   sectionsStepIsVisible,
 } from './etape-form'
-import { ETAPE_IS_BROUILLON, ETAPE_IS_NOT_BROUILLON, etapeDocumentIdValidator } from '../etape'
+import { ETAPE_IS_BROUILLON, ETAPE_IS_NOT_BROUILLON, EtapeDocument, TempEtapeDocument } from '../etape'
 import { firstEtapeDateValidator, toCaminoDate } from '../date'
 import { testBlankUser } from '../tests-utils'
 import { entrepriseIdValidator } from '../entreprise'
@@ -520,69 +520,36 @@ test('etapeDocumentsStepIsVisible', () => {
   expect(etapeDocumentsStepIsVisible()).toBe(true)
 })
 
-const axmDocumentsComplete = [
+const axmDocumentsComplete: Pick<EtapeDocument | TempEtapeDocument, 'etape_document_type_id'>[] = [
   {
-    description: "Plan à l'échelle 1/50 000ème ou 1/100 000ème",
-    id: etapeDocumentIdValidator.parse('idcar'),
     etape_document_type_id: 'car',
-    entreprises_lecture: true,
-    public_lecture: true,
   },
 
   {
-    description: null,
-    id: etapeDocumentIdValidator.parse('idlem'),
     etape_document_type_id: 'lem',
-    entreprises_lecture: true,
-    public_lecture: true,
   },
 
   {
-    description: '',
-    id: etapeDocumentIdValidator.parse('ididm'),
     etape_document_type_id: 'idm',
-    entreprises_lecture: true,
-    public_lecture: true,
   },
 
   {
-    description:
-      'la définition des mesures prévues par le pétitionnaire pour réhabiliter le site après exploitation, notamment la nature et les modalités de revégétalisation envisagée. (décret 2001-204, art. 5 bis)',
-    id: etapeDocumentIdValidator.parse('idmes'),
     etape_document_type_id: 'mes',
-    entreprises_lecture: true,
-    public_lecture: true,
   },
   {
-    description: "descriptif des méthodes envisagées pour l'exécution des travaux ((décret 2001-204, art. 6)",
-    id: etapeDocumentIdValidator.parse('idmet'),
     etape_document_type_id: 'met',
-    entreprises_lecture: true,
-    public_lecture: true,
   },
   {
-    description: null,
-    id: etapeDocumentIdValidator.parse('idnip'),
     etape_document_type_id: 'nip',
-    entreprises_lecture: true,
-    public_lecture: true,
   },
 
   {
-    description: 'Description du phasage et planigramme des travaux. (décret 2001-204, art. 5)',
-    id: etapeDocumentIdValidator.parse('idprg'),
     etape_document_type_id: 'prg',
-    entreprises_lecture: true,
-    public_lecture: true,
   },
   {
-    description: "le schéma de pénétration du massif forestier proposé par le pétitionnaire pour l'acheminement du matériel lourd et la desserte du chantier (décret 2001-204, art. 5 bis)",
-    id: etapeDocumentIdValidator.parse('idsch'),
     etape_document_type_id: 'sch',
-    entreprises_lecture: true,
-    public_lecture: true,
   },
-] as const
+]
 
 const entreprise1Id = entrepriseIdValidator.parse('id1')
 test('etapeDocumentsStepIsComplete', () => {
diff --git a/packages/common/src/permissions/etape-form.ts b/packages/common/src/permissions/etape-form.ts
index 0278c7825053dafb5bd2ac2924ba8fb9c37ae47e..1842ded65fd46c36c0c0c2243102f6c57b17a0ff 100644
--- a/packages/common/src/permissions/etape-form.ts
+++ b/packages/common/src/permissions/etape-form.ts
@@ -15,7 +15,7 @@ import { getDocuments } from '../static/titresTypes_demarchesTypes_etapesTypes/d
 import { getEntrepriseDocuments } from '../static/titresTypes_demarchesTypes_etapesTypes/entrepriseDocuments'
 import { documentTypeIdsBySdomZonesGet } from '../static/titresTypes_demarchesTypes_etapesTypes/sdom'
 import { getSections, getSectionsWithValue } from '../static/titresTypes_demarchesTypes_etapesTypes/sections'
-import { isNotNullNorUndefinedNorEmpty, DeepReadonly, onlyUnique, NonEmptyArray, isNonEmptyArray, isNullOrUndefinedOrEmpty, isNullOrUndefined, Nullable } from '../typescript-tools'
+import { isNotNullNorUndefinedNorEmpty, onlyUnique, NonEmptyArray, isNonEmptyArray, isNullOrUndefinedOrEmpty, isNullOrUndefined, Nullable } from '../typescript-tools'
 import { sectionsWithValueCompleteValidate } from './sections'
 import { canEditAmodiataires, canEditDuree, canEditPerimetre, canEditTitulaires } from './titres-etapes'
 import { machineIdFind } from '../machines'
@@ -24,10 +24,10 @@ import { FirstEtapeDate } from '../date'
 
 type ValidReturn = { valid: true } | { valid: false; errors: NonEmptyArray<string> }
 
-export const dateTypeStepIsVisible = (user: DeepReadonly<User>): boolean => {
+export const dateTypeStepIsVisible = (user: User): boolean => {
   return isSuper(user) || isAdministrationAdmin(user) || isAdministrationEditeur(user)
 }
-export const dateTypeStepIsComplete = (etape: DeepReadonly<Nullable<Pick<FlattenEtape, 'typeId' | 'date' | 'statutId'>>>, user: DeepReadonly<User>): ValidReturn => {
+export const dateTypeStepIsComplete = (etape: Nullable<Pick<FlattenEtape, 'typeId' | 'date' | 'statutId'>>, user: User): ValidReturn => {
   if (!dateTypeStepIsVisible(user)) {
     return { valid: true }
   }
@@ -57,10 +57,10 @@ export const fondamentaleStepIsVisible = (etapeTypeId: EtapeTypeId): boolean =>
 }
 
 export const fondamentaleStepIsComplete = (
-  flattened: DeepReadonly<Pick<FlattenEtape, 'typeId' | 'duree' | 'substances' | 'titulaires' | 'amodiataires'>>,
+  flattened: Pick<FlattenEtape, 'typeId' | 'duree' | 'substances' | 'titulaires' | 'amodiataires'>,
   demarcheTypeId: DemarcheTypeId,
   titreTypeId: TitreTypeId,
-  user: DeepReadonly<User>
+  user: User
 ): ValidReturn => {
   if (!fondamentaleStepIsVisible(flattened.typeId)) {
     return { valid: true }
@@ -96,7 +96,7 @@ export const fondamentaleStepIsComplete = (
 export const sectionsStepIsVisible = (etape: Pick<FlattenEtape, 'typeId'>, demarcheTypeId: DemarcheTypeId, titreTypeId: TitreTypeId): boolean => {
   return getSections(titreTypeId, demarcheTypeId, etape.typeId).length > 0
 }
-export const sectionsStepIsComplete = (etape: DeepReadonly<Pick<FlattenEtape, 'typeId' | 'contenu'>>, demarcheTypeId: DemarcheTypeId, titreTypeId: TitreTypeId): ValidReturn => {
+export const sectionsStepIsComplete = (etape: Pick<FlattenEtape, 'typeId' | 'contenu'>, demarcheTypeId: DemarcheTypeId, titreTypeId: TitreTypeId): ValidReturn => {
   if (!sectionsStepIsVisible(etape, demarcheTypeId, titreTypeId)) {
     return { valid: true }
   }
@@ -117,7 +117,7 @@ export const perimetreStepIsVisible = (etape: Pick<FlattenEtape, 'typeId'>, dema
 
   return editPerimetre.visibility === 'present'
 }
-export const perimetreStepIsComplete = (etape: DeepReadonly<Pick<FlattenEtape, 'typeId' | 'perimetre'>>, demarcheTypeId: DemarcheTypeId): ValidReturn => {
+export const perimetreStepIsComplete = (etape: Pick<FlattenEtape, 'typeId' | 'perimetre'>, demarcheTypeId: DemarcheTypeId): ValidReturn => {
   if (!perimetreStepIsVisible(etape, demarcheTypeId)) {
     return { valid: true }
   }
@@ -136,11 +136,11 @@ export const perimetreStepIsComplete = (etape: DeepReadonly<Pick<FlattenEtape, '
 }
 
 export const getDocumentsTypes = (
-  etape: DeepReadonly<Pick<FlattenEtape, 'typeId'>>,
+  etape: Pick<FlattenEtape, 'typeId'>,
   demarcheTypeId: DemarcheTypeId,
   titreTypeId: TitreTypeId,
   demarcheId: DemarcheId,
-  sdomZoneIds: DeepReadonly<SDOMZoneId[]>,
+  sdomZoneIds: SDOMZoneId[],
   isArmMecanise: boolean,
   firstEtapeDate: FirstEtapeDate
 ): (DocumentType | AutreDocumentType)[] => {
@@ -186,7 +186,7 @@ export const getAvisTypes = (
   demarcheTypeId: DemarcheTypeId,
   demarcheId: DemarcheId,
   firstEtapeDate: FirstEtapeDate,
-  communeIds: DeepReadonly<CommuneId[]>
+  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) {
@@ -245,12 +245,12 @@ export const etapeDocumentsStepIsVisible = (): boolean => {
 }
 
 export const etapeDocumentsStepIsComplete = (
-  etape: DeepReadonly<Pick<FlattenEtape, 'typeId' | 'contenu' | 'isBrouillon'>>,
+  etape: Pick<FlattenEtape, 'typeId' | 'contenu' | 'isBrouillon'>,
   demarcheTypeId: DemarcheTypeId,
   titreTypeId: TitreTypeId,
   demarcheId: DemarcheId,
-  etapeDocuments: DeepReadonly<Pick<EtapeDocument | TempEtapeDocument, 'etape_document_type_id'>[]>,
-  sdomZoneIds: DeepReadonly<SDOMZoneId[]>,
+  etapeDocuments: Pick<EtapeDocument | TempEtapeDocument, 'etape_document_type_id'>[],
+  sdomZoneIds: SDOMZoneId[],
   firstEtapeDate: FirstEtapeDate
 ): ValidReturn => {
   const errors: string[] = []
@@ -275,19 +275,19 @@ export const etapeAvisStepIsVisible = (
   demarcheTypeId: DemarcheTypeId,
   demarcheId: DemarcheId,
   firstEtapeDate: FirstEtapeDate,
-  communeIds: DeepReadonly<CommuneId[]>
+  communeIds: CommuneId[]
 ): boolean => {
   return getAvisTypes(etape.typeId, titreTypeId, demarcheTypeId, demarcheId, firstEtapeDate, communeIds).length > 0
 }
 
 export const etapeAvisStepIsComplete = (
-  etape: DeepReadonly<Pick<FlattenEtape, 'typeId'>>,
-  etapeAvis: DeepReadonly<Pick<EtapeAvis | TempEtapeAvis, 'avis_type_id'>[]>,
+  etape: Pick<FlattenEtape, 'typeId'>,
+  etapeAvis: Pick<EtapeAvis | TempEtapeAvis, 'avis_type_id'>[],
   titreTypeId: TitreTypeId,
   demarcheTypeId: DemarcheTypeId,
   demarcheId: DemarcheId,
   firstEtapeDate: FirstEtapeDate,
-  communeIds: DeepReadonly<CommuneId[]>
+  communeIds: CommuneId[]
 ): ValidReturn => {
   if (!etapeAvisStepIsVisible(etape, titreTypeId, demarcheTypeId, demarcheId, firstEtapeDate, communeIds)) {
     return { valid: true }
@@ -305,10 +305,10 @@ export const entrepriseDocumentsStepIsVisible = (etape: Pick<FlattenEtape, 'type
   return getEntrepriseDocuments(titreTypeId, demarcheTypeId, etape.typeId).length > 0
 }
 export const entrepriseDocumentsStepIsComplete = (
-  etape: DeepReadonly<Pick<FlattenEtape, 'typeId' | 'contenu' | 'titulaires' | 'amodiataires'>>,
+  etape: Pick<FlattenEtape, 'typeId' | 'contenu' | 'titulaires' | 'amodiataires'>,
   demarcheTypeId: DemarcheTypeId,
   titreTypeId: TitreTypeId,
-  entreprisesDocuments: DeepReadonly<Pick<SelectedEntrepriseDocument, 'documentTypeId' | 'entrepriseId'>[]>
+  entreprisesDocuments: Pick<SelectedEntrepriseDocument, 'documentTypeId' | 'entrepriseId'>[]
 ): ValidReturn => {
   if (!entrepriseDocumentsStepIsVisible(etape, demarcheTypeId, titreTypeId)) {
     return { valid: true }
diff --git a/packages/common/src/permissions/sections.ts b/packages/common/src/permissions/sections.ts
index 37af99f69b81e4fc03c107ab8e8e9cffe511960e..e609a5c6dd6697d975b7ab42e72cd2fe89955349 100644
--- a/packages/common/src/permissions/sections.ts
+++ b/packages/common/src/permissions/sections.ts
@@ -1,10 +1,10 @@
 import { ElementWithValue } from '../sections'
-import { DeepReadonly, isNullOrUndefined } from '../typescript-tools'
+import { isNullOrUndefined } from '../typescript-tools'
 
 // @deprecated ==> type better
 export type Contenu = { [key in string]?: { [secondKey in string]?: unknown } } | null
 
-export const sectionsWithValueCompleteValidate = (sections_with_value: DeepReadonly<{ nom?: string; elements: Pick<ElementWithValue, 'nom' | 'optionnel' | 'value' | 'type'>[] }[]>): string[] => {
+export const sectionsWithValueCompleteValidate = (sections_with_value: { nom?: string; elements: Pick<ElementWithValue, 'nom' | 'optionnel' | 'value' | 'type'>[] }[]): string[] => {
   const errors: string[] = []
   sections_with_value.forEach(s =>
     s.elements.forEach(e => {
@@ -17,7 +17,7 @@ export const sectionsWithValueCompleteValidate = (sections_with_value: DeepReado
   return errors
 }
 
-export const sectionElementWithValueCompleteValidate = (elementWithValue: DeepReadonly<Pick<ElementWithValue, 'optionnel' | 'value' | 'type'>>): boolean => {
+export const sectionElementWithValueCompleteValidate = (elementWithValue: Pick<ElementWithValue, 'optionnel' | 'value' | 'type'>): boolean => {
   if ((isNullOrUndefined(elementWithValue.optionnel) || !elementWithValue.optionnel) && !['checkbox'].includes(elementWithValue.type)) {
     if (isNullOrUndefined(elementWithValue.value) || elementWithValue.value === '') {
       return false
diff --git a/packages/common/src/permissions/titres-demarches.ts b/packages/common/src/permissions/titres-demarches.ts
index 8b7eda2e60d60df865bbbf7aa62567b7ae887241..34ae82575c08d03da4c9a4cb7cf301c8223d0407 100644
--- a/packages/common/src/permissions/titres-demarches.ts
+++ b/packages/common/src/permissions/titres-demarches.ts
@@ -8,7 +8,7 @@ import { getEtapesTDE } from '../static/titresTypes_demarchesTypes_etapesTypes/i
 import { DemarcheTypeId } from '../static/demarchesTypes'
 import { canCreateEtape } from './titres-etapes'
 import { TitreGetDemarche } from '../titres'
-import { DeepReadonly, isNotNullNorUndefinedNorEmpty, isNullOrUndefined } from '../typescript-tools'
+import { isNotNullNorUndefinedNorEmpty, isNullOrUndefined } from '../typescript-tools'
 import { ETAPE_IS_BROUILLON } from '../etape'
 import { demarcheEnregistrementDemandeDateFind, DemarcheEtape, DemarcheId } from '../demarche'
 import { machineIdFind } from '../machines'
@@ -20,7 +20,7 @@ const hasOneDemarcheWithoutPhase = (demarches: Pick<TitreGetDemarche, 'demarche_
   return isNotNullNorUndefinedNorEmpty(demarches) && demarches.length === 1 && isNullOrUndefined(demarches[0].demarche_date_debut)
 }
 export const canCreateDemarche = (
-  user: DeepReadonly<User>,
+  user: User,
   titreTypeId: TitreTypeId,
   titreStatutId: TitreStatutId,
   administrationsLocales: AdministrationId[],
@@ -29,7 +29,7 @@ export const canCreateDemarche = (
   return !hasOneDemarcheWithoutPhase(demarches) && canEditDemarche(user, titreTypeId, titreStatutId, administrationsLocales)
 }
 
-export const canEditDemarche = (user: DeepReadonly<User>, titreTypeId: TitreTypeId, titreStatutId: TitreStatutId, administrationsLocales: AdministrationId[]): boolean => {
+export const canEditDemarche = (user: User, titreTypeId: TitreTypeId, titreStatutId: TitreStatutId, administrationsLocales: AdministrationId[]): boolean => {
   if (isSuper(user)) {
     return true
   } else if (isAdministrationAdmin(user) || isAdministrationEditeur(user)) {
@@ -57,7 +57,7 @@ export const canDeleteDemarche = (user: User, titreTypeId: TitreTypeId, titreSta
   return false
 }
 
-export const canCreateTravaux = (user: DeepReadonly<User>, titreTypeId: TitreTypeId, administrations: AdministrationId[], demarches: Pick<TitreGetDemarche, 'demarche_date_debut'>[]): boolean => {
+export const canCreateTravaux = (user: User, titreTypeId: TitreTypeId, administrations: AdministrationId[], demarches: Pick<TitreGetDemarche, 'demarche_date_debut'>[]): boolean => {
   if (hasOneDemarcheWithoutPhase(demarches)) {
     return false
   }
@@ -89,7 +89,7 @@ export const canCreateEtapeByDemarche = (
 }
 
 export const canPublishResultatMiseEnConcurrence = (
-  user: DeepReadonly<User>,
+  user: User,
   titre_type_id: TitreTypeId,
   demarche_type_id: DemarcheTypeId,
   etapes: Pick<DemarcheEtape, 'etape_type_id' | 'demarche_id_en_concurrence' | 'date' | 'etape_statut_id'>[],
diff --git a/packages/common/src/permissions/titres-etapes.ts b/packages/common/src/permissions/titres-etapes.ts
index 324efe9e6b3d18ad81005834d8e433f95f648ecc..5db02835a6b752760261e96b35c2a589c3e8b4f0 100644
--- a/packages/common/src/permissions/titres-etapes.ts
+++ b/packages/common/src/permissions/titres-etapes.ts
@@ -6,7 +6,7 @@ import { canAdministrationEtapeTypeId } from '../static/administrationsTitresTyp
 import { TitreStatutId } from '../static/titresStatuts'
 import { EntrepriseDocument, EntrepriseId } from '../entreprise'
 import { SDOMZoneId } from '../static/sdom'
-import { DeepReadonly, NonEmptyArray, isNonEmptyArray } from '../typescript-tools'
+import { NonEmptyArray, isNonEmptyArray } from '../typescript-tools'
 import { ETAPE_IS_BROUILLON, EtapeAvis, EtapeBrouillon, EtapeDocument, TempEtapeAvis, TempEtapeDocument } from '../etape'
 import {
   dateTypeStepIsComplete,
@@ -34,7 +34,7 @@ type InputPresentRequired = { visibility: 'present'; required: true; message: st
 export type InputPresentOptional = { visibility: 'present'; required: false }
 export type InputPresence = InputAbsent | InputPresentRequired | InputPresentOptional
 
-export const canEditAmodiataires = (titreTypeId: TitreTypeId, demarcheTypeId: DemarcheTypeId, user: DeepReadonly<User>): InputPresence => {
+export const canEditAmodiataires = (titreTypeId: TitreTypeId, demarcheTypeId: DemarcheTypeId, user: User): InputPresence => {
   if (titreTypeId === TITRES_TYPES_IDS.AUTORISATION_DE_RECHERCHE_METAUX || titreTypeId === TITRES_TYPES_IDS.AUTORISATION_D_EXPLOITATION_METAUX) {
     return { visibility: 'absent', message: `une autorisation ${titreTypeId === 'arm' ? 'de recherche' : "d'exploitation"} ne peut pas inclure d'amodiataires` }
   }
@@ -69,7 +69,7 @@ export const canEditAmodiataires = (titreTypeId: TitreTypeId, demarcheTypeId: De
 const demarchesSansDatesNiDureePourLesEtapes = [DEMARCHES_TYPES_IDS.DeplacementDePerimetre, DEMARCHES_TYPES_IDS.Mutation, DEMARCHES_TYPES_IDS.ExtensionDePerimetre] as const
 
 // Attention les champs dates ne sont jamais obligatoires, si ils le deviennent il faudra faire des modifs dans la validation et dans l'ui
-export const canEditDates = (_titreTypeId: TitreTypeId, demarcheTypeId: DemarcheTypeId, etapeTypeId: EtapeTypeId, user: DeepReadonly<User>): InputAbsent | InputPresentOptional => {
+export const canEditDates = (_titreTypeId: TitreTypeId, demarcheTypeId: DemarcheTypeId, etapeTypeId: EtapeTypeId, user: User): InputAbsent | InputPresentOptional => {
   if (demarchesSansDatesNiDureePourLesEtapes.includes(demarcheTypeId)) {
     return { visibility: 'absent', message: `une démarche ${DemarchesTypes[demarcheTypeId].nom} ne peut pas inclure de date` }
   }
@@ -85,7 +85,7 @@ export const canEditDates = (_titreTypeId: TitreTypeId, demarcheTypeId: Demarche
   return { visibility: 'absent', message: 'droits insuffisants pour éditer les dates' }
 }
 
-export const canEditTitulaires = (_titreTypeId: TitreTypeId, demarcheTypeId: DemarcheTypeId, user: DeepReadonly<User>): InputPresence => {
+export const canEditTitulaires = (_titreTypeId: TitreTypeId, demarcheTypeId: DemarcheTypeId, user: User): InputPresence => {
   if (
     [
       DEMARCHES_TYPES_IDS.Fusion,
@@ -146,7 +146,7 @@ export const dureeIsValide = (
   return { valid: true }
 }
 
-export const canEditDuree = (_titreTypeId: TitreTypeId, demarcheTypeId: DemarcheTypeId, _user: DeepReadonly<User>): InputPresence => {
+export const canEditDuree = (_titreTypeId: TitreTypeId, demarcheTypeId: DemarcheTypeId, _user: User): InputPresence => {
   // par exemple, ne peut pas ajouter de durée à la démarche déplacement de périmètre
   if (demarchesSansDatesNiDureePourLesEtapes.includes(demarcheTypeId)) {
     return { visibility: 'absent', message: `une démarche ${DemarchesTypes[demarcheTypeId].nom} ne peut pas inclure de durée` }
@@ -210,7 +210,7 @@ export const canEditPerimetre = (demarcheTypeId: DemarcheTypeId, etapeTypeId: Et
 }
 
 export const canCreateEtape = (
-  user: DeepReadonly<User>,
+  user: User,
   etapeTypeId: EtapeTypeId,
   isBrouillon: EtapeBrouillon,
   titulaireIds: EntrepriseId[],
@@ -236,7 +236,7 @@ export const canDeleteEtape = (
 }
 
 export const canEditEtape = (
-  user: DeepReadonly<User>,
+  user: User,
   etapeTypeId: EtapeTypeId,
   isBrouillon: EtapeBrouillon,
   titulaireIds: EntrepriseId[],
@@ -248,7 +248,7 @@ export const canEditEtape = (
 }
 
 const canCreateOrEditEtape = (
-  user: DeepReadonly<User>,
+  user: User,
   etapeTypeId: EtapeTypeId,
   isBrouillon: EtapeBrouillon,
   titulaireIds: EntrepriseId[],
@@ -276,12 +276,12 @@ const canCreateOrEditEtape = (
   return false
 }
 
-export type IsEtapeCompleteEtape = DeepReadonly<Pick<FlattenEtape, 'typeId' | 'date' | 'statutId' | 'duree' | 'contenu' | 'substances' | 'perimetre' | 'isBrouillon' | 'titulaires' | 'amodiataires'>>
-export type IsEtapeCompleteDocuments = DeepReadonly<Pick<EtapeDocument | TempEtapeDocument, 'etape_document_type_id'>[]>
-export type IsEtapeCompleteEntrepriseDocuments = DeepReadonly<Pick<EntrepriseDocument, 'entreprise_document_type_id' | 'entreprise_id'>[]>
-type IsEtapeCompleteSdomZones = DeepReadonly<SDOMZoneId[]> | null | undefined
-type IsEtapeCompleteCommunes = DeepReadonly<CommuneId[]>
-export type IsEtapeCompleteEtapeAvis = DeepReadonly<Pick<EtapeAvis, 'avis_type_id'>[]>
+export type IsEtapeCompleteEtape = Pick<FlattenEtape, 'typeId' | 'date' | 'statutId' | 'duree' | 'contenu' | 'substances' | 'perimetre' | 'isBrouillon' | 'titulaires' | 'amodiataires'>
+export type IsEtapeCompleteDocuments = Pick<EtapeDocument | TempEtapeDocument, 'etape_document_type_id'>[]
+export type IsEtapeCompleteEntrepriseDocuments = Pick<EntrepriseDocument, 'entreprise_document_type_id' | 'entreprise_id'>[]
+type IsEtapeCompleteSdomZones = SDOMZoneId[] | null | undefined
+type IsEtapeCompleteCommunes = CommuneId[]
+export type IsEtapeCompleteEtapeAvis = Pick<EtapeAvis, 'avis_type_id'>[]
 
 export const isEtapeValid = (
   etape: IsEtapeCompleteEtape,
@@ -320,7 +320,7 @@ export const isEtapeComplete = (
   sdomZones: IsEtapeCompleteSdomZones,
   communes: IsEtapeCompleteCommunes,
   etapeAvis: IsEtapeCompleteEtapeAvis,
-  user: DeepReadonly<User>,
+  user: User,
   firstEtapeDate: FirstEtapeDate
 ): { valid: true } | { valid: false; errors: NonEmptyArray<string> } => {
   const isCompleteChecks = [
@@ -352,13 +352,13 @@ export const isEtapeComplete = (
   return { valid: true }
 }
 
-type IsEtapeDeposableEtapeAvis = DeepReadonly<Pick<EtapeAvis | TempEtapeAvis, 'avis_type_id'>[]>
+type IsEtapeDeposableEtapeAvis = Pick<EtapeAvis | TempEtapeAvis, 'avis_type_id'>[]
 export const isEtapeDeposable = (
   user: User,
   titreTypeId: TitreTypeId,
   demarcheId: DemarcheId,
   demarcheTypeId: DemarcheTypeId,
-  titreEtape: DeepReadonly<Pick<FlattenEtape, 'typeId' | 'date' | 'statutId' | 'duree' | 'contenu' | 'substances' | 'perimetre' | 'isBrouillon' | 'titulaires' | 'amodiataires'>>,
+  titreEtape: Pick<FlattenEtape, 'typeId' | 'date' | 'statutId' | 'duree' | 'contenu' | 'substances' | 'perimetre' | 'isBrouillon' | 'titulaires' | 'amodiataires'>,
   etapeDocuments: IsEtapeCompleteDocuments,
   entrepriseDocuments: IsEtapeCompleteEntrepriseDocuments,
   sdomZones: IsEtapeCompleteSdomZones,
@@ -390,7 +390,7 @@ export const canDeposeEtape = (
   },
   demarcheId: DemarcheId,
   demarcheTypeId: DemarcheTypeId,
-  titreEtape: DeepReadonly<Pick<FlattenEtape, 'typeId' | 'date' | 'statutId' | 'duree' | 'contenu' | 'substances' | 'perimetre' | 'isBrouillon' | 'titulaires' | 'amodiataires'>>,
+  titreEtape: Pick<FlattenEtape, 'typeId' | 'date' | 'statutId' | 'duree' | 'contenu' | 'substances' | 'perimetre' | 'isBrouillon' | 'titulaires' | 'amodiataires'>,
   etapeDocuments: Pick<EtapeDocument, 'etape_document_type_id'>[],
   entrepriseDocuments: Pick<EntrepriseDocument, 'entreprise_document_type_id' | 'entreprise_id'>[],
   sdomZones: SDOMZoneId[] | null | undefined,
diff --git a/packages/common/src/permissions/titres.ts b/packages/common/src/permissions/titres.ts
index 2ced9a92077074b6c454800f8028daa84556782f..fbf7a9368df304e53161dfd81ffe1dee1bb1e388 100644
--- a/packages/common/src/permissions/titres.ts
+++ b/packages/common/src/permissions/titres.ts
@@ -10,7 +10,7 @@ import { activitesTypesPays } from '../static/activitesTypesPays'
 import { canAdministrationModifyTitres } from '../static/administrationsTitresTypesTitresStatuts'
 import { TitreStatutId } from '../static/titresStatuts'
 import { territoiresIdFind } from '../territoires'
-import { DeepReadonly, isNotNullNorUndefinedNorEmpty, isNullOrUndefinedOrEmpty, SimplePromiseFn } from '../typescript-tools'
+import { isNotNullNorUndefinedNorEmpty, isNullOrUndefinedOrEmpty, SimplePromiseFn } from '../typescript-tools'
 import { SecteursMaritimes } from '../static/facades'
 import { EntrepriseId } from '../entreprise'
 import { TITRES_TYPES_TYPES_IDS } from '../static/titresTypesTypes'
@@ -37,7 +37,7 @@ export const getLinkConfig = (typeId: TitreTypeId, demarches: { demarche_type_id
   return null
 }
 
-export const canLinkTitres = (user: DeepReadonly<User>, administrationIds: AdministrationId[]): boolean => {
+export const canLinkTitres = (user: User, administrationIds: AdministrationId[]): boolean => {
   if (isSuper(user)) {
     return true
   }
@@ -51,7 +51,7 @@ export const canLinkTitres = (user: DeepReadonly<User>, administrationIds: Admin
 
 export const TITRES_TYPES_IDS_DEMAT = ['arm', 'axm']
 
-export const canCreateTitre = (user: DeepReadonly<User>, titreTypeId: TitreTypeId | null): boolean => {
+export const canCreateTitre = (user: User, titreTypeId: TitreTypeId | null): boolean => {
   if (isSuper(user)) {
     return true
   } else if (isAdministrationAdmin(user) || isAdministrationEditeur(user)) {
@@ -109,7 +109,7 @@ export const canDeleteTitre = (user: User): boolean => isSuper(user)
 
 interface TitreReduced {
   titreTypeId: TitreTypeId
-  communes: DeepReadonly<{ id: CommuneId }[]>
+  communes: { id: CommuneId }[]
   secteursMaritime: SecteursMaritimes[]
   demarches: unknown[]
 }
diff --git a/packages/common/src/permissions/utilisateurs.ts b/packages/common/src/permissions/utilisateurs.ts
index 71e22b1592b2a6ba379831473028c89ecc7f73b5..afdbf458345c36ee79785c694be015822671dc81 100644
--- a/packages/common/src/permissions/utilisateurs.ts
+++ b/packages/common/src/permissions/utilisateurs.ts
@@ -12,12 +12,12 @@ import {
   isAdministrationLecteur,
   isEntrepriseOrBureauDEtude,
 } from '../roles'
-import { DeepReadonly, isNotNullNorUndefinedNorEmpty } from '../typescript-tools'
+import { isNotNullNorUndefinedNorEmpty } from '../typescript-tools'
 
 export const canCreateEntreprise = (user: User): boolean => isSuper(user) || isAdministrationAdmin(user) || isAdministrationEditeur(user)
-export const canReadUtilisateurs = (user: DeepReadonly<User>): boolean => isSuper(user) || isAdministration(user) || isEntreprise(user) || isBureauDEtudes(user)
+export const canReadUtilisateurs = (user: User): boolean => isSuper(user) || isAdministration(user) || isEntreprise(user) || isBureauDEtudes(user)
 
-export const canReadUtilisateur = (user: DeepReadonly<User>, utilisateur: UserNotNull): boolean => {
+export const canReadUtilisateur = (user: User, utilisateur: UserNotNull): boolean => {
   if (user?.id === utilisateur.id) {
     return true
   }
diff --git a/packages/common/src/roles.ts b/packages/common/src/roles.ts
index 4a732b3ed04fc6f2121a165ec8331bc8224f3bbd..b98f841456ee4de4e36d3ff8eb4df8ddeef2e804 100644
--- a/packages/common/src/roles.ts
+++ b/packages/common/src/roles.ts
@@ -1,7 +1,6 @@
 import { administrationIdValidator } from './static/administrations'
 import { entrepriseIdValidator } from './entreprise'
 import { z } from 'zod'
-import { DeepReadonly } from './typescript-tools'
 
 export const ROLES = ['super', 'admin', 'editeur', 'lecteur', 'entreprise', "bureau d'études", 'defaut'] as const
 
@@ -57,22 +56,21 @@ export type EntrepriseUserNotNull = z.infer<typeof entrepriseUserNotNullValidato
 export const userNotNullValidator = z.discriminatedUnion('role', [superUserNotNullValidator, defautUserNotNullValidator, adminUserNotNullValidator, entrepriseUserNotNullValidator])
 export const userValidator = userNotNullValidator.nullable().optional()
 
-export const isSuper = (user: DeepReadonly<User>): user is UserSuper => userPermissionCheck(user, 'super')
+export const isSuper = (user: User): user is UserSuper => userPermissionCheck(user, 'super')
 
-export const isAdministration = (user: DeepReadonly<User>): user is UserLecteur | UserAdmin | UserEditeur =>
-  isAdministrationAdmin(user) || isAdministrationEditeur(user) || isAdministrationLecteur(user)
-export const isAdministrationAdmin = (user: DeepReadonly<User>): user is UserAdmin => userPermissionCheck(user, 'admin')
-export const isAdministrationEditeur = (user: DeepReadonly<User>): user is UserEditeur => userPermissionCheck(user, 'editeur')
-export const isAdministrationLecteur = (user: DeepReadonly<User>): user is UserLecteur => userPermissionCheck(user, 'lecteur')
-export const isEntrepriseOrBureauDEtude = (user: DeepReadonly<User>): user is UserEntreprise | UserBureaudEtudes => isEntreprise(user) || isBureauDEtudes(user)
+export const isAdministration = (user: User): user is UserLecteur | UserAdmin | UserEditeur => isAdministrationAdmin(user) || isAdministrationEditeur(user) || isAdministrationLecteur(user)
+export const isAdministrationAdmin = (user: User): user is UserAdmin => userPermissionCheck(user, 'admin')
+export const isAdministrationEditeur = (user: User): user is UserEditeur => userPermissionCheck(user, 'editeur')
+export const isAdministrationLecteur = (user: User): user is UserLecteur => userPermissionCheck(user, 'lecteur')
+export const isEntrepriseOrBureauDEtude = (user: User): user is UserEntreprise | UserBureaudEtudes => isEntreprise(user) || isBureauDEtudes(user)
 
-export const isEntreprise = (user: DeepReadonly<User>): user is UserEntreprise => userPermissionCheck(user, 'entreprise')
-export const isBureauDEtudes = (user: DeepReadonly<User>): user is UserBureaudEtudes => userPermissionCheck(user, "bureau d'études")
-export const isDefault = (user: DeepReadonly<User>): user is UserDefaut | undefined => !user || userPermissionCheck(user, 'defaut')
+export const isEntreprise = (user: User): user is UserEntreprise => userPermissionCheck(user, 'entreprise')
+export const isBureauDEtudes = (user: User): user is UserBureaudEtudes => userPermissionCheck(user, "bureau d'études")
+export const isDefault = (user: User): user is UserDefaut | undefined => !user || userPermissionCheck(user, 'defaut')
 
 export const isRole = (role: Role | string | undefined | null): role is Role => ROLES.includes(role)
 
-function userPermissionCheck(user: DeepReadonly<User>, role: Role) {
+function userPermissionCheck(user: User, role: Role) {
   return user?.role === role
 }
 
diff --git a/packages/common/src/sections.ts b/packages/common/src/sections.ts
index 201e066b0dcb24e8f08922d98b58f34dd1fa6baf..4231561877aa56e0de1c1c3fff8f179922d544c9 100644
--- a/packages/common/src/sections.ts
+++ b/packages/common/src/sections.ts
@@ -12,7 +12,7 @@ import {
   urlElementValidator,
 } from './static/titresTypes_demarchesTypes_etapesTypes/sections'
 import { z } from 'zod'
-import { DeepReadonly, isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty } from './typescript-tools'
+import { isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty } from './typescript-tools'
 import { TitreTypeId } from './static/titresTypes'
 import { DemarcheTypeId } from './static/demarchesTypes'
 import { EtapeTypeId } from './static/etapesTypes'
@@ -51,10 +51,10 @@ const elementWithValueValidator = z.union([
 
 export type ElementWithValue = z.infer<typeof elementWithValueValidator>
 
-export const isNumberElement = (element: DeepReadonly<ElementWithValue>): element is DeepReadonly<NumberElementWithValue> => {
+export const isNumberElement = (element: ElementWithValue): element is NumberElementWithValue => {
   return element.type === 'number' || element.type === 'integer'
 }
-export const isRadioElement = (element: DeepReadonly<ElementWithValue>): element is DeepReadonly<RadioElementWithValue> => {
+export const isRadioElement = (element: ElementWithValue): element is RadioElementWithValue => {
   return element.type === 'radio'
 }
 
diff --git a/packages/common/src/static/activitesTypes.ts b/packages/common/src/static/activitesTypes.ts
index a914120ee3b691d6da534d37225f25bfc9175353..f827c7e3071869a57d1884894b0f6bddc4620a25 100644
--- a/packages/common/src/static/activitesTypes.ts
+++ b/packages/common/src/static/activitesTypes.ts
@@ -1,7 +1,6 @@
 import { CaminoDate, toCaminoDate } from '../date'
 import { FrequenceId } from './frequence'
 import { Section, SectionElement } from './titresTypes_demarchesTypes_etapesTypes/sections'
-import { DeepReadonly } from '../typescript-tools'
 import { z } from 'zod'
 
 const IDS = ['gra', 'grp', 'grx', 'pma', 'pmb', 'pmc', 'pmd', 'wrp'] as const
@@ -28,11 +27,11 @@ export type ActiviteType<T = ActivitesTypesId> = {
   dateDebut: CaminoDate
   delaiMois: number
   description?: string
-  sections: DeepReadonly<ActiviteSection[]>
+  sections: ActiviteSection[]
 }
 
 type SubstancesFiscalesSection = { id: 'substancesFiscales'; nom: string }
-export const isSubstancesFiscales = (section: DeepReadonly<ActiviteSection>): section is DeepReadonly<SubstancesFiscalesSection> => section.id === 'substancesFiscales'
+export const isSubstancesFiscales = (section: ActiviteSection): section is SubstancesFiscalesSection => section.id === 'substancesFiscales'
 
 export type ActiviteSection = (Omit<Section, 'elements'> & { elements: ActiviteSectionElement[] }) | SubstancesFiscalesSection
 export type ActiviteSectionElement = SectionElement & { periodeId?: 1 | 2 | 3 | 4 }
diff --git a/packages/common/src/static/administrations.ts b/packages/common/src/static/administrations.ts
index 3c3e9acaa80dbaffd24b1cc3d404e8830298addc..40f6d897eef3c796248ddd6f1b2f516ead809f5d 100644
--- a/packages/common/src/static/administrations.ts
+++ b/packages/common/src/static/administrations.ts
@@ -2,7 +2,7 @@ import { Definition } from '../definition'
 import { RegionId } from './region'
 import { DepartementId } from './departement'
 import { z } from 'zod'
-import { map } from '../typescript-tools'
+import { map, toSorted } from '../typescript-tools'
 
 const ADMINISTRATION_TYPE_IDS_ARRAY = ['aut', 'dre', 'min', 'ope', 'pre'] as const
 
@@ -1889,4 +1889,7 @@ export const Administrations: {
     },
   } // ----- ne pas supprimer cette ligne : fin
 
-export const sortedAdministrations = map(IDS, id => Administrations[id]).sort((a, b) => a.abreviation.localeCompare(b.abreviation))
+export const sortedAdministrations = toSorted(
+  map(IDS, id => Administrations[id]),
+  (a, b) => a.abreviation.localeCompare(b.abreviation)
+)
diff --git a/packages/common/src/static/documentsTypes.ts b/packages/common/src/static/documentsTypes.ts
index 429bf7f0d49b1ca18597da3aeddb9c38e2e16028..2a212684ad378c46e67e34f89a52de047709a203 100644
--- a/packages/common/src/static/documentsTypes.ts
+++ b/packages/common/src/static/documentsTypes.ts
@@ -1,5 +1,5 @@
 import { z } from 'zod'
-import { NonEmptyArray, map } from '../typescript-tools'
+import { NonEmptyArray, map, toSorted } from '../typescript-tools'
 
 export interface DocumentType {
   id: DocumentTypeId
@@ -274,7 +274,10 @@ export const DocumentsTypes: { [key in DocumentTypeId | AutreDocumentTypeId]: De
   sir: { id: 'sir', nom: 'Avis de situation au répertoire Sirene' },
 }
 
-export const sortedEntrepriseDocumentTypes = map(EntrepriseDocumentTypeIds, id => DocumentsTypes[id]).sort((a, b) => a.nom.localeCompare(b.nom))
+export const sortedEntrepriseDocumentTypes = toSorted(
+  map(EntrepriseDocumentTypeIds, id => DocumentsTypes[id]),
+  (a, b) => a.nom.localeCompare(b.nom)
+)
 export const sortedDocumentTypes = IDS_WITHOUT_AUTRE.map(id => DocumentsTypes[id]).sort((a, b) => a.nom.localeCompare(b.nom))
 
 export const isDocumentTypeId = (documentTypeId: string | null | undefined): documentTypeId is DocumentTypeId => IDS_WITHOUT_AUTRE.includes(documentTypeId)
diff --git a/packages/common/src/static/titresTypes_demarchesTypes_etapesTypes/sdom.ts b/packages/common/src/static/titresTypes_demarchesTypes_etapesTypes/sdom.ts
index c9b4d793efcd791ee9a9117a5f66522c773bb973..c3ff6d57cd437bfb57ff406caafe157447be2c6b 100644
--- a/packages/common/src/static/titresTypes_demarchesTypes_etapesTypes/sdom.ts
+++ b/packages/common/src/static/titresTypes_demarchesTypes_etapesTypes/sdom.ts
@@ -1,4 +1,3 @@
-import { DeepReadonly } from '../../typescript-tools'
 import { DEMARCHES_TYPES_IDS, DemarcheTypeId } from '../demarchesTypes'
 import { DOCUMENTS_TYPES_IDS } from '../documentsTypes'
 import { ETAPES_TYPES, EtapeTypeId } from '../etapesTypes'
@@ -6,12 +5,7 @@ import { SDOMZoneId, SDOMZoneIds } from '../sdom'
 import { TITRES_TYPES_IDS, TitreTypeId } from '../titresTypes'
 
 type DocumentTypeIdsBySdomZonesGet = 'nir' | 'jeg' | 'nip'
-export const documentTypeIdsBySdomZonesGet = (
-  sdomZones: DeepReadonly<SDOMZoneId[]>,
-  titreTypeId: TitreTypeId,
-  demarcheTypeId: DemarcheTypeId,
-  etapeTypeId: EtapeTypeId
-): DocumentTypeIdsBySdomZonesGet[] => {
+export const documentTypeIdsBySdomZonesGet = (sdomZones: SDOMZoneId[], titreTypeId: TitreTypeId, demarcheTypeId: DemarcheTypeId, etapeTypeId: EtapeTypeId): DocumentTypeIdsBySdomZonesGet[] => {
   const documentTypeIds: DocumentTypeIdsBySdomZonesGet[] = []
 
   // Pour les demandes d'octroi d'AXM
diff --git a/packages/common/src/static/titresTypes_demarchesTypes_etapesTypes/sections.ts b/packages/common/src/static/titresTypes_demarchesTypes_etapesTypes/sections.ts
index 46576882418b9d53681b0d375b9c9864933bfbe3..c880a66460e082f3632440f5b4e37767eeaf3173 100644
--- a/packages/common/src/static/titresTypes_demarchesTypes_etapesTypes/sections.ts
+++ b/packages/common/src/static/titresTypes_demarchesTypes_etapesTypes/sections.ts
@@ -3,7 +3,7 @@ import { DEMARCHES_TYPES_IDS, DemarcheTypeId } from '../demarchesTypes'
 import { TITRES_TYPES_IDS, TitreTypeId } from '../titresTypes'
 import { ETAPES_TYPES, ETAPES_WITH_AUTOMATIC_STATUTS, EtapeTypeId } from '../etapesTypes'
 import { TDEType } from './index'
-import { DeepReadonly, isNotNullNorUndefined, NonEmptyArray } from '../../typescript-tools'
+import { isNotNullNorUndefined, NonEmptyArray } from '../../typescript-tools'
 import { UniteId, uniteIdValidator, Unites } from '../unites'
 import { DeviseId, sortedDevises } from '../devise'
 import { z } from 'zod'
@@ -208,7 +208,7 @@ const EtapesTypesSections = {
       ],
     },
   ],
-} as const satisfies { [key in EtapeTypeId]?: DeepReadonly<Section[]> }
+} as const satisfies { [key in EtapeTypeId]?: Section[] }
 
 const proprietesDeLaConcession: Section[] = [
   {
@@ -959,7 +959,7 @@ const TDESections = {
 } as const satisfies {
   [titreKey in keyof TDEType]?: {
     [demarcheKey in keyof TDEType[titreKey]]?: {
-      [key in Extract<TDEType[titreKey][demarcheKey], readonly EtapeTypeId[]>[number]]?: DeepReadonly<Section[]>
+      [key in Extract<TDEType[titreKey][demarcheKey], readonly EtapeTypeId[]>[number]]?: Section[]
     }
   }
 }
@@ -1013,11 +1013,11 @@ const isEtapesTypesEtapesTypesSections = (etapeTypeId?: EtapeTypeId): etapeTypeI
   return Object.keys(EtapesTypesSections).includes(etapeTypeId)
 }
 
-export const getSections = (titreTypeId: TitreTypeId | undefined, demarcheTypeId: DemarcheTypeId | undefined, etapeTypeId: EtapeTypeId | undefined): DeepReadonly<Section[]> => {
+export const getSections = (titreTypeId: TitreTypeId | undefined, demarcheTypeId: DemarcheTypeId | undefined, etapeTypeId: EtapeTypeId | undefined): Section[] => {
   if (isNotNullNorUndefined(titreTypeId) && isNotNullNorUndefined(demarcheTypeId) && isNotNullNorUndefined(etapeTypeId)) {
-    const sections: DeepReadonly<Section>[] = []
+    const sections: Section[] = []
 
-    type TDESectionsTypesUnleashed = { [key in TitreTypeId]?: { [key in DemarcheTypeId]?: { [key in EtapeTypeId]?: DeepReadonly<Section[]> } } }
+    type TDESectionsTypesUnleashed = { [key in TitreTypeId]?: { [key in DemarcheTypeId]?: { [key in EtapeTypeId]?: Section[] } } }
 
     sections.push(...((TDESections as TDESectionsTypesUnleashed)[titreTypeId]?.[demarcheTypeId]?.[etapeTypeId] ?? []))
 
@@ -1035,7 +1035,7 @@ export const getSections = (titreTypeId: TitreTypeId | undefined, demarcheTypeId
   }
 }
 
-const getElementValeurs = (element: DeepReadonly<SelectElement>): DeepReadonly<{ id: string; nom: string }[]> => {
+const getElementValeurs = (element: SelectElement): { id: string; nom: string }[] => {
   return element.options
 }
 
@@ -1053,7 +1053,7 @@ export const getElementWithValue = (sectionsWithValue: SectionWithValue[], secti
   return null
 }
 
-export const getSectionsWithValue = (sections: DeepReadonly<Section[]>, contenu: Contenu | FlattenEtape['contenu']): SectionWithValue[] => {
+export const getSectionsWithValue = (sections: Section[], contenu: Contenu | FlattenEtape['contenu']): SectionWithValue[] => {
   const sectionsWithValue: SectionWithValue[] = []
 
   sections.forEach(section => {
diff --git a/packages/common/src/territoires.ts b/packages/common/src/territoires.ts
index c06b2a695bd7ca37555d51997a655547da66db20..d57bac978192571284b080894eead4c94ecd86e0 100644
--- a/packages/common/src/territoires.ts
+++ b/packages/common/src/territoires.ts
@@ -2,12 +2,12 @@ import { CommuneId } from './static/communes'
 import { FacadeComputed, FacadesMaritimes, getDepartementsBySecteurs, getFacade, getFacadesComputed, SecteursMaritimes } from './static/facades'
 import { DepartementId, DepartementLabel, Departements, toDepartementId } from './static/departement'
 import { RegionId, RegionLabel, Regions } from './static/region'
-import { DeepReadonly, onlyUnique, RecordPartial } from './typescript-tools'
+import { onlyUnique, RecordPartial } from './typescript-tools'
 import { PaysId } from './static/pays'
 
 export const territoiresFind = (
   communesWithName: RecordPartial<CommuneId, string>,
-  communes?: DeepReadonly<{ id: CommuneId; surface?: number | null }[]> | null | undefined,
+  communes?: { id: CommuneId; surface?: number | null }[] | null | undefined,
   secteursMaritime?: SecteursMaritimes[] | null | undefined
 ): { communes: { nom: string; surface: null | number }[]; departements: DepartementLabel[]; regions: RegionLabel[]; facades: FacadeComputed[] } => {
   const result: {
@@ -56,7 +56,7 @@ export const territoiresFind = (
 }
 
 export const territoiresIdFind = (
-  communes: DeepReadonly<{ id: CommuneId }[]>,
+  communes: { id: CommuneId }[],
   secteursMaritime: SecteursMaritimes[]
 ): { departements: DepartementId[]; regions: RegionId[]; facades: FacadesMaritimes[]; pays: PaysId[] } => {
   const departements: DepartementId[] = [...getDepartementsBySecteurs(secteursMaritime), ...communes.map(({ id }) => toDepartementId(id))].filter(onlyUnique)
diff --git a/packages/common/src/titres.ts b/packages/common/src/titres.ts
index 365314ab949e9027545ab107c956d283cdf43179..234907f957f8497efa896072a8504c657514eb07 100644
--- a/packages/common/src/titres.ts
+++ b/packages/common/src/titres.ts
@@ -9,7 +9,7 @@ import { DemarcheEtape, DemarcheEtapeFondamentale, DemarcheEtapeNonFondamentale,
 import { demarcheStatutIdValidator } from './static/demarchesStatuts'
 import { demarcheTypeIdValidator } from './static/demarchesTypes'
 import { TitreId, titreIdValidator, titreSlugValidator } from './validators/titres'
-import { DeepReadonly, isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty } from './typescript-tools'
+import { isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty } from './typescript-tools'
 import { EntrepriseId, entrepriseIdValidator } from './entreprise'
 import { isFondamentalesStatutOk } from './static/etapesStatuts'
 import { ETAPE_IS_NOT_BROUILLON, etapeIdValidator } from './etape'
@@ -168,4 +168,4 @@ export type TitreDemande = z.infer<typeof titreDemandeValidator>
 export const titreDemandeOutputValidator = z.object({ etapeId: etapeIdValidator.optional(), titreId: titreIdValidator })
 export type TitreDemandeOutput = z.infer<typeof titreDemandeOutputValidator>
 
-export const createAutomaticallyEtapeWhenCreatingTitre = (user: DeepReadonly<User>): boolean => isEntrepriseOrBureauDEtude(user)
+export const createAutomaticallyEtapeWhenCreatingTitre = (user: User): boolean => isEntrepriseOrBureauDEtude(user)
diff --git a/packages/common/src/typescript-tools.test.ts b/packages/common/src/typescript-tools.test.ts
index 74a2d716d517b95730493b3afa80c67857a23846..4313d0058edbd354c1353cf4c3f26edb4b4aadaf 100644
--- a/packages/common/src/typescript-tools.test.ts
+++ b/packages/common/src/typescript-tools.test.ts
@@ -1,14 +1,4 @@
-import {
-  exhaustiveCheck,
-  isNonEmptyArrayAndDeepReadonly,
-  isNotNullNorUndefined,
-  isNotNullNorUndefinedNorEmpty,
-  isNullOrUndefinedOrEmpty,
-  memoize,
-  onlyUnique,
-  stringArrayEquals,
-  toSorted,
-} from './typescript-tools'
+import { exhaustiveCheck, isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty, isNullOrUndefinedOrEmpty, memoize, onlyUnique, stringArrayEquals, toSorted } from './typescript-tools'
 import { Role } from './roles'
 import { AdministrationId } from './static/administrations'
 import { Departements } from './static/departement'
@@ -51,11 +41,6 @@ test('isNotNullNorUndefinedNorEmpty', () => {
   expect(isNotNullNorUndefinedNorEmpty(' a ')).toBe(true)
 })
 
-test('isNonEmptyArray', () => {
-  expect(isNonEmptyArrayAndDeepReadonly([])).toBe(false)
-  expect(isNonEmptyArrayAndDeepReadonly([1])).toBe(true)
-})
-
 test('onlyUnique', () => {
   const departements = [Departements['01'], Departements['2A'], Departements['02'], Departements['01']]
   const actual = departements.filter(onlyUnique)
diff --git a/packages/common/src/typescript-tools.ts b/packages/common/src/typescript-tools.ts
index ab39162ed36ff8bfcc1972969079b1ff5a66e031..185e60a5074337abfff00b1f855f1a84270922ec 100644
--- a/packages/common/src/typescript-tools.ts
+++ b/packages/common/src/typescript-tools.ts
@@ -6,17 +6,18 @@ export function isNotNullNorUndefined<T>(value: T | null | undefined): value is
 }
 
 // @ts-ignore faisons confiance à notre code
-export function toSorted<U>(value: DeepReadonly<U[]>, comparator?: (a: DeepReadonly<U>, b: DeepReadonly<U>) => number): DeepReadonly<U[]>
+export function toSorted<U>(value: Readonly<NonEmptyArray<U>>, comparator?: (a: U, b: U) => number): Readonly<NonEmptyArray<U>>
+// @ts-ignore faisons confiance à notre code
+export function toSorted<U>(value: Readonly<U[]>, comparator?: (a: U, b: U) => number): Readonly<U[]>
 export function toSorted<U>(value: NonEmptyArray<U>, comparator?: (a: U, b: U) => number): NonEmptyArray<U>
 export function toSorted<U>(value: U[], comparator?: (a: U, b: U) => number): U[]
 export function toSorted<U>(value: U[], comparator?: (a: U, b: U) => number): U[] {
   return [...value].sort(comparator)
 }
 
-export function isNotNullNorUndefinedNorEmpty<U>(value: DeepReadonly<U[]> | null | undefined): value is DeepReadonly<NonEmptyArray<U>>
 export function isNotNullNorUndefinedNorEmpty<U>(value: U[] | null | undefined): value is NonEmptyArray<U>
 export function isNotNullNorUndefinedNorEmpty(value: string | null | undefined): value is string
-export function isNotNullNorUndefinedNorEmpty(value: string | DeepReadonly<any[]> | null | undefined): boolean {
+export function isNotNullNorUndefinedNorEmpty(value: string | any[] | null | undefined): boolean {
   if (Array.isArray(value)) {
     if (!isNullOrUndefined(value)) {
       return isNonEmptyArray(value)
@@ -28,10 +29,9 @@ export function isNotNullNorUndefinedNorEmpty(value: string | DeepReadonly<any[]
   return false
 }
 
-export function isNullOrUndefinedOrEmpty<U>(value: DeepReadonly<U[]> | null | undefined): value is null | undefined
-export function isNullOrUndefinedOrEmpty<U>(value: U[] | null | undefined): value is null | undefined
+export function isNullOrUndefinedOrEmpty<U>(value: Readonly<U[]> | null | undefined): value is null | undefined
 export function isNullOrUndefinedOrEmpty(value: string | null | undefined): value is null | undefined
-export function isNullOrUndefinedOrEmpty(value: string | DeepReadonly<any[]> | null | undefined): boolean {
+export function isNullOrUndefinedOrEmpty(value: string | Readonly<any[]> | null | undefined): boolean {
   if (value === null || value === undefined) {
     return true
   }
@@ -71,62 +71,16 @@ export const getEntries = <T extends string, U>(object: Record<T, U>, filter: (k
 // @ts-ignore use with caution
 export const getEntriesHardcore = <T extends string, U>(object: Record<T, U>): [T, U][] => Object.entries<U>(object)
 
-declare const RefSymbol: unique symbol
-interface Ref<T = any> {
-  value: T
-  /**
-   * Type differentiator only.
-   * We need this to be in public d.ts but don't want it to show up in IDE
-   * autocomplete, so we use a private Symbol instead.
-   */
-  [RefSymbol]: true
-}
-
-// export type DeepReadonly<T> = {
-//   readonly [K in keyof T]: DeepReadonly<T[K]>
-// }
-
-type Primitive = string | number | boolean | bigint | symbol | undefined | null
-type Builtin = Primitive | Function | Date | Error | RegExp // eslint-disable-line
-// DeepReadonly from vue
-export type DeepReadonly<T> = T extends Builtin
-  ? T
-  : T extends Map<infer K, infer V>
-    ? ReadonlyMap<DeepReadonly<K>, DeepReadonly<V>>
-    : T extends ReadonlyMap<infer K, infer V>
-      ? ReadonlyMap<DeepReadonly<K>, DeepReadonly<V>>
-      : T extends WeakMap<infer K, infer V>
-        ? WeakMap<DeepReadonly<K>, DeepReadonly<V>>
-        : T extends Set<infer U>
-          ? ReadonlySet<DeepReadonly<U>>
-          : T extends ReadonlySet<infer U>
-            ? ReadonlySet<DeepReadonly<U>>
-            : T extends WeakSet<infer U>
-              ? WeakSet<DeepReadonly<U>>
-              : T extends Promise<infer U>
-                ? Promise<DeepReadonly<U>>
-                : T extends Ref<infer U>
-                  ? Readonly<Ref<DeepReadonly<U>>>
-                  : T extends {} // eslint-disable-line
-                    ? {
-                        readonly [K in keyof T]: DeepReadonly<T[K]>
-                      }
-                    : Readonly<T>
-
 export const exhaustiveCheck = (param: never): never => {
   throw new Error(`Unreachable case: ${JSON.stringify(param)}`)
 }
 
 export type NonEmptyArray<T> = [T, ...T[]]
-export const isNonEmptyArrayAndDeepReadonly = <T>(arr: DeepReadonly<T[]>): arr is DeepReadonly<NonEmptyArray<T>> => {
-  return arr.length > 0
-}
-
 export const isNonEmptyArray = <T>(arr: T[]): arr is NonEmptyArray<T> => {
   return arr.length > 0
 }
 
-export const map = <T, U>(array: DeepReadonly<NonEmptyArray<T>>, transform: (item: DeepReadonly<T>) => U): NonEmptyArray<U> => {
+export const map = <T, U>(array: Readonly<NonEmptyArray<T>>, transform: (item: T) => U): Readonly<NonEmptyArray<U>> => {
   const [first, ...rest] = array
 
   return [transform(first), ...rest.map(transform)]
diff --git a/packages/ui/src/api/client-rest.ts b/packages/ui/src/api/client-rest.ts
index b7bff701badf618033ac87ab46689117bb765420..89a5acfde5ca078010016b7843d10b5bdd92cb6c 100644
--- a/packages/ui/src/api/client-rest.ts
+++ b/packages/ui/src/api/client-rest.ts
@@ -16,7 +16,6 @@ import {
 } from 'camino-common/src/rest'
 import { isNotNullNorUndefined } from 'camino-common/src/typescript-tools'
 import { CaminoError } from 'camino-common/src/zod-tools'
-import { DeepReadonly } from 'vue'
 import { ZodType, z } from 'zod'
 
 type Loading = { status: 'LOADING' }
@@ -158,13 +157,13 @@ export const newPostWithJson = async <T extends NewPostRestRoutes>(
 export const putWithJson = async <T extends PutRestRoutes>(
   path: T,
   params: CaminoRestParams<T>,
-  body: DeepReadonly<z.infer<(typeof CaminoRestRoutes)[T]['put']['input']>>
+  body: z.infer<(typeof CaminoRestRoutes)[T]['put']['input']>
 ): Promise<z.infer<(typeof CaminoRestRoutes)[T]['put']['output']>> => callFetch(path, params, 'put', {}, body)
 
 export const newPutWithJson = async <T extends NewPutRestRoutes>(
   path: T,
   params: CaminoRestParams<T>,
-  body: DeepReadonly<z.infer<(typeof CaminoRestRoutes)[T]['newPut']['input']>>
+  body: z.infer<(typeof CaminoRestRoutes)[T]['newPut']['input']>
 ): Promise<CaminoError<string> | z.infer<(typeof CaminoRestRoutes)[T]['newPut']['output']>> => {
   try {
     const url = getUiRestRoute(path, params, {})
diff --git a/packages/ui/src/components/_common/dsfr-perimetre-table.tsx b/packages/ui/src/components/_common/dsfr-perimetre-table.tsx
index c26e5d129a2848913e4c20d3012b40ed7e9434de..febbb10141689700ea11627a5b8c98ed6fd2f35b 100644
--- a/packages/ui/src/components/_common/dsfr-perimetre-table.tsx
+++ b/packages/ui/src/components/_common/dsfr-perimetre-table.tsx
@@ -1,6 +1,6 @@
 import { contentTypes } from 'camino-common/src/rest'
 import { GeoSysteme, GeoSystemes, GeoSystemeId } from 'camino-common/src/static/geoSystemes'
-import { DeepReadonly, defineComponent, FunctionalComponent } from 'vue'
+import { defineComponent, FunctionalComponent } from 'vue'
 import { DsfrLink } from '../_ui/dsfr-button'
 import { TableRow, TextColumnData } from '../_ui/table'
 import { TableAuto, Column } from '../_ui/table-auto'
@@ -12,8 +12,8 @@ import { NotNullableKeys, isNotNullNorUndefined } from 'camino-common/src/typesc
 import { GeoSystemeTypeahead } from './geosysteme-typeahead'
 
 interface Props {
-  geojson_origine_points: DeepReadonly<FeatureCollectionPoints>
-  geojson_origine_forages: DeepReadonly<FeatureCollectionForages> | null
+  geojson_origine_points: FeatureCollectionPoints
+  geojson_origine_forages: FeatureCollectionForages | null
   geo_systeme_id: GeoSystemeId
   surface: KM2 | null
   titreSlug: TitreSlug
@@ -26,7 +26,7 @@ const labels = {
   gon: { x: 'longitude', y: 'latitude' },
 } as const satisfies Record<GeoSysteme['uniteId'], { x: string; y: string }>
 
-const geoJsonToArray = (perimetre: DeepReadonly<FeatureCollectionPoints | FeatureCollectionForages>): TableRow<string>[] => {
+const geoJsonToArray = (perimetre: FeatureCollectionPoints | FeatureCollectionForages): TableRow<string>[] => {
   return perimetre.features.map<TableRow<string>>((feature, index) => {
     const x_deg = toDegresMinutes(feature.geometry.coordinates[0])
     const y_deg = toDegresMinutes(feature.geometry.coordinates[1])
@@ -161,7 +161,7 @@ export const TabCaminoTable = defineComponent<Props>(props => {
 // @ts-ignore waiting for https://github.com/vuejs/core/issues/7833
 TabCaminoTable.props = ['geojson_origine_points', 'geojson_origine_forages', 'geo_systeme_id', 'titreSlug', 'maxRows', 'surface']
 
-export const transformMultipolygonToPoints = (geojson_perimetre: DeepReadonly<FeatureMultiPolygon>): DeepReadonly<FeatureCollectionPoints> => {
+export const transformMultipolygonToPoints = (geojson_perimetre: FeatureMultiPolygon): FeatureCollectionPoints => {
   const currentPoints: (FeatureCollectionPoints['features'][0] & { properties: { latitude: string; longitude: string } })[] = []
   let index = 0
   geojson_perimetre.geometry.coordinates.forEach((topLevel, topLevelIndex) =>
diff --git a/packages/ui/src/components/_common/dsfr-perimetre.tsx b/packages/ui/src/components/_common/dsfr-perimetre.tsx
index 110c67c7de9973466b5d3bd3779095f7f4c998eb..90424fc84386ced3fc79241f6857c7474b0592a2 100644
--- a/packages/ui/src/components/_common/dsfr-perimetre.tsx
+++ b/packages/ui/src/components/_common/dsfr-perimetre.tsx
@@ -1,4 +1,4 @@
-import { defineComponent, HTMLAttributes, defineAsyncComponent, computed, DeepReadonly } from 'vue'
+import { defineComponent, HTMLAttributes, defineAsyncComponent, computed } from 'vue'
 import { Tab, Tabs } from '../_ui/tabs'
 import { TitreSlug } from 'camino-common/src/validators/titres'
 import { FeatureCollection, FeatureCollectionForages, FeatureCollectionPoints, FeatureMultiPolygon } from 'camino-common/src/perimetre'
@@ -14,7 +14,7 @@ import { CaminoRouter } from '@/typings/vue-router'
 export type TabId = 'carte' | 'points'
 
 type Props = {
-  perimetre: DeepReadonly<{
+  perimetre: {
     geojson4326_perimetre: FeatureMultiPolygon
     geojson4326_points: FeatureCollectionPoints | null
     geojson_origine_geo_systeme_id: GeoSystemeId
@@ -23,7 +23,7 @@ type Props = {
     geojson4326_forages: FeatureCollectionForages | null
     geojson_origine_forages: FeatureCollectionForages | null
     surface: KM2 | null
-  }>
+  }
   titreSlug: TitreSlug
   titreTypeId: TitreTypeId
   initTab?: TabId
@@ -37,14 +37,14 @@ const maxRows = 20
  *
  */
 export const DsfrPerimetre = defineComponent<Props>((props: Props) => {
-  const geojson4326Points = computed<DeepReadonly<FeatureCollectionPoints>>(() => {
+  const geojson4326Points = computed<FeatureCollectionPoints>(() => {
     if (isNotNullNorUndefined(props.perimetre.geojson4326_points)) {
       return props.perimetre.geojson4326_points
     }
 
     return transformMultipolygonToPoints(props.perimetre.geojson4326_perimetre)
   })
-  const geojsonOriginePoints = computed<DeepReadonly<FeatureCollectionPoints>>(() => {
+  const geojsonOriginePoints = computed<FeatureCollectionPoints>(() => {
     if (isNotNullNorUndefined(props.perimetre.geojson_origine_points)) {
       return props.perimetre.geojson_origine_points
     }
@@ -80,7 +80,7 @@ export const DsfrPerimetre = defineComponent<Props>((props: Props) => {
 })
 
 type TabCaminoMapProps = OmitDistributive<Props, 'perimetre'> & {
-  perimetre: DeepReadonly<{
+  perimetre: {
     geojson4326_perimetre: FeatureMultiPolygon
     geojson4326_points: FeatureCollectionPoints
     geojson_origine_geo_systeme_id: GeoSystemeId
@@ -88,7 +88,7 @@ type TabCaminoMapProps = OmitDistributive<Props, 'perimetre'> & {
     geojson_origine_points: FeatureCollectionPoints
     geojson4326_forages: FeatureCollectionForages | null
     surface: KM2 | null
-  }>
+  }
 }
 const TabCaminoMap = defineComponent<TabCaminoMapProps>(props => {
   const neighbours = props.calculateNeighbours ? { apiClient: props.apiClient, titreSlug: props.titreSlug, router: props.router } : null
@@ -99,14 +99,14 @@ const TabCaminoMap = defineComponent<TabCaminoMapProps>(props => {
     return DemarcheMap
   })
 
-  const geojson_origine = computed<DeepReadonly<FeatureCollection>>(() => ({
+  const geojson_origine = computed<FeatureCollection>(() => ({
     type: 'FeatureCollection',
     crs: { type: 'name', properties: { name: `urn:ogc:def:crs:EPSG::${props.perimetre.geojson_origine_geo_systeme_id}` } },
     properties: null,
     features: [props.perimetre.geojson_origine_perimetre, ...props.perimetre.geojson_origine_points.features],
   }))
 
-  const geojson_4326 = computed<DeepReadonly<FeatureCollection>>(() => ({
+  const geojson_4326 = computed<FeatureCollection>(() => ({
     type: 'FeatureCollection',
     crs: { type: 'name', properties: { name: 'urn:ogc:def:crs:EPSG::4326' } },
     properties: null,
diff --git a/packages/ui/src/components/_common/new-sections-edit.stories.tsx b/packages/ui/src/components/_common/new-sections-edit.stories.tsx
index b1c228f1e86b0e693041cb17ff6c3bc8013abb30..1ba5c035ad7aa27045a5c4be8fcc08254f87c811 100644
--- a/packages/ui/src/components/_common/new-sections-edit.stories.tsx
+++ b/packages/ui/src/components/_common/new-sections-edit.stories.tsx
@@ -6,7 +6,7 @@ import { UNITES, Unite, Unites } from 'camino-common/src/static/unites'
 import { ActiviteSectionElement, ActivitesTypes, isSubstancesFiscales } from 'camino-common/src/static/activitesTypes'
 import { getSectionsWithValue, sectionDureeIds } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections'
 import { SubstancesFiscale } from 'camino-common/src/static/substancesFiscales'
-import { DeepReadonly, NonEmptyArray } from 'camino-common/src/typescript-tools'
+import { NonEmptyArray } from 'camino-common/src/typescript-tools'
 
 const meta: Meta = {
   title: 'Components/Common/SectionsEdit',
@@ -524,7 +524,7 @@ export const ToutesLesActivites: StoryFn = () => (
                         ...section,
                         elements: [SubstancesFiscale.auru].map(sf => {
                           const unite = Unites[sf.uniteId]
-                          const element: DeepReadonly<ActiviteSectionElement> = {
+                          const element: ActiviteSectionElement = {
                             id: sf.id,
                             nom: `${sf.nom}`,
                             type: 'number',
diff --git a/packages/ui/src/components/_common/new-sections-edit.tsx b/packages/ui/src/components/_common/new-sections-edit.tsx
index 7e7d26048a88bf5941cac7c8b265f359e07785b9..5a4914a41905ed2bc269909f2a057725d9f9c607 100644
--- a/packages/ui/src/components/_common/new-sections-edit.tsx
+++ b/packages/ui/src/components/_common/new-sections-edit.tsx
@@ -1,4 +1,4 @@
-import { defineComponent, ref, watch, DeepReadonly, FunctionalComponent } from 'vue'
+import { defineComponent, ref, watch, FunctionalComponent } from 'vue'
 import { ElementWithValue, isNumberElement, isRadioElement, SectionWithValue } from 'camino-common/src/sections'
 import { exhaustiveCheck, isNonEmptyArray, isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty, isNullOrUndefined } from 'camino-common/src/typescript-tools'
 import { numberFormat } from 'camino-common/src/number'
@@ -14,13 +14,13 @@ import { useState } from '../../utils/vue-tsx-utils'
 import { CaminoDate, dateAddDays, dateFormat } from 'camino-common/src/date'
 import { sectionDureeIds } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections'
 interface Props {
-  sectionsWithValue: DeepReadonly<SectionWithValue[]>
+  sectionsWithValue: SectionWithValue[]
   completeUpdate: (complete: boolean, newContenu: Props['sectionsWithValue']) => void
   etapeDate: CaminoDate | null
 }
 
 export const SectionsEdit = defineComponent<Props>(props => {
-  const [sectionsWithValue, setSectionsWithValue] = useState<DeepReadonly<SectionWithValue[]>>([])
+  const [sectionsWithValue, setSectionsWithValue] = useState<SectionWithValue[]>([])
 
   watch(
     () => props.sectionsWithValue,
@@ -31,8 +31,8 @@ export const SectionsEdit = defineComponent<Props>(props => {
     { immediate: true }
   )
 
-  const onValueChange = (elementIndex: number, sectionIndex: number) => (elementWithValue: DeepReadonly<ElementWithValue>) => {
-    const newSectionsWithValue: DeepReadonly<SectionWithValue[]> = sectionsWithValue.value.map((section, index) => {
+  const onValueChange = (elementIndex: number, sectionIndex: number) => (elementWithValue: ElementWithValue) => {
+    const newSectionsWithValue: SectionWithValue[] = sectionsWithValue.value.map((section, index) => {
       if (index === sectionIndex) {
         return {
           ...section,
@@ -78,13 +78,13 @@ export const SectionsEdit = defineComponent<Props>(props => {
 SectionsEdit.props = ['sectionsWithValue', 'completeUpdate', 'etapeDate']
 
 interface SectionElementEditProps {
-  element: DeepReadonly<ElementWithValue>
+  element: ElementWithValue
   onValueChange: (value: SectionElementEditProps['element']) => void
   sectionId: string
   etapeDate: CaminoDate | null
 }
 
-export const getInfo = (element: DeepReadonly<ElementWithValue>, sectionId: string, etapeDate: CaminoDate | null): string => {
+export const getInfo = (element: ElementWithValue, sectionId: string, etapeDate: CaminoDate | null): string => {
   if (isNotNullNorUndefined(element.value)) {
     if (element.id === 'volumeGranulatsExtrait' && isNumberElement(element)) {
       return `Soit l’équivalent de ${numberFormat(element.value * 1.5)} tonnes`
@@ -105,7 +105,7 @@ export const getInfo = (element: DeepReadonly<ElementWithValue>, sectionId: stri
 export const SectionElementEdit = defineComponent<SectionElementEditProps>(props => {
   const complete = ref<boolean>(sectionElementWithValueCompleteValidate(props.element))
 
-  const onValueChange = (value: DeepReadonly<ElementWithValue>) => {
+  const onValueChange = (value: ElementWithValue) => {
     complete.value = sectionElementWithValueCompleteValidate(value)
     props.onValueChange(value)
   }
diff --git a/packages/ui/src/components/_ui/dsfr-input-checkboxes.tsx b/packages/ui/src/components/_ui/dsfr-input-checkboxes.tsx
index 89bc2ad3e9d3bfea261bd494e0fd249e671c6e1a..a537d7e008dfad7bb3e3ba8e78dd036b425d122d 100644
--- a/packages/ui/src/components/_ui/dsfr-input-checkboxes.tsx
+++ b/packages/ui/src/components/_ui/dsfr-input-checkboxes.tsx
@@ -1,22 +1,22 @@
 import { random } from '@/utils/vue-tsx-utils'
 import { DsfrInputCheckbox, Props as InputCheckboxProps } from './dsfr-input-checkbox'
 import { Ref, defineComponent, ref, watch } from 'vue'
-import { DeepReadonly, isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools'
+import { isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools'
 
 type Props<T extends string> = {
   id?: string
   legend: { main: string; description?: string }
   disabled?: boolean
-  valueChanged: (values: DeepReadonly<T[]>) => void
+  valueChanged: (values: T[]) => void
   size?: 'sm' | 'md'
-  elements: (Omit<InputCheckboxProps, 'disabled' | 'id' | 'valueChanged' | 'initialValue'> & { itemId: DeepReadonly<T> })[]
-  initialCheckedValue: DeepReadonly<NoInfer<T>[]>
+  elements: (Omit<InputCheckboxProps, 'disabled' | 'id' | 'valueChanged' | 'initialValue'> & { itemId: T })[]
+  initialCheckedValue: NoInfer<T[]>
 }
 
 export const DsfrInputCheckboxes = defineComponent(<T extends string>(props: Props<T>) => {
   const id = props.id ?? `checkboxes_${(random() * 1000).toFixed()}`
 
-  const values = ref<DeepReadonly<T[]>>(props.elements.filter(element => props.initialCheckedValue.includes(element.itemId)).map(({ itemId }) => itemId)) as Ref<DeepReadonly<T[]>>
+  const values = ref<T[]>(props.elements.filter(element => props.initialCheckedValue.includes(element.itemId)).map(({ itemId }) => itemId)) as Ref<T[]>
   watch(
     () => props.elements,
     () => {
@@ -36,7 +36,7 @@ export const DsfrInputCheckboxes = defineComponent(<T extends string>(props: Pro
     { deep: true }
   )
 
-  const updateCheckbox = (itemId: DeepReadonly<T>) => (checked: boolean) => {
+  const updateCheckbox = (itemId: T) => (checked: boolean) => {
     if (checked) {
       values.value = [...values.value, itemId]
     } else {
diff --git a/packages/ui/src/components/_ui/dsfr-select.tsx b/packages/ui/src/components/_ui/dsfr-select.tsx
index b843be77fbd4701af5b15c10530880129d17a8c7..61ff1d06149e3e18d13938def4e920600b5724da 100644
--- a/packages/ui/src/components/_ui/dsfr-select.tsx
+++ b/packages/ui/src/components/_ui/dsfr-select.tsx
@@ -1,19 +1,19 @@
 import { NonEmptyArray, isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools'
 import { isEventWithTarget, random } from '../../utils/vue-tsx-utils'
-import { DeepReadonly, HTMLAttributes } from 'vue'
+import { HTMLAttributes } from 'vue'
 import type { JSX } from 'vue/jsx-runtime'
 export type Item<T> = { id: T; label: string; disabled?: boolean }
-type Props<T, Items extends DeepReadonly<NonEmptyArray<Item<T>>>> = {
+type Props<T, Items extends Readonly<NonEmptyArray<Item<T>>>> = {
   id?: string
   items: Items
   legend: { main: string; visible?: boolean; description?: string; placeholder?: string }
   initialValue: Items[number]['id'] | null
   required?: boolean
   disabled?: boolean
-  valueChanged: (id: DeepReadonly<Items[number]['id'] | null>) => void
+  valueChanged: (id: NoInfer<Items>[number]['id'] | null) => void
 } & HTMLAttributes
 
-export const DsfrSelect = <T, Items extends DeepReadonly<NonEmptyArray<Item<T>>>>(props: Props<T, Items>): JSX.Element => {
+export const DsfrSelect = <T, Items extends Readonly<NonEmptyArray<Item<T>>>>(props: Props<T, Items>): JSX.Element => {
   const id = props.id ?? `select_${(random() * 1000).toFixed()}`
 
   return (
@@ -32,7 +32,7 @@ export const DsfrSelect = <T, Items extends DeepReadonly<NonEmptyArray<Item<T>>>
         disabled={props.disabled ?? false}
         name={id}
         value={props.initialValue}
-        onChange={event => (isEventWithTarget(event) ? props.valueChanged(event.target.value as DeepReadonly<Items[number]['id']>) : null)}
+        onChange={event => (isEventWithTarget(event) ? props.valueChanged(event.target.value as Items[number]['id']) : null)}
       >
         {props.items.map(({ id, label, disabled }) => (
           <option value={id} selected={props.initialValue === id} disabled={disabled}>
diff --git a/packages/ui/src/components/_ui/filters/filters.tsx b/packages/ui/src/components/_ui/filters/filters.tsx
index eac35d776d543fba0f8a52a108267f065e68492f..55f3636bfcff9a33cfc62304bcbc2788d2340b1a 100644
--- a/packages/ui/src/components/_ui/filters/filters.tsx
+++ b/packages/ui/src/components/_ui/filters/filters.tsx
@@ -182,7 +182,7 @@ export const Filters = defineComponent((props: Props) => {
       }
       if ((filterType.type === 'autocomplete' || filterType.type === 'checkboxes') && isNotNullNorUndefined(nonValidatedValues.value[filter])) {
         return nonValidatedValues.value[filterType.id].map<FormatedLabel>(v => {
-          let elements: { id: string; nom: string }[] = []
+          let elements: Readonly<{ id: string; nom: string }[]> = []
           if (filterType.id === 'titresIds') {
             elements = titresIds.elements
           } else if (filterType.id === 'entreprisesIds') {
diff --git a/packages/ui/src/components/_ui/typeahead-single.tsx b/packages/ui/src/components/_ui/typeahead-single.tsx
index 745e341bce36c4b4d1b868fb7514907672e2b168..5db617e21d55cb8f7c3168bde0e3107cded5efa3 100644
--- a/packages/ui/src/components/_ui/typeahead-single.tsx
+++ b/packages/ui/src/components/_ui/typeahead-single.tsx
@@ -1,11 +1,11 @@
 import { computed, Ref, ref, watch, defineComponent } from 'vue'
 import styles from './typeahead.module.css'
 import { isEventWithTarget, random } from '@/utils/vue-tsx-utils'
-import { DeepReadonly, isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools'
+import { isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools'
 import type { JSX } from 'vue/jsx-runtime'
 type TypeAheadRecord = Record<string | symbol | number, any>
 
-type Props<T extends DeepReadonly<TypeAheadRecord>, K extends keyof DeepReadonly<T>> = {
+type Props<T extends TypeAheadRecord, K extends keyof T> = {
   overrideItem: (Pick<T, K> & Partial<Omit<T, K>>) | null
   disabled?: boolean
   props: {
@@ -22,7 +22,7 @@ type Props<T extends DeepReadonly<TypeAheadRecord>, K extends keyof DeepReadonly
   }
 }
 
-export const TypeAheadSingle = defineComponent(<T extends DeepReadonly<TypeAheadRecord>, K extends keyof DeepReadonly<T>>(props: Props<T, K>) => {
+export const TypeAheadSingle = defineComponent(<T extends TypeAheadRecord, K extends keyof T>(props: Props<T, K>) => {
   const id = props.props.id ?? `typeahead_${(random() * 1000).toFixed()}`
   const wrapperId = computed(() => `${id}_wrapper`)
   const getItem = (item: (Pick<T, K> & Partial<Omit<T, K>>) | null): T | null =>
diff --git a/packages/ui/src/components/_ui/typeahead-smart-single.tsx b/packages/ui/src/components/_ui/typeahead-smart-single.tsx
index fdf321eec01b5a816b12e371ce8d42c4ed3dd414..0a09e38d0dfd004803cb83a1968437d085497eaf 100644
--- a/packages/ui/src/components/_ui/typeahead-smart-single.tsx
+++ b/packages/ui/src/components/_ui/typeahead-smart-single.tsx
@@ -1,26 +1,26 @@
 import { Ref, computed, defineComponent, ref } from 'vue'
 import { TypeAheadSingle } from './typeahead-single'
-import { DeepReadonly, isNotNullNorUndefined } from 'camino-common/src/typescript-tools'
+import { isNotNullNorUndefined } from 'camino-common/src/typescript-tools'
 
 type Props<T extends string> = {
   alwaysOpen?: boolean
-  possibleValues: DeepReadonly<TypeaheadValue<T>>[]
-  initialValue?: DeepReadonly<NoInfer<T>>
-  valueIdSelected: (valueId: DeepReadonly<NoInfer<T>> | null) => void
+  possibleValues: TypeaheadValue<T>[]
+  initialValue?: NoInfer<T>
+  valueIdSelected: (valueId: NoInfer<T> | null) => void
 }
 
 type TypeaheadValue<T> = { id: T; nom: string }
 
 export const TypeaheadSmartSingle = defineComponent(<T extends string>(props: Props<T>) => {
-  const valueTypeSelected = ref<DeepReadonly<TypeaheadValue<T>> | null>(props.possibleValues.find(({ id }) => props.initialValue === id) ?? null) as Ref<DeepReadonly<TypeaheadValue<T>> | null>
-  const onValueUpdate = async (value: DeepReadonly<TypeaheadValue<T>> | undefined) => {
+  const valueTypeSelected = ref<TypeaheadValue<T> | null>(props.possibleValues.find(({ id }) => props.initialValue === id) ?? null) as Ref<TypeaheadValue<T> | null>
+  const onValueUpdate = async (value: TypeaheadValue<T> | undefined) => {
     valueTypeSelected.value = value ?? null
     props.valueIdSelected(isNotNullNorUndefined(value) ? value.id : null)
   }
 
-  const sortedByUs = computed<DeepReadonly<TypeaheadValue<T>>[]>(() => [...props.possibleValues].sort((a, b) => a.nom.localeCompare(b.nom)))
+  const sortedByUs = computed<TypeaheadValue<T>[]>(() => [...props.possibleValues].sort((a, b) => a.nom.localeCompare(b.nom)))
 
-  const valuesFiltered = ref<DeepReadonly<TypeaheadValue<T>>[]>(sortedByUs.value) as Ref<DeepReadonly<TypeaheadValue<T>>[]>
+  const valuesFiltered = ref<TypeaheadValue<T>[]>(sortedByUs.value) as Ref<TypeaheadValue<T>[]>
   const onInput = (search: string) => {
     const formatedSearch = search.trim().toLowerCase()
 
diff --git a/packages/ui/src/components/activite-edition.tsx b/packages/ui/src/components/activite-edition.tsx
index 9419c2488a68d105c2b076dcce7a3985022a8329..a53ec8d35c278fc093d357e40eb72b645431ee73 100644
--- a/packages/ui/src/components/activite-edition.tsx
+++ b/packages/ui/src/components/activite-edition.tsx
@@ -1,6 +1,6 @@
 import { ActiviteDocumentsEdit } from './activite/activite-documents-edit'
 import { getPeriode } from 'camino-common/src/static/frequence'
-import { DeepReadonly, computed, defineComponent, onBeforeUnmount, onMounted, ref } from 'vue'
+import { computed, defineComponent, onBeforeUnmount, onMounted, ref } from 'vue'
 import { AsyncData } from '@/api/client-rest'
 import { Activite, ActiviteDocumentId, ActiviteId, ActiviteIdOrSlug, TempActiviteDocument, activiteIdOrSlugValidator } from 'camino-common/src/activite'
 import { useRouter } from 'vue-router'
@@ -55,7 +55,7 @@ export const PureActiviteEdition = defineComponent<Props>(props => {
     activiteDocumentIds: [],
     tempsDocuments: [],
   })
-  const sectionsComplete = ref<{ complete: boolean; sectionsWithValue: DeepReadonly<SectionWithValue[]> }>({ complete: false, sectionsWithValue: [] })
+  const sectionsComplete = ref<{ complete: boolean; sectionsWithValue: SectionWithValue[] }>({ complete: false, sectionsWithValue: [] })
 
   const data = ref<AsyncData<Activite>>({ status: 'LOADING' })
 
@@ -126,7 +126,7 @@ export const PureActiviteEdition = defineComponent<Props>(props => {
     documentsComplete.value = { complete, activiteDocumentIds, tempsDocuments }
   }
 
-  const sectionsUpdate = (complete: boolean, sectionsWithValue: DeepReadonly<SectionWithValue[]>) => {
+  const sectionsUpdate = (complete: boolean, sectionsWithValue: SectionWithValue[]) => {
     sectionsComplete.value = { complete, sectionsWithValue }
   }
 
diff --git a/packages/ui/src/components/activite/activite-api-client.ts b/packages/ui/src/components/activite/activite-api-client.ts
index 4a4374c4f3c2c82fd4c66502a5d43ec1f8054727..ca9de4ddf11dfe4d292af76242c8c18ed7a2055d 100644
--- a/packages/ui/src/components/activite/activite-api-client.ts
+++ b/packages/ui/src/components/activite/activite-api-client.ts
@@ -6,7 +6,6 @@ import { ActivitesTypesId } from 'camino-common/src/static/activitesTypes'
 import gql from 'graphql-tag'
 import { deleteWithJson, getWithJson, putWithJson } from '../../api/client-rest'
 import { SectionWithValue } from 'camino-common/src/sections'
-import { DeepReadonly } from 'vue'
 import { EntrepriseId } from 'camino-common/src/entreprise'
 
 export interface UiGraphqlActivite {
@@ -31,7 +30,7 @@ export interface ActiviteApiClient {
   updateActivite: (
     activiteId: ActiviteId,
     activiteTypeId: ActivitesTypesId,
-    sectionsWithValue: DeepReadonly<SectionWithValue[]>,
+    sectionsWithValue: SectionWithValue[],
     activiteDocumentIds: ActiviteDocumentId[],
     newTempDocuments: TempActiviteDocument[]
   ) => Promise<void>
@@ -122,7 +121,7 @@ export const activiteApiClient: ActiviteApiClient = {
   updateActivite: async (
     activiteId: ActiviteId,
     _activiteTypeId: ActivitesTypesId,
-    sectionsWithValue: DeepReadonly<SectionWithValue[]>,
+    sectionsWithValue: SectionWithValue[],
     activiteDocumentIds: ActiviteDocumentId[],
     newTempDocuments: TempActiviteDocument[]
   ) => {
diff --git a/packages/ui/src/components/demarche/demarche-map-layer-controls.tsx b/packages/ui/src/components/demarche/demarche-map-layer-controls.tsx
index cabfc62e8b12605473f5d7f280d02d4a495abb09..b58c3a51eb768f0dda65ea78e5832a1f28aa2843 100644
--- a/packages/ui/src/components/demarche/demarche-map-layer-controls.tsx
+++ b/packages/ui/src/components/demarche/demarche-map-layer-controls.tsx
@@ -1,4 +1,4 @@
-import { HTMLAttributes, defineComponent, computed, DeepReadonly } from 'vue'
+import { HTMLAttributes, defineComponent, computed } from 'vue'
 import 'maplibre-gl/dist/maplibre-gl.css'
 import { DsfrSeparator } from '../_ui/dsfr-separator'
 import { useState } from '@/utils/vue-tsx-utils'
@@ -87,7 +87,7 @@ export const LayersControl = defineComponent<LayersControlProps>(props => {
     props.setLayer(layer)
   }
 
-  const checkboxValueChanged = (overlayLayerNames: DeepReadonly<OverlayName[]>) => {
+  const checkboxValueChanged = (overlayLayerNames: OverlayName[]) => {
     updateSelectedLayers(overlayLayerNames)
     props.selectedOverlayLayerNames(overlayLayerNames)
   }
diff --git a/packages/ui/src/components/demarche/demarche-map.tsx b/packages/ui/src/components/demarche/demarche-map.tsx
index 637f0ebfef0ebb08489527f83344fb1af9a9e458..595b259aee5bc32d3b44e644472486002538c1df 100644
--- a/packages/ui/src/components/demarche/demarche-map.tsx
+++ b/packages/ui/src/components/demarche/demarche-map.tsx
@@ -1,4 +1,4 @@
-import { HTMLAttributes, defineComponent, onMounted, ref, Ref, computed, watch, onUnmounted, DeepReadonly } from 'vue'
+import { HTMLAttributes, defineComponent, onMounted, ref, Ref, computed, watch, onUnmounted } from 'vue'
 import { FullscreenControl, Map, NavigationControl, StyleSpecification, LayerSpecification, LngLatBounds, SourceSpecification, Popup } from 'maplibre-gl'
 import 'maplibre-gl/dist/maplibre-gl.css'
 import { FeatureCollectionForages, FeatureCollectionPoints, FeatureMultiPolygon, ForageType, featureForagePropertiesValidator } from 'camino-common/src/perimetre'
@@ -35,7 +35,7 @@ import {
 import { CaminoRouter } from '@/typings/vue-router'
 
 type Props = {
-  perimetre: DeepReadonly<{ geojson4326_perimetre: FeatureMultiPolygon; geojson4326_points: FeatureCollectionPoints; geojson4326_forages: FeatureCollectionForages | null }>
+  perimetre: { geojson4326_perimetre: FeatureMultiPolygon; geojson4326_points: FeatureCollectionPoints; geojson4326_forages: FeatureCollectionForages | null }
   maxMarkers: number
   style?: HTMLAttributes['style']
   class?: HTMLAttributes['class']
@@ -260,7 +260,7 @@ export const DemarcheMap = defineComponent<Props>(props => {
     return values
   })
 
-  const points = computed<DeepReadonly<FeatureCollectionPoints>>(() => {
+  const points = computed<FeatureCollectionPoints>(() => {
     return {
       type: 'FeatureCollection',
       features: props.perimetre.geojson4326_points.features.map(feature => {
@@ -269,7 +269,7 @@ export const DemarcheMap = defineComponent<Props>(props => {
     }
   })
 
-  const forages = computed<DeepReadonly<FeatureCollectionForages>>(() => {
+  const forages = computed<FeatureCollectionForages>(() => {
     return {
       type: 'FeatureCollection',
       features:
diff --git a/packages/ui/src/components/entreprise/add-entreprise-document-popup.tsx b/packages/ui/src/components/entreprise/add-entreprise-document-popup.tsx
index d0d23bce9fa1bcedfcd34446d098f1e7713b6084..3293c71157187e36d086a743322902ed42309bd7 100644
--- a/packages/ui/src/components/entreprise/add-entreprise-document-popup.tsx
+++ b/packages/ui/src/components/entreprise/add-entreprise-document-popup.tsx
@@ -8,7 +8,7 @@ import { InputFile } from '../_ui/dsfr-input-file'
 import { ApiClient } from '@/api/api-client'
 import { DsfrInput } from '../_ui/dsfr-input'
 import { DsfrSelect } from '../_ui/dsfr-select'
-import { DeepReadonly, map } from 'camino-common/src/typescript-tools'
+import { map } from 'camino-common/src/typescript-tools'
 
 interface Props {
   close: () => void
@@ -17,7 +17,7 @@ interface Props {
   apiClient: Pick<ApiClient, 'creerEntrepriseDocument' | 'uploadTempDocument'>
 }
 export const AddEntrepriseDocumentPopup = defineComponent<Props>(props => {
-  const entrepriseDocumentTypeId = ref<DeepReadonly<(typeof EntrepriseDocumentTypeIds)[number]> | null>(props.lockedEntrepriseDocumentTypeId ?? null)
+  const entrepriseDocumentTypeId = ref<(typeof EntrepriseDocumentTypeIds)[number] | null>(props.lockedEntrepriseDocumentTypeId ?? null)
   const documentDate = ref<CaminoDate | null>(null)
   const entrepriseDocumentFile = ref<File | null>(null)
   const documentDescription = ref<string>('')
@@ -36,7 +36,7 @@ export const AddEntrepriseDocumentPopup = defineComponent<Props>(props => {
 
   const documentsTypes = map(sortedEntrepriseDocumentTypes, edt => ({ id: edt.id, label: edt.nom }))
 
-  const typeChange = (e: DeepReadonly<EntrepriseDocumentTypeId> | null) => {
+  const typeChange = (e: EntrepriseDocumentTypeId | null) => {
     entrepriseDocumentTypeId.value = e
   }
   const content = () => (
diff --git a/packages/ui/src/components/etape-edition.tsx b/packages/ui/src/components/etape-edition.tsx
index 3b1fdc21ab669a0a659deb0686864af231419521..5efe0004f50971a4cdc19c6b1d90cc8f35bdbd17 100644
--- a/packages/ui/src/components/etape-edition.tsx
+++ b/packages/ui/src/components/etape-edition.tsx
@@ -1,4 +1,4 @@
-import { DeepReadonly, computed, defineComponent, inject, onMounted, ref } from 'vue'
+import { computed, defineComponent, inject, onMounted, ref } from 'vue'
 import { useRoute, useRouter } from 'vue-router'
 import { ApiClient, apiClient } from '../api/api-client'
 import { DemarcheId, DemarcheIdOrSlug, demarcheIdOrSlugValidator } from 'camino-common/src/demarche'
@@ -84,7 +84,7 @@ const helpVisible = (user: User, titreTypeId: TitreTypeId, etapeTypeId: EtapeTyp
 }
 
 export const PureEtapeEdition = defineComponent<Props>(props => {
-  const [asyncData, setAsyncData] = useState<AsyncData<DeepReadonly<{ etape: EtapeEditFormProps['etape']; demarche: GetDemarcheByIdOrSlug; perimetre: PerimetreInformations }>>>({
+  const [asyncData, setAsyncData] = useState<AsyncData<{ etape: EtapeEditFormProps['etape']; demarche: GetDemarcheByIdOrSlug; perimetre: PerimetreInformations }>>({
     status: 'LOADING',
   })
 
diff --git a/packages/ui/src/components/etape/add-etape-avis-popup.tsx b/packages/ui/src/components/etape/add-etape-avis-popup.tsx
index ca1e8247092c5fa67a320a0b0de008a0bd7a446b..ea9a27bc60e8f9542b8021c2d6e300a72fa50982 100644
--- a/packages/ui/src/components/etape/add-etape-avis-popup.tsx
+++ b/packages/ui/src/components/etape/add-etape-avis-popup.tsx
@@ -1,6 +1,6 @@
 import { computed, defineComponent, ref } from 'vue'
 import { FunctionalPopup } from '../_ui/functional-popup'
-import { AVIS_VISIBILITY_IDS, AvisTypeId, AvisTypes, AvisVisibilityId, AvisVisibilityIds } from 'camino-common/src/static/avisTypes'
+import { AVIS_VISIBILITY_IDS, AvisStatutId, AvisTypeId, AvisTypes, AvisVisibilityId, AvisVisibilityIds } from 'camino-common/src/static/avisTypes'
 import { InputFile } from '../_ui/dsfr-input-file'
 import { ApiClient } from '@/api/api-client'
 import { TempDocumentName } from 'camino-common/src/document'
@@ -28,7 +28,7 @@ export const AddEtapeAvisPopup = defineComponent<Props>(props => {
   const etapeAvisFile = ref<File | null>(null)
   const avisDescription = ref<string>(props.initialAvis?.description ?? '')
   const [avisDate, setAvisDate] = useState(props.initialAvis?.date ?? null)
-  const [avisStatutId, setAvisStatutId] = useState(props.initialAvis?.avis_statut_id ?? null)
+  const [avisStatutId, setAvisStatutId] = useState<AvisStatutId | null>(props.initialAvis?.avis_statut_id ?? null)
   const [avisVisibilityId, setAvisVisibilityId] = useState(props.initialAvis?.avis_visibility_id ?? null)
 
   const tempAvisName = ref<TempDocumentName | undefined>(isNotNullNorUndefined(props.initialAvis) && 'temp_document_name' in props.initialAvis ? props.initialAvis.temp_document_name : undefined)
@@ -87,7 +87,7 @@ export const AddEtapeAvisPopup = defineComponent<Props>(props => {
             legend={{ main: 'Statut' }}
             disabled={isNullOrUndefined(etapeAvisTypeId.value)}
             required={true}
-            items={map(etapeAvisTypeId.value ? AvisTypes[etapeAvisTypeId.value].statutIds : ['Non renseigné'], avis => ({ id: avis, label: avis }))}
+            items={map(etapeAvisTypeId.value ? AvisTypes[etapeAvisTypeId.value].statutIds : (['Non renseigné'] as NonEmptyArray<AvisStatutId>), avis => ({ id: avis, label: avis }))}
             initialValue={avisStatutId.value}
             valueChanged={setAvisStatutId}
           />
diff --git a/packages/ui/src/components/etape/autocomplete-entreprise-single.tsx b/packages/ui/src/components/etape/autocomplete-entreprise-single.tsx
index daa41c9b8b1e77922dd88cd6b05faa4fe96ed6c3..7930f41ea9c467db40301eb52e8597a714a24f2a 100644
--- a/packages/ui/src/components/etape/autocomplete-entreprise-single.tsx
+++ b/packages/ui/src/components/etape/autocomplete-entreprise-single.tsx
@@ -1,18 +1,18 @@
 import { useState } from '@/utils/vue-tsx-utils'
-import { DeepReadonly, computed, defineComponent, ref, watch } from 'vue'
+import { computed, defineComponent, ref, watch } from 'vue'
 import { EntrepriseId, Entreprise } from 'camino-common/src/entreprise'
 import { isNotNullNorUndefined } from 'camino-common/src/typescript-tools'
 import { TypeAheadSingle } from '../_ui/typeahead-single'
 
 interface Props {
-  initialValue?: DeepReadonly<EntrepriseId | null>
-  items: DeepReadonly<Entreprise>[]
-  onUpdate: (entreprise: DeepReadonly<EntrepriseId | null>) => void
+  initialValue?: EntrepriseId | null
+  items: Entreprise[]
+  onUpdate: (entreprise: EntrepriseId | null) => void
   id?: string
 }
 
 export const AutocompleteEntrepriseSingle = defineComponent<Props>(props => {
-  const [currentEntrepriseId, setCurrentEntrepriseId] = useState<DeepReadonly<EntrepriseId | null>>(props.initialValue ?? null)
+  const [currentEntrepriseId, setCurrentEntrepriseId] = useState<EntrepriseId | null>(props.initialValue ?? null)
   const currentSearch = ref<string>('')
 
   watch(
@@ -35,7 +35,7 @@ export const AutocompleteEntrepriseSingle = defineComponent<Props>(props => {
     setCurrentEntrepriseId(entreprise?.id ?? null)
   }
 
-  const filteredItems = computed<DeepReadonly<Entreprise>[]>(() => {
+  const filteredItems = computed<Entreprise[]>(() => {
     if (currentSearch.value.length === 0) {
       return props.items
     }
diff --git a/packages/ui/src/components/etape/autocomplete-entreprises.tsx b/packages/ui/src/components/etape/autocomplete-entreprises.tsx
index 6fb02269bc7be823425b8a2d4de24bb457d06dc0..1d43df140f8e1066e645837bee2b3c072157e74a 100644
--- a/packages/ui/src/components/etape/autocomplete-entreprises.tsx
+++ b/packages/ui/src/components/etape/autocomplete-entreprises.tsx
@@ -1,18 +1,18 @@
 import { useState } from '@/utils/vue-tsx-utils'
-import { DeepReadonly, computed, defineComponent, watch } from 'vue'
+import { computed, defineComponent, watch } from 'vue'
 import { EntrepriseId, Entreprise } from 'camino-common/src/entreprise'
 import { isNullOrUndefinedOrEmpty, stringArrayEquals } from 'camino-common/src/typescript-tools'
 import { TypeAheadSmartMultiple } from '../_ui/typeahead-smart-multiple'
 
 interface Props {
-  nonSelectableEntities?: DeepReadonly<EntrepriseId[]>
-  selectedEntities?: DeepReadonly<EntrepriseId[]>
-  allEntities: DeepReadonly<Entreprise[]>
+  nonSelectableEntities?: EntrepriseId[]
+  selectedEntities?: EntrepriseId[]
+  allEntities: Entreprise[]
   name: 'titulaires' | 'amodiataires'
-  onEntreprisesUpdate: (entreprise: DeepReadonly<EntrepriseId[]>) => void
+  onEntreprisesUpdate: (entreprise: EntrepriseId[]) => void
 }
 export const AutocompleteEntreprises = defineComponent<Props>(props => {
-  const [mySelectedEntities, setMySelectedEntities] = useState<DeepReadonly<EntrepriseId[]>>(props.selectedEntities ?? [])
+  const [mySelectedEntities, setMySelectedEntities] = useState<EntrepriseId[]>(props.selectedEntities ?? [])
 
   watch(
     () => props.selectedEntities,
diff --git a/packages/ui/src/components/etape/date-type-edit.tsx b/packages/ui/src/components/etape/date-type-edit.tsx
index 8daa8ea3d81e1a7f01343ae56717f84cd277bbd7..55140a600b39b07ec10561f6fd2933cfd53750b5 100644
--- a/packages/ui/src/components/etape/date-type-edit.tsx
+++ b/packages/ui/src/components/etape/date-type-edit.tsx
@@ -2,7 +2,7 @@ import { useState } from '@/utils/vue-tsx-utils'
 import { CaminoDate } from 'camino-common/src/date'
 import { EtapeId } from 'camino-common/src/etape'
 import { EtapeTypeId } from 'camino-common/src/static/etapesTypes'
-import { watch, DeepReadonly, defineComponent } from 'vue'
+import { watch, defineComponent } from 'vue'
 import { isNotNullNorUndefined } from 'camino-common/src/typescript-tools'
 import { TypeEdit } from './type-edit'
 import { DemarcheId } from 'camino-common/src/demarche'
@@ -10,12 +10,12 @@ import { ApiClient } from '../../api/api-client'
 import { EtapeStatutId } from 'camino-common/src/static/etapesStatuts'
 import { DsfrInput } from '../_ui/dsfr-input'
 
-export type EtapeDateTypeEdit = DeepReadonly<{
+export type EtapeDateTypeEdit = {
   statutId: EtapeStatutId | null
   typeId: EtapeTypeId | null
   id: EtapeId | null
   date: CaminoDate | null
-}>
+}
 
 export interface Props {
   etape: EtapeDateTypeEdit
diff --git a/packages/ui/src/components/etape/entreprises-documents-edit.tsx b/packages/ui/src/components/etape/entreprises-documents-edit.tsx
index 7a20f0a9db043d074891aea0784274ede6da5dda..88b3dd486103904b9284980168762d2f05bbd6de 100644
--- a/packages/ui/src/components/etape/entreprises-documents-edit.tsx
+++ b/packages/ui/src/components/etape/entreprises-documents-edit.tsx
@@ -1,5 +1,5 @@
 import { dateFormat } from 'camino-common/src/date'
-import { DeepReadonly, FunctionalComponent, computed, defineComponent, onMounted, ref, watch } from 'vue'
+import { FunctionalComponent, computed, defineComponent, onMounted, ref, watch } from 'vue'
 import { EntrepriseDocument, EntrepriseDocumentId, EntrepriseId, entrepriseDocumentIdValidator, isEntrepriseId } from 'camino-common/src/entreprise'
 import { DocumentsTypes, EntrepriseDocumentType, EntrepriseDocumentTypeId } from 'camino-common/src/static/documentsTypes'
 import { getEntries, getEntriesHardcore, getKeys, isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty, isNullOrUndefined, map, stringArrayEquals } from 'camino-common/src/typescript-tools'
@@ -26,7 +26,7 @@ interface Props {
     etapeTypeId: EtapeTypeId
   }
   completeUpdate: (etapeEntrepriseDocuments: SelectedEntrepriseDocument[]) => void
-  entreprises: DeepReadonly<Entreprise[]>
+  entreprises: Entreprise[]
   etapeId: EtapeId | null
   apiClient: Pick<ApiClient, 'creerEntrepriseDocument' | 'getEntrepriseDocuments' | 'getEtapeEntrepriseDocuments' | 'uploadTempDocument'>
 }
diff --git a/packages/ui/src/components/etape/etape-api-client.ts b/packages/ui/src/components/etape/etape-api-client.ts
index 7c41ac99653d234f20de8319ddd644f3915ebccb..5f68e4a728bcaf9452db01a408c1affb9d49e8b0 100644
--- a/packages/ui/src/components/etape/etape-api-client.ts
+++ b/packages/ui/src/components/etape/etape-api-client.ts
@@ -11,7 +11,7 @@ import { etapeTypeIdValidator } from 'camino-common/src/static/etapesTypes'
 import { geoSystemeIdValidator } from 'camino-common/src/static/geoSystemes'
 import { substanceLegaleIdValidator } from 'camino-common/src/static/substancesLegales'
 import { GetDemarcheByIdOrSlug } from 'camino-common/src/titres'
-import { DeepReadonly, Nullable } from 'camino-common/src/typescript-tools'
+import { Nullable } from 'camino-common/src/typescript-tools'
 import { CaminoError, nullToDefault } from 'camino-common/src/zod-tools'
 import gql from 'graphql-tag'
 import { DistributiveOmit } from 'maplibre-gl'
@@ -83,11 +83,11 @@ export interface EtapeApiClient {
   deleteEtape: (titreEtapeId: EtapeId) => Promise<void>
   deposeEtape: (titreEtapeId: EtapeId) => Promise<void>
   getEtapeDocumentsByEtapeId: (etapeId: EtapeId) => Promise<GetEtapeDocumentsByEtapeId>
-  getEtapeHeritagePotentiel: (etape: DeepReadonly<Pick<CoreEtapeCreationOrModification, 'id' | 'date' | 'typeId'>>, titreDemarcheId: DemarcheId) => Promise<DeepReadonly<GetEtapeHeritagePotentiel>>
+  getEtapeHeritagePotentiel: (etape: Pick<CoreEtapeCreationOrModification, 'id' | 'date' | 'typeId'>, titreDemarcheId: DemarcheId) => Promise<GetEtapeHeritagePotentiel>
   getEtapeAvisByEtapeId: (etapeId: EtapeId) => Promise<GetEtapeAvisByEtapeId>
-  getEtape: (etapeIdOrSlug: EtapeIdOrSlug) => Promise<DeepReadonly<{ etape: FlattenEtape; demarche: GetDemarcheByIdOrSlug }>>
-  etapeCreer: (etape: DeepReadonly<RestEtapeCreation>) => Promise<CaminoError<string> | { id: EtapeId }>
-  etapeModifier: (etape: DeepReadonly<RestEtapeModification>) => Promise<CaminoError<string> | { id: EtapeId }>
+  getEtape: (etapeIdOrSlug: EtapeIdOrSlug) => Promise<{ etape: FlattenEtape; demarche: GetDemarcheByIdOrSlug }>
+  etapeCreer: (etape: RestEtapeCreation) => Promise<CaminoError<string> | { id: EtapeId }>
+  etapeModifier: (etape: RestEtapeModification) => Promise<CaminoError<string> | { id: EtapeId }>
 }
 
 export const etapeApiClient: EtapeApiClient = {
@@ -189,7 +189,7 @@ export const etapeApiClient: EtapeApiClient = {
     })
 
     // TODO 2024-06-02 on a du code métier dans notre api, on fusionne étape avec l'héritage
-    const heritageData: DeepReadonly<z.infer<typeof heritageValidator>> = heritageValidator.parse(data)
+    const heritageData: z.infer<typeof heritageValidator> = heritageValidator.parse(data)
     return heritageData
   },
 
diff --git a/packages/ui/src/components/etape/etape-avis-edit.tsx b/packages/ui/src/components/etape/etape-avis-edit.tsx
index a4504c736d0cd7e6295ed6c5e923fdad8c17bca1..796beef8719330f6a7d40e59af95896081b00f5e 100644
--- a/packages/ui/src/components/etape/etape-avis-edit.tsx
+++ b/packages/ui/src/components/etape/etape-avis-edit.tsx
@@ -3,7 +3,7 @@ import { DemarcheTypeId } from 'camino-common/src/static/demarchesTypes'
 import { EtapeTypeId } from 'camino-common/src/static/etapesTypes'
 import { TitreTypeId } from 'camino-common/src/static/titresTypes'
 import { ApiClient } from '../../api/api-client'
-import { DeepReadonly, FunctionalComponent, computed, defineComponent, onMounted, ref, watch } from 'vue'
+import { FunctionalComponent, computed, defineComponent, onMounted, ref, watch } from 'vue'
 import { isNonEmptyArray, isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty, isNullOrUndefined, NonEmptyArray } from 'camino-common/src/typescript-tools'
 import { LoadingElement } from '../_ui/functional-loader'
 import { AsyncData } from '../../api/client-rest'
@@ -28,7 +28,7 @@ interface Props {
   }
   onChange: (etapeAvis: (EtapeAvis | TempEtapeAvis)[]) => void
   etapeId: EtapeId | null
-  communeIds: DeepReadonly<CommuneId[]>
+  communeIds: CommuneId[]
   apiClient: Pick<ApiClient, 'uploadTempDocument' | 'getEtapeAvisByEtapeId'>
   user: User
 }
diff --git a/packages/ui/src/components/etape/etape-documents-edit.tsx b/packages/ui/src/components/etape/etape-documents-edit.tsx
index 7ffad82092316a47d6da3f1eea4ac77e414393f0..38b06b6cab2d2931a56469a9d204c700189b64d6 100644
--- a/packages/ui/src/components/etape/etape-documents-edit.tsx
+++ b/packages/ui/src/components/etape/etape-documents-edit.tsx
@@ -3,7 +3,7 @@ import { DemarcheTypeId } from 'camino-common/src/static/demarchesTypes'
 import { EtapeTypeId } from 'camino-common/src/static/etapesTypes'
 import { TitreTypeId } from 'camino-common/src/static/titresTypes'
 import { ApiClient } from '../../api/api-client'
-import { DeepReadonly, FunctionalComponent, computed, defineComponent, onMounted, ref, watch } from 'vue'
+import { FunctionalComponent, computed, defineComponent, onMounted, ref, watch } from 'vue'
 import { SDOMZoneId } from 'camino-common/src/static/sdom'
 import { isNonEmptyArray, isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty, isNullOrUndefined, NonEmptyArray } from 'camino-common/src/typescript-tools'
 import { AutreDocumentType, AutreDocumentTypeId, DocumentType, DocumentTypeId, DocumentsTypes } from 'camino-common/src/static/documentsTypes'
@@ -26,11 +26,11 @@ interface Props {
     firstEtapeDate: FirstEtapeDate
   }
   isBrouillon: EtapeBrouillon
-  sdomZoneIds: DeepReadonly<SDOMZoneId[]>
+  sdomZoneIds: SDOMZoneId[]
   completeUpdate: (etapeDocuments: (EtapeDocument | TempEtapeDocument)[]) => void
   etapeId: EtapeId | null
   apiClient: Pick<ApiClient, 'uploadTempDocument' | 'getEtapeDocumentsByEtapeId'>
-  contenu: DeepReadonly<{ arm?: { mecanise?: { value: boolean } } }>
+  contenu: { arm?: { mecanise?: { value: boolean } } }
   user: User
 }
 
diff --git a/packages/ui/src/components/etape/etape-edit-form.tsx b/packages/ui/src/components/etape/etape-edit-form.tsx
index d0c7f797685013930868adef15c854ef506fe8ce..a571af63969d5b1ac7ea1f15371e969b61ade364 100644
--- a/packages/ui/src/components/etape/etape-edit-form.tsx
+++ b/packages/ui/src/components/etape/etape-edit-form.tsx
@@ -1,4 +1,4 @@
-import { DeepReadonly, computed, defineComponent, onMounted, ref } from 'vue'
+import { computed, defineComponent, onMounted, ref } from 'vue'
 import { Bloc } from './bloc'
 import { EtapeFondamentaleEdit, FondamentalesEdit } from './fondamentales-edit'
 import { PerimetreEdit } from './perimetre-edit'
@@ -53,14 +53,14 @@ import { DsfrInputCheckbox } from '../_ui/dsfr-input-checkbox'
 import { CaminoError } from 'camino-common/src/zod-tools'
 
 export type Props = {
-  etape: DeepReadonly<Pick<Nullable<FlattenEtape>, 'id' | 'date' | 'typeId' | 'statutId' | 'slug'> & Omit<FlattenEtape, 'date' | 'typeId' | 'statutId' | 'id' | 'slug'>>
+  etape: Pick<Nullable<FlattenEtape>, 'id' | 'date' | 'typeId' | 'statutId' | 'slug'> & Omit<FlattenEtape, 'date' | 'typeId' | 'statutId' | 'id' | 'slug'>
   demarcheId: DemarcheId
   demarcheTypeId: DemarcheTypeId
   titreTypeId: TitreTypeId
   titreSlug: TitreSlug
   user: User
-  entreprises: DeepReadonly<Entreprise[]>
-  perimetre: DeepReadonly<PerimetreInformations>
+  entreprises: Entreprise[]
+  perimetre: PerimetreInformations
   initTab?: 'points' | 'carte'
   goToDemarche: (demarcheId: DemarcheId) => void
   firstEtapeDate: FirstEtapeDate | null
@@ -83,25 +83,25 @@ export type Props = {
   >
 }
 
-type EtapeEditFormDocuments = DeepReadonly<{
+type EtapeEditFormDocuments = {
   etapeDocuments: (EtapeDocument | TempEtapeDocument)[]
   entrepriseDocuments: SelectedEntrepriseDocument[]
   etapeAvis: (EtapeAvis | TempEtapeAvis)[]
-}>
+}
 
 const mergeFlattenEtapeWithNewHeritage = (
-  etape: DeepReadonly<CoreEtapeCreationOrModification>,
+  etape: CoreEtapeCreationOrModification,
   titreTypeId: TitreTypeId,
   demarcheTypeId: DemarcheTypeId,
-  heritageData: DeepReadonly<GetEtapeHeritagePotentiel>
-): DeepReadonly<CoreEtapeCreationOrModification> => {
+  heritageData: GetEtapeHeritagePotentiel
+): CoreEtapeCreationOrModification => {
   const sections = getSections(titreTypeId, demarcheTypeId, etape.typeId)
-  const flattenEtape: DeepReadonly<CoreEtapeCreationOrModification> = {
+  const flattenEtape: CoreEtapeCreationOrModification = {
     ...etape,
-    contenu: sections.reduce<DeepReadonly<FlattenEtape['contenu']>>((accSection, section) => {
-      const newSection = section.elements.reduce<DeepReadonly<FlattenEtape['contenu'][string]>>((accElement, element) => {
+    contenu: sections.reduce<FlattenEtape['contenu']>((accSection, section) => {
+      const newSection = section.elements.reduce<FlattenEtape['contenu'][string]>((accElement, element) => {
         const elementHeritage = heritageData.heritageContenu[section.id]?.[element.id] ?? { actif: false, etape: null }
-        const currentHeritage: DeepReadonly<FlattenedContenuElement> = etape.contenu[section.id]?.[element.id] ?? { value: null, heritee: true, etapeHeritee: null }
+        const currentHeritage: FlattenedContenuElement = etape.contenu[section.id]?.[element.id] ?? { value: null, heritee: true, etapeHeritee: null }
 
         // L'héritage ne peut pas être activé si le champ est obligatoire et que la valeur du champ dans l'étape héritable est null
         const canHaveHeritage: boolean = element.optionnel || isNotNullNorUndefined(elementHeritage.etape?.contenu?.[section.id]?.[element.id])
@@ -217,7 +217,7 @@ const mergeFlattenEtapeWithNewHeritage = (
 }
 export const EtapeEditForm = defineComponent<Props>(props => {
   const [etape, setEtape] = useState<AsyncData<CoreEtapeCreationOrModification | null>>({ status: 'LOADED', value: null })
-  const [perimetreInfos, setPerimetreInfos] = useState<DeepReadonly<Omit<PerimetreInformations, 'communes'>>>(props.perimetre)
+  const [perimetreInfos, setPerimetreInfos] = useState<Omit<PerimetreInformations, 'communes'>>(props.perimetre)
 
   const [documents, setDocuments] = useState<EtapeEditFormDocuments>({
     etapeDocuments: [],
@@ -258,7 +258,7 @@ export const EtapeEditForm = defineComponent<Props>(props => {
     }
   }
 
-  const setEtapeAndDocument = (etape: DeepReadonly<CoreEtapeCreationOrModification>, documents: EtapeEditFormDocuments) => {
+  const setEtapeAndDocument = (etape: CoreEtapeCreationOrModification, documents: EtapeEditFormDocuments) => {
     setEtape({ status: 'LOADED', value: etape })
     setDocuments(documents)
   }
@@ -361,10 +361,10 @@ export const EtapeEditForm = defineComponent<Props>(props => {
           titulaires: { actif: etapeValue.titulaires.heritee },
           amodiataires: { actif: etapeValue.amodiataires.heritee },
         },
-        contenu: Object.keys(etapeValue.contenu).reduce<DeepReadonly<RestEtapeCreation['contenu']>>((sectionsAcc, section) => {
+        contenu: Object.keys(etapeValue.contenu).reduce<RestEtapeCreation['contenu']>((sectionsAcc, section) => {
           sectionsAcc = {
             ...sectionsAcc,
-            [section]: Object.keys(etapeValue.contenu[section] ?? {}).reduce<DeepReadonly<RestEtapeCreation['contenu'][string]>>((elementsAcc, element) => {
+            [section]: Object.keys(etapeValue.contenu[section] ?? {}).reduce<RestEtapeCreation['contenu'][string]>((elementsAcc, element) => {
               elementsAcc = { ...elementsAcc, [element]: etapeValue.contenu[section]?.[element]?.value }
 
               return elementsAcc
@@ -373,10 +373,10 @@ export const EtapeEditForm = defineComponent<Props>(props => {
 
           return sectionsAcc
         }, {}),
-        heritageContenu: Object.keys(etapeValue.contenu).reduce<DeepReadonly<RestEtapeCreation['heritageContenu']>>((sectionsAcc, section) => {
+        heritageContenu: Object.keys(etapeValue.contenu).reduce<RestEtapeCreation['heritageContenu']>((sectionsAcc, section) => {
           return {
             ...sectionsAcc,
-            [section]: Object.keys(etapeValue.contenu[section] ?? {}).reduce<DeepReadonly<RestEtapeCreation['heritageContenu'][string]>>((elementsAcc, element) => {
+            [section]: Object.keys(etapeValue.contenu[section] ?? {}).reduce<RestEtapeCreation['heritageContenu'][string]>((elementsAcc, element) => {
               return { ...elementsAcc, [element]: { actif: etapeValue.contenu[section]?.[element]?.heritee ?? false } }
             }, {}),
           }
@@ -489,10 +489,10 @@ export const EtapeEditForm = defineComponent<Props>(props => {
 
 const EtapeEditFormInternal = defineComponent<
   {
-    etape: DeepReadonly<CoreEtapeCreationOrModification>
+    etape: CoreEtapeCreationOrModification
     documents: EtapeEditFormDocuments
-    setEtape: (etape: DeepReadonly<CoreEtapeCreationOrModification>, documents: EtapeEditFormDocuments) => void
-    alertesUpdate: (alertes: Omit<DeepReadonly<PerimetreInformations>, 'communes'>) => void
+    setEtape: (etape: CoreEtapeCreationOrModification, documents: EtapeEditFormDocuments) => void
+    alertesUpdate: (alertes: Omit<PerimetreInformations, 'communes'>) => void
   } & Omit<Props, 'etape'>
 >(props => {
   const documentsCompleteUpdate = (etapeDocuments: (EtapeDocument | TempEtapeDocument)[]) => {
@@ -513,7 +513,7 @@ const EtapeEditFormInternal = defineComponent<
     })
   }
 
-  const entrepriseDocumentsCompleteUpdate = (entrepriseDocuments: DeepReadonly<SelectedEntrepriseDocument[]>) => {
+  const entrepriseDocumentsCompleteUpdate = (entrepriseDocuments: SelectedEntrepriseDocument[]) => {
     props.setEtape(props.etape, { ...props.documents, entrepriseDocuments })
   }
 
@@ -541,7 +541,7 @@ const EtapeEditFormInternal = defineComponent<
     props.alertesUpdate({ superposition_alertes: perimetreInfos.superposition_alertes, sdomZoneIds: perimetreInfos.sdomZoneIds })
   }
 
-  const onEtapePerimetreHeritageChange = (perimetre: DeepReadonly<FlattenEtape['perimetre']>) => {
+  const onEtapePerimetreHeritageChange = (perimetre: FlattenEtape['perimetre']) => {
     props.setEtape(
       {
         ...props.etape,
@@ -568,11 +568,11 @@ const EtapeEditFormInternal = defineComponent<
   const onUpdateNotes = (notes: string) => {
     props.setEtape({ ...props.etape, note: { is_avertissement: props.etape.note.is_avertissement, valeur: notes } }, props.documents)
   }
-  const onUpdateNoteAvertissement = (isAvertissement: DeepReadonly<boolean>) => {
+  const onUpdateNoteAvertissement = (isAvertissement: boolean) => {
     props.setEtape({ ...props.etape, note: { valeur: props.etape.note.valeur, is_avertissement: isAvertissement } }, props.documents)
   }
 
-  const fondamentalesCompleteUpdate = (etapeFondamentale: DeepReadonly<EtapeFondamentaleEdit>) => {
+  const fondamentalesCompleteUpdate = (etapeFondamentale: EtapeFondamentaleEdit) => {
     props.setEtape({ ...props.etape, ...etapeFondamentale }, props.documents)
   }
 
diff --git a/packages/ui/src/components/etape/fondamentales-edit.tsx b/packages/ui/src/components/etape/fondamentales-edit.tsx
index f9ba8c1f0625e2275df6f890f0cfd10e33e69d4f..9875dcaadc5277ff01e5bfa670477c7c2208f234 100644
--- a/packages/ui/src/components/etape/fondamentales-edit.tsx
+++ b/packages/ui/src/components/etape/fondamentales-edit.tsx
@@ -8,7 +8,7 @@ import { canEditAmodiataires, canEditTitulaires, canEditDuree, canEditDates, Inp
 import { DomaineId } from 'camino-common/src/static/domaines'
 import { DemarcheTypeId } from 'camino-common/src/static/demarchesTypes'
 import { getDomaineId, TitreTypeId } from 'camino-common/src/static/titresTypes'
-import { computed, ref, DeepReadonly, defineComponent } from 'vue'
+import { computed, ref, defineComponent } from 'vue'
 import { Entreprise, EntrepriseId } from 'camino-common/src/entreprise'
 import { User } from 'camino-common/src/roles'
 import { isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools'
@@ -18,11 +18,11 @@ import { ZERO_KM2 } from 'camino-common/src/number'
 
 export type EtapeFondamentaleEdit = Pick<FlattenEtape, 'typeId' | 'dateDebut' | 'dateFin' | 'duree' | 'titulaires' | 'amodiataires' | 'substances' | 'perimetre' | 'date' | 'titreDemarcheId'>
 interface Props {
-  etape: DeepReadonly<EtapeFondamentaleEdit>
+  etape: EtapeFondamentaleEdit
   demarcheTypeId: DemarcheTypeId
   titreTypeId: TitreTypeId
   user: User
-  entreprises: DeepReadonly<Entreprise[]>
+  entreprises: Entreprise[]
   completeUpdate: (etape: Props['etape']) => void
   firstEtapeDate: FirstEtapeDate
 }
@@ -47,7 +47,7 @@ export const FondamentalesEdit = defineComponent<Props>(props => {
   const dateFinChanged = (dateFin: CaminoDate | null) => {
     updateEtape({ dateFin: { ...editedEtape.value.dateFin, value: dateFin } })
   }
-  const substancesChanged = (substances: DeepReadonly<FlattenEtape['substances']>) => {
+  const substancesChanged = (substances: FlattenEtape['substances']) => {
     updateEtape({ substances })
   }
   const updateDureeHeritage = (duree: FlattenEtape['duree']) => {
@@ -59,10 +59,10 @@ export const FondamentalesEdit = defineComponent<Props>(props => {
   const updateDateFinHeritage = (dateFin: FlattenEtape['dateFin']) => {
     updateEtape({ dateFin })
   }
-  const updateTitulairesHeritage = (titulaires: DeepReadonly<FlattenEtape['titulaires']>) => {
+  const updateTitulairesHeritage = (titulaires: FlattenEtape['titulaires']) => {
     updateEtape({ titulaires })
   }
-  const updateAmodiatairesHeritage = (amodiataires: DeepReadonly<FlattenEtape['amodiataires']>) => {
+  const updateAmodiatairesHeritage = (amodiataires: FlattenEtape['amodiataires']) => {
     updateEtape({ amodiataires })
   }
 
@@ -100,11 +100,11 @@ export const FondamentalesEdit = defineComponent<Props>(props => {
 
   const domaineId = computed<DomaineId>(() => getDomaineId(props.titreTypeId))
 
-  const titulairesUpdate = (titulaireIds: DeepReadonly<EntrepriseId[]>) => {
+  const titulairesUpdate = (titulaireIds: EntrepriseId[]) => {
     updateEtape({ titulaires: { ...editedEtape.value.titulaires, value: titulaireIds } })
   }
 
-  const amodiatairesUpdate = (amodiataireIds: DeepReadonly<EntrepriseId[]>) => {
+  const amodiatairesUpdate = (amodiataireIds: EntrepriseId[]) => {
     updateEtape({ amodiataires: { ...editedEtape.value.amodiataires, value: amodiataireIds } })
   }
 
diff --git a/packages/ui/src/components/etape/heritage-edit.tsx b/packages/ui/src/components/etape/heritage-edit.tsx
index e7d1c59da3be8fb7abcb695dea67fa5266d34ac5..306e14a4be8fbf6371ecafab85077c335cbeff3f 100644
--- a/packages/ui/src/components/etape/heritage-edit.tsx
+++ b/packages/ui/src/components/etape/heritage-edit.tsx
@@ -1,6 +1,6 @@
 import { dateFormat } from 'camino-common/src/date'
 import { HTMLAttributes } from 'vue'
-import { DeepReadonly, isNotNullNorUndefined } from 'camino-common/src/typescript-tools'
+import { isNotNullNorUndefined } from 'camino-common/src/typescript-tools'
 import { DsfrToggle } from '../_ui/dsfr-toggle'
 import { EtapesTypes } from 'camino-common/src/static/etapesTypes'
 import { capitalize } from 'camino-common/src/strings'
@@ -19,7 +19,7 @@ type HeritagePossible =
   | FlattenEtape['substances']
   | FlattenedContenuElement
 
-type Props<T extends DeepReadonly<HeritagePossible>> = {
+type Props<T extends HeritagePossible> = {
   prop: T
   write: () => JSX.Element
   read: (heritagePropEtape?: NoInfer<T>['etapeHeritee']) => JSX.Element
@@ -29,7 +29,7 @@ type Props<T extends DeepReadonly<HeritagePossible>> = {
   updateHeritage: (update: NoInfer<T>) => void
 }
 
-export const HeritageEdit = <T extends DeepReadonly<HeritagePossible>>(props: Props<T>): JSX.Element => {
+export const HeritageEdit = <T extends HeritagePossible>(props: Props<T>): JSX.Element => {
   const updateHeritage = () => {
     const etapeHeritee = props.prop.etapeHeritee
     const newHeritage = !props.prop.heritee
diff --git a/packages/ui/src/components/etape/perimetre-edit.tsx b/packages/ui/src/components/etape/perimetre-edit.tsx
index 02d59dd2caf5679e67df8c7a6af1e7569ed21c93..35023cf2c116b89b2296344b5915a2218d11728a 100644
--- a/packages/ui/src/components/etape/perimetre-edit.tsx
+++ b/packages/ui/src/components/etape/perimetre-edit.tsx
@@ -1,6 +1,6 @@
 import { HeritageEdit } from './heritage-edit'
 import { PerimetreImportPopup } from './perimetre-import-popup'
-import { DeepReadonly, FunctionalComponent, HTMLAttributes, defineComponent, ref } from 'vue'
+import { FunctionalComponent, HTMLAttributes, defineComponent, ref } from 'vue'
 import { DsfrButton } from '../_ui/dsfr-button'
 import { ApiClient } from '@/api/api-client'
 import { FeatureCollectionForages, FeatureCollectionPoints, GeojsonInformations } from 'camino-common/src/perimetre'
@@ -20,7 +20,7 @@ import { FirstEtapeDate } from 'camino-common/src/date'
 
 export interface Props {
   apiClient: Pick<ApiClient, 'uploadTempDocument' | 'geojsonImport' | 'geojsonPointsImport' | 'geojsonForagesImport'>
-  etape: DeepReadonly<Pick<CoreEtapeCreationOrModification, 'perimetre' | 'date' | 'typeId' | 'titreDemarcheId'>>
+  etape: Pick<CoreEtapeCreationOrModification, 'perimetre' | 'date' | 'typeId' | 'titreDemarcheId'>
   titreTypeId: TitreTypeId
   demarcheTypeId: DemarcheTypeId
   titreSlug: TitreSlug
diff --git a/packages/ui/src/components/etape/section-element-with-value-edit.tsx b/packages/ui/src/components/etape/section-element-with-value-edit.tsx
index 8127cc90ffbef94d5f10d22016b476fb74d3467d..296e856d5ff0182c07fe58d372807446af51db28 100644
--- a/packages/ui/src/components/etape/section-element-with-value-edit.tsx
+++ b/packages/ui/src/components/etape/section-element-with-value-edit.tsx
@@ -1,4 +1,4 @@
-import { DeepReadonly, FunctionalComponent } from 'vue'
+import { FunctionalComponent } from 'vue'
 import { isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools'
 import { ElementWithValue } from 'camino-common/src/sections'
 import { HeritageEdit } from './heritage-edit'
@@ -9,8 +9,8 @@ import { CaminoDate } from 'camino-common/src/date'
 
 type Props = {
   sectionId: string
-  elementWithValue: DeepReadonly<ElementWithValue>
-  elementHeritage: DeepReadonly<FlattenedContenuElement>
+  elementWithValue: ElementWithValue
+  elementHeritage: FlattenedContenuElement
   updateElement: (etape: Props['elementHeritage']) => void
   etapeDate: CaminoDate
 }
@@ -20,7 +20,7 @@ export const SectionElementWithValueEdit: FunctionalComponent<Props> = props =>
     return <SectionElementEdit element={props.elementWithValue} onValueChange={updateValue} sectionId={props.sectionId} etapeDate={props.etapeDate} />
   }
 
-  const updateValue = (element: DeepReadonly<ElementWithValue>) => {
+  const updateValue = (element: ElementWithValue) => {
     props.updateElement({ ...props.elementHeritage, value: element.value })
   }
   const updateHeritage = (heritage: Props['elementHeritage']) => {
diff --git a/packages/ui/src/components/etape/sections-edit.tsx b/packages/ui/src/components/etape/sections-edit.tsx
index cddc77eb5e1c8b022fd53814d6b0074bf3de86fa..f610aa6b979c2b9d18d2aff3479471387f065b5c 100644
--- a/packages/ui/src/components/etape/sections-edit.tsx
+++ b/packages/ui/src/components/etape/sections-edit.tsx
@@ -1,4 +1,4 @@
-import { DeepReadonly, computed, defineComponent } from 'vue'
+import { computed, defineComponent } from 'vue'
 import { TitreTypeId } from 'camino-common/src/static/titresTypes'
 import { DemarcheTypeId } from 'camino-common/src/static/demarchesTypes'
 import { getSections, getSectionsWithValue } from 'camino-common/src/static/titresTypes_demarchesTypes_etapesTypes/sections'
@@ -8,18 +8,18 @@ import { SectionWithValue } from 'camino-common/src/sections'
 import { SectionElementWithValueEdit } from './section-element-with-value-edit'
 import { FlattenedContenuElement, FlattenEtape } from 'camino-common/src/etape-form'
 
-export type SectionsEditEtape = DeepReadonly<Pick<FlattenEtape, 'typeId' | 'contenu' | 'date'>>
+export type SectionsEditEtape = Pick<FlattenEtape, 'typeId' | 'contenu' | 'date'>
 type Props = {
   titreTypeId: TitreTypeId
   demarcheTypeId: DemarcheTypeId
-  etape: DeepReadonly<SectionsEditEtape>
+  etape: SectionsEditEtape
   completeUpdate: (etape: Props['etape']) => void
 }
 
 export const SectionsEdit = defineComponent<Props>(props => {
   const [editedEtape, setEditedEtape] = useState(props.etape)
 
-  const updateElement = (sectionId: string, elementId: string) => (element: DeepReadonly<FlattenedContenuElement>) => {
+  const updateElement = (sectionId: string, elementId: string) => (element: FlattenedContenuElement) => {
     updateEtape({ contenu: { ...editedEtape.value.contenu, [sectionId]: { ...editedEtape.value.contenu[sectionId], [elementId]: element } } })
   }
 
@@ -31,7 +31,7 @@ export const SectionsEdit = defineComponent<Props>(props => {
   const sections = computed(() => {
     return getSections(props.titreTypeId, props.demarcheTypeId, props.etape.typeId)
   })
-  const sectionsWithValue = computed<DeepReadonly<SectionWithValue[]>>(() => {
+  const sectionsWithValue = computed<SectionWithValue[]>(() => {
     if (isNotNullNorUndefined(editedEtape.value.contenu)) {
       return getSectionsWithValue(sections.value, editedEtape.value.contenu)
     }
diff --git a/packages/ui/src/components/etape/substances-edit.tsx b/packages/ui/src/components/etape/substances-edit.tsx
index e4d392a20cc2667e82b1cb06f35385bc057bdbfe..cf6eb6ddd6d2ebe0b27d39e254ba844596cfdb24 100644
--- a/packages/ui/src/components/etape/substances-edit.tsx
+++ b/packages/ui/src/components/etape/substances-edit.tsx
@@ -1,6 +1,6 @@
 import { useState } from '@/utils/vue-tsx-utils'
 import { SubstancesLegales, SubstancesLegale, SubstanceLegaleId } from 'camino-common/src/static/substancesLegales'
-import { DeepReadonly, computed, defineComponent, watch } from 'vue'
+import { computed, defineComponent, watch } from 'vue'
 import { HeritageEdit } from '@/components/etape/heritage-edit'
 import { DomaineId } from 'camino-common/src/static/domaines'
 import { isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty, isNullOrUndefinedOrEmpty } from 'camino-common/src/typescript-tools'
@@ -11,20 +11,18 @@ import { capitalize } from 'camino-common/src/strings'
 import { FlattenEtape } from 'camino-common/src/etape-form'
 
 type Props = {
-  substances: DeepReadonly<FlattenEtape['substances']>
+  substances: FlattenEtape['substances']
   domaineId: DomaineId
-  updateSubstances: (substances: DeepReadonly<FlattenEtape['substances']>) => void
+  updateSubstances: (substances: FlattenEtape['substances']) => void
 }
 
 type SubstancesEditables = Pick<FlattenEtape['substances'], 'heritee' | 'etapeHeritee'> & { value: (SubstanceLegaleId | undefined)[] }
 export const SubstancesEdit = defineComponent<Props>(props => {
-  const [editedSubstances, setEditedSubstances] = useState<DeepReadonly<SubstancesEditables>>(
-    isNullOrUndefinedOrEmpty(props.substances.value) ? { ...props.substances, value: [undefined] } : props.substances
-  )
+  const [editedSubstances, setEditedSubstances] = useState<SubstancesEditables>(isNullOrUndefinedOrEmpty(props.substances.value) ? { ...props.substances, value: [undefined] } : props.substances)
 
   const substancesLength = computed<number>(() => editedSubstances.value.value.filter(isNotNullNorUndefined).length)
 
-  const updateHeritage = (substanceHeritageValue: DeepReadonly<FlattenEtape['substances']>) => {
+  const updateHeritage = (substanceHeritageValue: FlattenEtape['substances']) => {
     setEditedSubstances(substanceHeritageValue)
   }
 
diff --git a/packages/ui/src/components/etape/type-edit.tsx b/packages/ui/src/components/etape/type-edit.tsx
index e67f6f30d780dc5b45a88511a45b47fce76a09d1..f83a194d9d3ccf75dd3ee358696ba4246203116f 100644
--- a/packages/ui/src/components/etape/type-edit.tsx
+++ b/packages/ui/src/components/etape/type-edit.tsx
@@ -7,7 +7,7 @@ import { CaminoDate } from 'camino-common/src/date'
 import { EtapeId, EtapeTypeEtapeStatutWithMainStep } from 'camino-common/src/etape'
 import { AsyncData } from '@/api/client-rest'
 import { LoadingElement } from '../_ui/functional-loader'
-import { DeepReadonly, NonEmptyArray, getKeys, isNonEmptyArray, isNotNullNorUndefined, isNullOrUndefined, isNullOrUndefinedOrEmpty, map, onlyUnique } from 'camino-common/src/typescript-tools'
+import { NonEmptyArray, getKeys, isNonEmptyArray, isNotNullNorUndefined, isNullOrUndefined, isNullOrUndefinedOrEmpty, map, onlyUnique } from 'camino-common/src/typescript-tools'
 import { Alert } from '../_ui/alert'
 import { TypeAheadSingle } from '../_ui/typeahead-single'
 import { DsfrSelect, Item } from '../_ui/dsfr-select'
@@ -15,12 +15,12 @@ import type { JSX } from 'vue/jsx-runtime'
 import { capitalize } from 'camino-common/src/strings'
 
 type Props = {
-  etape: DeepReadonly<{
+  etape: {
     statutId: EtapeStatutId | null
     typeId: EtapeTypeId | null
     id?: EtapeId | null
     date: CaminoDate
-  }>
+  }
   demarcheId: DemarcheId
   apiClient: Pick<EtapeApiClient, 'getEtapesTypesEtapesStatuts'>
   onEtapeChange: (statutId: EtapeStatutId | null, typeId: EtapeTypeId | null) => void
@@ -33,7 +33,7 @@ interface SelectStatutProps {
 }
 
 const SelectStatut: FunctionalComponent<SelectStatutProps> = (props: SelectStatutProps): JSX.Element | null => {
-  const items: NonEmptyArray<Item<EtapeStatutId>> = map(props.statutIds, statutId => ({ id: statutId, label: EtapesStatuts[statutId].nom, disabled: props.statutId === statutId }))
+  const items: Readonly<NonEmptyArray<Item<EtapeStatutId>>> = map(props.statutIds, statutId => ({ id: statutId, label: EtapesStatuts[statutId].nom, disabled: props.statutId === statutId }))
 
   const initialValue = isNotNullNorUndefined(props.statutId) ? props.statutId : props.statutIds.length === 1 ? props.statutIds[0] : null
 
diff --git a/packages/ui/src/components/page/quick-access-titre.tsx b/packages/ui/src/components/page/quick-access-titre.tsx
index 0de316ce7a8608a9368b786baa16a9055230d961..c763de03bbcfb04a6854b1012d3f9ff2913f9c97 100644
--- a/packages/ui/src/components/page/quick-access-titre.tsx
+++ b/packages/ui/src/components/page/quick-access-titre.tsx
@@ -4,7 +4,7 @@ import { getDomaineId, getTitreTypeType } from 'camino-common/src/static/titresT
 import { titresRechercherByReferences } from '@/api/titres'
 import { createDebounce } from '@/utils/debounce'
 import { useRouter } from 'vue-router'
-import { ref, FunctionalComponent, DeepReadonly, defineComponent } from 'vue'
+import { ref, FunctionalComponent, defineComponent } from 'vue'
 import { titreApiClient, TitreForTitresRerchercherByNom } from '../titre/titre-api-client'
 import { capitalize } from 'camino-common/src/strings'
 import { isNotNullNorUndefined } from 'camino-common/src/typescript-tools'
@@ -29,7 +29,7 @@ export const QuickAccessTitre = defineComponent<{ id: string; onSelectTitre: ()
     titres.value.splice(0, titres.value.length, ...searchTitres.elements)
   }
 
-  const onSelectedTitre = (titre: DeepReadonly<TitreForTitresRerchercherByNom> | undefined) => {
+  const onSelectedTitre = (titre: TitreForTitresRerchercherByNom | undefined) => {
     if (titre) {
       router.push({ name: 'titre', params: { id: titre.id } })
       props.onSelectTitre()
@@ -45,12 +45,12 @@ QuickAccessTitre.props = ['id', 'onSelectTitre']
 interface Props {
   id?: string
   titres: TitreForTitresRerchercherByNom[]
-  onSelectedTitre: (titre: DeepReadonly<TitreForTitresRerchercherByNom> | undefined) => void
+  onSelectedTitre: (titre: TitreForTitresRerchercherByNom | undefined) => void
   alwaysOpen?: boolean
   onSearch: (searchTerm: string) => void
 }
 interface DisplayTitreProps {
-  titre: DeepReadonly<Pick<TitreForTitresRerchercherByNom, 'nom' | 'typeId' | 'demarches'>>
+  titre: Pick<TitreForTitresRerchercherByNom, 'nom' | 'typeId' | 'demarches'>
 }
 export const DisplayTitre: FunctionalComponent<DisplayTitreProps> = props => {
   let annee: CaminoAnnee | null = null
@@ -73,12 +73,12 @@ export const DisplayTitre: FunctionalComponent<DisplayTitreProps> = props => {
 }
 
 export const PureQuickAccessTitre = defineComponent<Props>(props => {
-  const display = (titre: DeepReadonly<TitreForTitresRerchercherByNom>) => {
+  const display = (titre: TitreForTitresRerchercherByNom) => {
     return <DisplayTitre titre={titre} />
   }
 
   const overrideItem = ref<TitreForTitresRerchercherByNom | null>(null)
-  const selectItem = (item: DeepReadonly<TitreForTitresRerchercherByNom> | undefined) => {
+  const selectItem = (item: TitreForTitresRerchercherByNom | undefined) => {
     overrideItem.value = null
     props.onSelectedTitre(item)
   }
diff --git a/packages/ui/src/components/titre/demarche-api-client.ts b/packages/ui/src/components/titre/demarche-api-client.ts
index 6b107e09cbddd96c9d150da7e9acca4c298db0ff..b872b245e09a45361762528d1a1258a0949cc9e0 100644
--- a/packages/ui/src/components/titre/demarche-api-client.ts
+++ b/packages/ui/src/components/titre/demarche-api-client.ts
@@ -13,7 +13,6 @@ import { EntrepriseId } from 'camino-common/src/entreprise'
 import { SubstanceLegaleId } from 'camino-common/src/static/substancesLegales'
 import { TitreTypeTypeId } from 'camino-common/src/static/titresTypesTypes'
 import { deleteWithJson, getWithJson, newGetWithJson, newPostWithJson } from '../../api/client-rest'
-import { DeepReadonly } from 'vue'
 import { CaminoError } from 'camino-common/src/zod-tools'
 
 type InputDemarcheUpdation = DemarcheCreationInput & {
@@ -54,9 +53,9 @@ export interface DemarcheApiClient {
   createDemarche: (demarche: DemarcheCreationInput) => Promise<DemarcheCreationOutput | CaminoError<string>>
   updateDemarche: (demarche: InputDemarcheUpdation) => Promise<DemarcheSlug>
   deleteDemarche: (demarcheId: DemarcheId) => Promise<void>
-  getDemarcheByIdOrSlug: (demarcheIdOrSlug: DemarcheIdOrSlug) => Promise<DeepReadonly<GetDemarcheByIdOrSlug>>
-  getDemarcheMiseEnConcurrence: (demarcheId: DemarcheId) => Promise<DeepReadonly<GetDemarcheMiseEnConcurrence[]> | CaminoError<string>>
-  getResultatMiseEnConcurrence: (demarcheId: DemarcheId) => Promise<DeepReadonly<GetResultatMiseEnConcurrence | CaminoError<string>>>
+  getDemarcheByIdOrSlug: (demarcheIdOrSlug: DemarcheIdOrSlug) => Promise<GetDemarcheByIdOrSlug>
+  getDemarcheMiseEnConcurrence: (demarcheId: DemarcheId) => Promise<GetDemarcheMiseEnConcurrence[] | CaminoError<string>>
+  getResultatMiseEnConcurrence: (demarcheId: DemarcheId) => Promise<GetResultatMiseEnConcurrence | CaminoError<string>>
   getDemarches: (params: GetDemarchesParams) => Promise<{ elements: GetDemarchesDemarche[]; total: number }>
 }
 
diff --git a/packages/ui/src/components/titre/demarche-consentement.tsx b/packages/ui/src/components/titre/demarche-consentement.tsx
index ace5e8362e0a0ddf9ceb4c33ec5fdc2ad4ba5b4b..863896ff3729e5d1a762cf4f251ac64e26a087ec 100644
--- a/packages/ui/src/components/titre/demarche-consentement.tsx
+++ b/packages/ui/src/components/titre/demarche-consentement.tsx
@@ -1,6 +1,6 @@
 import { DemarcheConsentement, DemarcheEtape, DemarcheSlug } from 'camino-common/src/demarche'
 import { computed, defineComponent, FunctionalComponent } from 'vue'
-import { DeepReadonly, isNotNullNorUndefined, isNullOrUndefined, PickDistributive } from 'camino-common/src/typescript-tools'
+import { isNotNullNorUndefined, isNullOrUndefined, PickDistributive } from 'camino-common/src/typescript-tools'
 import { Alert } from '../_ui/alert'
 import { DsfrLink } from '../_ui/dsfr-button'
 import { ETAPE_TYPE_FOR_CONSENTEMENT_DATA, ETAPES_TYPES } from 'camino-common/src/static/etapesTypes'
@@ -43,7 +43,7 @@ export const DemarchesConsentement = defineComponent<Props>(props => {
 // @ts-ignore waiting for https://github.com/vuejs/core/issues/7833
 DemarchesConsentement.props = ['demarcheSlug', 'titre']
 
-const DemarchesConsentementLoaded: FunctionalComponent<{ demarches: DeepReadonly<DemarcheConsentement[]> }> = ({ demarches }) => {
+const DemarchesConsentementLoaded: FunctionalComponent<{ demarches: DemarcheConsentement[] }> = ({ demarches }) => {
   return (
     <>
       <span> Les titres suivants sont valides et concernent au moins une substance en commun avec cette demande :</span>
diff --git a/packages/ui/src/components/titre/demarche-mise-en-concurrence.tsx b/packages/ui/src/components/titre/demarche-mise-en-concurrence.tsx
index 450d5bb03bb3dac68550b31a38efd81d122e4b69..2a1abf3d73c1f3c640f9a14a321b941c81319327 100644
--- a/packages/ui/src/components/titre/demarche-mise-en-concurrence.tsx
+++ b/packages/ui/src/components/titre/demarche-mise-en-concurrence.tsx
@@ -3,7 +3,7 @@ import { AsyncData } from '@/api/client-rest'
 import { canHaveMiseEnConcurrence, demarcheEnregistrementDemandeDateFind, DemarcheEtape, DemarcheId, demarcheIdValidator, GetDemarcheMiseEnConcurrence } from 'camino-common/src/demarche'
 import { computed, defineComponent, FunctionalComponent, ref } from 'vue'
 import { LoadingElement } from '../_ui/functional-loader'
-import { DeepReadonly, isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty, PickDistributive } from 'camino-common/src/typescript-tools'
+import { isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty, PickDistributive } from 'camino-common/src/typescript-tools'
 import { Alert } from '../_ui/alert'
 import { DsfrLink } from '../_ui/dsfr-button'
 import { ETAPE_TYPE_FOR_CONCURRENCY_DATA, ETAPES_TYPES } from 'camino-common/src/static/etapesTypes'
@@ -23,7 +23,7 @@ export type Props = {
   hasTitresFrom: boolean | 'LOADING'
 }
 export const DemarcheMiseEnConcurrence = defineComponent<Props>(props => {
-  type AsyncDemarches = AsyncData<DeepReadonly<GetDemarcheMiseEnConcurrence[]>>
+  type AsyncDemarches = AsyncData<GetDemarcheMiseEnConcurrence[]>
   type Conf = null | { type: 'hasAlert'; demarches: AsyncDemarches; demarcheId: DemarcheId } | { type: 'mayHaveAlert'; demarches: AsyncDemarches; demarcheId: DemarcheId }
 
   const conf = ref<Conf>({
@@ -170,7 +170,7 @@ export const DemarcheMiseEnConcurrence = defineComponent<Props>(props => {
 // @ts-ignore waiting for https://github.com/vuejs/core/issues/7833
 DemarcheMiseEnConcurrence.props = ['apiClient', 'titre', 'user', 'hasTitresFrom']
 
-const DemarcheMiseEnConcurrenceLoaded: FunctionalComponent<{ demarches: DeepReadonly<GetDemarcheMiseEnConcurrence[]> }> = ({ demarches }) => {
+const DemarcheMiseEnConcurrenceLoaded: FunctionalComponent<{ demarches: GetDemarcheMiseEnConcurrence[] }> = ({ demarches }) => {
   return (
     <>
       {demarches.length === 0 ? (
diff --git a/packages/ui/src/components/titre/resultat-mise-en-concurrence.tsx b/packages/ui/src/components/titre/resultat-mise-en-concurrence.tsx
index 12416aeb4d32d2d2d7f7c1782b81ee9c231820ac..0e65ce7370ac31cdac8b89fbbece4ba7d93052a8 100644
--- a/packages/ui/src/components/titre/resultat-mise-en-concurrence.tsx
+++ b/packages/ui/src/components/titre/resultat-mise-en-concurrence.tsx
@@ -3,7 +3,7 @@ import { computed, defineComponent, watch } from 'vue'
 import { DsfrInputRadio } from '../_ui/dsfr-input-radio'
 import { useState } from '@/utils/vue-tsx-utils'
 import { DsfrButton, DsfrLink } from '../_ui/dsfr-button'
-import { DeepReadonly, isNotNullNorUndefined, isNullOrUndefined } from 'camino-common/src/typescript-tools'
+import { isNotNullNorUndefined, isNullOrUndefined } from 'camino-common/src/typescript-tools'
 import { DsfrPerimetre, TabId } from '../_common/dsfr-perimetre'
 import { DsfrInput } from '../_ui/dsfr-input'
 import { Entreprise, EntrepriseId } from 'camino-common/src/entreprise'
@@ -26,7 +26,7 @@ export type Props = {
   entreprises: Entreprise[]
   initDate?: CaminoDate
   initDecision?: 'acc' | 'rej'
-  pivot: DeepReadonly<GetResultatMiseEnConcurrence>
+  pivot: GetResultatMiseEnConcurrence
 }
 
 export const ResultatMiseEnConcurrence = defineComponent<Props>(props => {
@@ -40,19 +40,17 @@ export const ResultatMiseEnConcurrence = defineComponent<Props>(props => {
     return acc
   }, {})
 
-  const perimetre = computed<
-    DeepReadonly<{
-      geojson4326_perimetre: FeatureMultiPolygon
-      geojson4326_points: FeatureCollectionPoints | null
-      geojson_origine_geo_systeme_id: GeoSystemeId
-      geojson_origine_perimetre: FeatureMultiPolygon
-      geojson_origine_points: FeatureCollectionPoints | null
-      geojson4326_forages: FeatureCollectionForages | null
-      geojson_origine_forages: FeatureCollectionForages | null
-      surface: KM2 | null
-    }>
-  >(() => {
-    const toPerimetre = ({ geojson4326_perimetre, surface }: DeepReadonly<{ geojson4326_perimetre: FeatureMultiPolygon; surface: KM2 }>) => ({
+  const perimetre = computed<{
+    geojson4326_perimetre: FeatureMultiPolygon
+    geojson4326_points: FeatureCollectionPoints | null
+    geojson_origine_geo_systeme_id: GeoSystemeId
+    geojson_origine_perimetre: FeatureMultiPolygon
+    geojson_origine_points: FeatureCollectionPoints | null
+    geojson4326_forages: FeatureCollectionForages | null
+    geojson_origine_forages: FeatureCollectionForages | null
+    surface: KM2 | null
+  }>(() => {
+    const toPerimetre = ({ geojson4326_perimetre, surface }: { geojson4326_perimetre: FeatureMultiPolygon; surface: KM2 }) => ({
       geojson4326_perimetre,
       geojson4326_points: null,
       geojson_origine_geo_systeme_id: GEO_SYSTEME_IDS.WGS84,
diff --git a/packages/ui/src/components/titre/titres-link.tsx b/packages/ui/src/components/titre/titres-link.tsx
index 1d52bdc390cfa5008086a4c3bc49fea0e11bd2a8..3751f7cab76c2c065e61dc52ad735ca768cb9fdb 100644
--- a/packages/ui/src/components/titre/titres-link.tsx
+++ b/packages/ui/src/components/titre/titres-link.tsx
@@ -6,7 +6,7 @@ import { LinkableTitre, TitresLinkConfig } from '@/components/titre/titres-link-
 import { TitreStatut } from '../_common/titre-statut'
 import { TypeAheadSingle } from '../_ui/typeahead-single'
 import { TypeAheadMultiple } from '../_ui/typeahead-multiple'
-import { DeepReadonly, isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools'
+import { isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools'
 
 import { capitalize } from 'camino-common/src/strings'
 
@@ -16,7 +16,7 @@ interface Props {
   onSelectTitres: (titres: TitreLink[]) => void
 }
 export const TitresLink = defineComponent<Props>(props => {
-  const display = (item: DeepReadonly<LinkableTitre>) => {
+  const display = (item: LinkableTitre) => {
     return (
       <div class="flex flex-center">
         <TitreStatut titreStatutId={item.titreStatutId} />
@@ -76,7 +76,7 @@ export const TitresLink = defineComponent<Props>(props => {
     search.value = searchLabel.toLowerCase()
   }
 
-  const getDateDebutEtDateFin = (titre: DeepReadonly<LinkableTitre>): string => {
+  const getDateDebutEtDateFin = (titre: LinkableTitre): string => {
     const dateDebut = titre.demarches
       .filter(({ demarcheDateDebut }) => !!demarcheDateDebut)
       .map(({ demarcheDateDebut }) => demarcheDateDebut)
diff --git a/packages/ui/src/router/index.ts b/packages/ui/src/router/index.ts
index a1e71e2e77c7e75066f4d4050b78d93ee9bf4519..4e31384de6fb9abc0733762ab01cba77b15bc5e4 100644
--- a/packages/ui/src/router/index.ts
+++ b/packages/ui/src/router/index.ts
@@ -5,7 +5,6 @@ import { Titres } from '../components/titres'
 import { isNullOrUndefinedOrEmpty } from 'camino-common/src/typescript-tools'
 import { CaminoRouteNames, routesDefinitions } from './routes'
 import { CaminoFiltre } from 'camino-common/src/filters'
-import { DeepReadonly } from 'vue'
 const PageIntrouvableAlert = async () => {
   const { PageIntrouvableAlert } = await import('@/components/_ui/alert')
 
@@ -127,7 +126,7 @@ declare module 'vue-router' {
   interface RouteMeta {
     menuSection: MenuSection | null
     title: string
-    filtres: DeepReadonly<CaminoFiltre[]>
+    filtres: Readonly<CaminoFiltre[]>
   }
 }
 const routes = {
diff --git a/packages/ui/src/typings/maplibre-gl.d.ts b/packages/ui/src/typings/maplibre-gl.d.ts
index c57cfcdc575b071ec68f929a96abf94dc34ab548..d2d208e1b42ab35f56fbd201879c390b0224b00b 100644
--- a/packages/ui/src/typings/maplibre-gl.d.ts
+++ b/packages/ui/src/typings/maplibre-gl.d.ts
@@ -1,5 +1,4 @@
 import * as maplibre from 'maplibre-gl'
-import { DeepReadonly } from 'vue'
 
 export type CaminoMapOptions = maplibre.MapOptions & { style: CaminoStyleSpecification }
 export class CaminoMapLibre extends maplibre.Map {
@@ -8,11 +7,11 @@ export class CaminoMapLibre extends maplibre.Map {
 }
 
 export class CaminoLngLatBounds extends maplibre.LngLatBounds {
-  extend(obj: DeepReadonly<maplibre.LngLatLike | maplibre.LngLatBoundsLike>): this
+  extend(obj: maplibre.LngLatLike | maplibre.LngLatBoundsLike): this
 }
 
 export class CaminoGeoJSONSource extends maplibre.GeoJSONSource {
-  setData(data: string | DeepReadonly<maplibre.GeoJSON>): this
+  setData(data: string | maplibre.GeoJSON): this
 }
 
 export class CaminoStyleSpecification extends maplibre.StyleSpecification {}
diff --git a/packages/ui/src/utils/vue-tsx-utils.ts b/packages/ui/src/utils/vue-tsx-utils.ts
index 0f1dd59cce799fd4b502c5a96f2e59eca499de20..d22f32857707998257b08d09a28fe19b9ab57dd1 100644
--- a/packages/ui/src/utils/vue-tsx-utils.ts
+++ b/packages/ui/src/utils/vue-tsx-utils.ts
@@ -1,4 +1,4 @@
-import { DeepReadonly, readonly, ref, Ref } from 'vue'
+import { readonly, ref, Ref } from 'vue'
 
 export const isEventWithTarget = (event: Event): event is FocusEvent & { target: HTMLInputElement } => 'target' in event
 
@@ -13,11 +13,13 @@ export const random = (): number => {
   return x - Math.floor(x)
 }
 
-export function useState<T>(initialState: T): [Readonly<Ref<DeepReadonly<T>>>, (value: T | DeepReadonly<T>) => void] {
+export function useState<T>(initialState: T): [Ref<T>, (value: T) => void] {
   const state = ref<T>(initialState) as Ref<T>
-  const setState = (newState: T | DeepReadonly<T>) => {
-    state.value = newState as T
+  const setState = (newState: T) => {
+    state.value = newState
   }
 
-  return [readonly(state), setState]
+  // TODO 2024-12-03 avant on avait le deepreadonly qu'on a viré car trop encombrant dans nos types, ça débordait de partout dans le common/api et on avait des gros conflits avec les NonEmptyArray et les structures un peu complexes.
+  // On n'a pas trouvé de règle eslint pour vérifier que le state n'est jamais modifié, donc c'est dangereux :(
+  return [readonly(state) as Ref<T>, setState]
 }