Skip to content

feat(okf): el corpus firma su procedencia como autorado por humano - #661

Merged
beyondnetPeru merged 1 commit into
mainfrom
feat/okf-generated-actor
Aug 23, 2026
Merged

feat(okf): el corpus firma su procedencia como autorado por humano#661
beyondnetPeru merged 1 commit into
mainfrom
feat/okf-generated-actor

Conversation

@beyondnetPeru

Copy link
Copy Markdown
Contributor

Pull Request Summary

Un consumidor OKF v0.2 que leía nuestro bundle no encontraba generated, así que caía al timestamp legado (§13.1) — una fecha sin ninguna procedencia. Nuestro corpus se autora a mano en canonical/*.yaml, pero el bundle no lo decía: no había forma de distinguirlo de uno escupido por una máquina.

Los 10 conceptos proyectados pasan a firmar:

generated:
  by: human:@winston

Dos decisiones, ambas con razón

human: y no process:

§7 avisa de que los consumidores que clasifican confianza (§5.3) se apoyan en ese prefijo, y obliga a los productores a usarlo para contenido autorado o confirmado por humanos. El proyector transcribe el corpus, no lo escribe; firmar con el script degradaría el corpus a "generado por máquina" ante cualquier consumidor v0.2 — justo lo contrario de lo que es.

at se omite, y conviene que siga omitido

§5.2 lo define como "the content's last meaningful change" y solo marca by como REQUIRED, así que omitirlo es conforme. Las dos fuentes posibles no sirven:

  • asOf es la fecha de proyección. Emitirla haría que cada re-proyección afirme que todo el corpus acaba de cambiar — lo contrario del uso que §5.2 le da al campo ("tell a recent edit from a stale fact").
  • La fecha del commit del fichero canónico sería la correcta, pero es inalcanzable: el bundle se commitea en el mismo commit que el cambio canónico y lo gatea --verify, así que at necesitaría la fecha de un commit que aún no existe al generar. Cualquier edición canónica dejaría el gate en rojo.

Un dato ausente es conforme; uno inventado engaña al consumidor. Hay un test que fija la ausencia de at para que no se cuele más adelante.

Lo que NO cambia

El bundle sigue siendo v0.1-conforme: v0.1 tolera claves extra, y el §11 de v0.2 exige las mismas tres reglas (frontmatter parseable, type no vacío, reservados) que ya cumplíamos. Por eso no se toca la versión declarada ni el ADR-0105 — eso sería otra decisión, no un efecto colateral de esta.

El validador gana dientes

Si generated está presente, generated.by es REQUERIDO (§5.2) y debe seguir la convención de actor (§7). Sin eso el campo podría emitirse a medias y un consumidor lo clasificaría mal en silencio, que es peor que no emitirlo.

Verificación

  • El diff del bundle son exactamente 10 adiciones de generated, nada más (auditado línea a línea).
  • --check: 0 violaciones · --verify: al día — corrido como en CI, sin --as-of (la línea 527 reproduce con el as-of del log.md publicado, así que el diff es determinista).
  • guard CI 38-validate-okf-projection: exit 0 · guard pre-commit: exit 0.
  • Tests del proyector: 14 → 17, incluidos el actor, la ausencia de at, y el rechazo de generated sin by o con actor no convencional.

Before you submit

  • Sign-off (DCO): my commits carry a Signed-off-by line.
  • Conventional Commits: my PR title and commits follow Conventional Commits.
  • Agnosticism: no introduce ninguna dependencia tecnológica.
  • Bilingual: no aplica — no toqué ninguno de los dieciséis documentos de la superficie de entrada.

Linked ADRs / Issues

🤖 Generated with Claude Code

Un consumidor OKF v0.2 que leia nuestro bundle no encontraba `generated`, asi que
caia al `timestamp` legado (§13.1) — una fecha sin ninguna procedencia. Nuestro
corpus se autora a mano en canonical/*.yaml, pero el bundle no lo decia, de modo
que no habia forma de distinguirlo de uno escupido por una maquina.

Los 10 conceptos proyectados pasan a firmar `generated: { by: human:@winston }`.

Dos decisiones, ambas con razon:

`human:` y no `process:`. §7 avisa de que los consumidores que clasifican confianza
(§5.3) se apoyan en ese prefijo, y obliga a los productores a usarlo para contenido
autorado o confirmado por humanos. El proyector TRANSCRIBE el corpus, no lo escribe;
firmar con el script degradaria el corpus a "generado por maquina" ante cualquier
consumidor v0.2, que es justo lo contrario de lo que es.

`at` se OMITE, y conviene que siga omitido. §5.2 lo define como "the content's last
meaningful change" y solo marca `by` como REQUIRED, asi que omitirlo es conforme.
Las dos fuentes posibles no sirven:

  - `asOf` es la fecha de PROYECCION. Emitirla haria que cada re-proyeccion afirme
    que todo el corpus acaba de cambiar — lo contrario del uso que §5.2 le da.
  - La fecha del commit del fichero canonico seria la correcta, pero es inalcanzable:
    el bundle se commitea EN EL MISMO commit que el cambio canonico y lo gatea
    `--verify`, asi que `at` necesitaria la fecha de un commit que aun no existe al
    generar. Cualquier edicion canonica dejaria el gate en rojo.

Un dato ausente es conforme; uno inventado engaña al consumidor.

El bundle sigue siendo v0.1-conforme: v0.1 tolera claves extra, el §11 de v0.2 exige
las mismas tres reglas (frontmatter parseable, `type` no vacio, reservados) y ya las
cumpliamos. Por eso NO se toca la version declarada ni el ADR-0105 — eso seria otra
decision, no un efecto colateral de esta.

El validador gana dientes: si `generated` esta presente, `generated.by` es REQUERIDO
(§5.2) y debe seguir la convencion de actor (§7). Sin eso el campo podria emitirse a
medias y un consumidor lo clasificaria mal en silencio, que es peor que no emitirlo.

Verificacion: el diff del bundle son EXACTAMENTE 10 adiciones de `generated`, nada
mas. --check 0 violaciones, --verify al dia (corrido como en CI, sin --as-of; la
linea 527 reproduce con el as-of del log.md publicado), guard CI 38 exit 0, guard
pre-commit exit 0. Tests del proyector 14 -> 17, incluido uno que fija la AUSENCIA
de `at` para que no se cuele mas adelante.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Signed-off-by: aarroyo <beyondnet.peru@gmail.com>
@beyondnetPeru
beyondnetPeru requested a review from a team as a code owner August 23, 2026 02:20
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@github-actions

Copy link
Copy Markdown

📊 Bilingual Coverage Impact

PR Changes

  • Paired EN/ES files modified: 0
  • New EN files needing ES translation: 10

Repository Coverage

Metric Value
Total EN files 527
Total ES files 497
Paired files 0
Coverage 0%

⚠️ Action required: 10 new EN file(s) added without ES counterparts.

To create skeletons:

node .harness/scripts/generate-es-skeleton.mjs <file.md>

Generated by GitHub Actions

@beyondnetPeru
beyondnetPeru merged commit 7e324bc into main Aug 23, 2026
48 checks passed
@beyondnetPeru
beyondnetPeru deleted the feat/okf-generated-actor branch August 23, 2026 02:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant