Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 39 additions & 10 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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)
Expand All @@ -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)
Expand All @@ -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
Expand All @@ -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)
Expand Down
34 changes: 17 additions & 17 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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 }}
Expand Down Expand Up @@ -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/
Expand All @@ -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
Expand All @@ -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/*
Expand All @@ -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
Expand All @@ -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 \
Expand All @@ -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
Expand All @@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -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.
12 changes: 6 additions & 6 deletions .straymark/follow-ups-backlog.md
Original file line number Diff line number Diff line change
@@ -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:
Expand Down Expand Up @@ -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)
Expand All @@ -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

Expand Down
Loading