Módulo 8: Capstone The Andes Cargo Genai Extractor
5. Lo que esta guía dejó representativo
Descripción
Cada uno de los siete módulos anteriores documentó, en su propia lección de "el límite exacto", qué parte de su dominio quedaba fuera del alcance de este laboratorio $0, con la razón técnica precisa y la fuente oficial que la respalda. Esta lección no descubre ningún límite nuevo — reúne, en un solo documento, cada una de esas afirmaciones, con su lección de origen exacta, para que nadie que quiera citar el trabajo de esta guía en una entrevista, un README o una presentación tenga que rebuscar entre treinta y seis lecciones para encontrar la razón completa. Es la etiqueta nutricional de toda la guía: qué tiene, qué no tiene, y por qué, en una sola tabla.
Conexión con el módulo
Las lecciones 3 y 4 de este módulo acaban de demostrar, con código corrido de verdad, exactamente dónde el camino determinista y el camino de escalamiento terminan en código ejecutable y dónde empieza lo representativo. Esta lección generaliza esa misma disciplina a la guía completa, module por módulo, desde el M1 hasta el M7.
Analogía: la etiqueta nutricional, no el eslogan del empaque
Un empaque de alimento tiene dos superficies de texto completamente distintas. El frente —el eslogan, el diseño, "100% natural"— vende una promesa general, sin números. La etiqueta nutricional, en el reverso, no vende nada: lista, con precisión legal, exactamente cuántos gramos de cada cosa contiene ese producto específico, sin redondear hacia arriba ni hacia abajo, con una fuente verificable si alguien la cuestiona. Esta guía completa, desde el M1.1, se comportó como esa etiqueta nutricional, no como el eslogan del frente: cada afirmación de "esto corrió de verdad" o "esto es representativo" llevó, siempre, su razón exacta al lado. Esta lección es la etiqueta nutricional completa, impresa una sola vez, del producto entero — treinta y seis lecciones de contenido, condensadas en una tabla que un lector puede verificar renglón por renglón.
El ledger completo, módulo por módulo, con la razón exacta de cada fila
| # | Pieza | Módulo · lección | Razón técnica exacta |
|---|---|---|---|
| 1 | Cualquier invocación real a bedrock:InvokeModel/Converse, en toda esta guía | M1.2 (decisión), reafirmado en cada módulo | Decisión de diseño explícita desde la primera lección — esta guía enseña a operar Bedrock, no reemplaza el prerequisito de AI Engineering de saber invocarlo; ninguna razón técnica lo impide, es una frontera pedagógica deliberada |
| 2 | list-foundation-models/cualquier API de Bedrock contra LocalStack | M1.7 | Bedrock — "Included in Plans: Ultimate", un nivel por encima del plan gratuito Hobby sobre el que corre todo este laboratorio (LocalStack Docs — Bedrock) |
| 3 | tflocal apply/awslocal iam get-role-policy sobre BedrockManifestExtractorRole | M3.4, M3.7 | Límite del entorno de escritura, no del servicio — IAM sí está en Hobby, pero este sandbox específico no tiene LOCALSTACK_AUTH_TOKEN exportado (exit code 55, el mismo hallazgo del M1.7) |
| 4 | terraform apply/tflocal apply del recurso aws_bedrock_guardrail | M3.6, M3.7 | Misma razón que la fila 2 — ningún token, de ningún plan gratuito, habilita este recurso específico |
| 5 | Bloqueo real de un ataque de prompt, o enmascarado real de una fuga de PII, por Bedrock Guardrails | M4.7 | Requiere una invocación real de bedrock:InvokeModel/Converse con el guardrail referenciado — el schema de la respuesta (ApplyGuardrail) está verificado; el contenido de una clasificación real, no |
| 6 | write_shipment_record() escribiendo de verdad en Shipments (DynamoDB), en cualquier lección de esta guía | M8.3 | Misma razón que la fila 3 — DynamoDB sí está en Hobby, pero este entorno de escritura no tiene token exportado |
| 7 | El número en dólares que Infracost produciría para bedrock.tf | M2.5, M2.6 | Dos obstáculos independientes: el gate de autenticación de Infracost bloquea antes de analizar nada; y, estructuralmente, ningún recurso aws_bedrock_* existe en el catálogo de Infracost, ni podría fijarle precio a una llamada de inferencia sin un archivo de uso declarado |
| 8 | InvocationLatency/TimeToFirstToken reales de extract-shipment-manifest-fields | M7.7 | Ambas métricas, publicadas por Bedrock en CloudWatch/AWS/Bedrock, solo tienen un valor si una invocación real produjo ese valor — ni siquiera existe, además, un rango publicado por AWS específicamente para Nova Lite |
| 9 | La tasa de escalamiento sobre tráfico real de producción (frente al 12,0 % de un lote de prueba fijo) | M7.4, M2.8 §7 | El 12,0 % (M7.4) y el 0,0 % (M8.3) son mediciones reales, pero sobre lotes construidos a mano — ninguno es una muestra de tráfico real, que solo existiría con el sistema desplegado y operando |
| 10 | La calidad semántica de una extracción real (¿el modelo entendió el matiz correcto de un texto ambiguo?) | M1.4, M7.5, M7.6 | Fuera de alcance por diseño, no por limitación técnica del laboratorio — es, explícitamente, territorio de AI Engineering; el arnés del M7.6 compara forma, nunca significado |
Diez filas. Nueve dependen, directa o indirectamente, de una invocación real a Bedrock que esta guía nunca hace. Una —la fila 1— es la decisión de diseño que las otras nueve, en cascada, hacen inevitable.
El mismo ledger, agrupado por causa raíz
Vale la pena ver estas diez filas agrupadas, no solo listadas — la mayoría de ellas comparte una de solo tres causas raíz distintas:
CAUSA RAIZ 1: BEDROCK NUNCA SE INVOCA (decision de diseno, M1.2)
│
├── Fila 1 -- ninguna invocacion real, en ningun punto
├── Fila 5 -- el bloqueo real del guardrail depende de invocar
├── Fila 7 -- Infracost no puede tasar una llamada que no ocurre
├── Fila 8 -- las metricas de latencia no existen sin invocacion
├── Fila 9 -- la tasa de escalamiento real necesita trafico real
└── Fila 10 -- la calidad semantica depende de una respuesta real
CAUSA RAIZ 2: BEDROCK ES "ULTIMATE-ONLY" EN LOCALSTACK (M1.7)
│
├── Fila 2 -- ninguna API de Bedrock corre contra LocalStack Hobby
└── Fila 4 -- apply del guardrail, mismo obstaculo
CAUSA RAIZ 3: ESTE SANDBOX NO TIENE LOCALSTACK_AUTH_TOKEN (M1.7, M3.4)
│
├── Fila 3 -- apply del rol IAM (SI esta en Hobby, no en este entorno)
└── Fila 6 -- escritura real en DynamoDB (misma razon)
Fíjate en la Causa raíz 3: es la única de las tres que es un límite de este entorno de escritura específico, no del servicio ni del plan de LocalStack — cualquier lector que corra esta guía en su propia máquina, con su propio token de Hobby gratuito, vería las filas 3 y 6 completarse de verdad, sin cambiar una sola línea de código. Las filas de la Causa raíz 1 y 2, en cambio, seguirían representativas sin importar quién las corra ni con qué token, porque dependen de una decisión de diseño de esta guía o de un límite real de licenciamiento de LocalStack.
Lo que esta tabla NO dice
Con la misma precisión que cada lección de "el límite exacto" ya aplicó a su propio dominio, vale la pena decir, en voz alta, lo que estas diez filas no significan: no significan que esta guía sea, en su mayoría, teórica. El M8.1 ya adelantó el conteo inverso — terraform validate/plan sobre diecisiete recursos, 34 casos de pytest sobre los guardrails propios, seis reglas de Rego evaluadas con conftest contra un plan real, una firma real de cosign, una calculadora de costo con doce casos de prueba, una métrica de escalamiento con siete casos de prueba, un arnés de smoke test con seis casos de prueba, y el recorrido completo de las lecciones 3 y 4 de este mismo módulo. Cada una de esas piezas es código real, ejecutado, verificable por cualquiera que clone este repositorio y corra los mismos comandos. La proporción exacta entre lo ejecutado y lo representativo no es el punto de esta lección —el DISENO.md de esta guía ya hizo esa contabilidad, con el veredicto de aprobación al inicio del documento—; el punto es que cada una de las diez filas de arriba tiene una razón técnica específica, citada, nunca una excusa genérica.
Errores comunes
Citar esta tabla sin la columna de "razón técnica exacta", reduciendo cada fila a "no se pudo" (de aplanar diez razones distintas en una sola). Qué pasa: alguien, resumiendo esta guía para un README, escribe "esta guía no puede invocar Bedrock por limitaciones del laboratorio", sin distinguir entre las tres causas raíz. Cómo detectarlo: si tu resumen de esta lección cabe en una sola frase sin ninguna de las tres causas nombradas. Cómo corregirlo: la sección "El mismo ledger, agrupado por causa raíz" existe exactamente para esto — un lector técnico exigente va a preguntar "¿por qué, específicamente?", y la respuesta correcta distingue una decisión de diseño (fila 1) de un límite de licenciamiento (filas 2 y 4) de un límite de este sandbox en particular (filas 3 y 6), porque cada una tiene una implicación distinta para alguien que quisiera correr esta guía con más recursos.
Asumir que las filas 3 y 6 (límite del entorno de escritura) también aplicarían en la propia máquina del lector (de generalizar un límite específico de este sandbox a todos los entornos). Qué pasa: alguien, siguiendo esta guía en su propia computadora, con un token de LocalStack Hobby ya exportado, asume que tampoco podría aplicar BedrockManifestExtractorRole ni escribir en Shipments. Cómo detectarlo: si tu copia local de esta guía nunca intenta tflocal apply -target=module.bedrock_manifest_extractor_role, asumiendo que fallaría igual que en la guía. Cómo corregirlo: la Causa raíz 3, explícitamente, es del sandbox de escritura de esta guía —no existe en tu propia máquina si tienes un token real exportado—; el M3.4 ya lo dijo con precisión: "cualquiera con un token de Hobby gratis, en su propia máquina, corre estos dos comandos de verdad".
Tratar el conteo de piezas ejecutadas de la sección "Lo que esta tabla NO dice" como si compensara o "cancelara" las diez filas representativas (de convertir una aclaración en una defensa desproporcionada). Qué pasa: alguien lee esa sección y concluye que las diez filas de arriba, en el fondo, "no importan tanto". Cómo detectarlo: si tu resumen de esta lección es "en realidad casi todo corrió, las diez filas son un detalle menor". Cómo corregirlo: esa sección existe para dar contexto, no para minimizar — las diez filas del ledger siguen siendo exactamente lo que son: el límite real y honesto de este laboratorio $0. Ninguna cantidad de pytest corrido en otro lugar de la guía cambia que ninguna invocación real de Bedrock ocurrió jamás. Las dos secciones de esta lección son complementarias, no una compensando a la otra.
Ejercicios
Ejercicio 1 — Clasifica, sin mirar la tabla, cada una de las diez filas de esta lección en una de las tres causas raíz. Verifica tu clasificación contra la sección "El mismo ledger, agrupado por causa raíz".
Ver solución
Causa raíz 1 (Bedrock nunca se invoca, decisión de diseño): filas 1, 5, 7, 8, 9, 10. Causa raíz 2 (Ultimate-only en LocalStack): filas 2, 4. Causa raíz 3 (este sandbox sin token): filas 3, 6. Si tu clasificación coincidió, tienes clara la diferencia entre una decisión de diseño, un límite de licenciamiento y un límite de entorno específico — la distinción central de esta lección.
Ejercicio 2 — Un entrevistador técnico te pregunta: "si tuvieras una cuenta AWS real con Bedrock habilitado, ¿cuántas de estas diez filas seguirían siendo un problema?" Responde con precisión, fila por fila.
Ver solución
Con una cuenta AWS real y Bedrock habilitado, las filas 1 a 8 dejarían de ser un obstáculo técnico —podrías invocar el modelo de verdad, aplicar el guardrail, escribir en Shipments, medir latencia real, y Bedrock Guardrails sí bloquearía o dejaría pasar contenido de verdad—. La fila 7 (Infracost) seguiría siendo un problema estructural, no de cuenta: Infracost, hoy, no tiene ningún recurso aws_bedrock_* en su catálogo, así que una cuenta real no lo resuelve, solo una actualización de la herramienta misma lo haría. La fila 9 dejaría de ser un límite en cuanto existiera tráfico real que medir — el código ya está listo para ese momento. La fila 10, la calidad semántica, seguiría siendo territorio de AI Engineering por diseño, no por limitación de cuenta — ninguna cantidad de acceso a Bedrock cambia esa frontera, que es pedagógica, no técnica.
Ejercicio 3 — Explica por qué esta lección eligió el formato de "razón técnica exacta" con fuente citada, en vez de simplemente escribir "REPRESENTATIVO" al lado de cada fila, como una versión abreviada. ¿Qué se perdería con la versión abreviada?
Ver solución
Se perdería, precisamente, la capacidad de distinguir las tres causas raíz de la sección anterior — una tabla de "REPRESENTATIVO" sin más contexto trataría por igual una decisión de diseño deliberada (fila 1), un límite de licenciamiento verificado con una cita oficial (filas 2 y 4), y un límite específico de este sandbox de escritura, reproducible o no según el entorno de quien lo lea (filas 3 y 6). Esas tres categorías tienen implicaciones prácticas completamente distintas para alguien que quisiera reproducir, extender o auditar esta guía — la misma razón por la que cada lección de "el límite exacto" de los siete módulos anteriores, desde el M1.7 en adelante, nunca se conformó con la palabra "representativo" sola, siempre con su razón y su fuente al lado.
Resumen y siguiente paso
Esta lección consolidó, en una sola tabla de diez filas, cada afirmación "representativo" de las treinta y seis lecciones anteriores de esta guía, con su lección de origen exacta y su razón técnica citada — nunca una etiqueta genérica. Agrupaste esas diez filas en tres causas raíz distintas: una decisión de diseño (nunca invocar Bedrock), un límite real de licenciamiento de LocalStack (Ultimate-only), y un límite específico de este sandbox de escritura (sin LOCALSTACK_AUTH_TOKEN) — la tercera, a diferencia de las otras dos, no aplicaría en la máquina de un lector con su propio token gratuito.
Antes de avanzar deberías poder: citar, de memoria o cerca, las tres causas raíz y qué filas pertenecen a cada una; explicar cuáles de las diez filas dejarían de ser un obstáculo con una cuenta AWS real, y cuáles no; y defender por qué esta tabla usa razones técnicas específicas, nunca la palabra "representativo" sola.
La lección 6 recapitula, con la misma precisión, la otra mitad de la honestidad de esta guía: no qué quedó sin ejecutar, sino qué esta guía decidió, deliberadamente, no enseñar en absoluto — la frontera con AI Engineering, cerrada sin ambigüedad.
Recursos
genai-on-aws-production-guide/DISENO.md— la fuente de la contabilidad de honestidad completa de esta guía y el veredicto de aprobación citado en la sección "Lo que esta tabla NO dice".- Cada lección citada en la columna "Módulo · lección" de la tabla principal — la fuente primaria y completa de cada una de las diez filas, con su propia evidencia ejecutada o su propia cita oficial.
- LocalStack Docs — Bedrock — la fuente de la Causa raíz 2, citada primero en el M1.7 y reconfirmada en el M3.6 y el M4.7.
- Infracost — Supported AWS Resources — la fuente de la fila 7, confirmada directamente en el M2.6.