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-0067: Context capability catalog generate-and-diff for token budgets
ADRs

ADR-0067: Context capability catalog generate-and-diff for token budgets

Architecture decision record 0067 — export Go ModelCapability catalog to committed JSON for Python BudgetCalculator; labeled char/rune estimates until exact HF tokenization lands.

ADR-0067: Context capability catalog generate-and-diff for token budgets

  • Status: Accepted
  • Date: 2026-09-04
  • Authors: IBEX Harness team
  • Milestone: 3.5.C.1 Token budget calculator
  • Depends on: ADR-0041, ADR-0043
  • Follow-up: #690 Exact HF/Qwen tokenizer-family counting

Context

Milestone 3.5.C.1 needs model-aware token budgets inside the future Python context-assembly package. Discovery confirmed:

  • services/context/ did not exist yet; Track C defers the gRPC wrapper to 3.5.C.6.
  • Go packages/provider / packages/tokenizer are proxy-in-process only — no RPC/HTTP surface for capability lookup or counting (ADR-0041, ADR-0043).
  • Python services have no tiktoken / HF tokenizers dependencies today.
  • The only Go→Python network precedent is Auth gRPC via packages/authclient — not applicable until a tokenizer/capability service exists.

A live TokenizerClient / CapabilityRegistry in the C.1 sketch would invent a network boundary that 3.5.C.6 must own.

Decision

1) Generate-and-diff JSON export (not a network call)

  • Maintainer tool: go run ./packages/provider/scripts/export_capabilities
  • Committed artifact: services/context/app/data/model_capabilities.v1.json (package data for installed wheels)
  • Contents: sorted BuiltInCapabilityCatalog rows + tokenizer_families estimate policy (estimate_kind, safety_buffer_fraction)
  • CI job capability-catalog-freshness runs -check and fails when the committed JSON drifts from the Go catalog

2) Python BudgetCalculator loads the artifact locally

  • Package layout under services/context/app/ (library only — no gRPC server in C.1)
  • Constructor takes an optional in-memory catalog; default loads the committed JSON
  • Unknown model IDs raise explicitly (no silent fallback model)

3) Labeled character/rune estimates (not exact tokenization)

estimate_kindFormulaFamilies
chars_div_4ceil(len(text) / 4)o200k_base, cl100k_base, unknown
runes_div_3_5ADR-0043 Claude estimate (runes*2+6)//7claude

TokenBudget.estimate_kind always records which formula ran. Exact OpenAI/HF counting is out of scope — tracked in #690.

4) Explicit non-goals for C.1

  • No tokenizer/capability gRPC or HTTP service
  • No packages/contextclient / ContextAssemblyService implementation (3.5.C.6)
  • No hand-maintained duplicate of the Go catalog in Python source

Consequences

Positive:

  • Python budgets stay aligned with the Go catalog via CI fail-closed drift detection
  • C.1 stays within Track C sequencing (assembly math before the gRPC façade)
  • Estimate error is visible (estimate_kind + family safety buffers)

Negative / follow-ups:

  • Estimates are approximate; do not treat them as tiktoken-ground-truth
  • Operator IBEX_MODEL_CAPABILITY_OVERLAYS on the proxy are not mirrored into the JSON export (built-in catalog only) until a later milestone extends the export
  • #690 for exact HF/Qwen (and tighter OpenAI) counting

Was this page helpful?

Edit on GitHub

Last updated on

PreviousADR-0066: Extraction quality evaluation harnessNextADR-0068: Composite scoring-time relevance gate

On this page

  • Context
  • Decision
  • 1) Generate-and-diff JSON export (not a network call)
  • 2) Python BudgetCalculator loads the artifact locally
  • 3) Labeled character/rune estimates (not exact tokenization)
  • 4) Explicit non-goals for C.1
  • Consequences
0%