HARD FACTS inyecta datos reales del runtime AI-LAB en el system prompt para reasoning/analysis. Las rutas ligeras (minimal, casual, greeting, observe, fast, general, coding) NO reciben HARD FACTS.

route → manifest_profiles.json → profile → manifest_memory.json → memory policy
  • minimal/casual/greeting/observeobserve_profile.jsonminimal_policy.json (sin memory, sin HARD_FACTS)
  • fast/general/chatchat_profile.jsonlight_policy.json (memory ligera, sin HARD_FACTS)
  • codingcoding_profile.jsonlight_policy.json (memory ligera, sin HARD_FACTS)
  • reasoninganalysis_profile.jsonfull_policy.json (memory completa + HARD_FACTS)
  • tool_use/tool_fastpathagent_profile.jsonfull_policy.json (memory completa + HARD_FACTS)

HARD_FACTS solo se activa cuando full_policy.json de memoria esta activa y tiene inject_runtime_state: true. Esto ocurre para analysis y agent profiles.

El formato se construye en context_shaper.py via _build_hard_facts() y se inyecta en el system prompt del router. Las rutas ligeras usan prompts declarativos de runtime/prompts/*.md con forbidden_markers que prohiben HARD_FACTS.

Los prompts estan en runtime/prompts/:

runtime/prompts/
├── manifest.json # Mapeo route → prompt + forbidden markers
├── chat_prompt.md
├── coding_prompt.md
├── reasoning_prompt.md
├── observe_prompt.md
├── minimal_prompt.md
└── tool_use_prompt.md

El manifest.json define forbidden_markers que rechazan prompts con HARD_FACTS en rutas ligeras:

{
"forbidden_markers": {
"minimal": ["HARD_FACTS", "Plan Mode", "FORMATO OBLIGATORIO"],
"chat": ["HARD_FACTS", "Plan Mode", "FORMATO OBLIGATORIO"],
"coding": ["HARD_FACTS", "Plan Mode"],
"observe": ["HARD_FACTS", "Plan Mode", "FORMATO OBLIGATORIO"]
}
}
  • HARD_FACTS_HITS: contador Prometheus de cuantas veces se construyo contexto HARD_FACTS
  • Profile metrics: ailab_profile_total{profile, route_family, model}
  • Memory metrics: ailab_memory_recall_total{policy, hit}