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-0009: Permission bitmap layout
ADRs

ADR-0009: Permission bitmap layout

Architecture decision record 0009.

ADR-0009: Permission bitmap layout

  • Status: Accepted
  • Date: 2026-06-04
  • Authors: IBEX Harness team

Context

The 64-bit permission bitmap is stored on ibex_core.tokens.permissions and returned by ValidateToken. Multiple docs reference the layout, but no single Go package or ADR locked the bit assignments. Milestone 1.1.5 establishes the contract before token management (1.1.4) and proxy auth (1.2.1) enforce permission checks.

Decision

1) Canonical implementation

  • Package: packages/permissions (github.com/Rick1330/ibex-harness/packages/permissions)
  • Helpers: Has, HasAny, RequiresStepUp (canonical; RequiresMFA is an alias), UsesReservedHighBits
  • Predefined sets: AgentDefault, ProxyChatCompletion, ReadOnly, Admin

2) Bit layout (v1)

BitGroupPermission
0MemoryMemoryRead
1MemoryMemoryWrite
2MemoryMemoryDelete
3MemoryMemoryBulkExport
4-7MemoryReserved
8DirectiveDirectiveRead
9DirectiveDirectiveWrite
10DirectiveDirectivePromote (MFA)
11DirectiveDirectiveRevoke (MFA)
12-15DirectiveReserved
16SessionSessionCreate
17SessionSessionRead
18SessionSessionTerminate
19Session / OperatorOperatorMetadataRead (4.P.1)
20-23SessionReserved
24TraceTraceRead
25TraceTraceExport
26-31TraceReserved
32AdminUserManage
33AdminBillingRead
34AdminBillingManage
35AdminOrgSettingsWrite
36AdminTokenCreate
37AdminTokenRevoke
38Admin / OperatorOperatorRedactedRead (4.P.1)
39Admin / OperatorOperatorRawRead (step-up; 4.P.1)
40MarketplaceMarketplacePublish
41MarketplaceMarketplaceInstall
42OperatorOperatorExport (step-up; 4.P.1)
43OperatorOperatorDelete (step-up; 4.P.1)
44OperatorOperatorReplay (step-up; 4.P.1)
45OperatorSecretUse (step-up; proxy credential get; 4.P.1)
46OperatorPolicyChange (step-up; 4.P.1)
47OperatorBreakGlass (step-up; 4.P.1)
48FederationFederationShare
49Federation / GovernanceLegalHoldManage (step-up; 4.P.3)
50-55FederationReserved
56-63—Reserved (do not use in v1)

2b) 4.P.1 amendment

  • Helpers: RequiresStepUp (canonical); RequiresMFA remains an alias.
  • Role defaults: ViewerOperatorDefault / MemberOperatorDefault = metadata+redacted; AdminOperatorDefault adds export+policy-change without raw/secret-use/break-glass.
  • Admin management set still excludes operator raw/secret/break-glass.

2c) 4.P.3 amendment

  • LegalHoldManage (bit 49) requires step-up; included in AdminOperatorDefault so owner/admin role bitmaps can set/clear holds.

3) Phase 2 proxy minimum

For OpenAI-compatible chat completion through the proxy, a token must include:

MemoryRead | SessionCreate | SessionRead (permissions.ProxyChatCompletion).

4) Change policy

  • Bit positions are stable for ibex.auth.v1 and stored token rows.
  • New permissions consume reserved bits within a group or require ADR + migration if layout changes.
  • Bits 56-63 are reserved for future expansion.

Consequences

Positive

  • Single import path for all services checking permissions.
  • Tests verify non-overlap and subset relationships.

Negative

  • Renumbering bits requires data migration and a new ADR.

References

  • ARCHITECTURE.md — auth permission table
  • Milestone 1.1.5
  • ADR-0006 — ValidateTokenResponse.permissions

Was this page helpful?

Edit on GitHub

Last updated on

PreviousADR-0008: Security scanning and CI quality gatesNextADR-0010: Cryptography policy

On this page

  • Context
  • Decision
  • 1) Canonical implementation
  • 2) Bit layout (v1)
  • 2b) 4.P.1 amendment
  • 2c) 4.P.3 amendment
  • 3) Phase 2 proxy minimum
  • 4) Change policy
  • Consequences
  • Positive
  • Negative
  • References
0%