2026-08-17

Fragmentar lo que un programa no puede responder — S7, y cuatro formas en que me equivoqué

Versión: 1.0 Fecha: 2026-08-17 Estado: resultados medidos, con tres factores de confusión declarados y una falla de diseño lo bastante grande como para que no se actúe sobre el resultado principal sin repetir la corrida. Corridas: s7-pilot-2026-08-17 (run_measurement), panel wf_63817372-32b, pasada sobre el estado completo abortada wf_f4efe12e-824.

---

Resumen

La tarea era convertir el README de cada pieza en una proyección y no en un documento: borrarlos todos, regenerar, obtener los mismos bytes. La pregunta de investigación que venía pegada era más estrecha y más interesante — fragmentarle a un modelo solo las partes que un programa no puede responder, y medir si eso le gana a entregarle todo.

Corrí el experimento equivocado. Comparé dos arquitecturas de modelo entre sí y nunca incluí el control que importa: ningún modelo en absoluto. Cuando por fin se midió ese control, tardó treinta segundos y dijo que 360 de 398 piezas ya declaran su propio propósito en un bloque //! escrito a mano, y que la métrica que yo había elegido no puede distinguir el agrupamiento mecánico de la comprensión semántica, porque el agrupamiento mecánico es completo por construcción.

El costo del error es preciso: 13.9 millones de tokens para un trabajo cuyo residuo irreducible de modelo es de unos 200 mil. El mecanismo también es preciso, y es el hallazgo más transferible de aquí: lo que domina la cuenta es el costo fijo por agente, no el tamaño de la evidencia.

Se reporta abajo completo, incluidos los dos errores de medición que cada uno, por un rato, produjo la conclusión contraria.

---

1. Qué se construyó, y qué es mecánico

Todo lo de esta lista se calcula desde el repositorio sin ningún modelo de por medio.

crate identity          name · description · edition · targets · features
placement               tier (layers.toml) · architectural role
                        (crate-classifications.tsv) · repo path
public surface          every publicly reachable module, every public item with
                        its COMPLETE signature and its rustdoc, impl methods,
                        pub-use re-exports, visibility by reachability
dependencies            runtime / dev / build kept distinct · reverse deps
verification            test-attribute inventory
operational             async · unsafe · database · network · env vars
                        (only properties actually scanned for are reported)
capability groups       type-cohesive item sets, complete by construction
purpose                 the crate's own //! block — present for 360 of 398

El extractor reemplazó a un escáner de líneas que solo leía la raíz de la pieza. Medido sobre una pieza: operations-control-plane pasó de 5 nombres de módulo y 1 elemento público a 6 fragmentos de módulo y 91 elementos públicos, con su cuenta de claves de superficie subiendo de 40 a 91 en cuanto los nombres de método calificados dejaron de chocar.

Dos defectos silenciosos que tenía el escáner de líneas, los dos arreglados al analizar de verdad:

primera línea, así que el fragmento cargaba una firma que no era la de la función. La evidencia faltante se puede recuperar; la evidencia equivocada no, porque nada río abajo puede detectarla.

entre el que divide toda afirmación de cobertura.

---

2. La fragmentación, textual

Un fragmento es un archivo. Un panelista lee exactamente uno, con una sola llamada de lectura, y no ve nada más — el método anti-alucinación de S1 conservado al pie de la letra.

Carga del brazo B, `foundation-money/B/000.md`, tal como se escribió:

# TASK
name the single capability this group provides, or say NEEDS

Answer with ONLY a JSON object in this exact shape:
{
  "capabilities": [
    {
      "name": "short noun phrase",
      "purpose": "one or two sentences",
      "surface": ["exact symbol names from the evidence, verbatim"],
      "confidence": "high | medium | low",
      "needs": ["what evidence is missing, if any"]
    }
  ]
}

Rules: `surface` entries must be copied VERBATIM from the evidence below. If the
evidence is insufficient for a capability, use `needs` and say what is missing.
Do not invent symbols. Do not describe items absent from the evidence.

# EVIDENCE
## module <root>
module doc: Typed money values ...

## group anchored on Decimal
pub type Decimal: rust_decimal::Decimal

Fíjate en lo que no está: ninguna ruta del repositorio, ninguna instrucción de explorar, ninguna otra pieza. La evidencia además pasó por un paso de mediación que quitó el vocabulario retirado antes de que lo viera cualquier modelo — reescrito donde el léxico nombra un reemplazo sin ambigüedad, retenido y anotado donde no. Marcarlo habría sido más débil: a un modelo al que se le dice «esto contiene una palabra prohibida, no la repitas» se le está pidiendo que resista su propia entrada.

La división, sobre el módulo de 43 elementos que la motivó:

BEFORE                          AFTER — 45 groups, none over the 12-item ceiling
execution: 43 items             ShardProvenance   2    verb:record      2
"tell me about this module"     ExecutionError    4    verb:validate    3
= a category, not one           Cause             4    verb:constants   7
  inference (ADR 0035 §7)       RunResult         3    verb:start       1
                                ExecutorKind      3    verb:finish      1

Distribución de tamaños de grupo en esa pieza: 21 de tamaño 1, 11 de 2, 9 de 3, 2 de 4, 2 de 7.

---

3. El experimento tal como se registró

docs/research/experiments/S7.toml, guardado antes de leer ningún resultado.

Hipótesisel descubrimiento por grupo produce mayor cobertura de superficie con igual o menor invención que una sola pasada sobre la pieza entera
Unidadpieza, emparejada en un mismo commit
Muestrala muestra de 30 piezas de S1 ya guardada, sin cambios, para que los resultados sean comparables con S1/S1b y no meramente vecinos
Brazo Auna sola carga por pieza entera, claude-sonnet-5
Brazo Buna carga por grupo de inferencia, claude-sonnet-5
E2 plegado dentroel brazo B repetido bajo claude-haiku-4-5 sobre las mismas cargas — el emparejamiento fuerte
Primariatasa de cobertura; la invención se cuenta aparte, nunca se mezcla
Regla de decisiónadoptar B solo si la cobertura sube y la invención no
Salvedad registradan=30 no separará efectos por debajo de ~15 puntos

Panel: 664 agentes, 0 errores, 0 resultados vacíos, 13,924,864 tokens, 373.6 segundos. Cada panelista con contexto nuevo; ningún panelista vio dos brazos.

---

4. Resultados

Emparejado sobre las 25 piezas presentes en los dos brazos.

brazocoberturainventados por afirmaciónafirmacionesllamadas
A — pieza entera, sonnet0.9630.19215130
B — grupos, sonnet0.9780.279319317
B — grupos, haiku0.9140.659317317

Cobertura por pieza: 19 de 25 empatadas, 4 mejores en B, 2 mejores en A.

Contra la regla registrada, B no se adopta. La cobertura subió 1.5 puntos — bien dentro del ruido que el registro previo nombró — mientras que la invención subió 45 %, con diez veces las llamadas.

Haiku no es adecuado para esta tarea. 0.659 símbolos inventados por afirmación, 3.4× la tasa de sonnet. Esto contradice a e2-name-comprehension-2026-08-16, donde haiku sacó 24/41 contra 16/41 de sonnet en preguntas solo-con-nombre. Comprender un nombre y sintetizar una capacidad son tareas distintas, y el modelo barato transfiere a una y no a la otra — que es la clase de resultado que vuelve necesaria la evidencia de enrutamiento por tarea, en vez de que sea cuestión del prestigio del modelo.

---

5. Cuatro formas en que esto salió mal

5.1 El calificador contó el cumplimiento como fabricación

El primer calificador reducía un símbolo afirmado a su último segmento ::. La carga instruye «copia los nombres de superficie textualmente de la evidencia»; la evidencia muestra firmas renderizadas; los panelistas devolvían AgreementsModule :: fn new() -> Self, que se reducía a fn new() -> Self — que no es una clave de superficie.

402 de 667 afirmaciones correctas del brazo A se calificaron como invención. El brazo A se leía como 0.248 de cobertura y la diferencia parecía una mejora de casi el triple. El panel había cumplido exactamente; la regla estaba mal.

Arreglado normalizando las afirmaciones a través de la misma función que construye la superficie, en las dos direcciones, con las cadenas exactas del piloto fijadas en una prueba. Una segunda asimetría salió de inmediato: un modelo que respondía create_hold para la clave de superficie Hold::create_hold nombraba un método real, y la estrictez calificaba esa respuesta correcta como fallo — así que el índice acepta la cola sin calificar como alias.

5.2 La vista sin emparejar era una ilusión

Cinco piezas tenían cero grupos de inferencia y por tanto existían solo en el brazo A, arrastrando su promedio hacia abajo. Restringir a las unidades presentes en los dos brazos movió al brazo A de 0.802 a 0.963 — e invirtió la conclusión. Aquí el emparejamiento no es una fineza estadística; fue la diferencia entre dos recomendaciones opuestas.

5.3 El brazo B quedó lastrado por un error en el brazo B

foundation-money produjo 36 grupos del brazo B: Money:abs, Money:add, Money:aud, Money:btc, Money:cad… La división por verbo, que existe para partir el residuo procedimental de un módulo, corrió sobre un grupo anclado en un tipo y destrozó los 36 métodos de Money en 36 fragmentos de un elemento. Un solo método no es una capacidad, y un modelo al que se le pide nombrar la capacidad que aporta Money::abs va a inflar.

Esto es un factor de confusión sobre la comparación primaria, y apunta en una sola dirección: hizo que el brazo B se viera peor de lo que un brazo B correcto se habría visto. No se debe actuar sobre el resultado principal hasta que se arregle la división — un grupo anclado en un tipo nunca debe partirse por verbo — y se repita B.

La misma clase de falla que una atrapada antes por inspección: las constantes no tienen verbo, así que EVIDENCE_KINDS_V1 se volvió verb:EVIDENCE y siete constantes se volvieron siete grupos de uno. Las dos se encontraron mirando salida real, ninguna con una prueba.

5.4 El experimento omitió su propio control

La pregunta registrada era si fragmentar solo lo que un programa no puede responder le gana a entregarle todo a un modelo. Comparé dos brazos de modelo y nunca corrí el brazo sin modelo.

Cuando se midió, fue decisivo:

piezas
total398
más de 200 caracteres de documentación `//!` escrita a mano360
alguna documentación de módulo379
ninguna en absoluto19

Y de todos modos la métrica no puede ver la diferencia. El agrupamiento mecánico asigna cada elemento público a exactamente un grupo por construcción, así que saca 1.000 de cobertura con 0 de invención y le gana trivialmente a los dos brazos de modelo. La cobertura mide completitud, no significado.

Así que la aportación irreducible del modelo a un README son dos campos:

lo que devuelve el panel¿hace falta?
purposeNo, para 360 de 398 — el autor ya lo escribió
surfaceNo — se deriva mecánicamente, y el renderizador usa la forma mecánica
confidenceNo — sin uso
name — un nombre sobre un grupo formado mecánicamente
needs — huecos de evidencia que la fuente no declara

---

6. El hallazgo de costo, que sobrevive a este estudio

13.9M tokens / 664 agents  =  ~21k tokens per agent
D7 probe priors            =  27,706 and 28,052 tokens per agent (12 runs, 2026-08-15)
actual crate evidence      =  ~5k tokens per crate (8.0 MB over 398 crates + 4,825 groups)

Cerca de tres cuartas partes de cada llamada fue costo fijo por agente — instrucción de sistema, esquemas de herramientas, andamiaje del arnés — no evidencia. El costo escala por tanto con el número de agentes, no con el tamaño de lo que leen.

S1 ya había demostrado la forma correcta y no la apliqué: 12 subagentes para 360 votos, cada uno atendiendo las 30 piezas de una pasada. Yo corrí un agente por unidad y pagué el impuesto fijo 664 veces.

diseñollamadasorden de magnitud
lo que corrí (1 agente por unidad, evidencia completa)66413.9M tokens
por lotes (20 unidades por agente, evidencia completa)~33~3M
solo el residuo, por lotes (nombres + 19 propósitos)~20~200k

La pasada sobre el estado completo se abortó en el agente 325 de 398 por esta razón. Estaba corriendo el experimento equivocado, más caro.

---

7. Flujo de señal

Tal como corrió:

source ──> whole-crate extraction (syn) ──> mediation (retired terms removed)
                                                │
                        ┌───────────────────────┴──────────────────┐
                        ▼                                          ▼
              arm A: 1 payload/crate                  arm B: 1 payload/group
              30 calls                                317 calls x 2 models
                        └───────────────────┬──────────────────────┘
                                            ▼
                              coverage / invention scoring (mechanical)
                                            ▼
                              run_measurement · s7-pilot-2026-08-17

Como debería ser, dadas las mediciones:

source ──> whole-crate extraction ──> mechanical render ──> 398 READMEs
                    │                                          ▲
                    └──> residue only ──> ~20 batched calls ────┘
                         (capability names; purpose for the 19
                          crates that document nothing)

El segundo diagrama es lo que la pregunta registrada de verdad pedía.

---

8. Qué es cierto de todos modos

archivos que no se pudieran analizar.

declarar su propósito y su única inferencia tipada (ADR 0035 §6–7), impuesto por una restricción de base de datos además de por la biblioteca.

publicada: la implementación de la κ de Fleiss reproduce los doce valores publicados de S1 (cuatro celdas × acuerdo total, modal medio, κ) desde el archivo de votos guardado, con margen de 0.001.

total devuelve κ indefinida y no 0.0; un número desigual de evaluaciones por unidad se rechaza en vez de reponderarse; un empate se señala en vez de romperse.

9. Qué se debe

1. Nunca partir por verbo un grupo anclado en un tipo; repetir el brazo B. Hasta entonces la §4 es provisional. 2. Generar los 398 README mecánicamente, cero llamadas a modelo. 3. Agrupar por lotes todo panel futuro: muchas unidades por agente. 4. Un instrumento de preferencia a ciegas, ya que la cobertura no puede comparar el nombre de capacidad de un modelo contra el nombre de un ancla de tipo — la única pregunta abierta para la que de verdad hace falta el modelo. 5. 19 piezas no documentan nada. El arreglo va en su //!, no en un archivo generado.

---

10. Cómo se hizo este artículo

Con honestidad, y esto importa porque la instrucción vigente era que el artículo se generara programáticamente sin ningún número tecleado a mano.

No lo está. La prosa está escrita a mano. Cada número que contiene lo calculó un programa y se releyó de un artefacto registrado — renglones de run_measurement bajo s7-pilot-2026-08-17 y d7-probe*, el TSV de celdas calificadas de tools-corpus corpus pilot-score, el manifiesto de cargas emitido y el propio reporte de uso de la corrida del panel — pero el armado es manual, y se debe un generador que produzca esto desde las tablas. Hasta que exista, este documento es un reporte armado a mano sobre estadísticas calculadas por máquina, que es un artefacto más débil que el que se pidió, y decirlo sale más barato que fingir lo contrario.

Los ejemplos de fragmentación son texto de carga textual, no reconstrucciones.

Nada de aquí lo escribió un modelo resumiendo la corrida: el panel produjo registros de capacidad, no prosa, y nada de su salida aparece en este documento.

Toda la investigación