Vercy · perfil aditivo

11 campos para añadir a la memoria que ya usa.

El perfil no sustituye un almacén de memoria. Nombra los campos que los benchmarks encontraron portantes y dice dónde va cada uno en los almacenes que la gente ya ejecuta.

Por qué un perfil y no un formato

El benchmark colaborativo se propuso comprobar si la gobernanza pertenece dentro del registro de memoria o en una capa al lado. No halló diferencia: los campos dentro del registro obtuvieron 95,2%, el mismo grafo con un catálogo de gobernanza aparte 93,5%, y un wiki de equipo con los mismos hechos en prosa 96,8%, con todas las comparaciones por pares en p = 1,00. Dónde se aloja esa información no importa.

Lo que sí importó fue que exista. Añadir gobernanza a un grafo bitemporal lo llevó del 77,4% al 93,5%, p = 0,039. Así que lo útil de publicar no es otro almacén ni otra serialización, sino el conjunto de campos, expresado de modo que pueda añadirse a un grafo, una memoria vectorial, un catálogo, un wiki o una tabla sin mover ningún dato.

Los campos

Cada campo aparece con la capacidad que sostiene y la diferencia medida entre tenerlo y no tenerlo, leída del resultado publicado del estudio que lo midió. PDB es el benchmark de dimensión personal, CMB el de memoria colaborativa.

CampoNivelRequisitoQué esMedido sin → con
record_id1MUSTUn identificador estable del propio registro, corto para poder escribirse a mano.0,0% → 100,0% (CMB)
valid_from1MUSTLa fecha desde la que la afirmación fue cierta. No la fecha en que se capturó.0,0% → 100,0% (PDB)
valid_to1MUSTLa fecha tras la cual dejó de ser cierta. El campo debe estar presente; null significa que sigue vigente.20,0% → 100,0% (PDB)
source2MUSTDe dónde procede la afirmación, como identificador que puede seguirse.33,3% → 100,0% (PDB)
concept_owner2MUSTLa única parte responsable de lo que significa el concepto. Una por concepto.80,0% → 100,0% (CMB)
owner_role2SHOULDEl rol responsable dentro de esa parte, para que una petición llegue a una persona.68,8% → 100,0% (CMB)
conflict_policy2MUSTUna regla, enunciada una vez por almacén, para elegir entre registros que cubren la misma fecha y discrepan.33,3% → 100,0% (CMB)
applies_to2MUST en todo registro que enuncie una reglaLas clases de pregunta que la regla gobierna. Una regla sin alcance declarado gobierna en silencio más de lo que su autor quiso.58,3% → 70,8% (SGB)
does_not_apply_to2MUST en todo registro que enuncie una reglaLas clases de pregunta que la regla explícitamente no gobierna. Se escribe aparte porque el lector no puede inferir la negación de la afirmación.79,2% → 83,3% (SGB)
release_to3MUST si algún registro está restringidoLas partes autorizadas a leer este registro. La ausencia del campo no es permiso.59,1% → 100,0%; filtraciones críticas 2 → 0 (CMB)
supersedes3SHOULDEl identificador del registro que este sustituye, para que una actualización nunca deba expresarse editando la historia.0,0% → 66,7% (PDB)
expected_concepts-EXPERIMENTALUn registro de los conceptos que el almacén debe contener, para que un concepto ausente por completo sea detectable. Sin probar.33,3% → 100,0% (R5)

Tres niveles

Los niveles se ordenan por lo que cada uno desbloquea, de modo que un almacén puede adoptar el perfil por etapas y saber qué ha ganado en cada paso.

Nivel 1 - tiempo e identidad
Responde preguntas sobre cualquier fecha y permite que una actualización nombre lo que sustituye.
Nivel 2 - procedencia y autoridad
Resuelve la discrepancia por regla y no por conjetura, y dirige una petición de cambio a la parte responsable.
Nivel 3 - divulgación
Decide qué puede cruzar una frontera sin filtrar ni negar de más.

Dónde va cada campo

Cinco formas de destino más la nativa. Una celda en ámbar es un campo para el que el destino no tiene sitio, y la celda dice cómo añadirlo. Todo lo demás ya está allí con otro nombre.

CampoGrafo bitemporalMemoria vectorialCatálogo de datosWiki o documentosTabla relacionalDimension de Vercy
record_idedge uuidmemory idterm or asset identifiera short tag written in the line, for example [D-102]primary keyid
valid_fromvalid_atadd: metadata field, distinct from the created-at timestampadd: usually only the asset has versions, the statement does notstated in the sentencedate columnvalid_from
valid_toinvalid_atadd: metadata fieldadd: samestated in the sentencenullable date columnvalid_to
sourcethe episodic node the edge was extracted frommetadata fieldlineage link to the source assetnamed in the sentenceforeign key to a source tablesource
concept_owneradd: OWNED_BY edge from the entity to a party nodeadd: metadata fieldowner field, nativea page listing who owns whatforeign key to a party tableconcept_owner
owner_roleadd: role attribute on that OWNED_BY edgeadd: metadata fieldsteward or accountable role, nativethe role named on that pagecolumn on the party tableowner_role
conflict_policyadd: one graph-level property, or a single policy nodeadd: one pinned memory, or application configurationadd: a policy document linked from the glossarya page stating how disagreements are settledone row in a policy table, referenced by the storeconflict_policy
applies_toadd: attribute on the rule edge, or SCOPES edges to entity classesadd: metadata list on the memory holding the rulepolicy scope, native in most cataloguesthe sentence says which questions the rule governsjoin table of rule to question classapplies_to
does_not_apply_toadd: EXCLUDES edges from the rule edgeadd: metadata list, kept separate from applies_toadd: catalogues usually state inclusion onlya second sentence saying what it does not governthe same join table with an excluded flagdoes_not_apply_to
release_toadd: VISIBLE_TO edges, or a list attribute on the fact edgeadd: metadata list, applied as a retrieval filterclassification and purpose policies, nativestated in the line that holds the restricted statementjoin table of record to partyrelease_to
supersedesadd: SUPERSEDES edge between fact edgesadd: metadata field holding the prior memory idterm version history, nativethe tag of the superseded line, named in the new lineself-referencing foreign keysupersedes
expected_conceptsadd: entity nodes marked as expected but unpopulatedadd: a separate register, not a memoryadd: a list of required termsa checklist pagea table of required conceptsnot yet in the specification

Las celdas usan el vocabulario de cada sistema de destino y se dejan en inglés en todos los idiomas, para que esta tabla, profile.yaml y mappings.csv digan lo mismo. La columna del wiki no es un recurso de última hora: en el benchmark colaborativo un wiki que llevaba estos campos en frases corrientes obtuvo un 96,8%, el mejor de todas las representaciones probadas.

Cuatro cosas que se hacen mal al implementarlo

En qué se apoya esto

Tres benchmarks, 1926 llamadas al modelo, una familia de modelos, herramientas desactivadas y un mundo redactado por estudio. Las magnitudes anteriores proceden de razonar sobre registros presentes en el contexto; la recuperación, el ranking y la ingesta quedaron fuera, y son lo que varios productos de memoria consideran su aportación principal. El campo expected_concepts es una hipótesis derivada de un punto ciego medido, no un resultado: ningún estudio lo ha probado. Cada cifra remite a una ejecución bruta publicada.

Cómo registrar un cambio

Ambos benchmarks produjeron el valor nuevo correcto en todos los escenarios y la fecha de frontera equivocada en entre un tercio y un quinto de ellos. La solución no es un mejor prompt sino una operación más estrecha: se escribe un registro nuevo, se le da la fecha en que empieza la nueva afirmación, se nombra el registro que sustituye y no se toca el registro sustituido.

superseded record, left untouched:
{
  "record_id": "D-802",
  "concept": "data_retention",
  "value": "customer records are kept for five years after the contract ends",
  "valid_from": "2026-06-01",
  "valid_to": null,
  "source": "LEG-POL-04",
  "concept_owner": "legal",
  "supersedes": "D-801"
}

new record:
{
  "record_id": "D-806",
  "concept": "data_retention",
  "value": "customer records are kept for three years after the contract ends",
  "valid_from": "2026-10-01",
  "valid_to": null,
  "source": "LEG-POL-06",
  "concept_owner": "legal",
  "supersedes": "D-802"
}

El final de un intervalo sustituido se deriva al leer, nunca se escribe: un registro está vigente en una fecha cuando la cubre y nada que lo sustituya empezó en esa fecha o antes. Editar el registro antiguo, o calcular su fecha final a mano, es exactamente donde ocurrieron los errores medidos.

El único campo que era una hipótesis, y su prueba

expected_concepts se publicó como propuesta derivada de un punto ciego medido: en el benchmark de anclaje semántico, una definición ausente por completo del catálogo fue el único hueco que ni la prosa ni la estructura encontraron nunca. Un registro que nombra los conceptos que un almacén debe contener convierte esa ausencia en algo señalable. Al publicarse no estaba probado. Ahora sí: 60 llamadas sobre el mismo catálogo deficiente con y sin el registro.

MedidaSin el registroCon él
detectar el concepto ausente por completo33,3%100,0%
detectar cualquiera de los seis huecos plantados83,3%100,0%
falsas alarmas en cuatro preguntas sin hueco8,3%8,3%

El campo funciona en el caso para el que se diseñó, y el control que importaba se mantuvo: un registro que hiciera inventar huecos habría sido peor que ninguno, y las falsas alarmas no se movieron. Pero solo dos de los seis huecos cambiaron, así que la prueba de signos exacta sobre la familia da p = 0,5. Un experimento pequeño no crea un requisito, de modo que el campo sigue siendo EXPERIMENTAL. La ejecución bruta se publica junto al perfil.

Pagar menos contexto por los mismos campos

El dimension fue el contexto más largo en los dos estudios posteriores y empató en exactitud, así que el perfil no debería costar el doble de contexto para decir lo mismo. Un orden de campos fijo y una línea por registro elimina la mayor parte de ese coste. Las cifras siguientes se miden al compilar sobre el almacén de referencia publicado, no se afirman.

SerializaciónCaracteresAhorro
un objeto JSON por línea6.064-
forma de línea compacta1.86069,3%
# record_id|valid_from|valid_to|source|concept_owner|owner_role|supersedes|release_to|value
D-101|2025-01-01|2026-03-31|FIN-POL-04|finance|Head of Finance

La otra mitad del ahorro es la selección. En la pista de ensamblado del benchmark de dimensión personal, un agente al que se pidió elegir los registros que la pregunta necesita recuperó todos los necesarios, eligió 1,2 registros de 41 y recortó el contexto entregado de 10.332 a 473 caracteres sin cambio medible en la exactitud, p = 0,34. La reducción está medida; una ganancia de exactitud no lo está y no debe afirmarse.

Comprobar un almacén frente a los niveles

El comprobador acepta un array JSON o un registro por línea, y un mapa de sus nombres de campo a los roles del perfil. Informa del nivel más alto que el almacén satisface y nombra los registros que fallaron cada requisito. Sale con código distinto de cero por debajo del nivel 1, así que encaja en una compilación.

python check.py store.jsonl
python check.py store.jsonl --map record_id=uuid,valid_from=valid_at,valid_to=invalid_at,source=episode

Junto a él se publican dos fixtures. El almacén de referencia alcanza el nivel 3. Los mismos registros como aristas de hecho bitemporales alcanzan el nivel 1 e informan exactamente de lo que el benchmark colaborativo encontró que faltaba: sin propietario del concepto y sin política de conflicto.

profile.yamlmappings.csvcheck.pyalmacén de referenciael experimento del registroLos estudios detrásLa especificación