complete
El recorrido terminó.
Nada que pudiera añadir un llamador quedó sin ver. El valor cubre todo lo que hay dentro del alcance declarado.
Léelo como: dentro de este alcance, esta es la respuesta completa.
Verdad de código determinista
ye-AST le da a tu agente lo que un IDE te da a ti: quién llama a un símbolo, qué depende de un cambio, dónde aparece esa dependencia y cuán completa es la respuesta. Deriva cada respuesta de código, git y contratos declarados, e indica lo que no pudo ver.
Ningún LLM corre dentro del motor. “Unknown” es una respuesta explícita, y un resultado vacío nunca significa “sin impacto”.
El contrato de fact
Cada query devuelve un Fact. Su estado decide si un resultado vacío significa “no hay” o “no se vio”.
complete
Nada que pudiera añadir un llamador quedó sin ver. El valor cubre todo lo que hay dentro del alcance declarado.
Léelo como: dentro de este alcance, esta es la respuesta completa.
partial
Cada causa es un cut, y cada cut nombra dónde se detuvo: un límite, un nombre sin resolver, un archivo sin extractor o una ruta fuera del export.
Léelo como: lo que está más allá de un cut no se conoce.
unknown
La razón indica la causa: index-unavailable, source-unreadable, out-of-scope…
Nunca lo leas como “no hay impacto”.
Qué hace que un fact sea el mismo fact
La identidad es la única clave de invalidación. Cambia el alcance, el contenido, la config o la versión de un engine y es un fact distinto.
src/core/domain/shared/fact.ts:73-90, 193-194 · RFC-0002 regla 5
Cómo leer un fact partial
Todo fact partial lista sus cuts con estos nombres (src/core/domain/shared/fact.ts:114-128). Las instrucciones del servidor MCP indican a un agente que una respuesta partial conserva sus hallazgos conocidos y lista sus cuts, y que solo debe subir un límite cuando un cut lo nombra (src/mcp/server.ts:50-69). La tabla indica qué hacer con cada uno.
| Corte | Qué significa | Qué hacer |
|---|---|---|
depth | El recorrido se detuvo en el límite de profundidad. | Sube budget.depth, o pregunta por el símbolo del cut con callers. |
hub | Un símbolo alcanzado tiene más llamadores de tipo llamada que el presupuesto hubFanIn, así que el recorrido no lo expandió. El símbolo sigue en la respuesta; lo que se detiene es el ascenso a través de él. | Sube hubFanIn, o pregunta con callers solo por ese símbolo. |
caller-budget | Se agotó expansions, o un presupuesto de export detuvo el snapshot. | Sube el límite, o acota la petición con alcance. |
unresolved-link | Un nombre que el índice no pudo resolver puede apuntar a un símbolo recorrido. | Abre cada lugar y decide; tras una eliminación, cada lugar que aún lo nombra se rompe. |
no-extractor | Un archivo que ye-AST no puede leer: una plantilla, una hoja de estilos, un lenguaje sin extractor. | Léelo tú cuando importe para la tarea. |
not-exported | Una ruta que el snapshot dejó fuera (symlink, submódulo, ruta insegura). | Léela tú; no se leyó nada debajo. |
deadline | Se acabó el tiempo antes de que la respuesta estuviera completa. | Pregunta otra vez; acota el alcance si se repite. |
section | Una sección de una respuesta compuesta no se pudo producir. | El resto se mantiene; volver a preguntar puede completarla. |
node-cap | Un recorrido se detuvo en un tope de nodos. | Acota el alcance o pregunta por menos símbolos. |
Superficies
Un adaptador de entrada convierte una petición externa en una llamada y da forma a la respuesta. Nunca llama directamente a un adaptador ni a un caso de uso; composición inyecta las query families.
| Superficie | Qué expone | Dónde |
|---|---|---|
ye-ast map | Los puntos de entrada de una revisión; --live para un working tree trusted. | src/cli/main.ts:296-299 |
ye-ast impact | El cambio desde el merge base hasta head, con opciones de límite y alcance. | src/cli/main.ts:300-303 |
ye-ast callers | Qué depende de símbolos o rangos de líneas. | src/cli/main.ts:304-307 |
ye-ast importers | Importers, users y namers sin resolver por archivo. | src/cli/main.ts:308-311 |
ye-ast outline | Spans de declaraciones e imports de los archivos pedidos; los archivos sin nodo en el índice se listan como unheld. | src/cli/main.ts:312-315 |
ye-ast workspace | Los nombres externos que usa un repositorio, los repositorios candidatos de cada uno y los nombres que ningún repositorio sirve; --offline no refresca ningún remoto. | src/cli/main.ts:316-319 |
ye-ast decisions | Los huecos de configuración que el código no puede cubrir, cada uno con opciones respaldadas por evidencia; no escribe nada. | src/cli/main.ts:320-323 |
ye-ast init | Escribe la declaración de trust, el exclude local y la fixed layer; imprime el registro MCP. | src/cli/main.ts:104 · src/core/application/install/install.ts:26 |
ye-ast mcp | Servidor MCP sobre stdio con tools de solo lectura; sirve los repositorios declarados, y cada llamada elige uno con repo. | src/composition/mcp.ts:9-23 |
ye-ast serve | El protocolo de query sobre stdio; stdout solo lleva líneas de protocolo. | src/protocol/query-server.ts |
Solo lectura por tipo. El servidor MCP recibe solo query families de lectura: EntrypointQueries, ImpactQueries, OutlineQueries, WorkspaceQueries, WorkspaceImpactQueries, DecisionQueries y ContractConsequencesQueries. No existe ningún método de escritura, y las diez tools están anotadas como de solo lectura.
El servidor también incluye instrucciones: cuándo llamar a cada tool y cómo leer una respuesta. Complete es relativo al alcance declarado, partial conserva los hallazgos conocidos y lista sus cuts, unknown nunca significa sin impacto, y un límite se sube solo cuando un cut lo nombra.
Un servidor sirve varios repositorios declarados: ye-ast mcp [<launch-root>] [--repo <id> <root>]... los declara y cada llamada elige uno con repo (por defecto, el repositorio de arranque). Registrar un repositorio no le concede trust.
src/mcp/query-runner.ts:27-37 · src/mcp/server.ts:50-69 · src/composition/mcp.ts:9-23
Las otras tools y controles
ye_ast_outline devuelve el tipo, el nombre y el rango de líneas de cada declaración y los archivos que importa un archivo, nunca texto fuente. Los archivos pedidos de los que el índice no tiene nodo vuelven como unheld, que no significa “nada”.ye_ast_workspace devuelve los nombres externos que usa un repositorio (HTTP, mensajería, dependencias), los repositorios candidatos de cada uno y los nombres que ningún repositorio sirve. Los clones locales que aportes se usan tal cual, nunca se descargan.ye_ast_decisions devuelve los huecos que el código no puede cubrir (membership, repository, library, gateway, revision, remote, trust), cada uno con opciones respaldadas por evidencia. No escribe nada.ye_ast_contract_consequences devuelve qué rompe un cambio de contrato de request o response, a partir de hipótesis escritas o de un diff del contrato: cada uso de un consumidor o productor de la request con su veredicto y la cadena que lo prueba, y cada punto donde se pierde el flujo como unknown. Una respuesta sin hallazgos nunca significa que el cambio sea seguro.mode cambia solo la presentación, nunca la cobertura: summary da los hallazgos, details la evidencia y las ubicaciones, full el JSON completo del resultado con texto de navegación.select y page van juntos, y page.limit es obligatorio. expect verifica la identidad de un resultado; replay vuelve a ejecutar la query y falla si el resultado cambió, porque ye-AST no guarda ninguna captura anterior.src/mcp/server.ts:50-69 · src/mcp/query-schema.ts:158-205 · src/mcp/presentation.ts:5-8 · src/core/domain/outline/outline-fact.ts · src/core/domain/decisions/decision.ts:4
Solo MCP · ye_ast_compose
Envía de 1 a 16 queries tipadas de las siete familias (entrypoints, impact, callers, importers, outline, workspace, decisions) y recibe una respuesta fusionada. Agrupa queries relacionadas que comparten entidades; si una query posterior depende de una coordenada, obtén primero esa coordenada.
Prueba una combinación
Respuestas reales capturadas sobre un fixture de dos repositorios (shop y web). Compose añade sobrecarga: una query sola, queries que no comparten nada o el modo full pueden costar más que las llamadas separadas. A cambio obtienes una respuesta fusionada con sus conexiones y su cobertura.
composition-source-fault.handler-declaration, reached-handler, linked-entrypoint, change-dependent, shared-file-import, used-import y shared-support enlazan hallazgos solo entre lecturas con el mismo schema, producer, trust, engines, workspace y snapshot. shared-file-import y shared-support solo repiten una observación exacta, así que también aceptan otra versión del mismo producer. Si no, se informa un issue context-mismatch o snapshot-difference. shares-evidence significa la misma ubicación, no causalidad.summary y details devuelven texto más un recibo: una identidad de verificación (mcp-c1) y las peticiones para repetirlas. Envíalas de vuelta con expect y el mismo conjunto debe seguir dando el mismo resultado.src/mcp/composition-input.ts:13-19 · src/mcp/compose-request.ts · src/core/application/composition/compose-evidence.ts:207-237, 600-682 · src/mcp/render-composition.ts:93
Trust y snapshots
Un repositorio nunca eleva su propio trust. El trust describe el contenido del repositorio, nunca la máquina, y se declara fuera de él: un host lo hace a través de la librería o del protocolo, y un usuario con ye-ast init o con un flag. Sin declaración, el CLI y el servidor MCP corren untrusted.
Lee solo un snapshot exportado desde git en un sha, nunca el repositorio en sí.
ls-tree lista el árbol; solo se seleccionan los archivos dentro del scope.cat-file --batch escribe cada blob en un directorio scratch..gitignore, config de engine ni índice preconstruido del repositorio.Añade el working tree y el refresh de remotes, siempre hacia el store propio de ye-AST.
--live sustituye head/revision por el working tree.ls-files -z -s --cached y las no rastreadas con ls-files -z --others --exclude-standard.sync({ paths }) mantienen el grafo de esos bytes.--live se rechaza bajo untrusted con live-requires-trusted.La regla de live: un fact live describe bytes que ye-AST copió y les calculó el hash, y el grafo que lee es el grafo de esos mismos bytes. El motor nunca recorre el repositorio.
docs/architecture/rfc/0010-impact-queries.md “Live head” · src/core/application/live/live-tree.ts
Invariantes
src/mcp/query-runner.ts:27-37).unknown/partial explícito, nunca un resultado vacío.Arquitectura
Elige un flujo y recórrelo paso a paso: cada paso resalta los módulos y las aristas que cruza y explica por qué. Selecciona un módulo para ver qué puede importar y qué nunca alcanza. Mantén Ctrl (⌘ en Mac) y haz scroll para ampliar el grafo.
Flujo
El recorrido
Estas reglas deciden qué aristas sigue un recorrido y qué puede ver la respuesta. El simulador las aplica a un repositorio de ejemplo, y dos ejecuciones reales muestran el resultado.
hub en ese símbolo. El símbolo sigue en la respuesta; el presupuesto solo evita que el recorrido suba a través de una utilidad compartida que, de otro modo, arrastraría todo el repositorio. No cuenta las llamadas que hace el símbolo.Una ruta nombra una clase, no un método. Cuando el recorrido alcanza un método, también alcanza el tipo que lo declara, a la misma profundidad y con confianza 1 (walk.ts:82-87). Ese tipo se expande solo por aristas de tipo completo: extends, implements y uses-component / uses-directive / uses-pipe de Angular. No se expande hacia quien lo inyecta o importa; de lo contrario, un solo miembro alcanzado arrastraría todo.
src/core/domain/impact/edge-policy.ts:33-39 · src/core/application/impact/inbound-edges.ts:92-102
Los puentes interface-impl de codegraph se detienen en silencio después de 40 por par clase-supertipo, así que ye-AST deriva los suyos: un método y el método del mismo nombre de un tipo por encima, para cada nodo alcanzado; hacia abajo solo cuando la declaración alcanzada es el contrato que cambió, porque una declaración cambiada cambia lo que sus implementaciones deben cumplir. Un camino que subió nunca vuelve a bajar a un hermano.
src/core/application/impact/inbound-edges.ts:123-169 · src/core/domain/impact/edge-policy.ts:50-55
this.field.member origen de campothis.auth.login() es una referencia sin resolver, no una arista de llamada. Si la clase declara auth con un origen fijo, ye-AST resuelve el uso: un campo que contiene el tipo del miembro convierte el código en llamador; un campo que contiene un tipo no relacionado lo descarta como uso; un campo que contiene un subtipo lo deja sin resolver. Por eso el recorrido puede seguir dispatch real sin convertir cada método del mismo nombre en llamador.
src/core/application/impact/inbound-edges.ts:265-302 · src/core/domain/impact/edge-policy.ts:40-45
Un camino es tan seguro como su arista menos segura, y el recorrido informa del mejor de esos caminos desde cualquier semilla. Una arista heurística sin puntuación cuenta 0.3. En la ejecución real: 1 en la semilla, 0.9 en login, 0.85 en onSubmit. El fan-in es otra cosa: cuenta los llamadores de tipo llamada, se hayan seguido o no, para que un renderizador pueda clasificar o colapsar hubs sin que el fact los corte.
src/core/application/impact/walk.ts:172-188 · src/core/domain/impact/edge-policy.ts:77-101
| Arista hacia un nodo alcanzado | Seguida | Por qué |
|---|---|---|
calls, instantiates desde una función, método, clase, componente, constante, variable o inicializador de campo | sí | El comportamiento depende del destino. |
Un this.<member> o this.<member>.<rest> sin resolver dentro de la clase que lo declara | sí | El propio código de la clase usa el miembro. |
references hacia una función, método, valor o clase | sí | La fuente lo usa. |
references hacia una interfaz o type alias (un DTO) | sí | Un cambio de tipo rompe a sus usuarios; qayaba no sigue estas. |
extends, implements hacia una clase o interfaz | sí | Un subtipo depende de su supertipo. |
| Método de interfaz → método de implementación del mismo nombre, derivado por ye-AST | sí, ambos sentidos | Dispatch en tiempo de ejecución; los puentes interface-impl de codegraph se detienen en silencio después de 40 por par. |
Un método alcanzado → su tipo, a la misma profundidad; desde ese tipo solo extends/implements y uses-* | sí | Las rutas y componentes nombran la clase, no el método; ADR-0017 conserva la clase y evita que se expanda hacia los injectors. |
imports hacia un nodo de archivo | no | Un nodo de archivo no lleva a ningún lado. |
imports hacia un símbolo | sí cuando se usa | Solo cuando el código top-level del archivo que importa lo usa. |
| Una clase inyectable sin llamador → el código top-level de sus importers | sí | Inyección sin una llamada estática. |
injects, uses-component, uses-directive, uses-pipe | sí, confianza 1 | Se leen de las fuentes Angular, no se adivinan. |
navigates | no | Un enlace del router es navegación, no dependencia. |
Las aristas angular-template y angular-event de codegraph | no | ADR-0014; las relaciones A2/A4 propias de ye-AST traen las suyas. |
| Cualquier arista desde un archivo de test | no | Los tests no son llamadores; el alcance declarado lo dice. |
| Contención | no | Estructura, no dependencia. |
Todas las familias de consulta usan la misma versión del producer (ADR-0024). src/core/domain/impact/edge-policy.ts:14-58 · docs/architecture/rfc/0010-impact-queries.md:88-109
Simulador del recorrido
El motor no se ejecuta en esta página. Es un modelo fiel del recorrido sobre un grafo pequeño, con la misma política de aristas, expansión de tipos declarantes, confianza y cuts. Cada regla que aplica está citada abajo.
hub fan-in es un presupuesto sobre el fan-in: el número de llamadores de tipo llamada que puede tener un símbolo antes de que el recorrido deje de expandirlo y emita un cut hub. Déjalo vacío para no aplicar límite. La profundidad cuenta saltos desde la semilla; las expansiones cuentan símbolos expandidos.
| prof. | símbolo | archivo | confianza | fan-in | vía |
|---|
El grafo de ejemplo es ilustrativo; las reglas no. Solo se dibujan los símbolos alcanzados: la tira de abajo lista el resto, y la traza de política nombra cada arista que el recorrido rechazó y por qué. El recorrido expande cada símbolo una vez, entra al tipo declarante de un método alcanzado a la misma profundidad y sigue solo las filas de la política de aristas: un archivo de test nunca es llamador, la navegación no es dependencia y una importación de archivo no lleva a ningún lado.
Ejecución de referencia
Los dos fixtures se crearon fuera del worktree, se leyeron como untrusted y se consultaron con este build. Los valores de abajo se copian del JSON.
TypeScript plano
ye-ast impact <repo> --base HEAD~1
La semilla es validateToken. El recorrido sube hasta AuthService.login y AuthController.loginHandler; las clases se unen a la misma profundidad que sus métodos. Este fixture no tiene puntos de entrada, y eso no es un fallo.
snapshot 4e00fd9b293a · merge base 8dba227feee2 · trust untrusted
Rutas Angular
ye-ast impact <repo> --base HEAD~1
El mismo cambio, ahora con una tabla de rutas. El recorrido alcanza LoginComponent a través de onSubmit, y el join hace aparecer /login. El cut viene del snapshot, no del cambio: un archivo .rb no tiene extractor.
snapshot 2dff4ecee21a · merge base d2a9f2b9368b · cut no-extractor en src/legacy/report.rb
src/auth/token.ts
export function validateToken(token: string): boolean {
return token.length > 40; // cambiado: era > 20
}
src/auth/auth.service.ts
export class AuthService {
login(token: string): boolean {
return validateToken(token);
}
}
src/ui/login.component.ts
@Component({ selector: "app-login", … })
export class LoginComponent {
constructor(private readonly auth: AuthService) {}
onSubmit(token: string): boolean {
return this.auth.login(token);
}
}
src/app.routes.ts
export const routes = [
{ path: "login", component: LoginComponent },
{ path: "dashboard", component: DashboardComponent,
canActivate: [AuthGuard] },
];
Este es el fixture de Angular detrás de la ejecución partial; la ejecución plana solo cambia el caller, un AuthController en vez del componente. El cambio toca una línea de token.ts. El recorrido sube tres saltos, y el join convierte el componente en /login. El archivo de test que también llama a login está en el repositorio, pero nunca es llamador, por política.
Límites
Lo que esta página deja fuera y los comandos que reproducen sus ejecuciones. Los términos del glosario aparecen resaltados en el texto: selecciona uno para leer su definición.
Límites de esta página
Reproducir la evidencia
# los dos fixtures son repositorios git normales node --import tsx src/composition/main.ts map <fixture> node --import tsx src/composition/main.ts impact <fixture> --base HEAD~1 node --import tsx src/composition/main.ts callers <fixture> src/auth/token.ts:validateToken node --import tsx src/composition/main.ts importers <fixture> src/auth/token.ts # la puerta de arquitectura npm run check