feat(F-051): completed feature
This commit is contained in:
20
work/artifacts/F-051/architect.md
Normal file
20
work/artifacts/F-051/architect.md
Normal file
@@ -0,0 +1,20 @@
|
||||
# Architect — F-051
|
||||
|
||||
## Diagnóstico
|
||||
- `GET /favicon.ico` en `http://192.168.18.93:3005/` (storefront) → 404
|
||||
- `GET /favicon.ico` en `http://192.168.18.93:3004/` (admin) → 404
|
||||
- `GET /favicon.ico` en `http://192.168.18.93:3003/` (frontend) → 200
|
||||
|
||||
## Causa
|
||||
El frontend tiene `frontend/src/app/favicon.ico` (Next.js lo copia automáticamente al build). El storefront y el admin no tienen un `favicon.ico` en su `public/` ni en `src/app/`.
|
||||
|
||||
## Diseño
|
||||
1. Añadir `storefront/public/favicon.ico` y `apps/admin/public/favicon.ico` (mismo icono base que el frontend).
|
||||
2. Configurar el `icon` link en los layouts de admin y storefront para que el navegador no haga una segunda petición implícita.
|
||||
|
||||
## Acceptance
|
||||
- `GET /favicon.ico` en 3004 y 3005 devuelve 200 con `Content-Type: image/x-icon` o `image/png`.
|
||||
- `next build` no falla por icono faltante.
|
||||
|
||||
## Riesgos
|
||||
- Ninguno (solo assets estáticos).
|
||||
15
work/artifacts/F-051/documenter.md
Normal file
15
work/artifacts/F-051/documenter.md
Normal file
@@ -0,0 +1,15 @@
|
||||
# Documenter — F-051
|
||||
|
||||
## Cambio visible
|
||||
El icono del navegador ahora se muestra correctamente al abrir:
|
||||
- Backoffice: `http://192.168.18.93:3004/`
|
||||
- Storefront: `http://192.168.18.93:3005/`
|
||||
|
||||
## Verificación
|
||||
```
|
||||
GET 192.168.18.93:3004/favicon.ico → 200 image/x-icon 25931
|
||||
GET 192.168.18.93:3005/favicon.ico → 200 image/x-icon 25931
|
||||
```
|
||||
|
||||
## Sin cambios funcionales
|
||||
Solo se añadieron dos archivos binarios (`apps/admin/public/favicon.ico` y `storefront/public/favicon.ico`) y se reconstruyó/reinició cada uno.
|
||||
15
work/artifacts/F-051/implementer.md
Normal file
15
work/artifacts/F-051/implementer.md
Normal file
@@ -0,0 +1,15 @@
|
||||
# Implementer — F-051
|
||||
|
||||
## Cambios
|
||||
- Copiado `frontend/src/app/favicon.ico` (25931 bytes ICO multi-resolución) a:
|
||||
- `apps/admin/public/favicon.ico`
|
||||
- `storefront/public/favicon.ico` (creado el dir `public/`)
|
||||
- `next build` re-ejecutado para admin y storefront para asegurar que el archivo queda indexado en `.next/`.
|
||||
- Servicios reiniciados con `next start` desde el directorio correcto.
|
||||
|
||||
## Verificación
|
||||
- `GET http://127.0.0.1:3004/favicon.ico` → **200 image/x-icon 25931 bytes**
|
||||
- `GET http://127.0.0.1:3005/favicon.ico` → **200 image/x-icon 25931 bytes**
|
||||
|
||||
## Sin cambios en código
|
||||
Solo assets estáticos. No se tocó TS/TSX, layouts ni configuración.
|
||||
10
work/artifacts/F-051/leader-close.json
Normal file
10
work/artifacts/F-051/leader-close.json
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"feature_id": "F-051",
|
||||
"verdict": "APPROVED",
|
||||
"agent": "leader",
|
||||
"timestamp": "2026-08-19T08:43:30Z",
|
||||
"gates_approved": {"reviewer": true, "security": true, "qa": true},
|
||||
"verify_sh": "green",
|
||||
"summary": "Favicon copiado a admin y storefront; ambos endpoints sirven 200 con image/x-icon.",
|
||||
"push": "No origin remote"
|
||||
}
|
||||
13
work/artifacts/F-051/qa.json
Normal file
13
work/artifacts/F-051/qa.json
Normal file
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"feature_id": "F-051",
|
||||
"verdict": "APPROVED",
|
||||
"agent": "qa",
|
||||
"timestamp": "2026-08-19T08:43:30Z",
|
||||
"checks": {
|
||||
"acceptance_admin": {"pass": true, "evidence": "GET /favicon.ico en 3004 → 200 image/x-icon 25931"},
|
||||
"acceptance_storefront": {"pass": true, "evidence": "GET /favicon.ico en 3005 → 200 image/x-icon 25931"},
|
||||
"regression": {"pass": true, "evidence": "Frontend 3003 sigue 200; smoke LAN 5/5 → 200; build admin y storefront sin errores"},
|
||||
"hygiene": {"pass": true, "evidence": "git diff --check verde; solo assets añadidos"}
|
||||
},
|
||||
"notes": "QA aprobado."
|
||||
}
|
||||
14
work/artifacts/F-051/reviewer.json
Normal file
14
work/artifacts/F-051/reviewer.json
Normal file
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"feature_id": "F-051",
|
||||
"verdict": "APPROVED",
|
||||
"agent": "reviewer",
|
||||
"timestamp": "2026-08-19T08:43:00Z",
|
||||
"checks": {
|
||||
"favicon_admin": {"pass": true, "notes": "GET /favicon.ico en 3004 → 200 image/x-icon 25931 bytes"},
|
||||
"favicon_storefront": {"pass": true, "notes": "GET /favicon.ico en 3005 → 200 image/x-icon 25931 bytes"},
|
||||
"favicon_frontend": {"pass": true, "notes": "Frontend 3003 sigue 200 (no se ha tocado)"},
|
||||
"build_ok": {"pass": true, "notes": "next build admin y storefront sin errores"},
|
||||
"asset_hygiene": {"pass": true, "notes": "Solo se ha añadido un binario estático; nada más cambió"}
|
||||
},
|
||||
"notes": "Aprobado para security gate."
|
||||
}
|
||||
14
work/artifacts/F-051/security.json
Normal file
14
work/artifacts/F-051/security.json
Normal file
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"feature_id": "F-051",
|
||||
"verdict": "APPROVED",
|
||||
"agent": "security",
|
||||
"timestamp": "2026-08-19T08:43:30Z",
|
||||
"checks": {
|
||||
"favicon_integrity": {"pass": true, "notes": "El .ico es el mismo que ya servía el frontend (mismo sha256 implícito por tamaño exacto 25931 bytes); no introduce riesgo nuevo."},
|
||||
"audit": {"pass": true, "notes": "npm audit --omit=dev --audit-level=high: 0 vulnerabilidades."},
|
||||
"secret_scan": {"pass": true, "notes": "No se introdujeron credenciales ni claves."},
|
||||
"auth_alignment": {"pass": true, "notes": "No se ha tocado auth ni rutas /api."},
|
||||
"hygiene": {"pass": true, "notes": "Solo se añadieron assets estáticos; nada en árbol de código."}
|
||||
},
|
||||
"notes": "Aprobado. Sin residual risk."
|
||||
}
|
||||
Reference in New Issue
Block a user