375 lines
59 KiB
Markdown
375 lines
59 KiB
Markdown
# 12 — Matriz de trazabilidad y verificación
|
||
|
||
## Alcance y método
|
||
|
||
Corte: 24 de octubre de 2026; repositorio `/home/david/dev/metis-desk`, bash en WSL. HEAD de referencia `fa9d95fa9e227a66a45e278d98e2895d8a9995ad`; evidencia del **árbol de trabajo**, con cambios locales preexistentes en DESIGN, documentación de componentes/listados, Assets, Companies/puestos, rdx-ui y un script de UI. No se revierten ni se consideran cambios de esta entrega.
|
||
|
||
Comprobación inicial realizada antes de escribir: pwd, git status --short, node --version (`v24.20.0`), pnpm --version (`11.25.0`); package.json exige Node >=24 <25 y pnpm@11.25.0. No se leyó ni imprimió .env. Únicas escrituras persistentes de esta tarea: los doce Markdown de esta carpeta; scripts temporales de elaboración/verificación en /tmp. Sin cambios funcionales, dependencias nuevas, ejecución de migraciones, conexión a BD o siembra.
|
||
|
||
Método: rg/rg --files para localizar modelo, ResourceId y usos semánticos en modules/apps/packages/scripts/docs; lectura de raíces, mappers, schemas, HTTP, servicios, SQL, formularios y pruebas; contraste con documentación; generación de enlaces con línea extraída del símbolo real; verificación de existencia/anclas y revisión de diff. Los diagramas describen FK/relaciones verificadas, no un esquema v2 implementado.
|
||
|
||
## Fuentes normativas consultadas
|
||
|
||
Arquitectura: [capas](../../arquitectura/capas-del-servidor.md), [composición](../../arquitectura/composicion-de-modulos.md), [flujo HTTP](../../arquitectura/flujo-http.md), [contratos HTTP](../../arquitectura/contratos-http.md), [DDD](../../arquitectura/modelo-ddd-e-identificadores.md), [pruebas](../../arquitectura/pruebas.md), [relaciones tipadas](../../arquitectura/contratos-de-relaciones-tipadas.md), [proveedor](../../arquitectura/proveedor-de-relaciones-tipadas.md).
|
||
|
||
Funcionalidad: [recursos](../../recursos-campos-y-plantillas.md), [inventario](../../inventario-de-activos.md), [software](../../software-del-ordenador.md), [aplicaciones del perfil](../../aplicaciones-del-perfil.md), [usuarios y acceso](../../usuarios-y-acceso.md). Sus afirmaciones históricas de pruebas no se presentan como ejecutadas ahora. Ejemplo de discrepancia detectada: recuento de plantillas/campos documentado frente al seed vigente, registrado en 02.
|
||
|
||
Frontend: [DESIGN](../../../DESIGN.md), [selección de skills](../../skills-frontend-ui-ux.md), [listados](../../patron-de-listados-de-entidades.md), [diálogos](../../patron-de-dialogos.md), [componentes](../../componentes-de-interfaz.md), [Playwright](../../playwright-mcp.md). Se inspeccionaron APIs SelectWithAction, FormDialog y OptionPickerList; no se modificó vendor.
|
||
|
||
Se inspeccionaron `.agents/skills/` y `skills-lock.json`: 15 guías frontend/UX; no skills de Sequelize/MariaDB/arquitectura/seguridad. Consultadas ux-tables (principal), ux-search y vercel-react-best-practices, incluidas reglas específicas citadas en 08. Auditores UX especializados no instalados; no se instalan. No se encontró «Plugin Architecture v1» funcional: composición explícita y registro estático de relaciones confirmados.
|
||
|
||
Fuentes oficiales externas para semántica SQL, no para inferir esquema desplegado: [MariaDB ALTER TABLE](https://mariadb.com/docs/server/reference/sql-statements/data-definition/alter/alter-table), [foreign keys](https://mariadb.com/docs/server/ha-and-performance/optimization-and-tuning/optimization-and-indexes/foreign-keys), [commit implícito](https://mariadb.com/docs/server/reference/sql-statements/transactions/sql-statements-that-cause-an-implicit-commit). Versiones exactas/DDL efectivo deben verificarse en entorno de implementación; no se conectó una BD para esta auditoría.
|
||
|
||
## Hallazgos y decisiones
|
||
|
||
| ID | Hallazgo y estado | Evidencia | Impacto / componentes | Decisión / fase |
|
||
| --- | --- | --- | --- | --- |
|
||
| H01 | CONFIRMADO Resource requiere compañía | [owner: resource.aggregate.ts:11](../../../modules/resources/src/api/domain/resource.aggregate.ts#L11) [sql: resource.model.ts:19](../../../modules/resources/src/api/infrastructure/persistence/resource.model.ts#L19) | Dominio/SQL/DTO | Ámbito explícito propuesto; R2.1 |
|
||
| H02 | CONFIRMADO valores/especificaciones son relacionales | [typed: resource-relational-schema.ts:98](../../../modules/resources/src/api/infrastructure/persistence/resource-relational-schema.ts#L98) [write: resource-inventory-relational.ts:315](../../../modules/resources/src/api/infrastructure/persistence/resource-inventory-relational.ts#L315) [history: resource-revision-specifications.ts:39](../../../modules/resources/src/api/infrastructure/persistence/resource-revision-specifications.ts#L39) | Persistencia e historial | Mantener normalización |
|
||
| H03 | CONFIRMADO ámbito de definición es global/local | [visible: resource-catalog.aggregate.ts:41](../../../modules/resources/src/api/domain/resource-catalog.aggregate.ts#L41) [catalogSQL: resource-catalog.model.ts:48](../../../modules/resources/src/api/infrastructure/persistence/resource-catalog.model.ts#L48) | Plantillas | No confundir con producto |
|
||
| H04 | CONFIRMADO identidad Aplicación estable por stockKey | [seed: resource-catalog-seed.ts:140](../../../modules/resources/src/api/domain/resource-catalog-seed.ts#L140) [usage: resource-inventory.service.ts:54](../../../modules/resources/src/api/application/resource-inventory.service.ts#L54) | Selectores/políticas | Nunca filtrar por nombre |
|
||
| H05 | CONFIRMADO uso personalizado application | [definition: resource-definition.ts:23](../../../modules/resources/src/api/domain/resource-definition.ts#L23) [applicationOptions: application-configuration-form-values.ts:8](../../../modules/companies/src/web/application-configurations/shared/helpers/application-configuration-form-values.ts#L8) | Plantillas propias | Conservar locales; global allowlist inicial |
|
||
| H06 | CONFIRMADO provider/url/description opcionales | [seedfields: resource-catalog-seed.ts:9](../../../modules/resources/src/api/domain/resource-catalog-seed.ts#L9) [seed: resource-catalog-seed.ts:140](../../../modules/resources/src/api/domain/resource-catalog-seed.ts#L140) | Producto/UX | Reutilizar; no inventar categoría |
|
||
| H07 | CONFIRMADO plantilla y contexto de Resource fijos | [update: resource.aggregate.ts:100](../../../modules/resources/src/api/domain/resource.aggregate.ts#L100) | CRUD y consolidación | Scope también fijo propuesto |
|
||
| H08 | CONFIRMADO historial UUID/actor/fecha/snapshot | [mapper: resource-persistence.mapper.ts:24](../../../modules/resources/src/api/infrastructure/persistence/resource-persistence.mapper.ts#L24) [history: resource-revision-specifications.ts:39](../../../modules/resources/src/api/infrastructure/persistence/resource-revision-specifications.ts#L39) | Lectura/edición | No reescribir revisiones |
|
||
| H09 | CONFIRMADO borrado físico protegido por FKs externas | [remove: remove-resource.ts:37](../../../modules/resources/src/api/infrastructure/persistence/remove-resource.ts#L37) | Actual e histórico | Global usado no se elimina |
|
||
| H10 | CONFIRMADO unicidad nombre en Application | [save: resource.use-cases.ts:64](../../../modules/resources/src/api/application/resource.use-cases.ts#L64) | Altas concurrentes | No unique nullable simplista |
|
||
| H11 | CONFIRMADO SQL compuesta operativa local | [directorySQL: directory-domain-migration.ts:5](../../../modules/resources/src/api/infrastructure/persistence/directory-domain-migration.ts#L5) [shareSQL: network-share-migration.ts:4](../../../modules/resources/src/api/infrastructure/persistence/network-share-migration.ts#L4) [supportSQL: support-migration.ts:86](../../../modules/assets/src/api/infrastructure/persistence/support-migration.ts#L86) | SMB/directorio/asistencia | No ampliar ámbito |
|
||
| H12 | CONFIRMADO sesión sin ACL por compañía | [auth: require-authenticated.ts:6](../../../modules/identity/src/api/infrastructure/http/require-authenticated.ts#L6) [relationshipAuth: relationship-read-access.ts:7](../../../apps/server/src/infrastructure/http/relationship-read-access.ts#L7) | Seguridad contextual | D04; A02 condicionado |
|
||
| H13 | CONFIRMADO admin inicial solo probado para usuarios | [admin: identity.use-cases.ts:75](../../../modules/identity/src/api/application/identity.use-cases.ts#L75) [catalogRoutes: resource-catalog.routes.ts:65](../../../modules/resources/src/api/infrastructure/http/resource-catalog.routes.ts#L65) | Gestión global | Guard/permiso explícito R2.2 |
|
||
| H14 | CONFIRMADO backend valida IDs de software contra compañía | [softwarePolicy: software-installation-policy.ts:5](../../../modules/companies/src/api/application/software-installation-policy.ts#L5) [softwareRead: sequelize-software-installation.repository.ts:27](../../../modules/companies/src/api/infrastructure/persistence/sequelize-software-installation.repository.ts#L27) | Instalaciones | Resolver application global por propósito |
|
||
| H15 | CONFIRMADO backend valida IDs de perfil/aplicación | [applicationPolicy: application-configuration-policy.ts:5](../../../modules/companies/src/api/application/application-configuration-policy.ts#L5) [applicationRead: sequelize-application-configuration.repository.ts:34](../../../modules/companies/src/api/infrastructure/persistence/sequelize-application-configuration.repository.ts#L34) | Configuraciones | Mantener perfil local |
|
||
| H16 | CONFIRMADO instalación/perfil independientes | [softwareInput: software-installation-values.ts:5](../../../modules/companies/src/api/domain/software-installation-values.ts#L5) [applicationInput: application-configuration-values.ts:5](../../../modules/companies/src/api/domain/application-configuration-values.ts#L5) | Versión/estado/historia | No fusionar ni propagar operación |
|
||
| H17 | CONFIRMADO licencia Resource local opcional | [softwareFK: software-installation-snapshot.ts:7](../../../modules/companies/src/api/infrastructure/persistence/software-installation-snapshot.ts#L7) [softwarePolicy: software-installation-policy.ts:5](../../../modules/companies/src/api/application/software-installation-policy.ts#L5) | Licencias/historia | Global producto no comparte licencia |
|
||
| H18 | CONFIRMADO no vínculo canónico licencia-producto | [softwareInput: software-installation-values.ts:5](../../../modules/companies/src/api/domain/software-installation-values.ts#L5) [seed: resource-catalog-seed.ts:140](../../../modules/resources/src/api/domain/resource-catalog-seed.ts#L140) | Cobertura/licencias | No afirmar consumo/cobertura |
|
||
| H19 | CONFIRMADO servicio list también consumido por remoto | [remoteRead: sequelize-remote-connection.repository.ts:92](../../../modules/companies/src/api/infrastructure/persistence/sequelize-remote-connection.repository.ts#L92) [remotePolicy: remote-connection-policy.ts:6](../../../modules/companies/src/api/application/remote-connection-policy.ts#L6) | Destinos operativos | Mantener list local; A03 |
|
||
| H20 | CONFIRMADO solo listado completo Resource en HTTP | [routes: resource.routes.ts:54](../../../modules/resources/src/api/infrastructure/http/resource.routes.ts#L54) [inventoryDTO: inventory.ts:55](../../../modules/resources/src/common/inventory.ts#L55) | Rendimiento y detalle | Nuevos candidatos/resolución R2.2 |
|
||
| H21 | CONFIRMADO DTO Resource no nullable y strict | [dto: inventory.ts:35](../../../modules/resources/src/common/inventory.ts#L35) [input: resource-values.ts:40](../../../modules/resources/src/api/domain/resource-values.ts#L40) | Compatibilidad cliente | Despliegue de lectores antes de activar |
|
||
| H22 | CONFIRMADO selector actual sin búsqueda remota | [select: select-with-action.tsx:19](../../../packages/rdx-ui/src/components/select-with-action.tsx#L19) [softwareUI: software-installations-panel.tsx:26](../../../modules/companies/src/web/software-installations/list/ui/software-installations-panel.tsx#L26) [applicationOptions: application-configuration-form-values.ts:8](../../../modules/companies/src/web/application-configurations/shared/helpers/application-configuration-form-values.ts#L8) | UX Chrome | Adaptar componente/paginación R2.4 |
|
||
| H23 | CONFIRMADO altas rápidas crean local | [softwareQuick: software-resource-create-dialog.tsx:5](../../../modules/companies/src/web/software-installations/create/ui/software-resource-create-dialog.tsx#L5) [applicationQuick: application-quick-editor.tsx:8](../../../modules/companies/src/web/application-configurations/create/ui/application-quick-editor.tsx#L8) | Duplicados | No ofrecer alta global implícita |
|
||
| H24 | DERIVABLE inactivo mantiene referencia/revisión | [softwareResponse: software-installation-response.builder.ts:7](../../../modules/companies/src/api/application/software-installation-response.builder.ts#L7) [applicationPolicy: application-configuration-policy.ts:5](../../../modules/companies/src/api/application/application-configuration-policy.ts#L5) | Desactivación multicompañía | Resolución de usados con inactivos |
|
||
| H25 | RIESGO propagación presupone compañía | [propagation: prepare-resource-template-updates.ts:15](../../../modules/resources/src/api/infrastructure/persistence/prepare-resource-template-updates.ts#L15) | Plantillas globales | Rama global y lock order R2.1 |
|
||
| H26 | RIESGO validación y escritura en transacciones distintas | [softwareRead: sequelize-software-installation.repository.ts:27](../../../modules/companies/src/api/infrastructure/persistence/sequelize-software-installation.repository.ts#L27) [applicationRead: sequelize-application-configuration.repository.ts:34](../../../modules/companies/src/api/infrastructure/persistence/sequelize-application-configuration.repository.ts#L34) [service: resource-inventory.service.ts:7](../../../modules/resources/src/api/application/resource-inventory.service.ts#L7) | Concurrencia | Punto de serialización R2.2 |
|
||
| H27 | RIESGO caché local no expresa cambio global | [inventoryAPI: inventory-api.ts:11](../../../modules/resources/src/web/resources/shared/api/inventory-api.ts#L11) [invalidation: resource-related-query-keys.ts:4](../../../modules/resources/src/web/resources/shared/api/resource-related-query-keys.ts#L4) | Selectores/avisos | Claves nuevas y refetch |
|
||
| H28 | RIESGO count/inner join con global NULL | [dashboard: resource-dashboard-reader.ts:15](../../../modules/resources/src/api/infrastructure/persistence/resource-dashboard-reader.ts#L15) | Dashboard | Separar métricas producto/operación |
|
||
| H29 | RIESGO exposición de historial global completo | [resourceDetail: resource-detail.tsx:11](../../../modules/resources/src/web/resources/detail/ui/resource-detail.tsx#L11) [dto: inventory.ts:35](../../../modules/resources/src/common/inventory.ts#L35) | Privacidad | Proyección mínima y permiso |
|
||
| H30 | DERIVABLE destino fijo complica consolidación | [softwareMapper: software-installation-input.mapper.ts:15](../../../modules/companies/src/api/application/software-installation-input.mapper.ts#L15) [applicationMapper: application-configuration-input.mapper.ts:11](../../../modules/companies/src/api/application/application-configuration-input.mapper.ts#L11) | Adopción/duplicados | Coexistir; comando separado R2.6 |
|
||
| H31 | NO CONFIRMADO Plugin Architecture v1 | [module: module.ts:39](../../../modules/resources/src/api/module.ts#L39) [runtime: identity-runtime.ts:17](../../../apps/server/src/infrastructure/http/identity-runtime.ts#L17) | Módulos/registro | No crear framework de plugins |
|
||
| H32 | PROPUESTO A preferida, B viable | H01/H03/H11/H14/H15 | Dominio/SQL | D01 antes de R2.1; C no satisface producto Resource único |
|
||
| H33 | DOCUMENTADO limitaciones NULL y DDL MariaDB | Fuentes oficiales arriba y 03 | Integridad/rollback | Ensayar esquema real, sin métricas inventadas |
|
||
| H34 | CONFIRMADO unitarias dirigidas pasan, globales no existen aún | Comandos siguientes | Confianza acotada | No acreditar soporte v2 |
|
||
| H35 | NO CONFIRMADO BD real, EXPLAIN, volumen, UI interactiva | No se ejecutan en esta fase | Validación pendiente | Criterios futuros en 08/10 |
|
||
|
||
## Comandos y resultados reproducibles
|
||
|
||
Ejecutados desde raíz salvo segundo test indicado:
|
||
|
||
```bash
|
||
pwd
|
||
git status --short
|
||
node --version
|
||
pnpm --version
|
||
rg --files docs modules packages apps .agents
|
||
rg -n 'resourceId|targetResourceId|licenseResourceId|domainResourceId' modules apps packages
|
||
rg -n 'model: "resources"|fk\("resources"\)|FROM resources|JOIN resources' modules apps packages
|
||
rg -n '@metis/resources|resources\.list' modules apps
|
||
rg -n 'Plugin Architecture|plugin|Plugin' docs modules packages
|
||
pnpm --filter @metis/resources test
|
||
```
|
||
|
||
Resultado del último comando: exit 0, 11 archivos de prueba reportados, 11 pass, 0 fail, 0 skipped. Incluye dominio, ciclo de vida y renderizado web de Resources. No se interpreta ese número como recuento de todos los assert internos.
|
||
|
||
Desde `modules/companies`:
|
||
|
||
```bash
|
||
TSX_TSCONFIG_PATH=../../tsconfig.json node --import tsx --test src/api/domain/software-installation.test.ts src/api/domain/application-configuration.test.ts
|
||
```
|
||
|
||
Resultado: exit 0, 2 archivos reportados, 2 pass, 0 fail, 0 skipped. No abre conexiones de integración ni crea datos persistidos. Las pruebas HTTP citadas fueron leídas, **no ejecutadas**.
|
||
|
||
No se ejecutaron pnpm typecheck/lint/test/check/build globales, migraciones, integración MariaDB, EXPLAIN, scripts de preparación/siembra, aplicación ni Playwright. Alcance documental: no hay código nuevo para compilar. No se extrapolan resultados a cambios previos del usuario ni a Resources v2. Volumen de prueba persistido utilizado: **cero**; validación de volumen queda prevista en 08/10.
|
||
|
||
Comprobación documental final: existencia de los doce ficheros; ausencia de placeholders; enlaces locales y líneas fuente válidos; índices de evidencia vinculados a símbolo real; revisión de diff y git diff --check. Las líneas no son snapshots inmutables: usar las huellas de las fuentes más abajo para detectar cambios posteriores. No se ejecutaron acciones de escritura sobre bases de datos.
|
||
|
||
## Cobertura de las fases solicitadas
|
||
|
||
| Fase | Entregables principales | Cobertura |
|
||
| --- | --- | --- |
|
||
| A modelo y ciclo | 01, 05, 07, 12 | Raíz, tablas, revisiones, campos, CRUD y consumidores |
|
||
| B plantillas | 02, 09 | Serie Aplicación, claves, campos, opciones de elegibilidad |
|
||
| C SQL | 03, 09, 10 | Constraints, índices, NULL, alternativas y migración |
|
||
| D seguridad | 04, 10 | Filtros lectura/escritura, sesión, pertenencia y permisos |
|
||
| E instalaciones | 06, 07, 08 | Políticas, selector, historial, versiones/licencias |
|
||
| F perfiles | 06, 07, 08 | Perfil/activo, configuración independiente y selector |
|
||
| G consumidores | 05, 06 | FKs directas, indirectas, operativas e históricas |
|
||
| H contratos | 07 | Rutas reales, DTO/schema, compatibilidad y caché |
|
||
| I UX | 08 | Requisitos, patrones, skills y validación pendiente |
|
||
| J evolución | 09, 10, 11 | A–D, recomendación, riesgos, fases y decisiones |
|
||
|
||
## Índice de evidencias del código
|
||
|
||
| Clave | Archivo y línea | Símbolo / expresión comprobada |
|
||
| --- | --- | --- |
|
||
| E-aggregate | [modules/resources/src/api/domain/resource.aggregate.ts](../../../modules/resources/src/api/domain/resource.aggregate.ts#L17) | `export class Resource ` |
|
||
| E-owner | [modules/resources/src/api/domain/resource.aggregate.ts](../../../modules/resources/src/api/domain/resource.aggregate.ts#L11) | `companyId: UniqueID;` |
|
||
| E-update | [modules/resources/src/api/domain/resource.aggregate.ts](../../../modules/resources/src/api/domain/resource.aggregate.ts#L100) | ` update(` |
|
||
| E-input | [modules/resources/src/api/domain/resource-values.ts](../../../modules/resources/src/api/domain/resource-values.ts#L40) | `export const ResourceInputSchema` |
|
||
| E-spec | [modules/resources/src/api/domain/resource-values.ts](../../../modules/resources/src/api/domain/resource-values.ts#L49) | `export const ResourceSpecificationSchema` |
|
||
| E-values | [modules/resources/src/api/domain/value-objects/resource-values.vo.ts](../../../modules/resources/src/api/domain/value-objects/resource-values.vo.ts#L123) | `export class ResourceValues` |
|
||
| E-sql | [modules/resources/src/api/infrastructure/persistence/resource.model.ts](../../../modules/resources/src/api/infrastructure/persistence/resource.model.ts#L19) | `export async function migrateInventory` |
|
||
| E-columns | [modules/resources/src/api/infrastructure/persistence/resource-relational-schema.ts](../../../modules/resources/src/api/infrastructure/persistence/resource-relational-schema.ts#L25) | `export const inventoryColumns` |
|
||
| E-typed | [modules/resources/src/api/infrastructure/persistence/resource-relational-schema.ts](../../../modules/resources/src/api/infrastructure/persistence/resource-relational-schema.ts#L98) | `const typedValues` |
|
||
| E-mapper | [modules/resources/src/api/infrastructure/persistence/resource-persistence.mapper.ts](../../../modules/resources/src/api/infrastructure/persistence/resource-persistence.mapper.ts#L24) | `export class ResourcePersistenceMapper` |
|
||
| E-read | [modules/resources/src/api/infrastructure/persistence/resource-inventory-relational.ts](../../../modules/resources/src/api/infrastructure/persistence/resource-inventory-relational.ts#L195) | `export async function readInventory` |
|
||
| E-write | [modules/resources/src/api/infrastructure/persistence/resource-inventory-relational.ts](../../../modules/resources/src/api/infrastructure/persistence/resource-inventory-relational.ts#L315) | `export async function writeInventory` |
|
||
| E-history | [modules/resources/src/api/infrastructure/persistence/resource-revision-specifications.ts](../../../modules/resources/src/api/infrastructure/persistence/resource-revision-specifications.ts#L39) | `export async function migrateResourceRevisionSpecifications` |
|
||
| E-repository | [modules/resources/src/api/infrastructure/persistence/sequelize-resource.repository.ts](../../../modules/resources/src/api/infrastructure/persistence/sequelize-resource.repository.ts#L32) | `export class SequelizeResourceRepository` |
|
||
| E-load | [modules/resources/src/api/infrastructure/persistence/sequelize-resource.repository.ts](../../../modules/resources/src/api/infrastructure/persistence/sequelize-resource.repository.ts#L58) | `private async load` |
|
||
| E-save | [modules/resources/src/api/application/resource.use-cases.ts](../../../modules/resources/src/api/application/resource.use-cases.ts#L64) | ` save(` |
|
||
| E-capture | [modules/resources/src/api/application/resource-input.mapper.ts](../../../modules/resources/src/api/application/resource-input.mapper.ts#L69) | `export function captureResourceSpecification` |
|
||
| E-mapInput | [modules/resources/src/api/application/resource-input.mapper.ts](../../../modules/resources/src/api/application/resource-input.mapper.ts#L13) | `export function mapResourceInput` |
|
||
| E-remove | [modules/resources/src/api/infrastructure/persistence/remove-resource.ts](../../../modules/resources/src/api/infrastructure/persistence/remove-resource.ts#L37) | `export async function removeResource` |
|
||
| E-routes | [modules/resources/src/api/infrastructure/http/resource.routes.ts](../../../modules/resources/src/api/infrastructure/http/resource.routes.ts#L54) | `export function registerResourceRoutes` |
|
||
| E-dto | [modules/resources/src/common/inventory.ts](../../../modules/resources/src/common/inventory.ts#L35) | `export const ResourceSchema` |
|
||
| E-inventoryDTO | [modules/resources/src/common/inventory.ts](../../../modules/resources/src/common/inventory.ts#L55) | `export const InventoryResponseSchema` |
|
||
| E-port | [modules/resources/src/api/application/resource.repository.ts](../../../modules/resources/src/api/application/resource.repository.ts#L21) | `export interface IResourceRepository` |
|
||
| E-service | [modules/resources/src/api/application/resource-inventory.service.ts](../../../modules/resources/src/api/application/resource-inventory.service.ts#L7) | `export interface IResourceInventoryService` |
|
||
| E-usage | [modules/resources/src/api/application/resource-inventory.service.ts](../../../modules/resources/src/api/application/resource-inventory.service.ts#L54) | `function resourceUsage` |
|
||
| E-seed | [modules/resources/src/api/domain/resource-catalog-seed.ts](../../../modules/resources/src/api/domain/resource-catalog-seed.ts#L140) | `const TEMPLATES` |
|
||
| E-seedfields | [modules/resources/src/api/domain/resource-catalog-seed.ts](../../../modules/resources/src/api/domain/resource-catalog-seed.ts#L9) | `const FIELDS` |
|
||
| E-definition | [modules/resources/src/api/domain/resource-definition.ts](../../../modules/resources/src/api/domain/resource-definition.ts#L23) | `export const ResourceDefinitionSchema` |
|
||
| E-definitionEntity | [modules/resources/src/api/domain/resource-definition.entity.ts](../../../modules/resources/src/api/domain/resource-definition.entity.ts#L35) | `export class ResourceDefinition ` |
|
||
| E-catalog | [modules/resources/src/api/domain/resource-catalog.aggregate.ts](../../../modules/resources/src/api/domain/resource-catalog.aggregate.ts#L14) | `export class ResourceCatalog ` |
|
||
| E-visible | [modules/resources/src/api/domain/resource-catalog.aggregate.ts](../../../modules/resources/src/api/domain/resource-catalog.aggregate.ts#L41) | ` visible(` |
|
||
| E-catalogSQL | [modules/resources/src/api/infrastructure/persistence/resource-catalog.model.ts](../../../modules/resources/src/api/infrastructure/persistence/resource-catalog.model.ts#L48) | `export async function migrateResourceCatalog` |
|
||
| E-propagation | [modules/resources/src/api/infrastructure/persistence/prepare-resource-template-updates.ts](../../../modules/resources/src/api/infrastructure/persistence/prepare-resource-template-updates.ts#L15) | `export async function prepareResourceTemplateUpdates` |
|
||
| E-catalogRoutes | [modules/resources/src/api/infrastructure/http/resource-catalog.routes.ts](../../../modules/resources/src/api/infrastructure/http/resource-catalog.routes.ts#L65) | `export function registerResourceCatalogRoutes` |
|
||
| E-catalogDTO | [modules/resources/src/common/index.ts](../../../modules/resources/src/common/index.ts#L19) | `export const CatalogItemSchema` |
|
||
| E-capability | [modules/resources/src/common/resource-capabilities.ts](../../../modules/resources/src/common/resource-capabilities.ts#L2) | `export function resourceTemplateCapability` |
|
||
| E-module | [modules/resources/src/api/module.ts](../../../modules/resources/src/api/module.ts#L39) | `export async function createResourceModule` |
|
||
| E-exports | [modules/resources/package.json](../../../modules/resources/package.json#L6) | `"exports"` |
|
||
| E-services | [modules/resources/src/api/services.ts](../../../modules/resources/src/api/services.ts#L11) | `IResourceInventoryService` |
|
||
| E-inventoryAPI | [modules/resources/src/web/resources/shared/api/inventory-api.ts](../../../modules/resources/src/web/resources/shared/api/inventory-api.ts#L11) | `export const inventoryKeys` |
|
||
| E-invalidation | [modules/resources/src/web/resources/shared/api/resource-related-query-keys.ts](../../../modules/resources/src/web/resources/shared/api/resource-related-query-keys.ts#L4) | `export function resourceRelatedQueryKeys` |
|
||
| E-resourceController | [modules/resources/src/web/resources/list/controllers/use-resources-page-controller.ts](../../../modules/resources/src/web/resources/list/controllers/use-resources-page-controller.ts#L24) | `export function useResourcesPageController` |
|
||
| E-resourceDetail | [modules/resources/src/web/resources/detail/ui/resource-detail.tsx](../../../modules/resources/src/web/resources/detail/ui/resource-detail.tsx#L11) | `export function ResourceDetail` |
|
||
| E-resourceForm | [modules/resources/src/web/resources/shared/controllers/use-resource-form-controller.ts](../../../modules/resources/src/web/resources/shared/controllers/use-resource-form-controller.ts#L16) | `export function useResourceFormController` |
|
||
| E-softwarePolicy | [modules/companies/src/api/application/software-installation-policy.ts](../../../modules/companies/src/api/application/software-installation-policy.ts#L5) | `export function softwareReferences` |
|
||
| E-softwareMapper | [modules/companies/src/api/application/software-installation-input.mapper.ts](../../../modules/companies/src/api/application/software-installation-input.mapper.ts#L15) | `export function mapSoftwareInput` |
|
||
| E-softwareRead | [modules/companies/src/api/infrastructure/persistence/sequelize-software-installation.repository.ts](../../../modules/companies/src/api/infrastructure/persistence/sequelize-software-installation.repository.ts#L27) | `private async load` |
|
||
| E-softwareSQL | [modules/companies/src/api/infrastructure/persistence/software-installation-migration.ts](../../../modules/companies/src/api/infrastructure/persistence/software-installation-migration.ts#L6) | `export async function migrateSoftwareInstallations` |
|
||
| E-softwareFK | [modules/companies/src/api/infrastructure/persistence/software-installation-snapshot.ts](../../../modules/companies/src/api/infrastructure/persistence/software-installation-snapshot.ts#L7) | `export const softwareSnapshot` |
|
||
| E-softwareInput | [modules/companies/src/api/domain/software-installation-values.ts](../../../modules/companies/src/api/domain/software-installation-values.ts#L5) | `export const SoftwareInstallationInputSchema` |
|
||
| E-softwareDTO | [modules/companies/src/common/software-installations.ts](../../../modules/companies/src/common/software-installations.ts#L19) | `export const SoftwareInstallationSchema` |
|
||
| E-softwareResponse | [modules/companies/src/api/application/software-installation-response.builder.ts](../../../modules/companies/src/api/application/software-installation-response.builder.ts#L7) | `export function buildSoftwareResponse` |
|
||
| E-softwareUI | [modules/companies/src/web/software-installations/list/ui/software-installations-panel.tsx](../../../modules/companies/src/web/software-installations/list/ui/software-installations-panel.tsx#L26) | `export function SoftwareInstallationsPanel` |
|
||
| E-softwareForm | [modules/companies/src/web/software-installations/shared/ui/software-installation-form.tsx](../../../modules/companies/src/web/software-installations/shared/ui/software-installation-form.tsx#L19) | `export function SoftwareInstallationForm` |
|
||
| E-softwareQuick | [modules/companies/src/web/software-installations/create/ui/software-resource-create-dialog.tsx](../../../modules/companies/src/web/software-installations/create/ui/software-resource-create-dialog.tsx#L5) | `export function SoftwareResourceCreateDialog` |
|
||
| E-applicationPolicy | [modules/companies/src/api/application/application-configuration-policy.ts](../../../modules/companies/src/api/application/application-configuration-policy.ts#L5) | `export function applicationReferences` |
|
||
| E-applicationMapper | [modules/companies/src/api/application/application-configuration-input.mapper.ts](../../../modules/companies/src/api/application/application-configuration-input.mapper.ts#L11) | `export function mapApplicationInput` |
|
||
| E-applicationRead | [modules/companies/src/api/infrastructure/persistence/sequelize-application-configuration.repository.ts](../../../modules/companies/src/api/infrastructure/persistence/sequelize-application-configuration.repository.ts#L34) | `private async load` |
|
||
| E-applicationSQL | [modules/companies/src/api/infrastructure/persistence/application-configuration-migration.ts](../../../modules/companies/src/api/infrastructure/persistence/application-configuration-migration.ts#L6) | `export async function migrateApplicationConfigurations` |
|
||
| E-applicationFK | [modules/companies/src/api/infrastructure/persistence/configuration-snapshots.ts](../../../modules/companies/src/api/infrastructure/persistence/configuration-snapshots.ts#L57) | `export const applicationSnapshot` |
|
||
| E-certificateFK | [modules/companies/src/api/infrastructure/persistence/configuration-snapshots.ts](../../../modules/companies/src/api/infrastructure/persistence/configuration-snapshots.ts#L80) | `export const certificateSnapshot` |
|
||
| E-applicationInput | [modules/companies/src/api/domain/application-configuration-values.ts](../../../modules/companies/src/api/domain/application-configuration-values.ts#L5) | `export const ApplicationConfigurationInputSchema` |
|
||
| E-applicationDTO | [modules/companies/src/common/application-configurations.ts](../../../modules/companies/src/common/application-configurations.ts#L20) | `export const ApplicationConfigurationSchema` |
|
||
| E-applicationForm | [modules/companies/src/web/application-configurations/shared/controllers/use-application-configuration-form-controller.ts](../../../modules/companies/src/web/application-configurations/shared/controllers/use-application-configuration-form-controller.ts#L28) | `export function useApplicationConfigurationFormController` |
|
||
| E-applicationOptions | [modules/companies/src/web/application-configurations/shared/helpers/application-configuration-form-values.ts](../../../modules/companies/src/web/application-configurations/shared/helpers/application-configuration-form-values.ts#L8) | `export function applicationOptions` |
|
||
| E-applicationQuick | [modules/companies/src/web/application-configurations/create/ui/application-quick-editor.tsx](../../../modules/companies/src/web/application-configurations/create/ui/application-quick-editor.tsx#L8) | `export function ApplicationQuickEditor` |
|
||
| E-auth | [modules/identity/src/api/infrastructure/http/require-authenticated.ts](../../../modules/identity/src/api/infrastructure/http/require-authenticated.ts#L6) | `export function requireAuthenticated` |
|
||
| E-admin | [modules/identity/src/api/application/identity.use-cases.ts](../../../modules/identity/src/api/application/identity.use-cases.ts#L75) | `private async administrator` |
|
||
| E-runtime | [apps/server/src/infrastructure/http/identity-runtime.ts](../../../apps/server/src/infrastructure/http/identity-runtime.ts#L17) | `export async function createIdentityRuntime` |
|
||
| E-relationshipAuth | [apps/server/src/infrastructure/http/relationship-read-access.ts](../../../apps/server/src/infrastructure/http/relationship-read-access.ts#L7) | `export class SessionRelationshipReadAccess` |
|
||
| E-directorySQL | [modules/resources/src/api/infrastructure/persistence/directory-domain-migration.ts](../../../modules/resources/src/api/infrastructure/persistence/directory-domain-migration.ts#L5) | `export async function migrateDirectoryDomains` |
|
||
| E-shareSQL | [modules/resources/src/api/infrastructure/persistence/network-share-migration.ts](../../../modules/resources/src/api/infrastructure/persistence/network-share-migration.ts#L4) | `export async function migrateNetworkShares` |
|
||
| E-supportSQL | [modules/assets/src/api/infrastructure/persistence/support-migration.ts](../../../modules/assets/src/api/infrastructure/persistence/support-migration.ts#L86) | `support_resource_company` |
|
||
| E-supportRead | [modules/assets/src/api/infrastructure/persistence/sequelize-support.repository.ts](../../../modules/assets/src/api/infrastructure/persistence/sequelize-support.repository.ts#L21) | `SELECT r.id,r.name` |
|
||
| E-shareRead | [modules/resources/src/api/infrastructure/persistence/network-share-reader.ts](../../../modules/resources/src/api/infrastructure/persistence/network-share-reader.ts#L22) | `export class NetworkShareReader` |
|
||
| E-directoryRead | [modules/resources/src/api/infrastructure/persistence/directory-domain-reader.ts](../../../modules/resources/src/api/infrastructure/persistence/directory-domain-reader.ts#L19) | `export class DirectoryDomainReader` |
|
||
| E-shareOptions | [modules/resources/src/api/infrastructure/persistence/network-share-options.ts](../../../modules/resources/src/api/infrastructure/persistence/network-share-options.ts#L11) | `export class NetworkShareOptions` |
|
||
| E-directoryOptions | [modules/resources/src/api/infrastructure/persistence/directory-domain-options-reader.ts](../../../modules/resources/src/api/infrastructure/persistence/directory-domain-options-reader.ts#L15) | `export class DirectoryDomainOptionsReader` |
|
||
| E-shareSummaries | [modules/resources/src/api/infrastructure/persistence/network-share-summary-resolver.ts](../../../modules/resources/src/api/infrastructure/persistence/network-share-summary-resolver.ts#L27) | `export class NetworkShareSummaryResolver` |
|
||
| E-directorySummaries | [modules/resources/src/api/infrastructure/persistence/directory-domain-summary-resolver.ts](../../../modules/resources/src/api/infrastructure/persistence/directory-domain-summary-resolver.ts#L27) | `export class DirectoryDomainSummaryResolver` |
|
||
| E-dashboard | [modules/resources/src/api/infrastructure/persistence/resource-dashboard-reader.ts](../../../modules/resources/src/api/infrastructure/persistence/resource-dashboard-reader.ts#L15) | `export class ResourceDashboardReader` |
|
||
| E-remotePolicy | [modules/companies/src/api/application/remote-connection-policy.ts](../../../modules/companies/src/api/application/remote-connection-policy.ts#L6) | `export function remoteReferences` |
|
||
| E-remoteRead | [modules/companies/src/api/infrastructure/persistence/sequelize-remote-connection.repository.ts](../../../modules/companies/src/api/infrastructure/persistence/sequelize-remote-connection.repository.ts#L92) | `resources: await this.resources.list(company)` |
|
||
| E-remoteFK | [modules/companies/src/api/infrastructure/persistence/mail-remote-snapshots.ts](../../../modules/companies/src/api/infrastructure/persistence/mail-remote-snapshots.ts#L83) | `export const remoteSnapshot` |
|
||
| E-accessFK | [modules/companies/src/api/infrastructure/persistence/access-relational.ts](../../../modules/companies/src/api/infrastructure/persistence/access-relational.ts#L32) | `export const accessColumns` |
|
||
| E-projection | [modules/resources/src/api/infrastructure/persistence/resource-compatibility.ts](../../../modules/resources/src/api/infrastructure/persistence/resource-compatibility.ts#L13) | `export async function projectResource` |
|
||
| E-sharePublication | [modules/assets/src/api/infrastructure/persistence/network-share-publication-migration.ts](../../../modules/assets/src/api/infrastructure/persistence/network-share-publication-migration.ts#L24) | `publication_share_fk` |
|
||
| E-directoryMembership | [modules/assets/src/api/infrastructure/persistence/directory-membership-migration.ts](../../../modules/assets/src/api/infrastructure/persistence/directory-membership-migration.ts#L23) | `directory_membership_domain_fk` |
|
||
| E-process | [modules/companies/src/api/infrastructure/persistence/process-review-reader.ts](../../../modules/companies/src/api/infrastructure/persistence/process-review-reader.ts#L35) | `resourceNames: ReadonlyMap` |
|
||
| E-legacy | [modules/resources/src/api/infrastructure/persistence/migrate-legacy-resources.ts](../../../modules/resources/src/api/infrastructure/persistence/migrate-legacy-resources.ts#L216) | `export async function migrateLegacyResources` |
|
||
| E-supportMigration | [modules/resources/src/api/infrastructure/persistence/migrate-support-resources.ts](../../../modules/resources/src/api/infrastructure/persistence/migrate-support-resources.ts#L44) | `export async function migrateSupportResources` |
|
||
| E-softwareHTTP | [modules/companies/src/api/infrastructure/http/software-installation.routes.ts](../../../modules/companies/src/api/infrastructure/http/software-installation.routes.ts#L116) | `app.use(` |
|
||
| E-applicationHTTP | [modules/companies/src/api/infrastructure/http/application-configuration.routes.ts](../../../modules/companies/src/api/infrastructure/http/application-configuration.routes.ts#L116) | `app.use(` |
|
||
| E-unitResource | [modules/resources/src/api/domain/resource.test.ts](../../../modules/resources/src/api/domain/resource.test.ts#L38) | `test(` |
|
||
| E-unitLifecycle | [modules/resources/src/api/application/resource-lifecycle.test.ts](../../../modules/resources/src/api/application/resource-lifecycle.test.ts#L94) | `test(` |
|
||
| E-unitSoftware | [modules/companies/src/api/domain/software-installation.test.ts](../../../modules/companies/src/api/domain/software-installation.test.ts#L52) | `test(` |
|
||
| E-unitApplication | [modules/companies/src/api/domain/application-configuration.test.ts](../../../modules/companies/src/api/domain/application-configuration.test.ts#L75) | `test(` |
|
||
| E-integrationResource | [apps/server/src/resources.integration.ts](../../../apps/server/src/resources.integration.ts#L19) | `export async function` |
|
||
| E-integrationLifecycle | [apps/server/src/resource-lifecycle.integration.ts](../../../apps/server/src/resource-lifecycle.integration.ts#L11) | `export async function` |
|
||
| E-integrationSoftware | [apps/server/src/software-installations.integration.ts](../../../apps/server/src/software-installations.integration.ts#L17) | `export async function` |
|
||
| E-integrationApplication | [apps/server/src/applications.integration.ts](../../../apps/server/src/applications.integration.ts#L18) | `export async function` |
|
||
| E-select | [packages/rdx-ui/src/components/select-with-action.tsx](../../../packages/rdx-ui/src/components/select-with-action.tsx#L19) | `export function SelectWithAction` |
|
||
| E-formDialog | [packages/rdx-ui/src/components/form-dialog.tsx](../../../packages/rdx-ui/src/components/form-dialog.tsx#L19) | `export function FormDialog` |
|
||
| E-picker | [packages/rdx-ui/src/components/option-picker-list.tsx](../../../packages/rdx-ui/src/components/option-picker-list.tsx#L7) | `export function OptionPickerList` |
|
||
| E-globalUI | [modules/companies/src/web/workspace/catalogs/ui/global-catalog-content.tsx](../../../modules/companies/src/web/workspace/catalogs/ui/global-catalog-content.tsx#L8) | `export function GlobalCatalogContent` |
|
||
| E-processRead | [modules/companies/src/api/infrastructure/persistence/sequelize-process.repository.ts](../../../modules/companies/src/api/infrastructure/persistence/sequelize-process.repository.ts#L109) | `await this.resources.list(company)` |
|
||
| E-folderInput | [modules/companies/src/api/domain/folder-mapping-values.ts](../../../modules/companies/src/api/domain/folder-mapping-values.ts#L5) | `export const FolderMappingInputSchema` |
|
||
| E-folderPolicy | [modules/companies/src/api/application/folder-mapping-policy.ts](../../../modules/companies/src/api/application/folder-mapping-policy.ts#L7) | `export function folderReferences` |
|
||
| E-folderFK | [modules/companies/src/api/infrastructure/persistence/configuration-snapshots.ts](../../../modules/companies/src/api/infrastructure/persistence/configuration-snapshots.ts#L125) | `export const folderSnapshot` |
|
||
| E-profileInput | [modules/companies/src/api/domain/work-profile-values.ts](../../../modules/companies/src/api/domain/work-profile-values.ts#L3) | `export const WorkProfileInputSchema` |
|
||
| E-csrf | [modules/identity/src/api/infrastructure/http/identity.routes.ts](../../../modules/identity/src/api/infrastructure/http/identity.routes.ts#L105) | `request.get("origin") !== origin` |
|
||
| E-projectionRead | [modules/resources/src/api/infrastructure/persistence/resource-projection-reader.ts](../../../modules/resources/src/api/infrastructure/persistence/resource-projection-reader.ts#L33) | `export async function readResourceProjections` |
|
||
|
||
## Huellas SHA-256 de fuentes citadas
|
||
|
||
Permiten detectar si cambió el árbol auditado. Las huellas no incluyen secretos ni archivos .env.
|
||
|
||
| Archivo | SHA-256 |
|
||
| --- | --- |
|
||
| `apps/server/src/applications.integration.ts` | `08bd0024b41c00b74371d6efc87916b54b975d0271fae3f8d9c7a8d9f6630207` |
|
||
| `apps/server/src/infrastructure/http/identity-runtime.ts` | `4f1377831d3cb8fceb95683bc8f44a1ad4470108239f990ffa54e46454b5dfbd` |
|
||
| `apps/server/src/infrastructure/http/relationship-read-access.ts` | `83cefdc28261ddd4a50fcd472b53b7b1eb8a7f136d92857dd0bfec1261b26fea` |
|
||
| `apps/server/src/resource-lifecycle.integration.ts` | `c3329f5a2602d637eab9c11b7297964ab8f1cd7e12f5ab60353dd27a0560ffd6` |
|
||
| `apps/server/src/resources.integration.ts` | `81481b31c8cdacddf6d75a3bc1a99dec865cd6529cd96f8dd6462faef0120a16` |
|
||
| `apps/server/src/software-installations.integration.ts` | `72d1e83c5d81c45bf86fed95bff915a5348b293c670d753d32cae2f29379d879` |
|
||
| `modules/assets/src/api/infrastructure/persistence/directory-membership-migration.ts` | `72f3e1afd2230e35c8a897eabebd78f47851c3b8ab3b1d355f2be3de6b4cd513` |
|
||
| `modules/assets/src/api/infrastructure/persistence/network-share-publication-migration.ts` | `91a5a0cd5bea0e0d29317d0836bd94891adf97c0720e97252abc3c1cb5ad2308` |
|
||
| `modules/assets/src/api/infrastructure/persistence/sequelize-support.repository.ts` | `9433afca6b8e69c4d8d6ea2b88b1a74ff8c0e1edb2b9a97191674d20e1debaab` |
|
||
| `modules/assets/src/api/infrastructure/persistence/support-migration.ts` | `080764fa316c7726bd8f42fb9d6915cdc65c112e2852578df6c50c6e9a2bb1fe` |
|
||
| `modules/companies/src/api/application/application-configuration-input.mapper.ts` | `0c5cb1e07628792b3b537f2ea314688bf96c05eca66ad87d56eaadc5306a3b05` |
|
||
| `modules/companies/src/api/application/application-configuration-policy.ts` | `3494419bfe206493ebbccf1d6ced5a8e5962443feee077a698de2749681123e4` |
|
||
| `modules/companies/src/api/application/folder-mapping-policy.ts` | `ba2f5c94da5736047296beb7818af763d11798a613c8f688df6a51e02822fe1b` |
|
||
| `modules/companies/src/api/application/remote-connection-policy.ts` | `4033f05956ae99ccd0a95243ab14e13a5bf6973bac7ea069cd7d6cb1e4a7e9d4` |
|
||
| `modules/companies/src/api/application/software-installation-input.mapper.ts` | `4560cc30c155ce003dfca820be11f2b7bf1d244a34bc095eec6b8e57c0efc139` |
|
||
| `modules/companies/src/api/application/software-installation-policy.ts` | `9b24c35f48ba9b424d6ac024425812e225b19cdc55544e8360974f5b19d82ea5` |
|
||
| `modules/companies/src/api/application/software-installation-response.builder.ts` | `682f7af3b10b1fdf0d60ae36aaf6878af772390624e9009a8ec6c65f8127917a` |
|
||
| `modules/companies/src/api/domain/application-configuration-values.ts` | `5dd80dc36871c0e1c53e6c991513093e70774b6445fd0a8b568ceaa3e913de94` |
|
||
| `modules/companies/src/api/domain/application-configuration.test.ts` | `76524528f29ae87913212f3a8cc8206d9d4560c6149343b811db8cbd9cffef40` |
|
||
| `modules/companies/src/api/domain/folder-mapping-values.ts` | `230ed57853212b1b640a0d252d533f2edca1d76dc1cbf35e07846a6c03f98bd0` |
|
||
| `modules/companies/src/api/domain/software-installation-values.ts` | `e59fdbae3514e9c3f1c04106db83f7ba493371e387b81986341451e2c1c8341e` |
|
||
| `modules/companies/src/api/domain/software-installation.test.ts` | `ee3f3642e8400e8fcbca7fbdb4dbb55e3f35dce27246affa8ab29b782f72df30` |
|
||
| `modules/companies/src/api/domain/work-profile-values.ts` | `9c60f46b47d06114d5d4f075c2b15ff97007a0d003b9c4fc33a2517268da331a` |
|
||
| `modules/companies/src/api/infrastructure/http/application-configuration.routes.ts` | `460c7e53023ef1a038110ffb5e608258fd15d3d3af82c69ec37ac975d8f6f4fa` |
|
||
| `modules/companies/src/api/infrastructure/http/software-installation.routes.ts` | `53e6f5647ee0ceb199ad8bed49d37b9dc73b9a37caebbb550f220a4d01ca8dbe` |
|
||
| `modules/companies/src/api/infrastructure/persistence/access-relational.ts` | `1192a810bcc713dd1466b06b3cc6a66d946b64301cc221499f2c910255988fba` |
|
||
| `modules/companies/src/api/infrastructure/persistence/application-configuration-migration.ts` | `0cb7bd20733579ec28b2b0c3df698c2fa79350a35a631a6393e261ff52468fe3` |
|
||
| `modules/companies/src/api/infrastructure/persistence/configuration-snapshots.ts` | `fe575a8f7f4a53ae065ba24d669ae7cb9886b5633472292802c69d079f18a3bf` |
|
||
| `modules/companies/src/api/infrastructure/persistence/mail-remote-snapshots.ts` | `5be1c25589b0bf10b77c822fcc39f1df4cc5fc9670e221acebd5b6e0f6c4cc29` |
|
||
| `modules/companies/src/api/infrastructure/persistence/process-review-reader.ts` | `335652c5a5446f23b80ad0edffdd2c42df26d59ccdaeb83935c9b7864eab5e01` |
|
||
| `modules/companies/src/api/infrastructure/persistence/sequelize-application-configuration.repository.ts` | `6dfe00cb5fc79dcb5841864e7019756f69748b00475091645e4675e406e92f0f` |
|
||
| `modules/companies/src/api/infrastructure/persistence/sequelize-process.repository.ts` | `5aa7c92a5b6532599662c3e43c6dcae31929d547d5f63a7816ea819368195281` |
|
||
| `modules/companies/src/api/infrastructure/persistence/sequelize-remote-connection.repository.ts` | `a3e38951f38cc40d695fbb86cde0fdcc812372d370e9196c5421413811c59af8` |
|
||
| `modules/companies/src/api/infrastructure/persistence/sequelize-software-installation.repository.ts` | `ee087829a2ac9b33c61e92c795b0a5e2a838a21b5d80dc02ef66f3acf12a6325` |
|
||
| `modules/companies/src/api/infrastructure/persistence/software-installation-migration.ts` | `0f38b7cc6f7ea8ec4e38089765a68b1ba051339ecdac666d1f291cc17fa986b8` |
|
||
| `modules/companies/src/api/infrastructure/persistence/software-installation-snapshot.ts` | `9020cc790d238401a52de8c63d9d2765c218b8f3dbb32ab79a24b00b26edabab` |
|
||
| `modules/companies/src/common/application-configurations.ts` | `fd8db3dd5ecc73a6eeb9e57c6c53d8c7ff2b06b9cdd69255e51edb4f65c37052` |
|
||
| `modules/companies/src/common/software-installations.ts` | `d64b220536d2fcc360fd0628c61fe0b5804c4cfa1b285ddbecdf78aefa166240` |
|
||
| `modules/companies/src/web/application-configurations/create/ui/application-quick-editor.tsx` | `8d2f7d332168dd3951e037ed8d516cfcac4c34c59e8001539508300d10900cd3` |
|
||
| `modules/companies/src/web/application-configurations/shared/controllers/use-application-configuration-form-controller.ts` | `6ecf7b2ce100891dde76a6115c2f43e2fa406b1f26178289ee7c0126b599cad0` |
|
||
| `modules/companies/src/web/application-configurations/shared/helpers/application-configuration-form-values.ts` | `ba78e87fcf991ebacad26141c1451409e4ce2b401addd182857e096e85fdb388` |
|
||
| `modules/companies/src/web/software-installations/create/ui/software-resource-create-dialog.tsx` | `2678d2b23681cc7dd93f4cef88691b2ea1fe125b27a3ba60fb2507cbc017254f` |
|
||
| `modules/companies/src/web/software-installations/list/ui/software-installations-panel.tsx` | `2aa056e0b41392671f4d21e41a858430a7393ded43527ffc636cb0107c88c7db` |
|
||
| `modules/companies/src/web/software-installations/shared/ui/software-installation-form.tsx` | `f2143c41be108626e1943b651b93f3bd3467f5299e3495e5f6c72fec21d93294` |
|
||
| `modules/companies/src/web/workspace/catalogs/ui/global-catalog-content.tsx` | `9f72f39379b82ad514abf27d8e6340a5fb5acdc7960c17a54279b58c105dbe8d` |
|
||
| `modules/identity/src/api/application/identity.use-cases.ts` | `3b1c38e03732ad6ba557bf96501282a3e7f46c5870c1c1e67c98f2b078c7f718` |
|
||
| `modules/identity/src/api/infrastructure/http/identity.routes.ts` | `e595e898a7e7addc1d6c8853680941f6c3b451701c6cbc010140493325ae4b51` |
|
||
| `modules/identity/src/api/infrastructure/http/require-authenticated.ts` | `5f7bcfe1a60229036593d780d1e0a266c181ac29cae9619802b5400c39af4c6a` |
|
||
| `modules/resources/package.json` | `a34ef6b04c8ba677c95b0b4ef38814e92c4c11cdbb6f1aee802c1c054302b84c` |
|
||
| `modules/resources/src/api/application/resource-input.mapper.ts` | `6e549289177b7cd87bd3c71243b59a3e0dcf749d0ff3330d1b2593771f288b80` |
|
||
| `modules/resources/src/api/application/resource-inventory.service.ts` | `e05c4c660be082de071d96160a473d58fad8dfaf098f9b8a9c8bfc172307cdd6` |
|
||
| `modules/resources/src/api/application/resource-lifecycle.test.ts` | `65b334340c7666a801f6d13c7c7420fa520be05bb5f8edf2f4b8ed04b32aab8b` |
|
||
| `modules/resources/src/api/application/resource.repository.ts` | `d0d8167bb2aaa7f124f72a9ffec4eccbc21f039c876c5c53e2e98e24a6ecfb43` |
|
||
| `modules/resources/src/api/application/resource.use-cases.ts` | `6cdc07279fa4bdb3b550b279724bafde46036af41d8d759eebdc8a26c0b70b5c` |
|
||
| `modules/resources/src/api/domain/resource-catalog-seed.ts` | `fd0c1e0dd95d5bb7f9d89e97fa66864619da0a308195c1b0ddf4fd17df799545` |
|
||
| `modules/resources/src/api/domain/resource-catalog.aggregate.ts` | `7a6ba7a4e944b16e1bfa7b98d20c7bdb0d80064f0664283ab124cba63ae9109a` |
|
||
| `modules/resources/src/api/domain/resource-definition.entity.ts` | `7fdfab66c78a8ac952e9ba4dcf2934b1c38b5784113fb7612a4b8f0bd39d0c80` |
|
||
| `modules/resources/src/api/domain/resource-definition.ts` | `6ad4b81950afea2f5f8e55d364f0c223f9a62f20b1f334dcc2232b81ea5d7b3d` |
|
||
| `modules/resources/src/api/domain/resource-values.ts` | `89a806387dd1ba7cff6d24cba189ce54b7ac0bfb9f64580c92931722e103206b` |
|
||
| `modules/resources/src/api/domain/resource.aggregate.ts` | `b80405c8eb8e275651bdb1747756085db86198e0799ee8704b1cc9a92d12245f` |
|
||
| `modules/resources/src/api/domain/resource.test.ts` | `9af60e53120faacb56e3a4c62257fdd1deccdf5a85f274df16200672403ab4f5` |
|
||
| `modules/resources/src/api/domain/value-objects/resource-values.vo.ts` | `4f95e8f3c08bb2ca0c121a9896f7cf0b854aad28a58b89dc47835d4ce0cd2d51` |
|
||
| `modules/resources/src/api/infrastructure/http/resource-catalog.routes.ts` | `16154a0b16b146a3db6e0828a16802c3b1967e86a549b791dfb0820221cbab3d` |
|
||
| `modules/resources/src/api/infrastructure/http/resource.routes.ts` | `7f64a8129cf0aa37273c5a332a5eb9e8bef1d864a0377ffc3fdd9baed0a79805` |
|
||
| `modules/resources/src/api/infrastructure/persistence/directory-domain-migration.ts` | `b5de1785013a014b99bf45ac0c90142f3d70165ee98fa0790e492fbb784ae7b4` |
|
||
| `modules/resources/src/api/infrastructure/persistence/directory-domain-options-reader.ts` | `2a1f7be9471376ec19145ba67afbc272b89805a75655e9b8dc23883a82fe67ac` |
|
||
| `modules/resources/src/api/infrastructure/persistence/directory-domain-reader.ts` | `bf7a460e84ca2740e380eed9201d743d17117192adfd9ba706a2b41716470039` |
|
||
| `modules/resources/src/api/infrastructure/persistence/directory-domain-summary-resolver.ts` | `cc21520a0a3add4ba323cafb305a29d29266260cd71f86c1884ef2c70b4d826f` |
|
||
| `modules/resources/src/api/infrastructure/persistence/migrate-legacy-resources.ts` | `6f1c30b6cf2d6a87fa585fe56529b67315731c3e6a805a90b46d426298422d49` |
|
||
| `modules/resources/src/api/infrastructure/persistence/migrate-support-resources.ts` | `322830ae8db05172648d8c079097e15f91b2b89da46fb210f7828db21268b979` |
|
||
| `modules/resources/src/api/infrastructure/persistence/network-share-migration.ts` | `df0042c42e9af912fe531c8759393b67274e63272e16d03881c7d2079bdb8cc3` |
|
||
| `modules/resources/src/api/infrastructure/persistence/network-share-options.ts` | `fb9c5dcecfd927d05d406e548ef553d5e0b0b844c9b8eeec60c4d9aaf71ca4e5` |
|
||
| `modules/resources/src/api/infrastructure/persistence/network-share-reader.ts` | `f1ec3cbaa17143451aa3cffa44516985787dca5b96ba8e422f4f8f5fe7180dd2` |
|
||
| `modules/resources/src/api/infrastructure/persistence/network-share-summary-resolver.ts` | `f3ee940213caaf7a1f7754ab7f960f29398be752e9096ebf9c4c01c59ef86b23` |
|
||
| `modules/resources/src/api/infrastructure/persistence/prepare-resource-template-updates.ts` | `5cbfee8cef8002aa9eda6044698525b174bbdfc5bfb42823235778f08d847aac` |
|
||
| `modules/resources/src/api/infrastructure/persistence/remove-resource.ts` | `a059f950534a19414cb09e402562e6963d09d120d7629ca770d10d5edb7af64d` |
|
||
| `modules/resources/src/api/infrastructure/persistence/resource-catalog.model.ts` | `7ee78b602bccefd2c2f9106627bc1b8fe4e2c1cccff34e7b79b09a3649e68be6` |
|
||
| `modules/resources/src/api/infrastructure/persistence/resource-compatibility.ts` | `0d07a48da382b1d85931071c6386a4467a8b1735c1f3afb2391ba077790ebc7f` |
|
||
| `modules/resources/src/api/infrastructure/persistence/resource-dashboard-reader.ts` | `63ea6c04ad9bf02142ed491c7e92857361a127a76d819912099eda72822d6fe3` |
|
||
| `modules/resources/src/api/infrastructure/persistence/resource-inventory-relational.ts` | `c4d1472f0f5fceb0d1c0395a78586faf1735d97a655489d18622f03fe1d35d6c` |
|
||
| `modules/resources/src/api/infrastructure/persistence/resource-persistence.mapper.ts` | `b27d3e79b20db981adbf2b75716ef194324fa342197868adcc1beb802f523b5b` |
|
||
| `modules/resources/src/api/infrastructure/persistence/resource-projection-reader.ts` | `a7aa9a92580cdbf60f68c4c327ef58c6dbf2b97b5e923ec36d9d56e3850c378b` |
|
||
| `modules/resources/src/api/infrastructure/persistence/resource-relational-schema.ts` | `4022e5c3e4806213025ec91da8dbef858e334c97d8f85fc587133b297888d0c5` |
|
||
| `modules/resources/src/api/infrastructure/persistence/resource-revision-specifications.ts` | `71dd63caffcaf33d65288e3c0be7dabff9de32d65854241f8b5b65e18ee83d00` |
|
||
| `modules/resources/src/api/infrastructure/persistence/resource.model.ts` | `9ebcf283218d4ceeace0faeca74bc048ae805b7817bd4c1297b044082cd69822` |
|
||
| `modules/resources/src/api/infrastructure/persistence/sequelize-resource.repository.ts` | `16a4fc8361ade3a8faffea173f95303eec87185b4491c0ec515ccf544fac6fd1` |
|
||
| `modules/resources/src/api/module.ts` | `b1172f039a6bf9164e524f83aa04883bfab503e50f2656a4e363a14bc65493a3` |
|
||
| `modules/resources/src/api/services.ts` | `25b29ed7ec209ab5453cf9f22d5c968847c7cc0eff7dea3f0e7a417758c7e8a8` |
|
||
| `modules/resources/src/common/index.ts` | `1b36f6a6133dedbdbff6788e233b70d20cb2c886ba3ba7449c89364f7c8e7ef5` |
|
||
| `modules/resources/src/common/inventory.ts` | `8ac1f4fb55b1dcbc925898e867b9cf2eb058b509e26f9b52245b033786e6e3ea` |
|
||
| `modules/resources/src/common/resource-capabilities.ts` | `eb065ea7daffd9dd13522139361493ff85a484ec2a627f1579cb615e836b246f` |
|
||
| `modules/resources/src/web/resources/detail/ui/resource-detail.tsx` | `3c3273b281cf5a52a5ec253c8fc870ad6cf6195e8c37ff1b2456aef6bf8587d9` |
|
||
| `modules/resources/src/web/resources/list/controllers/use-resources-page-controller.ts` | `da06f23016b38260598bce52dfbac404d267787b864b2a714e6009f01c3bf9b8` |
|
||
| `modules/resources/src/web/resources/shared/api/inventory-api.ts` | `450bd6ba1dcf929e97730cb8e65901086c110bd4102ee20f25978c5a9b55d694` |
|
||
| `modules/resources/src/web/resources/shared/api/resource-related-query-keys.ts` | `f13dddbd1b42dca83b58cf5b3a1b7417cb3604640fe1566903b472bfbcb0b784` |
|
||
| `modules/resources/src/web/resources/shared/controllers/use-resource-form-controller.ts` | `a5456e71c14a4d6a7d7718e216e3657ab5ca22ad676b73c8cd78f2b33967d5a4` |
|
||
| `packages/rdx-ui/src/components/form-dialog.tsx` | `6fe64d79c942c5d1ba43e05e2d0908c57226fcda31fd5659198e25a9e510f57d` |
|
||
| `packages/rdx-ui/src/components/option-picker-list.tsx` | `aef16c7eab3041496f12389a8e28ef54b7e627dfd6bd6994a724e4050d8b044f` |
|
||
| `packages/rdx-ui/src/components/select-with-action.tsx` | `a56d678fe4f78fc69c9d42e912e65151bbdd3033c20e7f4bf08dff7ac9f70475` |
|
||
|
||
## Verificador documental reproducible
|
||
|
||
Resultado final: **12 documentos, 533 enlaces locales, 99 huellas SHA-256 y 112 anclas de símbolos comprobados**, sin errores. También se revisó whitespace de cada Markdown nuevo mediante git diff --no-index --check, porque git diff ordinario no incluye archivos sin seguimiento. El estado final de git solo añade esta carpeta documental; los cambios previos observados al inicio ya no aparecen pendientes en el estado final. No se hizo commit ni se alteraron esos archivos desde esta tarea.
|
||
|
||
Ejecutar desde la raíz, sin conexión a BD:
|
||
|
||
```bash
|
||
python3 - <<'PY'
|
||
from pathlib import Path
|
||
import hashlib
|
||
import re
|
||
import subprocess
|
||
|
||
base = Path('docs/auditorias/resources-global-scope')
|
||
files = sorted(base.glob('*.md'))
|
||
assert len(files) == 12
|
||
links = 0
|
||
for file in files:
|
||
body = file.read_text()
|
||
assert chr(123) * 2 not in body and chr(125) * 2 not in body, file
|
||
assert body.count(chr(96) * 3) % 2 == 0, file
|
||
for target in re.findall(r'\]\(([^)]+)\)', body):
|
||
if target.startswith(('https://', 'http://')):
|
||
continue
|
||
name, _, anchor = target.partition('#')
|
||
source = (file.parent / name).resolve()
|
||
assert source.is_file(), (file, target)
|
||
if anchor.startswith('L'):
|
||
assert 1 <= int(anchor[1:]) <= len(source.read_text().splitlines()), target
|
||
links += 1
|
||
result = subprocess.run(['git', 'diff', '--no-index', '--check', '/dev/null', str(file)], capture_output=True, text=True)
|
||
assert result.returncode in (0, 1) and not result.stdout and not result.stderr, result.stdout + result.stderr
|
||
matrix = (base / '12-matriz-trazabilidad.md').read_text()
|
||
hashes = re.findall(r'^\| `([^`]+)` \| `([a-f0-9]{64})` \|$', matrix, re.M)
|
||
for name, expected in hashes:
|
||
assert hashlib.sha256(Path(name).read_bytes()).hexdigest() == expected, name
|
||
sources = re.findall(r'^\| E-[^|]+\| \[([^]]+)\]\([^#]+#L(\d+)\) \| `([^`]+)` \|$', matrix, re.M)
|
||
for name, line, token in sources:
|
||
actual = Path(name).read_text().splitlines()[int(line)-1]
|
||
assert token.replace(' / ', '|') in actual, (name, line, token)
|
||
print(f'OK: {len(files)} documentos, {links} enlaces locales, {len(hashes)} huellas SHA-256, {len(sources)} anclas de símbolos y whitespace de cada fichero.')
|
||
PY
|
||
```
|