Degradation Warnings¶
G6 is designed to run in constrained environments. When a component, backend, or external dependency is unavailable, the system operates in degraded mode rather than failing silently.
What triggers degradation¶
| Trigger | Effect | User impact |
|---|---|---|
| No LLM backend configured | Keyword/rule-based classification only | Lower accuracy, $0 cost |
| LLM backend timeout | Retry then fallback to cached artifacts | Slightly lower quality |
| External service unavailable (Elasticsearch, Redis) | Component-specific fallback or explicit failure | Reduced search/caching; ctx_elastic has no local fallback |
| Formal verification backend missing (Z3, NuSMV, Lean, Prolog) | Backend-specific result marked unavailable, pure-Python checks may still run | Fewer verification capabilities; no proof from that backend |
CSF Cognitive safeguard model unavailable (gpt-oss-safeguard) | Scenario analysis falls back to the local classifier and keyword/rule checks | Useful for triage and pilot safety review, but not compliance-grade assurance |
| Paid API not configured (Brave, Google Maps) | Mock/stub results | Clearly marked as unavailable |
G6_JOB_LIVE_SEARCH unset | Job-agent live web search paths are skipped | Deterministic local behavior; no live citations or current-market/regulatory lookup |
G6_JOB_LIVE_LLM unset | Job-agent debate/enrichment paths use deterministic or mock behavior | Faster and cheaper, but less deliberative than live LLM review |
G6_JOB_ENABLE_GROUNDING unset | Optional job-agent grounding/context enrichment is skipped | Faster first-run behavior; fewer retrieved domain facts |
G6_JOB_ENABLE_EXPERTA unset | Optional job-agent Experta enrichment is skipped | Core local rules still run; fewer external rule-engine details |
G6_JOB_ENABLE_BAYESIAN unset | Optional job-agent Bayesian enrichment is skipped | Deterministic polling/sentiment calculations still run; no Bayesian posterior enrichment |
How to detect degraded mode¶
In workflow reports¶
The report's Safety Status section includes:
## Safety Status
| Check | Status |
|-------|--------|
| LLM backend active | DEGRADED (no backend configured) |
| Resource bounds respected | PASS |
In API responses¶
The EvalOutput model includes degradation fields:
{
"scores": {"accuracy": 0.65},
"passed": false,
"degraded": true,
"degradation_reason": "Running in keyword-only mode (no LLM backend)"
}
Via health endpoint¶
Response includes service status:
{
"status": "degraded",
"services": {
"llm_backend": "unavailable",
"redis": "connected",
"database": "connected"
}
}
Via MCP¶
Returns component-level health including degradation signals.
For CSF formal bridge tools, unavailable solver backends are reported in the tool result itself:
verified: null means "no proof was produced by this backend." It is not equivalent to verified: true.
For csf_cognitive, a degraded scenario analysis warning such as [DEGRADED:local_classifier] means the configured safeguard model was unavailable and the tool used local classifier/rule fallbacks. Use that output as a pre-action triage signal. Do not rely on it as a standalone safety approval for regulated, high-stakes, or unattended production workflows.
For job agents, live external integrations are disabled by default. If a workflow depends on current web evidence or LLM-backed debate, check whether G6_JOB_LIVE_SEARCH=1 and G6_JOB_LIVE_LLM=1 are set in the runtime environment. The default is intentional for first-run MCP installs, CI, and demos: no surprise network calls, no surprise paid model usage, and predictable latency.
For job_political, also check whether optional enrichment flags are enabled when richer context is expected: G6_JOB_ENABLE_GROUNDING=1, G6_JOB_ENABLE_EXPERTA=1, and G6_JOB_ENABLE_BAYESIAN=1. With those flags off, political workflows still run their core deterministic policy, legislation, polling, communications, stakeholder, governance, and compliance calculations, but outputs are not current-source-backed or Bayesian-enriched.
Political outputs are decision support only. Do not treat them as legal, electoral, campaign-finance, compliance, lobbying, publication, spending, or targeting approval. Built-in defaults are illustrative; provide real poll data, stakeholder lists, budgets, campaign details, jurisdictions, and source material before using outputs for real-world review. Jurisdiction matters, and constituent/campaign workflows may involve sensitive personal or political data.
For job_scientist, literature review live retrieval is explicitly degraded when Semantic Scholar is unavailable, rate-limited, returns no results, or the runtime is offline. Fallback papers are labelled with connector_status: "fallback" and the response metadata includes connector_status plus synthesis_details.evidence_profile.source_mode. Set G6_SCIENTIST_STRICT_SEMANTIC_SCHOLAR=true when fallback papers should be treated as an error instead of degraded output. The built-in literature synthesis is metadata-level only; use it for triage and planning, not scientific, clinical, regulatory, or publication sign-off without human review.
job_scientist optional enrichment integrations are opt-in and time-bounded. Use G6_SCIENTIST_ENABLE_GROUNDING, G6_SCIENTIST_ENABLE_WEB_SEARCH, G6_SCIENTIST_ENABLE_DEBATE, or G6_SCIENTIST_ENABLE_DEEP_INTEGRATIONS to enable them. Tune budgets with G6_SCIENTIST_<NAME>_TIMEOUT_SEC or G6_SCIENTIST_INTEGRATION_TIMEOUT_SEC; timeout markers are surfaced in integration metadata rather than blocking the core scientific rule path indefinitely.
For job_framework production hardening, distinguish runtime health failures from verification warnings. validate_production_readiness() should block production when no LLM backend is available, and health_check() should report unhealthy if connection-pool or LLM-cache probes fail. The current non-blocking warning cleanup is limited to test/dependency noise: pytest-asyncio loop-scope deprecation, a Pydantic adapt_pandas.DataInput.schema warning, httpx raw-content upload deprecation in tests, and Pydantic serializer warnings from mocked or LLM-like message objects.
What G6 never does silently¶
- Never presents mock data as real results — mock/stub outputs are always labeled
- Never hides missing backends — the health endpoint and reports always show service status
- Never charges for degraded runs — if the LLM wasn't called, you aren't billed
- Never claims accuracy it didn't measure — degraded metrics are flagged
Degradation hierarchy¶
G6 follows a graceful degradation chain:
Full capability (all backends available)
↓ LLM unavailable
Cached artifacts (replay distilled results)
↓ No cache entries
Rule-based fallback (keyword/pattern matching)
↓ Rules insufficient
Explicit failure with diagnostic message
Each level is clearly communicated. The system never pretends a lower capability level is the full system.
Common scenarios¶
"I ran the workflow but accuracy seems low"¶
Check the report's Safety Status section. If degraded: true, the system used fallback mode. Configure an LLM backend (Ollama for local, OpenRouter for cloud) for production-quality results.
"The health endpoint shows services as unavailable"¶
This is informational, not an error. G6 runs without Redis, Elasticsearch, or cloud backends — it just runs with reduced capability. Only configure what you need.
For Elasticsearch specifically, ctx_elastic fails quickly with a diagnostic message when the cluster is unavailable. It does not fall back to local search because index mappings and query semantics are deployment-specific. Use ctx_rag when you need retrieval that works without Elasticsearch.
"I expected ColBERT, but ctx_colbert says degraded"¶
This is expected unless the full retrieval backend is installed in that environment. ctx_colbert only uses real ColBERT when ragatouille==0.0.9.post2 is available and the model/index path succeeds. Otherwise it reports degraded=True and uses embedding cosine retrieval if EMBEDDING_MODEL is configured, or local TF-IDF as the final fallback.
Install the context extension package (which includes the ctx_colbert retrieval component) for your tier, from the setup page:
Real ColBERT additionally needs the ragatouille model backend available in that environment; otherwise ctx_colbert falls back to embedding cosine or TF-IDF retrieval.
Then verify the real backend in the target environment:
G6_RUN_RAGATOUILLE_SMOKE=1 python -m pytest tests/mvp/ctx_colbert/test_ragatouille_real_smoke.py -m heavy -q
"My evaluation says 'degraded' but the numbers look fine"¶
The degradation flag means the system COULD do better with full backends. If your target is met in degraded mode, that's a positive signal — full mode will likely perform even better.
Configuring backends¶
| Backend | Env var | Purpose |
|---|---|---|
| Ollama | OLLAMA_BASE_URL | Local LLM inference |
| OpenRouter | OPENROUTER_API_KEY | Cloud LLM routing |
| Redis | SECURITY_REDIS_URL | Caching, rate limiting |
| Elasticsearch | ELASTIC_HOST, ELASTIC_PORT, ELASTIC_SCHEME | Full-text search |
| Elasticsearch auth | ELASTIC_API_KEY or ELASTIC_USERNAME/ELASTIC_PASSWORD | Secured Elasticsearch clusters |
| Job-agent live search | G6_JOB_LIVE_SEARCH=1 | Permit job agents to call live web search |
| Job-agent live LLM | G6_JOB_LIVE_LLM=1 | Permit job agents to use live LLM-backed debate/enrichment |
| Job-agent grounding enrichment | G6_JOB_ENABLE_GROUNDING=1 | Permit selected job agents to load optional grounding/context enrichment |
| Job-agent Experta enrichment | G6_JOB_ENABLE_EXPERTA=1 | Permit selected job agents to load optional Experta rule-engine enrichment |
| Job-agent Bayesian enrichment | G6_JOB_ENABLE_BAYESIAN=1 | Permit selected job agents to load optional Bayesian enrichment |
| Scientist strict live literature | G6_SCIENTIST_STRICT_SEMANTIC_SCHOLAR=true | Fail literature review when Semantic Scholar is unavailable instead of using labelled fallback papers |
| Scientist enrichment integrations | G6_SCIENTIST_ENABLE_DEEP_INTEGRATIONS=1 | Permit optional grounding, live search, and debate enrichment for job_scientist |
| Scientist integration timeout | G6_SCIENTIST_INTEGRATION_TIMEOUT_SEC=2 | Bound optional job_scientist enrichment latency |
See Configuration for full environment variable reference.