metis-desk/docs/auditorias/resources-global-scope/12-matriz-trazabilidad.md
2026-10-25 01:19:17 +02:00

59 KiB
Raw Blame History

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, composición, flujo HTTP, contratos HTTP, DDD, pruebas, relaciones tipadas, proveedor.

Funcionalidad: recursos, inventario, software, aplicaciones del perfil, usuarios y acceso. 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, selección de skills, listados, diálogos, componentes, Playwright. 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, foreign keys, commit implícito. 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 sql: resource.model.ts:19 Dominio/SQL/DTO Ámbito explícito propuesto; R2.1
H02 CONFIRMADO valores/especificaciones son relacionales typed: resource-relational-schema.ts:98 write: resource-inventory-relational.ts:315 history: resource-revision-specifications.ts:39 Persistencia e historial Mantener normalización
H03 CONFIRMADO ámbito de definición es global/local visible: resource-catalog.aggregate.ts:41 catalogSQL: resource-catalog.model.ts:48 Plantillas No confundir con producto
H04 CONFIRMADO identidad Aplicación estable por stockKey seed: resource-catalog-seed.ts:140 usage: resource-inventory.service.ts:54 Selectores/políticas Nunca filtrar por nombre
H05 CONFIRMADO uso personalizado application definition: resource-definition.ts:23 applicationOptions: application-configuration-form-values.ts:8 Plantillas propias Conservar locales; global allowlist inicial
H06 CONFIRMADO provider/url/description opcionales seedfields: resource-catalog-seed.ts:9 seed: resource-catalog-seed.ts:140 Producto/UX Reutilizar; no inventar categoría
H07 CONFIRMADO plantilla y contexto de Resource fijos update: resource.aggregate.ts:100 CRUD y consolidación Scope también fijo propuesto
H08 CONFIRMADO historial UUID/actor/fecha/snapshot mapper: resource-persistence.mapper.ts:24 history: resource-revision-specifications.ts:39 Lectura/edición No reescribir revisiones
H09 CONFIRMADO borrado físico protegido por FKs externas remove: remove-resource.ts:37 Actual e histórico Global usado no se elimina
H10 CONFIRMADO unicidad nombre en Application save: resource.use-cases.ts:64 Altas concurrentes No unique nullable simplista
H11 CONFIRMADO SQL compuesta operativa local directorySQL: directory-domain-migration.ts:5 shareSQL: network-share-migration.ts:4 supportSQL: support-migration.ts:86 SMB/directorio/asistencia No ampliar ámbito
H12 CONFIRMADO sesión sin ACL por compañía auth: require-authenticated.ts:6 relationshipAuth: relationship-read-access.ts:7 Seguridad contextual D04; A02 condicionado
H13 CONFIRMADO admin inicial solo probado para usuarios admin: identity.use-cases.ts:75 catalogRoutes: resource-catalog.routes.ts:65 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 softwareRead: sequelize-software-installation.repository.ts:27 Instalaciones Resolver application global por propósito
H15 CONFIRMADO backend valida IDs de perfil/aplicación applicationPolicy: application-configuration-policy.ts:5 applicationRead: sequelize-application-configuration.repository.ts:34 Configuraciones Mantener perfil local
H16 CONFIRMADO instalación/perfil independientes softwareInput: software-installation-values.ts:5 applicationInput: application-configuration-values.ts:5 Versión/estado/historia No fusionar ni propagar operación
H17 CONFIRMADO licencia Resource local opcional softwareFK: software-installation-snapshot.ts:7 softwarePolicy: software-installation-policy.ts:5 Licencias/historia Global producto no comparte licencia
H18 CONFIRMADO no vínculo canónico licencia-producto softwareInput: software-installation-values.ts:5 seed: resource-catalog-seed.ts:140 Cobertura/licencias No afirmar consumo/cobertura
H19 CONFIRMADO servicio list también consumido por remoto remoteRead: sequelize-remote-connection.repository.ts:92 remotePolicy: remote-connection-policy.ts:6 Destinos operativos Mantener list local; A03
H20 CONFIRMADO solo listado completo Resource en HTTP routes: resource.routes.ts:54 inventoryDTO: inventory.ts:55 Rendimiento y detalle Nuevos candidatos/resolución R2.2
H21 CONFIRMADO DTO Resource no nullable y strict dto: inventory.ts:35 input: resource-values.ts:40 Compatibilidad cliente Despliegue de lectores antes de activar
H22 CONFIRMADO selector actual sin búsqueda remota select: select-with-action.tsx:19 softwareUI: software-installations-panel.tsx:26 applicationOptions: application-configuration-form-values.ts:8 UX Chrome Adaptar componente/paginación R2.4
H23 CONFIRMADO altas rápidas crean local softwareQuick: software-resource-create-dialog.tsx:5 applicationQuick: application-quick-editor.tsx:8 Duplicados No ofrecer alta global implícita
H24 DERIVABLE inactivo mantiene referencia/revisión softwareResponse: software-installation-response.builder.ts:7 applicationPolicy: application-configuration-policy.ts:5 Desactivación multicompañía Resolución de usados con inactivos
H25 RIESGO propagación presupone compañía propagation: prepare-resource-template-updates.ts:15 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 applicationRead: sequelize-application-configuration.repository.ts:34 service: resource-inventory.service.ts:7 Concurrencia Punto de serialización R2.2
H27 RIESGO caché local no expresa cambio global inventoryAPI: inventory-api.ts:11 invalidation: resource-related-query-keys.ts:4 Selectores/avisos Claves nuevas y refetch
H28 RIESGO count/inner join con global NULL dashboard: resource-dashboard-reader.ts:15 Dashboard Separar métricas producto/operación
H29 RIESGO exposición de historial global completo resourceDetail: resource-detail.tsx:11 dto: inventory.ts:35 Privacidad Proyección mínima y permiso
H30 DERIVABLE destino fijo complica consolidación softwareMapper: software-installation-input.mapper.ts:15 applicationMapper: application-configuration-input.mapper.ts:11 Adopción/duplicados Coexistir; comando separado R2.6
H31 NO CONFIRMADO Plugin Architecture v1 module: module.ts:39 runtime: identity-runtime.ts:17 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:

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:

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 export class Resource
E-owner modules/resources/src/api/domain/resource.aggregate.ts companyId: UniqueID;
E-update modules/resources/src/api/domain/resource.aggregate.ts update(
E-input modules/resources/src/api/domain/resource-values.ts export const ResourceInputSchema
E-spec modules/resources/src/api/domain/resource-values.ts export const ResourceSpecificationSchema
E-values modules/resources/src/api/domain/value-objects/resource-values.vo.ts export class ResourceValues
E-sql modules/resources/src/api/infrastructure/persistence/resource.model.ts export async function migrateInventory
E-columns modules/resources/src/api/infrastructure/persistence/resource-relational-schema.ts export const inventoryColumns
E-typed modules/resources/src/api/infrastructure/persistence/resource-relational-schema.ts const typedValues
E-mapper modules/resources/src/api/infrastructure/persistence/resource-persistence.mapper.ts export class ResourcePersistenceMapper
E-read modules/resources/src/api/infrastructure/persistence/resource-inventory-relational.ts export async function readInventory
E-write modules/resources/src/api/infrastructure/persistence/resource-inventory-relational.ts export async function writeInventory
E-history modules/resources/src/api/infrastructure/persistence/resource-revision-specifications.ts export async function migrateResourceRevisionSpecifications
E-repository modules/resources/src/api/infrastructure/persistence/sequelize-resource.repository.ts export class SequelizeResourceRepository
E-load modules/resources/src/api/infrastructure/persistence/sequelize-resource.repository.ts private async load
E-save modules/resources/src/api/application/resource.use-cases.ts save(
E-capture modules/resources/src/api/application/resource-input.mapper.ts export function captureResourceSpecification
E-mapInput modules/resources/src/api/application/resource-input.mapper.ts export function mapResourceInput
E-remove modules/resources/src/api/infrastructure/persistence/remove-resource.ts export async function removeResource
E-routes modules/resources/src/api/infrastructure/http/resource.routes.ts export function registerResourceRoutes
E-dto modules/resources/src/common/inventory.ts export const ResourceSchema
E-inventoryDTO modules/resources/src/common/inventory.ts export const InventoryResponseSchema
E-port modules/resources/src/api/application/resource.repository.ts export interface IResourceRepository
E-service modules/resources/src/api/application/resource-inventory.service.ts export interface IResourceInventoryService
E-usage modules/resources/src/api/application/resource-inventory.service.ts function resourceUsage
E-seed modules/resources/src/api/domain/resource-catalog-seed.ts const TEMPLATES
E-seedfields modules/resources/src/api/domain/resource-catalog-seed.ts const FIELDS
E-definition modules/resources/src/api/domain/resource-definition.ts export const ResourceDefinitionSchema
E-definitionEntity modules/resources/src/api/domain/resource-definition.entity.ts export class ResourceDefinition
E-catalog modules/resources/src/api/domain/resource-catalog.aggregate.ts export class ResourceCatalog
E-visible modules/resources/src/api/domain/resource-catalog.aggregate.ts visible(
E-catalogSQL modules/resources/src/api/infrastructure/persistence/resource-catalog.model.ts export async function migrateResourceCatalog
E-propagation modules/resources/src/api/infrastructure/persistence/prepare-resource-template-updates.ts export async function prepareResourceTemplateUpdates
E-catalogRoutes modules/resources/src/api/infrastructure/http/resource-catalog.routes.ts export function registerResourceCatalogRoutes
E-catalogDTO modules/resources/src/common/index.ts export const CatalogItemSchema
E-capability modules/resources/src/common/resource-capabilities.ts export function resourceTemplateCapability
E-module modules/resources/src/api/module.ts export async function createResourceModule
E-exports modules/resources/package.json "exports"
E-services modules/resources/src/api/services.ts IResourceInventoryService
E-inventoryAPI modules/resources/src/web/resources/shared/api/inventory-api.ts export const inventoryKeys
E-invalidation modules/resources/src/web/resources/shared/api/resource-related-query-keys.ts export function resourceRelatedQueryKeys
E-resourceController modules/resources/src/web/resources/list/controllers/use-resources-page-controller.ts export function useResourcesPageController
E-resourceDetail modules/resources/src/web/resources/detail/ui/resource-detail.tsx export function ResourceDetail
E-resourceForm modules/resources/src/web/resources/shared/controllers/use-resource-form-controller.ts export function useResourceFormController
E-softwarePolicy modules/companies/src/api/application/software-installation-policy.ts export function softwareReferences
E-softwareMapper modules/companies/src/api/application/software-installation-input.mapper.ts export function mapSoftwareInput
E-softwareRead modules/companies/src/api/infrastructure/persistence/sequelize-software-installation.repository.ts private async load
E-softwareSQL modules/companies/src/api/infrastructure/persistence/software-installation-migration.ts export async function migrateSoftwareInstallations
E-softwareFK modules/companies/src/api/infrastructure/persistence/software-installation-snapshot.ts export const softwareSnapshot
E-softwareInput modules/companies/src/api/domain/software-installation-values.ts export const SoftwareInstallationInputSchema
E-softwareDTO modules/companies/src/common/software-installations.ts export const SoftwareInstallationSchema
E-softwareResponse modules/companies/src/api/application/software-installation-response.builder.ts export function buildSoftwareResponse
E-softwareUI modules/companies/src/web/software-installations/list/ui/software-installations-panel.tsx export function SoftwareInstallationsPanel
E-softwareForm modules/companies/src/web/software-installations/shared/ui/software-installation-form.tsx export function SoftwareInstallationForm
E-softwareQuick modules/companies/src/web/software-installations/create/ui/software-resource-create-dialog.tsx export function SoftwareResourceCreateDialog
E-applicationPolicy modules/companies/src/api/application/application-configuration-policy.ts export function applicationReferences
E-applicationMapper modules/companies/src/api/application/application-configuration-input.mapper.ts export function mapApplicationInput
E-applicationRead modules/companies/src/api/infrastructure/persistence/sequelize-application-configuration.repository.ts private async load
E-applicationSQL modules/companies/src/api/infrastructure/persistence/application-configuration-migration.ts export async function migrateApplicationConfigurations
E-applicationFK modules/companies/src/api/infrastructure/persistence/configuration-snapshots.ts export const applicationSnapshot
E-certificateFK modules/companies/src/api/infrastructure/persistence/configuration-snapshots.ts export const certificateSnapshot
E-applicationInput modules/companies/src/api/domain/application-configuration-values.ts export const ApplicationConfigurationInputSchema
E-applicationDTO modules/companies/src/common/application-configurations.ts export const ApplicationConfigurationSchema
E-applicationForm modules/companies/src/web/application-configurations/shared/controllers/use-application-configuration-form-controller.ts export function useApplicationConfigurationFormController
E-applicationOptions modules/companies/src/web/application-configurations/shared/helpers/application-configuration-form-values.ts export function applicationOptions
E-applicationQuick modules/companies/src/web/application-configurations/create/ui/application-quick-editor.tsx export function ApplicationQuickEditor
E-auth modules/identity/src/api/infrastructure/http/require-authenticated.ts export function requireAuthenticated
E-admin modules/identity/src/api/application/identity.use-cases.ts private async administrator
E-runtime apps/server/src/infrastructure/http/identity-runtime.ts export async function createIdentityRuntime
E-relationshipAuth apps/server/src/infrastructure/http/relationship-read-access.ts export class SessionRelationshipReadAccess
E-directorySQL modules/resources/src/api/infrastructure/persistence/directory-domain-migration.ts export async function migrateDirectoryDomains
E-shareSQL modules/resources/src/api/infrastructure/persistence/network-share-migration.ts export async function migrateNetworkShares
E-supportSQL modules/assets/src/api/infrastructure/persistence/support-migration.ts support_resource_company
E-supportRead modules/assets/src/api/infrastructure/persistence/sequelize-support.repository.ts SELECT r.id,r.name
E-shareRead modules/resources/src/api/infrastructure/persistence/network-share-reader.ts export class NetworkShareReader
E-directoryRead modules/resources/src/api/infrastructure/persistence/directory-domain-reader.ts export class DirectoryDomainReader
E-shareOptions modules/resources/src/api/infrastructure/persistence/network-share-options.ts export class NetworkShareOptions
E-directoryOptions modules/resources/src/api/infrastructure/persistence/directory-domain-options-reader.ts export class DirectoryDomainOptionsReader
E-shareSummaries modules/resources/src/api/infrastructure/persistence/network-share-summary-resolver.ts export class NetworkShareSummaryResolver
E-directorySummaries modules/resources/src/api/infrastructure/persistence/directory-domain-summary-resolver.ts export class DirectoryDomainSummaryResolver
E-dashboard modules/resources/src/api/infrastructure/persistence/resource-dashboard-reader.ts export class ResourceDashboardReader
E-remotePolicy modules/companies/src/api/application/remote-connection-policy.ts export function remoteReferences
E-remoteRead modules/companies/src/api/infrastructure/persistence/sequelize-remote-connection.repository.ts resources: await this.resources.list(company)
E-remoteFK modules/companies/src/api/infrastructure/persistence/mail-remote-snapshots.ts export const remoteSnapshot
E-accessFK modules/companies/src/api/infrastructure/persistence/access-relational.ts export const accessColumns
E-projection modules/resources/src/api/infrastructure/persistence/resource-compatibility.ts export async function projectResource
E-sharePublication modules/assets/src/api/infrastructure/persistence/network-share-publication-migration.ts publication_share_fk
E-directoryMembership modules/assets/src/api/infrastructure/persistence/directory-membership-migration.ts directory_membership_domain_fk
E-process modules/companies/src/api/infrastructure/persistence/process-review-reader.ts resourceNames: ReadonlyMap
E-legacy modules/resources/src/api/infrastructure/persistence/migrate-legacy-resources.ts export async function migrateLegacyResources
E-supportMigration modules/resources/src/api/infrastructure/persistence/migrate-support-resources.ts export async function migrateSupportResources
E-softwareHTTP modules/companies/src/api/infrastructure/http/software-installation.routes.ts app.use(
E-applicationHTTP modules/companies/src/api/infrastructure/http/application-configuration.routes.ts app.use(
E-unitResource modules/resources/src/api/domain/resource.test.ts test(
E-unitLifecycle modules/resources/src/api/application/resource-lifecycle.test.ts test(
E-unitSoftware modules/companies/src/api/domain/software-installation.test.ts test(
E-unitApplication modules/companies/src/api/domain/application-configuration.test.ts test(
E-integrationResource apps/server/src/resources.integration.ts export async function
E-integrationLifecycle apps/server/src/resource-lifecycle.integration.ts export async function
E-integrationSoftware apps/server/src/software-installations.integration.ts export async function
E-integrationApplication apps/server/src/applications.integration.ts export async function
E-select packages/rdx-ui/src/components/select-with-action.tsx export function SelectWithAction
E-formDialog packages/rdx-ui/src/components/form-dialog.tsx export function FormDialog
E-picker packages/rdx-ui/src/components/option-picker-list.tsx export function OptionPickerList
E-globalUI modules/companies/src/web/workspace/catalogs/ui/global-catalog-content.tsx export function GlobalCatalogContent
E-processRead modules/companies/src/api/infrastructure/persistence/sequelize-process.repository.ts await this.resources.list(company)
E-folderInput modules/companies/src/api/domain/folder-mapping-values.ts export const FolderMappingInputSchema
E-folderPolicy modules/companies/src/api/application/folder-mapping-policy.ts export function folderReferences
E-folderFK modules/companies/src/api/infrastructure/persistence/configuration-snapshots.ts export const folderSnapshot
E-profileInput modules/companies/src/api/domain/work-profile-values.ts export const WorkProfileInputSchema
E-csrf modules/identity/src/api/infrastructure/http/identity.routes.ts request.get("origin") !== origin
E-projectionRead modules/resources/src/api/infrastructure/persistence/resource-projection-reader.ts 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:

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