diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index c29f8c9..afd8b37 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -18,6 +18,7 @@ jobs: - run: node scripts/verify-chapter-anatomy.mjs - run: node scripts/verify-review-packet-coverage.mjs - run: node scripts/verify-editorial-status.mjs + - run: node scripts/verify-gate-sync.mjs - run: cargo fmt --check - run: cargo clippy --all-targets --all-features -- -D warnings - run: cargo test --all-targets diff --git a/README.md b/README.md index a9a5a94..64afa1f 100644 --- a/README.md +++ b/README.md @@ -98,8 +98,13 @@ node scripts/verify-cargo-examples.mjs node scripts/verify-chapter-anatomy.mjs node scripts/verify-review-packet-coverage.mjs node scripts/verify-editorial-status.mjs +node scripts/verify-gate-sync.mjs +git diff --check ``` +Además, el check remoto `rust` en GitHub Actions debe pasar antes de considerar +listo cualquier corte o PR autónomo. + ## Gobernanza - `AGENTS.md` es la guía de arranque para humanos e IA en este repositorio. diff --git a/docs/compuertas-automaticas.md b/docs/compuertas-automaticas.md index 3ee29cd..384c0a6 100644 --- a/docs/compuertas-automaticas.md +++ b/docs/compuertas-automaticas.md @@ -19,6 +19,7 @@ un estado editorial superior. | `node scripts/verify-chapter-anatomy.mjs` | Que cada capítulo conserve la anatomía editorial esperada antes de revisión humana. | Falta concepto, problema, alternativas, justificación, invariantes, modelo Rust, ejemplo, práctica o cierre editorial. | Joel decide si la explicación es correcta, suficiente y aprobable. | | `node scripts/verify-review-packet-coverage.mjs` | Que el paquete de revisión humana cubra todos los capítulos y sus artefactos principales. | Falta un capítulo, ruta, comando de compuerta o frontera editorial. | Joel decide el resultado de la revisión; la compuerta solo evita omisiones. | | `node scripts/verify-editorial-status.mjs` | Que ningún capítulo se marque como `reviewed` ni `published` por automatización. | Estado editorial elevado sin revisión humana explícita. | Solo Joel puede aprobar revisión o publicación de capítulos. | +| `node scripts/verify-gate-sync.mjs` | Que README, publicación candidata, guía de revisión, paquete humano y esta matriz mencionen las mismas compuertas obligatorias. | Documento operativo con una lista incompleta o desactualizada. | Joel decide si una nueva compuerta pertenece al flujo; el script solo evita deriva documental. | | `cargo fmt --check` | Que el código Rust conserve formato estándar. | Archivo Rust fuera de formato. | No sustituye criterio sobre legibilidad pedagógica. | | `cargo clippy --all-targets --all-features -- -D warnings` | Que biblioteca, pruebas y ejemplos no acumulen advertencias relevantes. | Warning de Clippy o patrón de código riesgoso. | Joel decide si una excepción futura requiere explicación curricular. | | `cargo test --all-targets` | Que modelos, ejemplos compilables y pruebas de integración mantengan invariantes. | Prueba fallida, ejemplo que no compila o contrato roto. | No prueba exactitud conceptual completa del capítulo. | diff --git a/docs/guia-revision-corte.md b/docs/guia-revision-corte.md index d9dd24c..7979f72 100644 --- a/docs/guia-revision-corte.md +++ b/docs/guia-revision-corte.md @@ -115,6 +115,7 @@ Antes de mover cualquier capítulo a `reviewed`, deben pasar: - `node scripts/verify-chapter-anatomy.mjs`; - `node scripts/verify-review-packet-coverage.mjs`; - `node scripts/verify-editorial-status.mjs`; +- `node scripts/verify-gate-sync.mjs`; - `cargo fmt --check`; - `cargo clippy --all-targets --all-features -- -D warnings`; - `cargo test --all-targets`; @@ -122,5 +123,8 @@ Antes de mover cualquier capítulo a `reviewed`, deben pasar: - `cargo bench --all-targets`; - `git diff --check`. +El check remoto `rust` en GitHub Actions también debe estar en verde antes de +usar esta evidencia como base de aprobación humana. + La aprobación humana debe quedar registrada en el PR que cambie el estado editorial. diff --git a/docs/paquete-revision-humana.md b/docs/paquete-revision-humana.md index d467ed9..0c989f2 100644 --- a/docs/paquete-revision-humana.md +++ b/docs/paquete-revision-humana.md @@ -31,7 +31,9 @@ node scripts/verify-course-links.mjs node scripts/verify-manifest-consistency.mjs node scripts/verify-cargo-examples.mjs node scripts/verify-chapter-anatomy.mjs +node scripts/verify-review-packet-coverage.mjs node scripts/verify-editorial-status.mjs +node scripts/verify-gate-sync.mjs cargo fmt --check cargo clippy --all-targets --all-features -- -D warnings cargo test --all-targets @@ -40,6 +42,9 @@ cargo bench --all-targets git diff --check ``` +El check remoto `rust` en GitHub Actions también debe pasar antes de cerrar la +revisión del corte. + ## Preguntas por capítulo Para cada capítulo, revisar: diff --git a/docs/publicacion-candidata.md b/docs/publicacion-candidata.md index 1dd0ab0..38918dc 100644 --- a/docs/publicacion-candidata.md +++ b/docs/publicacion-candidata.md @@ -45,14 +45,17 @@ Antes de considerar este corte como listo para revisión humana, deben pasar: - `node scripts/verify-cargo-examples.mjs`; - `node scripts/verify-chapter-anatomy.mjs`; - `node scripts/verify-review-packet-coverage.mjs`; +- `node scripts/verify-editorial-status.mjs`; +- `node scripts/verify-gate-sync.mjs`; - `cargo fmt --check`; - `cargo clippy --all-targets --all-features -- -D warnings`; - `cargo test --all-targets`; - `cargo test --doc`; - `cargo bench --all-targets`; -- `node scripts/verify-editorial-status.mjs`; - `git diff --check`. +También debe pasar el check remoto `rust` en GitHub Actions. + ## Benchmarks aplicables Se ejecuta `cargo bench --all-targets` en este corte y pasa correctamente. El diff --git a/scripts/verify-gate-sync.mjs b/scripts/verify-gate-sync.mjs new file mode 100644 index 0000000..33a9011 --- /dev/null +++ b/scripts/verify-gate-sync.mjs @@ -0,0 +1,67 @@ +import { readFileSync } from "node:fs"; +import { join } from "node:path"; + +const root = join(import.meta.dirname, ".."); +const failures = []; + +const localGates = [ + "node scripts/verify-course-links.mjs", + "node scripts/verify-manifest-consistency.mjs", + "node scripts/verify-cargo-examples.mjs", + "node scripts/verify-chapter-anatomy.mjs", + "node scripts/verify-review-packet-coverage.mjs", + "node scripts/verify-editorial-status.mjs", + "node scripts/verify-gate-sync.mjs", + "cargo fmt --check", + "cargo clippy --all-targets --all-features -- -D warnings", + "cargo test --all-targets", + "cargo test --doc", + "cargo bench --all-targets", + "git diff --check", +]; + +const remoteGates = ["check remoto `rust`"]; + +const documents = [ + ["README.md", "README"], + ["docs/publicacion-candidata.md", "publicación candidata"], + ["docs/guia-revision-corte.md", "guía de revisión"], + ["docs/paquete-revision-humana.md", "paquete humano"], + ["docs/compuertas-automaticas.md", "matriz de compuertas"], +]; + +function fail(message) { + failures.push(message); +} + +function hasGate(markdown, gate) { + return markdown.includes(gate); +} + +for (const [relativePath, label] of documents) { + const markdown = readFileSync(join(root, relativePath), "utf8"); + + for (const gate of localGates) { + if (!hasGate(markdown, gate)) { + fail(`${label}: falta compuerta ${gate}`); + } + } + + for (const gate of remoteGates) { + if (!hasGate(markdown.toLowerCase(), gate)) { + fail(`${label}: falta compuerta ${gate}`); + } + } +} + +if (failures.length > 0) { + console.error("Compuertas documentadas fuera de sincronía:"); + for (const failure of failures) { + console.error(`- ${failure}`); + } + process.exit(1); +} + +console.log( + `Compuertas sincronizadas: ${localGates.length + remoteGates.length} compuertas en ${documents.length} documentos.`, +); diff --git a/scripts/verify-review-packet-coverage.mjs b/scripts/verify-review-packet-coverage.mjs index f454fb0..c8aa7aa 100644 --- a/scripts/verify-review-packet-coverage.mjs +++ b/scripts/verify-review-packet-coverage.mjs @@ -34,6 +34,7 @@ for (const command of [ "node scripts/verify-cargo-examples.mjs", "node scripts/verify-chapter-anatomy.mjs", "node scripts/verify-editorial-status.mjs", + "node scripts/verify-gate-sync.mjs", "cargo fmt --check", "cargo clippy --all-targets --all-features -- -D warnings", "cargo test --all-targets",