feat(wiki): el tema de agrupacion sale de subject a su propia columna - #242
Merged
Conversation
wiki_engine agrupaba articulos por `subject`, pero `subject` es el sujeto de una tripleta y tres mecanismos lo tratan como identidad: el indice unico (tenant, subject, predicate, scope) sobre confirmadas publicas, `auto_resolver` y `conflict_resolver` — estos dos leen dos claims con el mismo (subject, predicate) y distinto object_value como CONTRADICCION y superseden una. Por eso la wiki solo podia correr con --pinned-only: sobre el corpus entero, o colapsaba en un unico articulo 'general', o habia que engrosar los subjects, y eso hacia que el steward archivara claims no relacionadas en el ciclo siguiente. Medido antes de tocar nada: engrosar subjects daba 176 colisiones directas del indice unico sobre 13.767 asignaciones, y esas eran solo las que la base frenaba. El tema va a `topic`, columna aditiva y deliberadamente SIN unicidad. El motor agrupa por COALESCE(NULLIF(topic,''), subject, 'general'), asi que las claims viejas siguen saliendo por subject y nada cambia para ellas. Medido sobre la base viva tras clasificar 13.767 claims: claims agrupadas 18% -> 96%, y project:memorymaster pasa a 319 articulos (el mayor de 95 claims) en vez de un 'general' unico. Barra roja verificada: con el esquema puesto pero sin la logica de agrupacion, los 3 tests del requisito fallan y los 2 de compatibilidad siguen pasando.
… reventar CI en rojo en los 6 jobs: `OperationalError: no such column: topic`. Varios tests del motor arman a mano una tabla claims minima, y por db_merge llegan bases de OpenClaw con el mismo perfil. Mi SELECT exigia la columna, asi que la wiki crasheaba sobre cualquier base no migrada — una regresion real, no un detalle de fixtures. Por eso se arregla en el loader y no editando los 8 tests para que me acomoden. El loader detecta la columna con PRAGMA table_info y, si no esta, agrupa por subject exactamente como antes. El tema es una mejora, no un requisito. Tambien regenerada la verdad de release: el generador cuenta funciones de test y yo agregue una despues de generar, que es el caso exacto que documenta el docstring de test_release_truth. 46/46 en los cinco archivos de test tocados, ruff limpio.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
El problema
wiki_engine._load_claims_by_topicagrupaba artículos porsubject. Perosubjectes el sujeto de una tripleta, y tres mecanismos independientes lo tratan como identidad:idx_claims_public_confirmed_tuple_uniquesobre(tenant, subject, predicate, scope)auto_resolver.py:224— agrupa conflictos por esa misma tripletaconflict_resolver.py:1— "two claims share the same subject and predicate but differ in object_value" → contradicción, supersede unaPor eso
wiki-absorbsólo podía correr con--pinned-only: sobre el corpus entero o colapsaba todo en un único artículogeneral, o había que engrosar los subjects — y eso hacía que el steward archivara claims no relacionadas en el ciclo siguiente.Medido antes de escribir nada: engrosar subjects producía 176 colisiones directas del índice único sobre 13.767 asignaciones. Y esas eran sólo las que la base frenaba; el resto habría llegado vivo hasta el resolver.
El cambio
topic TEXT, columna aditiva y deliberadamente sin unicidad. El motor agrupa porCOALESCE(NULLIF(topic,''), subject, 'general').topicsiguen saliendo porsubject, comportamiento idéntico al actual.ALTER TABLE ADD COLUMN+duplicate column nametolerado), verificada en base nueva y en base vieja, e idempotente.schema.sqlyschema_postgres.sqlactualizados según el contrato de Boundaries.Evidencia
project:memorymastergeneralLos 3.864 sin
topicson losOTHERque preferí no forzar (612) más los 3.252 que ya agrupaban bien porsubject— el fallback haciendo su trabajo.Migración sobre la base viva de 6,9 GB: 0,14 s,
quick_check ok, 142.345 claims intactas.Tests
tests/test_wiki_groups_by_topic_not_subject.py— anclados en el requisito, no en la implementación. El último falla si alguien le agrega unicidad atopic, que es lo que reintroduciría el problema.Barra roja verificada: con el esquema puesto pero revirtiendo sólo la lógica de agrupación, los 3 tests del requisito fallan y los 2 de compatibilidad siguen pasando.