# E-018 — El inventario global ocultaba eventos reales por rutas no canónicas

- Fecha: 2026-08-03
- Estado: falso negativo de observabilidad confirmado, corregido y cubierto por regresión.

## Jerarquía de objetivos

- Objetivo principal: detectar desvíos deterministas con una señal temprana y trazable.
- Objetivo de fase: observar actividad de hooks globales sin exponer contenido del repositorio.
- Objetivo de ronda: pre-registrar un ensayo control/placebo/guard y verificar dogfooding de Claude y Codex.

## Trayectoria observada

Durante el dogfooding de esta ronda se ejecutaron Claude y Codex sobre `src/intervention-trial-design.mjs`. `~/.oguard/inventory/events.jsonl` recibió cuatro eventos sanitizados nuevos, dos por harness, todos con resultado `pass`. Sin embargo, `oguard inventory report --json` seguía mostrando sólo cuatro eventos históricos.

El hook calcula `repository_hash` con la raíz física (`realpath`) para evitar el problema E-015. En cambio, `inventory discover` guardaba la raíz textual pasada por el usuario. Cuando ambas representaciones diferían, el reporte filtraba los eventos por un hash distinto y los ocultaba. No era ausencia de actividad ni un `pass` silencioso: era una pérdida de observabilidad en la agregación global.

## Corrección y evidencia

`discoverProjects` canoniza cada raíz con `realpath` antes de persistirla y calcular su hash. También preserva hashes anteriores del mismo registro como aliases de lectura: al actualizar el inventario, los eventos sanitizados ya escritos con la identidad anterior siguen contando. Si un hash histórico ya no puede asociarse de manera segura, `inventory report` lo expone como `unregistered_events` en vez de descartarlo silenciosamente. `test/global-inventory.test.mjs` cubre un proyecto registrado mediante symlink, una actualización desde hash legado y eventos no asociados. La corrección mantiene el inventario sanitizado: sólo cambian raíces y hashes internos, no se añaden paths de archivos, contenido ni prompts.

## Impacto sobre la tesis

La telemetría de hooks sólo es evidencia si el inventario puede reconstruirla. Antes de esta corrección, una cuenta baja podía interpretarse erróneamente como poca actividad, baja incidencia o baja sensibilidad. El episodio fortalece la trazabilidad del instrumento, pero no incrementa por sí solo la sensibilidad de los detectores ni demuestra eficacia causal del guard.

## Seguimiento

Después de cada instalación o nuevo harness, ejecutar `oguard inventory discover` y contrastar la cantidad de eventos sanitizados con el log local antes de interpretar métricas de uso.
