01Safety
0.0 / 30
What changed in the harness
Selection accuracy 100→100, token cost up 4%, unconfirmed writes 0%→0%.
Category breakdown
Earned points across the four signals Gradable measures. Safety and Legibility are scored out of 30; Economics and Discoverability are scored out of 20.
0.0 / 30
20.3 / 30
16.5 / 20
14.0 / 20
Highest-impact fix
Estimated gain +30 pointsExpose machine-readable principal/tenant confirmation and a non-mutating permission check so agents can verify both before destructive actions.
Description evidence
36 defects found across the exposed tool descriptions. Suggested rewrites make purpose, inputs, boundaries, and returns easier for an agent to understand.
| Tool | Defect types | Suggested rewrite |
|---|---|---|
read_note |
no_return_description |
Lee y devuelve el contenido completo (Markdown) de una nota, buscándola en todas las categorías de la bóveda. Parámetro: name, el nombre de la nota sin extensión .md. |
search_notes |
no_return_description |
Busca notas por texto libre y devuelve la lista de notas que coinciden. Con múltiples palabras busca notas que contengan TODAS (lógica AND). Busca en títulos, contenido y etiquetas, y no distingue mayúsculas ni acentos: "piramide" y "pirámide" devuelven lo mismo. Los resultados se ordenan por relevancia (título y etiquetas antes que cuerpo) y vienen limitados; usa limit o category para acotar. |
list_notes |
no_return_description |
Devuelve las notas con sus metadatos, filtradas opcionalmente por categoría y/o tag. El filtro de categoría es RECURSIVO: incluye la categoría indicada y todas sus subcarpetas. Por ejemplo, category "conocimiento" devuelve las notas sueltas en su raíz Y todas las de subcarpetas como "conocimiento/problemas-resueltos". Para ver la estructura completa de carpetas, usa get_index. |
get_index |
no_return_description |
Devuelve el mapa de categorías de la base de conocimiento con el número de notas de cada una. Devuelve solo el árbol, que es barato; el listado nota a nota (caro en bóvedas grandes) hay que pedirlo con full:true y conviene acotarlo con category. |
write_note |
no_return_description |
Crear, guardar, anotar, añadir o actualizar una nota en la base de conocimiento (la bóveda). Operación de escritura — úsala cuando quieras guardar contenido nuevo o sobrescribir uno existente, incluyendo notas en la carpeta bandeja-de-entrada. Si la nota ya existe, la actualiza completa (sobrescribe el cuerpo entero). Para retoques puntuales sin reenviar todo, prefiere edit_note, append_to_note, prepend_to_note, update_section o insert_after_section. Usa "name" para actualizar una nota existente por su slug real (útil cuando el título nuevo difiere del nombre de archivo). Devuelve confirmación de que la nota se ha creado o sobrescrito. |
delete_note |
no_return_description |
Eliminar, borrar o quitar una nota de la base de conocimiento. La nota va a la papelera (fuera de la bóveda), así que se puede recuperar. Devuelve confirmación de la eliminación y avisa si otras notas la referencian con wikilinks. |
create_category |
no_return_description |
Crear una nueva subcarpeta o categoría en la base de conocimiento. Úsala antes de guardar la primera nota en una categoría que aún no exista. Devuelve confirmación de la categoría creada. |
move_note |
no_return_description |
Mover, renombrar o reubicar una nota — cambiarla de categoría y/o cambiarle el título. Actualiza automáticamente los wikilinks de otras notas que la referencien. Devuelve confirmación de la nueva categoría y título de la nota. |
delete_category |
no_return_description |
Eliminar o borrar una categoría/subcarpeta vacía. Solo funciona si la carpeta no tiene notas dentro. Devuelve confirmación de la eliminación, o un error si la carpeta no está vacía. |
edit_note |
no_return_description |
Editar, modificar, retocar o cambiar una porción concreta de una nota mediante find/replace exacto. Reemplaza old_text por new_text dentro del cuerpo de la nota sin reenviar el archivo entero. Falla si old_text no aparece o aparece más de una vez (ambigüedad). Es la operación más eficiente para correcciones puntuales: una palabra, una línea, una entrada de tabla. Para añadir contenido al final usa append_to_note; para reemplazar una sección entera usa update_section. Devuelve confirmación de la sustitución realizada. |
append_to_note |
no_return_description |
Añadir, agregar, anexar o concatenar contenido al final del cuerpo de una nota sin tocar el resto. Si la nota termina en una línea de hashtags `#snake_case`, el contenido se inserta antes de los hashtags (preservando la convención de la bóveda). Ideal para notas-bandeja, listas crecientes y logs. Devuelve confirmación del contenido añadido. |
prepend_to_note |
no_return_description |
Añadir, insertar o anteponer contenido al principio del cuerpo de una nota (justo después del título h1, antes del resto del contenido). Útil para entradas tipo log invertido donde lo más nuevo va arriba. Devuelve confirmación del contenido insertado. |
update_section |
no_return_description |
Reemplazar, sustituir o reescribir una sección Markdown entera de una nota, identificada por el título exacto de su encabezado (sin los `#`). La sección abarca desde su encabezado hasta el siguiente encabezado del mismo nivel o superior. Conserva el encabezado original, sustituye solo el contenido entre encabezados. Es markdown-aware: ideal para regenerar tablas grandes, listas o párrafos largos sin tocar el resto del documento. Devuelve confirmación de la sección reemplazada. |
insert_after_section |
no_return_description |
Insertar, añadir o intercalar una nueva sección Markdown justo después de otra sección existente, identificada por su título. La sección nueva incluye su propio encabezado dentro de new_content. Útil para añadir entradas en orden a un inventario sin reescribir todo el archivo. Devuelve confirmación de la sección insertada. |
list_broken_links |
no_return_description |
Devuelve todos los wikilinks rotos de la bóveda (referencias [[slug]] que apuntan a notas inexistentes), agrupados por la nota que los contiene. Operación de mantenimiento: úsala periódicamente para limpiar la bóveda. |
find_backlinks |
no_return_description |
Devuelve únicamente los backlinks de una nota (qué notas la referencian), sin cargar su contenido. Más rápido y económico en tokens que read_note cuando solo se quieren los backlinks. Devuelve la lista de notas que referencian a la nota indicada. |
find_orphans |
no_return_description |
Devuelve las notas huérfanas: notas que no tienen backlinks ni outlinks (no enlazan a ninguna nota ni son enlazadas por nadie). Útil para auditar notas aisladas que probablemente deberían integrarse o eliminarse. |
rename_wikilink |
no_return_description |
Renombrar, cambiar o sustituir globalmente un wikilink en todas las notas que lo referencian. Útil cuando se ha consolidado un concepto y hay que redirigir todas las referencias [[old_slug]] a [[new_slug]] sin tocar las notas origen ni destino. No mueve archivos — usa move_note si lo que quieres es renombrar la propia nota. Devuelve confirmación de las referencias actualizadas. |
list_tags |
no_return_description |
Devuelve todos los hashtags `#snake_case` presentes en el cuerpo de las notas, con el número de notas en que aparece cada uno. Útil para auditar la taxonomía, detectar variantes y mantener consistencia. |
update_frontmatter |
no_return_description |
Actualizar, modificar o cambiar campos concretos del frontmatter YAML de una nota (title, category, tags, created) sin tocar el cuerpo. El campo updated se renueva automáticamente. Para mover de categoría usa move_note (mantiene wikilinks); este tool solo edita el YAML in situ sin mover archivos. Devuelve confirmación de los campos actualizados. |
peek_note |
no_return_description |
Echar un vistazo rápido a una nota: devuelve solo frontmatter + primer párrafo del cuerpo. Ahorra tokens cuando solo se quiere comprobar la categoría, tags o de qué trata la nota antes de decidir si leerla entera. |
read_section |
no_return_description |
Leer únicamente una sección Markdown de una nota, identificada por el título exacto de su encabezado. Devuelve desde ese encabezado hasta el siguiente del mismo nivel o superior. Ideal para notas largas (inventarios, capturas) cuando solo interesa una parte. |
read_frontmatter |
no_return_description |
Leer únicamente el frontmatter YAML de una nota, sin el cuerpo, y devolverlo. Útil para validaciones rápidas o cuando solo se necesitan los metadatos. |
recently_updated |
no_return_description |
Devuelve las notas modificadas recientemente, en los últimos N días (por defecto 7). Útil para retomar contexto de qué se ha tocado últimamente sin leer toda la bóveda. |
move_category |
no_return_description |
Mover, renombrar o reubicar una categoría/carpeta entera con todas sus notas dentro. Actualiza el campo category del frontmatter de cada nota. Más eficiente que mover una a una. No actualiza wikilinks porque los slugs no cambian. Devuelve confirmación del movimiento y las notas afectadas. |
validate_note |
no_return_description |
Validar, comprobar o auditar la estructura de una nota según el protocolo de la bóveda: frontmatter completo (title, category, created, updated), presencia de sección "Ver también", presencia de hashtags `#snake_case` al final, y wikilinks no rotos. Devuelve un reporte con los problemas detectados. |
bulk_move |
no_return_description |
Mover, reubicar o desplazar varias notas a la vez a una misma categoría destino. Procesa el array de slugs en una sola llamada. Útil al procesar la bandeja de entrada cuando hay varias notas para la misma carpeta. No renombra — para renombrar usa move_note una a una. Devuelve confirmación de las notas movidas. |
due_notes |
no_return_description |
Revisar las notas programadas y devolver SOLO las que ya toca sacar hoy. Lee la fecha `> APARECER: AAAA-MM-DD` del principio de cada nota de la carpeta de programados y la compara con la fecha actual. Sustituye a mirar una por una: una sola llamada barata para la comprobación de arranque de sesión. Devuelve la lista de notas que vencen hoy (y, con include_upcoming, las próximas con su fecha y los días que faltan). |
list_sections |
no_return_description |
Devuelve el índice de secciones (los encabezados) de una nota, con su nivel y su tamaño en líneas, sin devolver el contenido. Sirve para orientarse en notas largas y decidir qué leer: después se lee solo lo necesario con read_section en vez de cargar la nota entera. |
migrate_yaml_tags |
no_return_description |
Migrar, trasladar o bajar al cuerpo los tags que quedan en el frontmatter YAML, convirtiéndolos en hashtags `#snake_case` al final de la nota, y dejar el frontmatter limpio. Los tags que ya existen como hashtag no se duplican. Operación one-shot e idempotente: conserva la fecha de modificación y la autoría. Por defecto corre en dry_run y devuelve el informe de lo que haría sin tocar nada. |
list_snapshots |
no_return_description |
Devuelve las copias de seguridad (instantáneas) disponibles de la bóveda, con su fecha y el motivo por el que se hicieron. Se crean solas antes de cada operación masiva, y también se puede crear una a mano con create_snapshot. |
create_snapshot |
no_return_description |
Crear ahora una copia de seguridad completa de la bóveda, antes de hacer algo arriesgado. Se guarda fuera de la bóveda, con fecha y motivo, y se puede volver a ella con restore_snapshot. Devuelve confirmación de la copia creada. |
restore_snapshot |
no_return_description |
Restaurar, recuperar o volver a una copia de seguridad anterior de la bóveda: devuelve las notas al estado que tenían en esa instantánea. Antes de tocar nada guarda otra copia del estado actual, así que también se puede deshacer la restauración. Devuelve el resultado de la restauración; por defecto simula y devuelve qué notas cambiarían. |
vault_health |
no_return_description |
Revisar el estado de salud de toda la bóveda en una sola llamada: wikilinks rotos, notas huérfanas, notas sin etiquetar o con demasiadas, etiquetas mal formadas, restos de tags en el frontmatter y notas que incumplen el estándar (sin "Ver también"). Devuelve un parte corto con lo que está mal y qué herramienta lo arregla. Pensada para pasarla de vez en cuando y que el desorden no se acumule sin que nadie lo vea. |
prune_tags |
no_return_description |
Podar, limpiar o simplificar las etiquetas de la bóveda: fusionar variantes que significan lo mismo (#tipo_filosofia → #tipo_doctrina) y recortar las notas que llevan más etiquetas de la cuenta, quedándose con las que de verdad agrupan. Conserva siempre el `#tipo_*`, lo que se indique en `keep` y las etiquetas más usadas; las que sobran se retiran empezando por las de uso único, que no agrupan nada. Preserva la fecha de modificación y la autoría. Devuelve el informe de lo que haría; por defecto corre en dry_run. |
audit_tags |
no_return_description |
Auditar, revisar o comprobar la salud de las etiquetas de la bóveda: hashtags mal formados con guión medio (que los editores no agrupan y el extractor trunca), variantes del mismo concepto, etiquetas usadas una sola vez y notas que aún conservan tags en el frontmatter YAML. Devuelve un informe para limpiar la taxonomía. Si fix_dashes es true, además corrige los guiones a snake_case. |
Selection evidence
11 pairs where similar names or overlapping descriptions may send an agent toward the wrong tool.
| Tool A | Tool B | Confidence | Why they collide |
|---|---|---|---|
append_to_note |
prepend_to_note |
medium | Both tools trigger on 'añadir/agregar contenido a una nota' with near-identical phrasing; a task like 'añade este párrafo a la nota X' without specifying la posición (final vs principio) is genuinely ambiguous, and the agent may default to append. |
update_section |
update_frontmatter |
medium | Both are update_* tools that 'actualizar/modificar/cambiar' something in a note; tasks like 'actualiza los datos de la nota X' or 'cambia la categoría' don't reveal whether a body section or the YAML fields are meant. |
update_section |
insert_after_section |
medium | Both operate on markdown sections identified by heading title; 'añade o actualiza una sección sobre Y' is ambiguous between replacing the existing section content and inserting a new section after another. |
move_note |
move_category |
medium | Both are 'mover/renombrar/reubicar' tools sharing the category vocabulary; a task like 'mueve conocimiento/problemas-resueltos a X' is ambiguous unless the agent knows whether the target is a note or a folder. |
move_category |
bulk_move |
medium | Both relocate content across categories; a task like 'mueve todo lo de la bandeja a clientes' could mean moving the whole folder (move_category) or moving several notes at once (bulk_move). |
prune_tags |
audit_tags |
medium | Both concern tag taxonomy health; 'revisa/limpia/arregla las etiquetas' could select either, since audit reports problems (dashes, variants, YAML leftovers) while prune performs the merge/trim. |
list_tags |
audit_tags |
low | A task like 'dime cómo están las etiquetas' could pull the plain listing (list_tags) or the health audit (audit_tags); 'revisar' hints at the latter but is not decisive. |
read_note |
search_notes |
low | A task like 'muéstrame la nota sobre pirámides' is ambiguous: with a known exact name read_note is right, but without one only search_notes can locate the note. |
delete_note |
delete_category |
low | Both trigger on 'borrar/eliminar'; 'elimina X' is ambiguous between a note and an empty category unless the object type is explicit. |
find_backlinks |
find_orphans |
low | Both are find_* link analyses; 'busca notas que no estén enlazadas' could be read as orphan detection or as checking the backlinks of a specific note. |
migrate_yaml_tags |
audit_tags |
low | Audit flags notes that still keep tags in YAML and migrate moves them to the body; 'organiza/limpia los tags del frontmatter' could plausibly pick either. |
Compare the field