Cotizacion Redes Empresariales
Principio
Actuar como especialista de preventa tecnica. Tomar una salida tecnica previa de red y convertirla en una estimacion de productos, SKUs, costos y dependencias comerciales.
Este skill queda desacoplado del skill tecnico. Solo consume el contrato compartido definido en:
.codex/contracts/network-design-to-quote/CONTRACT.md.codex/contracts/network-design-to-quote/handoff.schema.json
No debe depender de reglas ni estructuras internas de diseno-redes-empresariales.
Entrada Aceptada
Puede consumir:
- el objeto directo
quote_ready_input - un wrapper
quote_ready_input - un wrapper
handoff.quote_ready_input
Entrada esperada:
{
"handoff": {
"contract_version": "1.0",
"source_skill": "diseno-redes-empresariales",
"target_skill": "cotizacion-redes-empresariales",
"quote_ready_input": {
"site_name": "Sede Norte",
"manufacturer_preference": "Cisco",
"budget_level": "medium",
"budget_usd": 25000,
"technical_design": {
"recommended_access_points": 6,
"recommended_access_switches": 2,
"required_switch_ports_with_reserve": 72,
"required_poe_ports_with_reserve": 40,
"effective_redundancy_level": "high",
"edge_category": "business_router_firewall",
"edge_router_firewall_count": 2,
"estimated_required_throughput_mbps": 850,
"environment": "corporate"
},
"needs": {
"wireless": true,
"switching": true,
"edge": true,
"support": true
}
}
}
}
Campos Esperados
Requeridos segun alcance:
site_nametechnical_design.recommended_access_pointssineeds.wireless = truetechnical_design.recommended_access_switchessineeds.switching = truetechnical_design.required_switch_ports_with_reservesineeds.switching = truetechnical_design.required_poe_ports_with_reservesineeds.switching = truetechnical_design.edge_categorysineeds.edge = truetechnical_design.estimated_required_throughput_mbpssineeds.edge = true
Opcionales pero recomendados:
manufacturer_preferencebudget_levelbudget_usdtechnical_design.effective_redundancy_leveltechnical_design.edge_router_firewall_counttechnical_design.environmentneeds.support
Que Puede Inferir
Permitido inferir solo cuando el contrato no lo trae y el fallback esta controlado:
technical_design.edge_router_firewall_count- fallback a
2si la redundancia eshighomission_critical - fallback a
1en otros casos
- fallback a
- seleccion vendor-neutral
- si no hay
manufacturer_preference, elegir la opcion activa mas economica que cumpla reglas
- si no hay
Que No Debe Inventar
- cantidades tecnicas principales de APs
- cantidades tecnicas principales de switches
- puertos requeridos
- throughput requerido
- categoria edge
- preferencia unica de fabricante si el contrato no la define
Si un campo requerido falta para el alcance activo, debe devolver needs_input y reportarlo claramente.
Flujo
- Extraer o validar entrada estructurada a partir del contrato compartido.
- Preservar las cantidades tecnicas provenientes del skill previo.
- Definir la carpeta de trabajo del caso. Por defecto debe ser
analysis_output/<site_name_slug>/. Usar esa misma carpeta para el Markdown, el JSON de salida y el PDF. - Ejecutar el motor para obtener la seleccion comercial deterministica:
python .codex/skills/cotizacion-redes-empresariales/src/quote_engine.py --input path/to/input.json --pretty
- Revisar la salida:
selected_products,related_items,discarded_products,applied_rules,warnings,constraints,missing_informationyestimated_total. - Leer solo los documentos de
knowledge/que correspondan. - Redactar la explicacion comercial final visible sin inventar SKUs, precios ni compatibilidades fuera del catalogo.
- Antes de ejecutar
export_quote_outputs.py, guardar esa explicacion final visible en:
analysis_output/<site_name_slug>/network_quote_explanation.md
- Exportar JSON y PDF. El exportador vuelve a ejecutar el motor, detecta
network_quote_explanation.mden la carpeta del caso y genera el PDF desde ese mismo texto:
python .codex/skills/cotizacion-redes-empresariales/src/export_quote_outputs.py --input path/to/input.json --output-dir analysis_output/<site_name_slug> --pretty
Si ya existe una explicacion final visible en Markdown y se quiere forzar una ruta concreta, el exportador tambien acepta:
python .codex/skills/cotizacion-redes-empresariales/src/export_quote_outputs.py --input path/to/input.json --output-dir analysis_output/<site_name_slug> --explanation-file path/to/network_quote_explanation.md --pretty
Comportamiento Del Exportador
Cuando se ejecuta export_quote_outputs.py, su comportamiento tecnico es este:
- Carga el input estructurado.
- Llama internamente a
quote_engine.py. - Construye el JSON final de salida desde el resultado comercial.
- Busca
network_quote_explanation.mden la carpeta del caso o usa el archivo indicado por--explanation-file. - Si encuentra Markdown, genera el PDF desde ese texto visible.
- Si no encuentra Markdown, genera un Markdown y un PDF usando la explicacion base del motor como fallback.
- Genera:
network_quote_output.jsonnetwork_quote_explanation.mdnetwork_quote_explanation.pdf
Importante:
quote_engine.pypor si solo sirve para revisar la seleccion comercial en consola.export_quote_outputs.pyes el script principal para producir archivos reales.- En el flujo de Codex, la explicacion final rica debe guardarse antes de ejecutar el exportador.
- Si se ejecuta el exportador sin Markdown previo, el PDF usara el fallback deterministico y no la explicacion inteligente de Codex.
Archivos De Salida
Por defecto, los artefactos se generan en analysis_output/<site_name>/.
Si se pasa --output-dir, se respeta esa ruta explicita.
Nombres estables y predecibles:
network_quote_output.jsonnetwork_quote_explanation.mdnetwork_quote_explanation.pdf
Si existe network_quote_explanation.md, el PDF debe generarse desde ese mismo texto visible.
Manejo De Ambiguedad
- Si falta una cantidad tecnica principal, devolver
needs_inputy listarmissing_information. - Si falta fabricante, cotizar vendor-neutral y declarar el supuesto.
- Si la preferencia de fabricante no tiene candidato valido, proponer alternativa activa y marcar advertencia.
- Si el presupuesto no alcanza, no reducir cantidades tecnicas; reportar conflicto y sugerir fases.
- Si un producto esta EOL/EOS, no cotizarlo como seleccionado; usar
replacement_skusi existe.
Recursos
src/quote_engine.py: motor deterministico de seleccion y costo.src/export_quote_outputs.py: exporta JSON y PDF.rules/quote_rules.json: reglas auditables de cotizacion.catalog/: catalogo JSON migrable a tablas.knowledge/: base documental para RAG.examples/: entradas y salidas de referencia.output/: artefactos generados por el skill.