Skip to content

feat(wiki): el tema de agrupacion sale de subject a su propia columna - #242

Merged
wolverin0 merged 2 commits into
mainfrom
feat/topic-column-for-wiki-grouping
Aug 30, 2026
Merged

feat(wiki): el tema de agrupacion sale de subject a su propia columna#242
wolverin0 merged 2 commits into
mainfrom
feat/topic-column-for-wiki-grouping

Conversation

@wolverin0

Copy link
Copy Markdown
Owner

El problema

wiki_engine._load_claims_by_topic agrupaba artículos por subject. Pero subject es el sujeto de una tripleta, y tres mecanismos independientes lo tratan como identidad:

  • idx_claims_public_confirmed_tuple_unique sobre (tenant, subject, predicate, scope)
  • auto_resolver.py:224 — agrupa conflictos por esa misma tripleta
  • conflict_resolver.py:1"two claims share the same subject and predicate but differ in object_value"contradicción, supersede una

Por eso wiki-absorb sólo podía correr con --pinned-only: sobre el corpus entero o colapsaba todo en un único artículo general, 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 por COALESCE(NULLIF(topic,''), subject, 'general').

  • Backward compatible: las claims sin topic siguen saliendo por subject, comportamiento idéntico al actual.
  • Migración con el idioma establecido del repo (ALTER TABLE ADD COLUMN + duplicate column name tolerado), verificada en base nueva y en base vieja, e idempotente.
  • schema.sql y schema_postgres.sql actualizados según el contrato de Boundaries.

Evidencia

antes después
Claims vivas agrupadas 3.252 (18%) 16.958 (96%)
project:memorymaster 1 artículo general 319 artículos, el mayor de 95 claims

Los 3.864 sin topic son los OTHER que preferí no forzar (612) más los 3.252 que ya agrupaban bien por subject — 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 a topic, 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.

Nota: el MCP de GitNexus no conectó en esta sesión (CONNECTION_CLOSED), así que el radio de impacto se midió con grep en vez de gitnexus_impact: una función interna, un llamador (_absorb_impl), y tests/test_wiki_absorb_pinned_only.py que ya la ejercita — pasa sin cambios (11/11 con los nuevos).

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.
@wolverin0
wolverin0 merged commit a58b082 into main Aug 30, 2026
15 checks passed
@wolverin0
wolverin0 deleted the feat/topic-column-for-wiki-grouping branch August 30, 2026 13:54
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