Repository navigation
test(linux): verificación W3 en Linux real — fixtures de sesión, smoke de Secret Service y gate de bundles (#106) - #176
Conversation
…6#106) Recupera el linux-ci.yml consolidado (rama ci/linux-test-manual, commit 4ffd147) y añade el step W3 de la issue egdev6#106: Secret Service smoke real. - gh gnome-keyring al apt del runner (provee el servicio) - dbus-run-session crea un session bus aislado; gnome-keyring-daemon --unlock levanta el Secret Service con password de prueba propia. - Corre el test #[ignore] linux_secret_service_round_trip (secrets.rs): guarda/lee/borra un valor de prueba via backend linux-native (libsecret) — criterio 2 de egdev6#106 ("Secret Service probado en escritorio real"). Los unit tests de login con rutas complejas (split_login_command con espacios/no-ASCII/fail-closed) ya corren en el cargo test --locked previo (criterio 3). El workflow sigue manual (workflow_dispatch por ref). Co-Authored-By: Claude Code <noreply@anthropic.com>
…tifacts Tauri emits Quorb_<version>_amd64.deb/AppImage with an uppercase Q, while container verification searched for lowercase quorb_*. Both checks silently skipped and the orchestrator reported success without launching either binary. Find bundles case-insensitively and reject an empty artifact set so bundle verification is a real gate. Co-Authored-By: Claude Code <noreply@anthropic.com>
Registra los runs 39698848192 (tests + smoke Secret Service) y 39800266204 (bundle + arranque .deb/.AppImage) ejecutados sobre feat-linux-l1-106-retake en Ubuntu 22.04: - Smoke linux_secret_service_round_trip (gnome-keyring vía dbus-run-session): guardar/leer/borrar OK en el Secret Service real. - Build de bundles OK y arranque verificado en Ubuntu 22.04 limpia. - Documenta el bug del glob quorb_*.deb/AppImage (minúscula) que saltaba la validación y el fix case-insensitive + fail-on-empty. - Límites honestos: sin sesiones reales de CLI, sin escritorio real, solo ubuntu-22.04. Co-Authored-By: Claude Code <noreply@anthropic.com>
…tas (egdev6#106) Cubre el criterio 4 de egdev6#106 (proveedores comprobados en Linux real) de forma determinista y SIN credenciales reales en CI, alineado con la tabla de proveedores del README («Login oficial de <CLI>»): - fixtures/claude-credentials.json: estructura que escribe ~/.claude/.credentials.json (claudeAiOauth.accessToken/expiresAt/subscriptionType). - fixtures/codex-auth.json: estructura que escribe $CODEX_HOME/auth.json (tokens.{id_token,access_token,refresh_token,account_id}) + JWT id_token con las claims que parse_validity exige (exp > now, chatgpt_account_id, suscripción). - fixtures/gemini-oauth_creds.json: estructura que escribe ~/.gemini/oauth_creds.json (access_token/refresh_token/expiry_date). Tests (funciones puras existentes, mismo patrón que is_expired/parse_validity): - claude: parsea el fixture real y decide caducidad con reloj inyectado. - codex: parsea el fixture real y parse_validity reporta validez (now fijo). - gemini: extrae token_needs_refresh pura (sin HTTP) y verifica que el fixture NO dispara refresh (expiry lejano) ni usa token expirado. Refactor mínimo necesario: token_needs_refresh(creds, now_ms) en gemini, pura y testeable; access_token la usa. El refresh HTTP real (expirado) queda identificado como dependiente de red — gap documentado en docs/linux-l1-evidence. Co-Authored-By: Claude Code <noreply@anthropic.com>
El warning `unused variable: t` (CI) saltaba al filtrar el access_token: el binding solo comprobaba presencia. Ahora se expresa como booleano `usable` con is_some_and; misma semántica, sin warning. Co-Authored-By: Claude Code <noreply@anthropic.com>
) Endurece el build-verify tras la revisión del owner: cada verify-*.sh falla (exit 1) si falta SU propio tipo de bundle, en vez de avisar y seguir. El gate solo pasa si .deb y .AppImage están ambos y arrancan. Actualiza la evidencia W3 con el log leído del run 39837767677: los 3 tests de fixture de sesión real y el smoke de Secret Service aparecen como `ok`. Documenta el pendiente de migrate_legacy (criterio 2) y el detalle de KEYRING_PASS para reproducir el smoke. Co-Authored-By: Claude Code <noreply@anthropic.com>
Enriquece el fixture con refreshToken y scopes (campos que escribe el CLI y Quorb ignora) y documenta en la evidencia dónde vive la sesión de Claude por plataforma: macOS usa el Keychain (servicio Claude Code-credentials, ya cubierto por keychain_fallback) y Linux/WSL/Windows el JSON. Registra como límite que Quorb no lee CLAUDE_CODE_OAUTH_TOKEN. Co-Authored-By: Claude Code <noreply@anthropic.com>
|
@sosan he revisado los commits nuevos ( 🔴 Bloqueante: el inventario i18n está desactualizado — el CI de upstream fallaráTras los merges con main (
Fix: ✅ Verificación reproducida (head del PR)
✅ Los commits nuevos, bien
VeredictoAprobar con un cambio requerido: regenerar |
Los scripts de build-verify fallan con exit 1 si falta su propio bundle (commit 2f33507), pero el contrato no estaba protegido contra regresión. Añade un test node --test que ejercita los tres scripts (bash puro, fallan en el find antes de instalar/lanzar) contra un ARTIFACTS_DIR temporal: - falta el .deb -> exit 1 - falta el .AppImage -> exit 1 - set vacío -> exit 1 - solo llega el .AppImage -> el gate entero en rojo Los scripts aceptan ARTIFACTS_DIR (default /artifacts) para poder testearlos sin contenedor; el comportamiento del contenedor no cambia. Co-Authored-By: Claude Code <noreply@anthropic.com>
npm test también corre en windows-latest (ci.yml), donde bash/find no existen y el spawnSync fallaría con ENOENT. Los scripts de build-verify son bash de Linux; el test se autoexcluye fuera de POSIX. Co-Authored-By: Claude Code <noreply@anthropic.com>
|
@sosan re-revisión de los dos commits nuevos ( 🔴 Bloqueante 1 (arrastrado, sin resolver): inventario i18n staleSigue sin regenerarse — 🔴 Bloqueante 2 (nuevo): el test del gate falla en un checkout Linux limpio — exec bitHe ejecutado Causa: los tres Verificado que es solo eso: con Fix: ✅ Lo bueno de los commits nuevos
|
…v6#106) Bloqueantes de la re-revisión del PR egdev6#176 (2026-10-23): 1. Los tres verify-*.sh estaban en git con modo 100644. verify.sh los invoca por nombre vía PATH; en un checkout limpio sin el exec bit, bash los encuentra y falla con 126 (Permission denied) en vez del exit 1 esperado → 2 de 4 casos del test del gate en rojo. Modo corregido a 100755 (el Dockerfile ya los hace ejecutables con COPY --chmod=755; el contenedor no cambia). 2. docs/i18n-inventory.md quedó stale al añadir scripts/verify-linux-bundles.test.mjs: `--check` falla en el head y ci.yml (check egdev6#155) pondría el PR en rojo. Regenerado con `node scripts/i18n-inventory.mjs --out docs/i18n-inventory.md`. Co-Authored-By: Claude Code <noreply@anthropic.com>
|
@sosan re-revisión del commit 🔴→✅ Bloqueante 1: exec bit
🔴→✅ Bloqueante 2: inventario i18n
✅ Verificación completa (head
|
| Check | Resultado |
|---|---|
cargo test --locked |
256 passed, 0 failed |
vitest run --dir src |
658 passed |
tsc --noEmit |
Limpio |
i18n-inventory --check |
✅ |
Test del gate (verify-linux-bundles.test.mjs) |
4/4 ✅ |
Nota (no bloquea)
Sigue sin haber run de CI en el fork para el head nuevo (última run: 43caa59). El delta es mínimo y está todo verificado en local — no lo exijo.
Veredicto
Listo para merge. Con esto el PR cierra #175, cubre la verificación W3 de #106 en lo automatizable, deja el pendiente de migrate_legacy() documentado en la evidencia (con mi propuesta de smoke en la issue) y declara los límites honestamente (sin llamadas autenticadas, sin escritorio real, solo ubuntu-22.04).
Buen trabajo de iteración: la evidencia pasó de «verde vacío» a un gate real con regresión protegida.
El merge a56caff (a55caff) resolvió el conflicto de docs/i18n-inventory.md tomando un lado sin regenerar: `--check` seguía fallando en el head, dejando vivo el bloqueante 1 de la re-revisión. Regenerado sobre el árbol ya mergeado con node scripts/i18n-inventory.mjs --out docs/i18n-inventory.md. Co-Authored-By: Claude Code <noreply@anthropic.com>
|
Ambos bloqueantes resueltos — head actual 1 · Inventario i18n — el merge de 2 · Exec bit — Verificación local sobre el head final (
CI en marcha: |
|
CI en marcha — El head |
Resumen
Cierra la verificación W3 del ODD de #106 (
quorb-linux-local-v1), con evidencia ejecutada en runner Ubuntu 22.04 real:dbus-run-session+gnome-keyring-daemon --unlock): guardar → leer → borrar vía backendlinux-native.quorb_*.deb/quorb_*.AppImageen minúscula pero Tauri produceQuorb_*; ambos checks se saltaban conexit 0y el orquestador declaraba «OK» sobre un set vacío. Ahorafind -iname+ fail por tipo.docs/linux-l1-evidence/README.md, con límites honestos.Cambios
5ca36e4linux-ci.yml: smoke de Secret Service (criterio 2)d7a0f8cfix(ci): búsqueda de bundles case-insensitive +exit 1si vacío72b18b8docs(linux): evidencia W343caa59test(linux): 3 fixtures de sesión real + tests deterministas99ae704fix(providers): warningunused variableentoken_needs_refresh2f33507test(linux): endurecer gate por tipo + evidencia directaf2e4050test(linux): fixture Claude fiel al layout v2.1.x + nota macOS KeychainEvidencia (runs en el fork
sosan/quorb,workflow_dispatch)39698848192— tests:cargo test --locked(233 passed, 1 ignored = smoke) + smoke Secret Service: 1 passed39837767677— tests: incluye los 3 fixtures (todosok; 249 passed, 0 failed) + smoke Secret Service39800266204— bundle:.deby.AppImagearrancados de verdad en Ubuntu 22.04 limpia (60 s)Pendiente declarado
migrate_legacy()(migración del servicio legacy): el smoke cubre guardar/leer/borrar, no la migración en sí. Registrado como pendiente en la evidencia con propuesta de validación.ubuntu-22.04, y no se leeCLAUDE_CODE_OAUTH_TOKEN.Refs #106