Skip to content

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

GET /api/v1/health

Response includes service status:

{
  "status": "degraded",
  "services": {
    "llm_backend": "unavailable",
    "redis": "connected",
    "database": "connected"
  }
}

Via MCP

nav_health()

Returns component-level health including degradation signals.

For CSF formal bridge tools, unavailable solver backends are reported in the tool result itself:

{
  "backend": "z3",
  "verified": null,
  "error": "Formal backend unavailable: Z3 is not installed."
}

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:

pip install g6-context --index-url https://packages.g6solver.com/simple/

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.