@kwirthmagnify/kwirth-docs-pinocchio 0.2.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,113 @@
1
+ # Límites conocidos
2
+
3
+ Lista honesta de lo que Pinocchio **no** hace, o hace de forma distinta a la que su UI sugiere. Todo lo de
4
+ esta página está verificado contra el código del plugin, no supuesto. Si algo te está pasando y aparece
5
+ aquí, no es tu configuración.
6
+
7
+ ## Configuración de IA
8
+
9
+ **La config de IA sólo se lee al arrancar el canal.** Los providers y los LLMs se cargan del almacén común en
10
+ el arranque de la instancia. Si un administrador crea un provider desde los menús *AI Providers* del core con
11
+ el canal ya abierto, ese canal no lo verá hasta que se cierre y se reabra.
12
+ *Workaround:* configúralo desde el propio menú **Config** de Pinocchio, que sí notifica al canal, o reabre el
13
+ canal.
14
+
15
+ **La config de IA no viaja entre clústeres.** Los menús *AI Providers* / *AI Models* del core escriben en el
16
+ backend **local**, pero un canal abierto contra otro kwirth lee el almacén de **ese** clúster. En una
17
+ federación hay que configurar providers y LLMs en cada clúster.
18
+
19
+ **Las opciones de salida estructurada se eligen por el `Name` del provider, no por su `Type`.** El modelo se
20
+ construye bien (por tipo), pero los `providerOptions` (`structuredOutputs`, `strictJsonSchema`) se deciden con
21
+ un `switch` sobre el nombre. Un provider de tipo `google` llamado `gemini-prod` pierde el
22
+ `structuredOutputs: true` y sus triggers `artifact` pueden empezar a fallar.
23
+ *Workaround:* deja el `Name` del provider igual que su `Type`.
24
+
25
+ ## Triggers
26
+
27
+ **El campo `Action` no está implementado.** El selector ofrece `inform`, `cancel` y `repair`, y el valor se
28
+ guarda en la configuración, pero el backend **nunca lo lee**. Todo se comporta como `inform`: se analiza y se
29
+ informa. Pinocchio no bloquea ni repara nada.
30
+
31
+ **El campo `Spaces` no filtra nada.** En un trigger `business` puedes escribir `orders.created`, pero el
32
+ matching no lo usa: **todos** los triggers `business` con una versión activa se disparan con **cualquier**
33
+ evento de negocio que llegue al canal. El único filtrado real es el de la suscripción del canal, que está
34
+ fijada en el código a `customers.status`, `branches.status` y `launch.immediate`.
35
+
36
+ **Los prompts `business` se renderizan con contexto vacío.** El backend calcula un objeto con los datos de los
37
+ espacios declarados… y luego llama a `nunjucks.renderString(prompt, {})`. Los datos del evento **no llegan a
38
+ la plantilla**: cualquier `{{ variable }}` sale como cadena vacía.
39
+
40
+ **Los triggers `business` ignoran el `system` de la versión.** El backend usa un system fijo
41
+ (*"Use the tools provided to find information…"*). El `system` que escribas en el editor se guarda pero no se
42
+ envía al modelo.
43
+
44
+ ## Playground
45
+
46
+ **`Export → New trigger` pierde el `Kind` y el `K8s Event`.** El trigger nuevo se crea con el tipo y la
47
+ versión, pero sin `kind` ni `k8sEvent`. Un trigger `artifact` recién exportado **no casa con ningún evento**.
48
+ *Workaround:* abre **Config → Trigger** justo después y ponle el kind a mano.
49
+
50
+ **El selector `K8s Event` del Playground no hace nada.** El objeto que inyectas siempre se le entrega al
51
+ modelo como un evento `ADDED`. El valor se guarda con el estado del Playground, pero no cambia la simulación.
52
+
53
+ **En modo Artifact, el `Prompt type` que elijas no siempre manda.** El backend lo deriva de si el campo Prompt
54
+ tiene texto: con prompt, `jinja`; vacío, `artifact`.
55
+ *Workaround:* para probar `artifact` puro, vacía el campo Prompt.
56
+
57
+ **En modo Business, el payload es el prompt.** El backend descarta el campo `Prompt` y usa el contenido del
58
+ textarea de evento como prompt.
59
+
60
+ **En modo Business, cambiar `Space`/`Type` desvía el disparo.** Sólo un evento con `launch`/`immediate` se
61
+ redirige al Playground. Con otros valores, el evento pasa a evaluarse contra los triggers de negocio
62
+ **reales**, y si además el par no es uno de los tres a los que el canal está suscrito, no llega a ninguna
63
+ parte y no verás nada.
64
+
65
+ **El Playground nunca produce findings.** Usa `generateText` sin esquema de salida: devuelve texto libre. El
66
+ formato estructurado sólo aparece cuando el trigger se dispara de verdad.
67
+
68
+ ## Salida y persistencia
69
+
70
+ **`hardened_yaml` se genera pero no se ve.** El esquema de salida pide al modelo un manifiesto endurecido, el
71
+ backend lo guarda en el análisis… y **ninguna pantalla lo muestra**. Se paga en tokens y no se aprovecha.
72
+ *Workaround parcial:* pide en el `system` que el YAML corregido vaya también dentro del `report`, que sí se
73
+ renderiza.
74
+
75
+ **Los análisis no se persisten.** Viven en memoria del canal, con un tope de **50**; a partir de ahí se
76
+ descarta el más antiguo. Un reinicio del backend los pierde todos. Si necesitas conservar un hallazgo,
77
+ expórtalo tú (copia el informe).
78
+
79
+ **El buffer de métricas es de 100 lecturas.** Las tools de histórico (`get_prev_*`) no pueden mirar más atrás
80
+ de eso, y arrancan vacías al abrir el canal.
81
+
82
+ ## Alcance y seguridad
83
+
84
+ **No hay filtro de sólo-lectura en las tools.** El interruptor `Auto` de un trigger entrega el catálogo
85
+ **completo**, incluidas `delete_pod`, `restart_deployment`, `add_node`, `remove_node` y el escalado. Se
86
+ ejecutan con el service account del backend, no con los permisos del usuario. Ver
87
+ [Permisos y acceso](05-rbac.md).
88
+
89
+ **No hay permisos granulares.** El canal sólo admite los scopes `none` y `cluster`, y cualquiera de los dos
90
+ da acceso completo: leer y borrar los análisis de todos, y editar los providers de IA compartidos, claves
91
+ incluidas.
92
+
93
+ **Los objetos preexistentes no se analizan.** Ante un `ADDED`, si el `creationTimestamp` del objeto es
94
+ anterior al arranque del canal, se descarta. Es intencionado —evita analizar el clúster entero cada vez que
95
+ alguien abre el canal— pero significa que no puedes auditar lo que ya existe sin recrearlo o pasarlo por el
96
+ Playground.
97
+
98
+ **Los kinds vigilados están fijados en el código.** `Pod`, `Deployment`, `DaemonSet`, `StatefulSet`,
99
+ `ReplicaSet`, `Job`, `CronJob`, `ReplicationController`, `Service`, `Ingress`, `HTTPRoute`. No hay CRDs y no
100
+ es configurable desde la UI.
101
+
102
+ ## Cosméticos
103
+
104
+ **`medium` se pinta en verde.** El código de colores es `critical`=rojo, `high`=naranja, `medium`=verde,
105
+ `low`=gris. Guíate por el texto de la etiqueta.
106
+
107
+ **El formateo de la descripción de un finding es mínimo.** Un fragmento entre ` **` y `** ` se pinta en
108
+ negrita y subrayado, y sólo el primero de la cadena. No es markdown. El markdown de verdad está en el
109
+ **Report**.
110
+
111
+ ---
112
+
113
+ El backlog de desarrollo con el estado de estos puntos está en `plans/pinocchio/PLAN.md`.
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
package/index.html ADDED
@@ -0,0 +1,64 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <title>Pinocchio — Guide</title>
6
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
7
+ <meta name="description" content="Pinocchio — user & administration guide">
8
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0">
9
+ <link rel="stylesheet" href="../../docsify/vue.css">
10
+ <link rel="stylesheet" href="kwirth-dark.css">
11
+ <style>
12
+ .sidebar { width: 320px; }
13
+ .content { left: 320px; }
14
+ </style>
15
+ </head>
16
+ <body>
17
+ <div id="app"></div>
18
+ <script>
19
+ // Colapsable de secciones propio (sin plugin): togglea con el chevron, abre por defecto,
20
+ // mantiene abierta la seccion de la pagina activa y NO se contrae al navegar.
21
+ var sectionState = {}
22
+ window.$docsify = {
23
+ homepage: 'index.md',
24
+ relativePath: false,
25
+ loadSidebar: true,
26
+ auto2top: true,
27
+ name: 'Pinocchio',
28
+ subMaxLevel: 0,
29
+ search: {
30
+ paths: 'auto',
31
+ placeholder: 'Search...',
32
+ noData: 'No results',
33
+ depth: 4
34
+ },
35
+ plugins: [
36
+ function (hook) {
37
+ hook.doneEach(function () {
38
+ var secs = document.querySelectorAll('.sidebar-nav > ul > li')
39
+ secs.forEach(function (li) {
40
+ var sub = li.querySelector(':scope > ul')
41
+ var head = li.querySelector(':scope > strong, :scope > p > strong')
42
+ if (!sub || !head) return
43
+ li.classList.add('has-children')
44
+ var key = head.textContent.trim()
45
+ if (sectionState[key] === undefined) sectionState[key] = true // abierto por defecto
46
+ var active = !!li.querySelector('a.active')
47
+ li.classList.toggle('open', sectionState[key] || active) // la activa siempre abierta
48
+ head.style.cursor = 'pointer'
49
+ head.onclick = function (e) {
50
+ e.preventDefault(); e.stopPropagation()
51
+ sectionState[key] = !li.classList.contains('open')
52
+ li.classList.toggle('open', sectionState[key])
53
+ }
54
+ })
55
+ })
56
+ }
57
+ ]
58
+ }
59
+ </script>
60
+ <script src="../../docsify/docsify.min.js"></script>
61
+ <script src="../../docsify/search.min.js"></script>
62
+ <script src="../../docsify/docsify-copy-code.min.js"></script>
63
+ </body>
64
+ </html>
package/index.md ADDED
@@ -0,0 +1,42 @@
1
+ # Pinocchio — análisis agéntico de tu clúster
2
+
3
+ **Pinocchio** es un plugin de kwirth que pone un **LLM a mirar lo que pasa en tu clúster**. No es un chat:
4
+ es un canal que **escucha eventos** —altas y cambios de recursos de Kubernetes, o eventos de negocio que le
5
+ manda un sistema externo— y, cuando uno encaja con un **trigger** que tú has definido, invoca al modelo con
6
+ tu prompt y tus *tools*, y devuelve **findings** estructurados y un **informe**.
7
+
8
+ La diferencia con "pegar un YAML en un chat" es que Pinocchio **vive dentro del clúster**: el modelo puede
9
+ llamar a herramientas que consultan namespaces, workloads, métricas, logs, eventos, ConfigMaps o el
10
+ histórico de rollouts. Analiza el recurso *y su contexto real*, no un fragmento fuera de sitio.
11
+
12
+ ![El editor de triggers: cuándo se dispara, qué se le pregunta al modelo y con qué herramientas](images/triggers-dialog.png)
13
+
14
+ ## Qué encontrarás en esta guía
15
+
16
+ **Guía de usuario** — entender, configurar y explotar el canal:
17
+
18
+ - [Introducción y modelo mental](user/01-introduction.md) · [Cómo funciona](user/00-how-it-works.md)
19
+ - [Triggers, versiones y prompts](user/03-concepts.md)
20
+ - [Recorrido por la UI](user/02-ui-tour.md) · [Configurar triggers](user/04-triggers.md)
21
+ - [Leer los findings](user/05-findings.md) · [El Playground](user/06-playground.md)
22
+ - [Import / Export de triggers](user/07-import-export.md)
23
+
24
+ **Guía de administrador** — instalar, conectar el LLM y gobernar el acceso:
25
+
26
+ - [Instalación](admin/01-setup.md) · [Providers y modelos de IA](admin/02-ai-config.md)
27
+ - [Tools y pasos del agente](admin/03-tools.md) · [Plantillas de prompt](admin/04-prompts.md)
28
+ - [Permisos y acceso](admin/05-rbac.md) · [Límites conocidos](admin/06-limits.md)
29
+
30
+ ## Empieza aquí
31
+
32
+ 1. Lee [Cómo funciona](user/00-how-it-works.md) para tener el bucle completo en la cabeza: evento → trigger →
33
+ prompt → modelo (+ tools) → findings.
34
+ 2. Pide a tu administrador que configure un **provider** y un **LLM** ([Providers y modelos](admin/02-ai-config.md)).
35
+ Sin eso el menú *Config* no te deja crear triggers.
36
+ 3. Abre el **Playground** ([El Playground](user/06-playground.md)) y afina un prompt contra un artefacto de
37
+ ejemplo, **sin tocar producción**.
38
+ 4. Cuando funcione, expórtalo a un trigger real desde el propio Playground y actívalo.
39
+
40
+ > ⚠️ Pinocchio **gasta tokens de tu proveedor de IA**. Un trigger sobre `Pod`/`MODIFIED` en un clúster vivo
41
+ > puede dispararse cientos de veces al día. Lee [Tools y pasos del agente](admin/03-tools.md) antes de
42
+ > activar nada en un entorno grande.