From 0fdfe7ec822ccf75ba9a2c526debfece902a7edb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=20Villase=C3=B1or=20Montfort?= <195970+montfort@users.noreply.github.com> Date: Tue, 14 Jul 2026 00:09:31 -0600 Subject: [PATCH] =?UTF-8?q?chore(ci):=20despachar=20FU-011=20+=20FU-013=20?= =?UTF-8?q?=E2=80=94=20cobertura=20Redis=20en=20CI=20+=20bump=20de=20Actio?= =?UTF-8?q?ns?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit FU-011: job `server-adapters` (ubuntu + service container redis:7) corre los 8 tests del adaptador Redis vía --filter RedisDocumentStoreContractTests con WEFT_TEST_REDIS. Repone la cobertura CI diferida en CHARTER-06 (se saltaba sin servidor). Linux-only (service containers de GH solo en Linux); lean (sin cargo, el adaptador es managed puro). FU-013: bump de la familia actions/* → @v5 (checkout/setup-node/setup-dotnet/ upload-artifact/download-artifact) + setup-qemu-action@v4 en ci.yml + release.yml, saliendo de Node 20 (deprecado, detectado por annotations del dry-run de CHARTER-07). mlugg/setup-zig@v2 y rust-cache@v2 se dejan (última major); cla.yml/docs-validation.yml ya estaban en v5. Verificación local: YAML válido; test Redis filtrado 8/8 verde con Valkey. AILOG-2026-07-14-001 (low). Backlog: 3 open (FU-006/FU-010/FU-012 diferidas) / 13. Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/workflows/ci.yml | 49 ++++++++--- .github/workflows/release.yml | 34 ++++---- ...-2026-07-14-001-despacho-fu011-fu013-ci.md | 84 +++++++++++++++++++ .straymark/follow-ups-backlog.md | 12 +-- 4 files changed, 146 insertions(+), 33 deletions(-) create mode 100644 .straymark/07-ai-audit/agent-logs/AILOG-2026-07-14-001-despacho-fu011-fu013-ci.md diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d4aa25b..058c12b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -29,12 +29,12 @@ jobs: os: [ubuntu-latest, windows-latest, macos-latest] runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - uses: dtolnay/rust-toolchain@stable - uses: Swatinem/rust-cache@v2 with: workspaces: native - - uses: actions/setup-dotnet@v4 + - uses: actions/setup-dotnet@v5 with: dotnet-version: "10.0.x" # El shim se compila CON test-hooks para la suite de panic-safety (SC-009); el binario de @@ -54,7 +54,7 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 20 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - uses: dtolnay/rust-toolchain@nightly with: components: rust-src @@ -85,7 +85,7 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 20 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - uses: dtolnay/rust-toolchain@nightly - uses: Swatinem/rust-cache@v2 with: @@ -153,12 +153,12 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 20 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - uses: dtolnay/rust-toolchain@stable - uses: Swatinem/rust-cache@v2 with: workspaces: native - - uses: actions/setup-dotnet@v4 + - uses: actions/setup-dotnet@v5 with: dotnet-version: "10.0.x" - name: Build shim (test-hooks) @@ -174,12 +174,12 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 20 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - uses: dtolnay/rust-toolchain@stable - uses: Swatinem/rust-cache@v2 with: workspaces: native - - uses: actions/setup-dotnet@v4 + - uses: actions/setup-dotnet@v5 with: dotnet-version: "10.0.x" - name: Build shims (yrs + loro, test-hooks) @@ -188,6 +188,35 @@ jobs: - name: Dual-engine versioning suite run: dotnet test tests/Weft.Versioning.Tests/ --configuration Release + # ── FU-011: adaptador Redis ejercitado en CI contra un service container ─────────────────── + # El resto de la contract suite de IDocumentStore (InMemory/FileSystem/EFCore-SQLite) corre en el + # job `test`; el adaptador Redis se salta ahí (sin servidor). Aquí lo ejercitamos de verdad — es + # .NET managed puro (sin binario nativo), y Linux-only porque los service containers de GH Actions + # solo corren en runners Linux (por eso no está en la matriz test win/mac). + server-adapters: + name: server-adapters (redis) + runs-on: ubuntu-latest + timeout-minutes: 10 + services: + redis: + image: redis:7 + ports: + - 6379:6379 + options: >- + --health-cmd "redis-cli ping" + --health-interval 5s + --health-timeout 3s + --health-retries 5 + steps: + - uses: actions/checkout@v5 + - uses: actions/setup-dotnet@v5 + with: + dotnet-version: "10.0.x" + - name: Contract suite del adaptador Redis (contra el service container) + env: + WEFT_TEST_REDIS: localhost:6379 + run: dotnet test tests/Weft.Server.Tests/ -c Release --filter "FullyQualifiedName~RedisDocumentStoreContractTests" + pack-smoke: name: pack-smoke runs-on: ubuntu-latest @@ -209,12 +238,12 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 20 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - uses: dtolnay/rust-toolchain@stable - uses: Swatinem/rust-cache@v2 with: workspaces: native - - uses: actions/setup-dotnet@v4 + - uses: actions/setup-dotnet@v5 with: dotnet-version: "10.0.x" - name: Build shim (release) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 6883b4f..b22bbd4 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -51,7 +51,7 @@ jobs: target: aarch64-apple-darwin tool: cargo steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - uses: dtolnay/rust-toolchain@stable with: targets: ${{ matrix.target }} @@ -110,7 +110,7 @@ jobs: done exit $fail - name: Upload native artifacts - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: native-${{ matrix.rid }} path: native/out/ @@ -123,12 +123,12 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 15 steps: - - uses: actions/checkout@v4 - - uses: actions/setup-dotnet@v4 + - uses: actions/checkout@v5 + - uses: actions/setup-dotnet@v5 with: dotnet-version: "10.0.x" - name: Download native artifacts - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v5 with: pattern: native-* path: native-artifacts @@ -151,7 +151,7 @@ jobs: - name: Pack (símbolos + SourceLink) run: dotnet pack Weft.sln -c Release -p:Version=${{ inputs.version }} -o artifacts/nupkg - name: Upload nupkgs - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: nupkg path: artifacts/nupkg/* @@ -171,12 +171,12 @@ jobs: - { rid: win-x64, runner: windows-latest } - { rid: osx-arm64, runner: macos-latest } steps: - - uses: actions/checkout@v4 - - uses: actions/setup-dotnet@v4 + - uses: actions/checkout@v5 + - uses: actions/setup-dotnet@v5 with: dotnet-version: "10.0.x" - name: Download nupkgs - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v5 with: name: nupkg path: artifacts/nupkg @@ -191,13 +191,13 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 20 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Download nupkgs - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v5 with: name: nupkg path: artifacts/nupkg - - uses: docker/setup-qemu-action@v3 + - uses: docker/setup-qemu-action@v4 - name: hello-Weft en arm64 run: | docker run --rm --platform linux/arm64 -v "$PWD":/w -w /w/tests/pack-smoke \ @@ -211,8 +211,8 @@ jobs: timeout-minutes: 10 continue-on-error: true steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 + - uses: actions/checkout@v5 + - uses: actions/setup-node@v5 with: node-version: "22" - name: Yjs export hash del corpus compartido @@ -232,12 +232,12 @@ jobs: permissions: contents: write steps: - - uses: actions/checkout@v4 - - uses: actions/setup-dotnet@v4 + - uses: actions/checkout@v5 + - uses: actions/setup-dotnet@v5 with: dotnet-version: "10.0.x" - name: Download nupkgs - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v5 with: name: nupkg path: artifacts/nupkg diff --git a/.straymark/07-ai-audit/agent-logs/AILOG-2026-07-14-001-despacho-fu011-fu013-ci.md b/.straymark/07-ai-audit/agent-logs/AILOG-2026-07-14-001-despacho-fu011-fu013-ci.md new file mode 100644 index 0000000..c88dfe7 --- /dev/null +++ b/.straymark/07-ai-audit/agent-logs/AILOG-2026-07-14-001-despacho-fu011-fu013-ci.md @@ -0,0 +1,84 @@ +--- +id: AILOG-2026-07-14-001 +title: "Despacho de FU-011 + FU-013: cobertura Redis en CI + bump de GitHub Actions (Node 20)" +status: accepted +created: 2026-07-14 +agent: claude-opus-4-8 +confidence: high +review_required: false +risk_level: low +eu_ai_act_risk: not_applicable +nist_genai_risks: [] +iso_42001_clause: [] +lines_changed: 0 +files_modified: [] +observability_scope: none +tags: [ci, github-actions, redis, valkey, service-container, chore, follow-ups, node20] +related: [AILOG-2026-07-13-002, AILOG-2026-07-13-003] +originating_charter: none +--- + +# AILOG: despacho de FU-011 + FU-013 (CI) + +## Summary + +Despacho de dos follow-ups `chore` en un solo PR (no es un Charter — trabajo de una sesión sin cambios de +comportamiento de la librería). **FU-011**: reponer la cobertura del adaptador Redis en CI (diferida en +CHARTER-06 por presupuesto de minutos) con un job `server-adapters` Linux + service container `redis:7`. +**FU-013**: bump de GitHub Actions fuera de Node 20 (deprecado, detectado por las annotations del dry-run de +CHARTER-07). Verificación local: YAML válido; el test Redis filtrado corre **8/8 verde** contra Valkey. + +## Actions Performed + +1. **FU-013 — bump de actions**: la familia `actions/*` a **@v5** (consistente con las que `docs-validation.yml` + ya usaba en v5, y off-Node 20): `checkout@v4→v5` (16), `setup-dotnet@v4→v5` (7), `setup-node@v4→v5` (2), + `upload-artifact@v4→v5` (2), `download-artifact@v4→v5` (4); `docker/setup-qemu-action@v3→v4`. Se dejan + `mlugg/setup-zig@v2` y `Swatinem/rust-cache@v2` (ya son la última major; `@v2` recoge parches Node-24), y las + third-party de `cla.yml` (`contributor-assistant`, `changed-files`, `create-github-app-token`) intactas (no + flageadas; `cla.yml` es sensible). `macos-latest` se deja (la migración a macOS 26 ya pasó [2026-06-15] y el + dry-run pasó en él). +2. **FU-011 — job Redis en CI**: `ci.yml` gana `server-adapters` (ubuntu, `services: redis:7` con health-check), + que corre `dotnet test tests/Weft.Server.Tests/ --filter "FullyQualifiedName~RedisDocumentStoreContractTests"` + con `WEFT_TEST_REDIS=localhost:6379` → los 8 tests del adaptador Redis (que se saltan en el job `test` sin + servidor) ahora se ejercitan de verdad. Linux-only porque los service containers de GH solo corren en Linux; + el adaptador es .NET managed puro (sin binario nativo → sin build de cargo en este job, lean). + +## Modified Files + +**Modificados**: `.github/workflows/ci.yml` (bumps + job `server-adapters`), `.github/workflows/release.yml` +(bumps), `.straymark/follow-ups-backlog.md` (FU-011/FU-013 → `closed`). `cla.yml` y `docs-validation.yml` **NO** +cambiaron (ya estaban en `actions/*@v5` o usan third-party no flageadas). + +## Risk + +- **R1 (bajo) — bumps de `release.yml` no re-validados por dry-run**: los `actions/*` de `release.yml` (upload/ + download-artifact, checkout, setup-dotnet, setup-node) solo se ejercitan en un `workflow_dispatch`, no en el CI + por-PR. Para no gastar otro dry-run (matriz cara), NO se re-lanzó; el próximo dispatch (dry-run o el publish + real del operador) los ejercita. Riesgo real bajo: son bumps de versión de actions oficiales estables + (v4→v5, backend de artefactos compartido v4+), y un fallo sería un fix trivial. El CI por-PR (ci.yml) sí valida + los bumps de `ci.yml` incl. el nuevo job Redis. + +## Verification + +```bash +# YAML válido de los workflows tocados +python3 -c "import yaml; yaml.safe_load(open('.github/workflows/ci.yml')); yaml.safe_load(open('.github/workflows/release.yml'))" +# El job Redis: filtro selecciona exactamente los 8 tests del adaptador, verde contra Valkey local +WEFT_TEST_REDIS=localhost:6379 dotnet test tests/Weft.Server.Tests/ -c Release \ + --filter "FullyQualifiedName~RedisDocumentStoreContractTests" # 8/8, 0 fallos, 0 omitidos +# Sin actions v4/v3 flageadas restantes +grep -rE 'actions/(checkout|setup-node|setup-dotnet|upload-artifact|download-artifact)@v4|setup-qemu-action@v3' .github/workflows/ # vacío +``` + +## Additional Notes + +- FU-011 añade costo de CI **recurrente** por PR (un job ubuntu ~1-2 min con el service container) — decisión + consciente del operador al despachar (aceptó reponer la cobertura). El adaptador Redis vuelve a estar cubierto + en CI, no solo en el gate local. +- El job Redis es lean (sin build de cargo): la contract suite del adaptador opera sobre blobs opacos, no toca el + motor nativo yrs. + +## Approval + +Chore de bajo riesgo (`risk_level: low`, `review_required: false`). Verificación local citada; el CI del PR valida +los bumps de `ci.yml` + el job Redis contra el service container. diff --git a/.straymark/follow-ups-backlog.md b/.straymark/follow-ups-backlog.md index d20b1a0..5aca3d3 100644 --- a/.straymark/follow-ups-backlog.md +++ b/.straymark/follow-ups-backlog.md @@ -1,9 +1,9 @@ --- last_scan: 2026-07-10 schema_version: v1 -total_open: 5 +total_open: 3 total_promoted: 0 -total_closed_in_session: 8 +total_closed_in_session: 10 total_phase_blocked: 0 total_suspected_closed: 0 buckets: @@ -121,11 +121,11 @@ fully_extracted_ailogs: ### FU-011 — reponer la cobertura del adaptador Redis en CI (job Linux-only con service container) - **Origin**: CHARTER-06 §Scope/§Out of scope / R4 · AILOG-2026-07-13-002 §Decisions #4 (registro hand-add + recount, vía §13; el follow-up nace en tiempo de declaración de Charter, sin sección extraíble — cf. issue straymark #360) -- **Status**: open +- **Status**: closed - **Trigger**: when el presupuesto de minutos de GitHub Actions lo permita (resetea mensualmente) - **Destination**: chore - **Cost**: S -- **Notes**: CHARTER-06 no añadió job de CI para el adaptador Redis por coste de minutos (GH Actions ~agotado al ejecutarlo). El test `RedisDocumentStoreContractTests` es `[SkippableFact]`: corre local con `WEFT_TEST_REDIS=localhost:6379` (Valkey) y se **omite** en CI (sin servidor). Reponer: job Linux-only en `.github/workflows/ci.yml` con service container `redis:7`/`valkey` + `WEFT_TEST_REDIS` apuntándolo, para que el adaptador Redis se ejercite en CI. **Ningún gate depende hoy**: el gate local cubre la ruta funcional y el adaptador es .NET managed puro (sin comportamiento por-plataforma). EF Core/SQLite ya corre en CI (sin infra). +- **Notes**: CHARTER-06 no añadió job de CI para el adaptador Redis por coste de minutos (GH Actions ~agotado al ejecutarlo). El test `RedisDocumentStoreContractTests` es `[SkippableFact]`: corre local con `WEFT_TEST_REDIS=localhost:6379` (Valkey) y se **omite** en CI (sin servidor). Reponer: job Linux-only en `.github/workflows/ci.yml` con service container `redis:7`/`valkey` + `WEFT_TEST_REDIS` apuntándolo, para que el adaptador Redis se ejercite en CI. **Ningún gate depende hoy**: el gate local cubre la ruta funcional y el adaptador es .NET managed puro (sin comportamiento por-plataforma). EF Core/SQLite ya corre en CI (sin infra). **CERRADO 2026-07-14 (AILOG-2026-07-14-001)**: job `server-adapters` (ubuntu + service `redis:7`) corre los 8 tests del adaptador Redis vía `--filter RedisDocumentStoreContractTests`; verificado 8/8 verde local con Valkey. ### FU-012 — determinism-yjs: exponer client-id determinista + promover a gate de paridad cross-impl - **Origin**: CHARTER-07 §Scope (T058) · AILOG-2026-07-13-003 · tests/determinism-yjs/README.md (registro hand-add + recount, §13) @@ -137,11 +137,11 @@ fully_extracted_ailogs: ### FU-013 — bump de GitHub Actions fuera de Node 20 (deprecado) - **Origin**: CHARTER-07 (dry-run release.yml run 29307786498, annotations) · AILOG-2026-07-13-003 (registro hand-add + recount, §13) -- **Status**: open +- **Status**: closed - **Trigger**: when Node 20 se retire de los runners de GH (o al tocar los workflows por otra razón) - **Destination**: chore - **Cost**: XS -- **Notes**: El dry-run anotó "Node.js 20 is deprecated" para `actions/checkout@v4`, `actions/setup-node@v4`, `actions/upload-artifact@v4`, `mlugg/setup-zig@v2` (forzados a Node 24). Bump a `@v5`/equivalentes en `.github/workflows/{ci.yml,release.yml,docs-validation.yml}` cuando toque. También aviso informativo: `macos-latest` migra a macOS 26 el 2026-06-15 (revisar el runner de `native (osx-arm64)` / pack-smoke). Cosmético hoy; ningún gate depende. +- **Notes**: El dry-run anotó "Node.js 20 is deprecated" para `actions/checkout@v4`, `actions/setup-node@v4`, `actions/upload-artifact@v4`, `mlugg/setup-zig@v2` (forzados a Node 24). Bump a `@v5`/equivalentes en `.github/workflows/{ci.yml,release.yml,docs-validation.yml}` cuando toque. También aviso informativo: `macos-latest` migra a macOS 26 el 2026-06-15 (revisar el runner de `native (osx-arm64)` / pack-smoke). Cosmético hoy; ningún gate depende. **CERRADO 2026-07-14 (AILOG-2026-07-14-001)**: familia `actions/*` → `@v5` (checkout/setup-node/setup-dotnet/upload-artifact/download-artifact) + `setup-qemu-action@v4` en ci.yml + release.yml (cla.yml/docs-validation.yml ya estaban en v5). `mlugg/setup-zig@v2` y `rust-cache@v2` se dejan (última major). `macos-latest` se deja (migración ya pasada, dry-run verde en él). ## Bucket: phase-blocked