59 KiB
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
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