IBEX Harness
DocsBenchmarksBlogChangelogRoadmap
GitHub
IBEX Harness

Documentation

Architecture Decision RecordsADR-0002: Repository foundation bootstrapADR-0003: Branch protection and merge policyADR-0004: Protobuf and code generation policyADR-0005: Postgres migration strategyADR-0006: Auth protobuf contract (`ibex.auth.v1`)ADR-0007: Auth token validation implementationADR-0008: Security scanning and CI quality gatesADR-0009: Permission bitmap layoutADR-0010: Cryptography policyADR-0011: Proxy auth gRPC client and middlewareADR-0012: Proxy request normalization (OpenAI chat)ADR-0013: Proxy input validation and stable error envelopeADR-0014: Core domain migration sequencingADR-0015: Proxy rate limit skeleton (Phase 1)ADR-0016: Proxy agent identity verification (Phase 1)ADR-0017: Request ID and trace context strategy (Phase 1)ADR-0018: Graceful shutdown contract (Phase 1)ADR-0019: OpenTelemetry provider configuration (Phase 1)ADR-0020: Shared package boundaries — `packages/config` and `packages/apierror`ADR-0021: Prometheus Metric Catalog (Phase 1)ADR-0022: Health check contract (Phase 1)ADR-0023: Docs site architecture (Phase 1.5)ADR-0024: Benchmark data publishing modelADR-0025: LLM provider abstractionADR-0026: OpenAI client designADR-0027: Streaming dual-write strategyADR-0028: Auth cache designADR-0029: Token revocation propagation via Redis pub/subADR-0030: Directive versioning strategyADR-0031: System prompt injection strategyADR-0032: Session data model and retentionADR-0033: ClickHouse llm_traces schema and retentionADR-0034: Proxy overhead performance measurement methodologyADR-0035: Chat Idempotency-Key Redis dedupeADR-0038: Context assembly service design and gRPC contractADR-0039: Proxy Postgres ownership for session and directive storesADR-0040: Anthropic provider adapterADR-0041: Model capability registryADR-0042: Self-hosted OpenAI-compatible LLM adapterADR-0043: Tokenizer registry architectureADR-0044: Non-streaming response pipelineADR-0045: Streaming response transformationADR-0046: Embedder interface and profile registryADR-0047: Memory temporal validity foundationADR-0048: Memory multi-label categoriesADR-0049: Memory relationship graph readinessADR-0050: MCP server skeleton (transport, auth, audit)ADR-0051: Local LGTM observability stack (Phase 2.5 exit pull-forward)ADR-0052: Memory schema v2 expand (HNSW, quality columns)ADR-0053: Vector store abstraction and composite scoring v2ADR-0054: In-process Presidio PII detection in memoryADR-0055: Memory write-path exact and near-duplicate dedupADR-0056: Temporal-interval-aware conflict detectionADR-0057: Memory write-path persistence and orchestrationADR-0058: Semantic search FTS fallback triggerADR-0059: Hot cache read pathADR-0060: Memory service tenant isolation architectureADR-0061: Retrieval-quality benchmark methodologyADR-0062: Worker task observability and dead-letter handlingADR-0063: Extraction output schema v2ADR-0064: Extraction provider registry and batch executionADR-0065: Extraction batch idempotency and turn pointer orderingADR-0066: Extraction quality evaluation harnessADR-0067: Context capability catalog generate-and-diff for token budgetsADR-0068: Composite scoring-time relevance gateADR-0069: Context packer bounded DP knapsackADR-0070: Context formatting locked ordering and session nonceADR-0071: Context assembly gRPC degradation ladder and retrieval deadlineADR-0072: Extraction enqueue via worker HTTP (not Celery Redis wire format)ADR-0073: Organization Lifecycle and Cascading SuspensionADR-0074 Provider Credential StorageADR-0075 Per-Org Model Routing PolicyADR-0076: Circuit Breaker per ProviderADR-0077: Provider Fallback RoutingADR-0078: Operator runtime topology & environment contract (4.P.0)ADR-0079: Operator session RS256 dual-verify and TOTP step-upIBEX Console service rename and boundaryADR-0081: Fail-closed Proxy runtime controlsD2 metadata-only trace read contractD2 publication, identity, query, and lifecycle contract
ADRs›ADR-0071: Context assembly gRPC degradation ladder and retrieval deadline
ADRs

ADR-0071: Context assembly gRPC degradation ladder and retrieval deadline

Architecture decision record 0071 — AssembleContext orchestrator, L0–L2 degradation observability without proto field adds, IBEX_CONTEXT_DEADLINE_MS (40ms) retrieval wall, L3 proxy-owned, AssemblyMetrics field mapping.

ADR-0071: Context assembly gRPC degradation ladder and retrieval deadline

  • Status: Accepted
  • Date: 2026-09-06
  • Authors: IBEX Harness team
  • Milestone: 3.5.C.6 gRPC service + degradation contract
  • Depends on: ADR-0038 (gRPC contract), ADR-0069, ADR-0070

Context

Track C needed a single AssembleContext entrypoint that orchestrates retrieve → budget → score → pack → format, with an explicit degradation ladder. Planning sketches proposed new proto fields (fallback, was_truncated) and a separate RETRIEVAL_INTERNAL_DEADLINE_MS name. Discovery against main found:

  • context.proto already defines AssemblyMetrics with stage timings — no degradation enum.
  • IBEX_CONTEXT_DEADLINE_MS (default 40) is already documented in ENVIRONMENT_VARIABLES; proxy client timeout remains 45ms.
  • L3 (proxy fail-open / X-IBEX-Context-Fallback) belongs to 3.5.D.1, not the context service.
  • Repo k6 scripts are HTTP-only; gRPC load belongs in a Python harness.

Decision

1) No proto message changes

Do not add fallback / was_truncated (or similar) to AssembleContextResponse. Infer L0–L2 from response shape plus structured logs (degradation_level). Keep packages/proto/** unchanged for this milestone.

2) Degradation ladder (context service)

LevelTriggerBehavior
L0Hot and cold both usable (success, not skipped)Full pack/format path
L1Exactly one memory source usablePack the usable side; INFO log with ids only
L2No memory source usable (failures and/or skips)Format directive (+ history) only; empty packed memories
L3Caller cancel / gRPC deadlineServer returns DEADLINE_EXCEEDED without inventing partial context — proxy fail-open (3.5.D.1)

3) Retrieval wall: IBEX_CONTEXT_DEADLINE_MS

Wire documented IBEX_CONTEXT_DEADLINE_MS (default 40) into ContextSettings.deadline_ms. Effective outer parallel-retrieval wait is min(timeout_ms, deadline_ms). Pack + format run in remaining headroom under the proxy’s ~45ms client timeout.

4) Metrics mapping

Populate existing AssemblyMetrics fields:

StageProto field
Budgetbudget_calculation_ms
Directive branchdirective_load_ms
Hot / coldhot_memory_retrieval_ms / cold_memory_retrieval_ms
Scoreranking_ms
Packpacking_ms
Formatformatting_ms
End-to-endtotal_ms
Pack input sizecandidates_evaluated

5) Interim MemoryUsed scores

Until scoring exposes per-component weights on the wire, set relevance / recency / usefulness to 0.0 and put the interim packer score in composite_score (same interim rule as ADR-0069).

6) Server registration

grpc.aio generic handlers + generated context_pb2 (local buf generate; gitignored gen/). SearchMemories / RecordMemoryFeedback return UNIMPLEMENTED per ADR-0038.

7) Load harness

benchmarks/context/assemble_load.py — async gRPC client; stub profile gates p99 < 50ms; live 100K corpus documented separately (do not fake success).

Consequences

  • Context service is runnable via python -m app (IBEX_CONTEXT_GRPC_ADDR).
  • Proxy wiring and X-IBEX-Context-Fallback remain 3.5.D.1.
  • Operators observe L1/L2 via logs + empty/hot-only memories, not new response flags.

Alternatives considered

  1. Add proto degradation fields — rejected: expands contract surface for observability already available via metrics + logs; defers unnecessary buf churn.
  2. Implement L3 inside context as directive-only invent — rejected: milestone table and ADR-0038 treat full timeout as proxy fail-open.
  3. New env name RETRIEVAL_INTERNAL_DEADLINE_MS — rejected: docs already specify IBEX_CONTEXT_DEADLINE_MS.
  4. k6 gRPC script — rejected: repo k6 is HTTP-only; Python async client matches ADR-0034-style percentile reporting.

Was this page helpful?

Edit on GitHub

Last updated on

PreviousADR-0070: Context formatting locked ordering and session nonceNextADR-0072: Extraction enqueue via worker HTTP (not Celery Redis wire format)

On this page

  • Context
  • Decision
  • 1) No proto message changes
  • 2) Degradation ladder (context service)
  • 3) Retrieval wall: IBEX_CONTEXT_DEADLINE_MS
  • 4) Metrics mapping
  • 5) Interim MemoryUsed scores
  • 6) Server registration
  • 7) Load harness
  • Consequences
  • Alternatives considered
0%