[{"data":1,"prerenderedAt":1064},["ShallowReactive",2],{"navigation_docs":3,"-docs-getting-started-local-development":356,"-docs-getting-started-local-development-surround":1059},[4,8,34,64,90,139,157,171,193,227,241,266,312,334],{"title":5,"path":6,"stem":7},"Documentation","\u002Fdocs","docs\u002Findex",{"title":9,"path":10,"stem":11,"children":12},"Getting started","\u002Fdocs\u002Fgetting-started","docs\u002F01.getting-started\u002Findex",[13,14,18,22,26,30],{"title":9,"path":10,"stem":11},{"title":15,"path":16,"stem":17},"Introduction","\u002Fdocs\u002Fgetting-started\u002Fintroduction","docs\u002F01.getting-started\u002F01.introduction",{"title":19,"path":20,"stem":21},"Concepts","\u002Fdocs\u002Fgetting-started\u002Fconcepts","docs\u002F01.getting-started\u002F02.concepts",{"title":23,"path":24,"stem":25},"Quickstart (5 minutes)","\u002Fdocs\u002Fgetting-started\u002Fquickstart","docs\u002F01.getting-started\u002F03.quickstart",{"title":27,"path":28,"stem":29},"Local development","\u002Fdocs\u002Fgetting-started\u002Flocal-development","docs\u002F01.getting-started\u002F04.local-development",{"title":31,"path":32,"stem":33},"FAQ","\u002Fdocs\u002Fgetting-started\u002Ffaq","docs\u002F01.getting-started\u002F05.faq",{"title":35,"path":36,"stem":37,"children":38},"Architecture","\u002Fdocs\u002Farchitecture","docs\u002F02.architecture\u002Findex",[39,40,44,48,52,56,60],{"title":35,"path":36,"stem":37},{"title":41,"path":42,"stem":43},"Architecture overview","\u002Fdocs\u002Farchitecture\u002Foverview","docs\u002F02.architecture\u002F01.overview",{"title":45,"path":46,"stem":47},"Services","\u002Fdocs\u002Farchitecture\u002Fservices","docs\u002F02.architecture\u002F02.services",{"title":49,"path":50,"stem":51},"Request lifecycle","\u002Fdocs\u002Farchitecture\u002Frequest-lifecycle","docs\u002F02.architecture\u002F03.request-lifecycle",{"title":53,"path":54,"stem":55},"Data model","\u002Fdocs\u002Farchitecture\u002Fdata-model","docs\u002F02.architecture\u002F04.data-model",{"title":57,"path":58,"stem":59},"Status and evidence","\u002Fdocs\u002Farchitecture\u002Fstatus-and-evidence","docs\u002F02.architecture\u002F05.status-and-evidence",{"title":61,"path":62,"stem":63},"Target architecture and authority","\u002Fdocs\u002Farchitecture\u002Ftarget-architecture","docs\u002F02.architecture\u002F06.target-architecture",{"title":65,"path":66,"stem":67,"children":68},"Auth","\u002Fdocs\u002Fauth","docs\u002F03.auth\u002Findex",[69,70,74,78,82,86],{"title":65,"path":66,"stem":67},{"title":71,"path":72,"stem":73},"Overview","\u002Fdocs\u002Fauth\u002Foverview","docs\u002F03.auth\u002F01.overview",{"title":75,"path":76,"stem":77},"Organization and agent model","\u002Fdocs\u002Fauth\u002Forg-project-model","docs\u002F03.auth\u002F02.org-project-model",{"title":79,"path":80,"stem":81},"Issuing API keys","\u002Fdocs\u002Fauth\u002Fissuing-api-keys","docs\u002F03.auth\u002F03.issuing-api-keys",{"title":83,"path":84,"stem":85},"Multi-tenant RLS","\u002Fdocs\u002Fauth\u002Fmulti-tenant-rls","docs\u002F03.auth\u002F04.multi-tenant-rls",{"title":87,"path":88,"stem":89},"Operator sessions and step-up","\u002Fdocs\u002Fauth\u002Foperator-sessions","docs\u002F03.auth\u002F05.operator-sessions",{"title":91,"path":92,"stem":93,"children":94},"Proxy","\u002Fdocs\u002Fproxy","docs\u002F04.proxy\u002Findex",[95,96,99,103,107,111,115,119,123,127,131,135],{"title":91,"path":92,"stem":93},{"title":71,"path":97,"stem":98},"\u002Fdocs\u002Fproxy\u002Foverview","docs\u002F04.proxy\u002F01.overview",{"title":100,"path":101,"stem":102},"Authentication","\u002Fdocs\u002Fproxy\u002Fauthentication","docs\u002F04.proxy\u002F02.authentication",{"title":104,"path":105,"stem":106},"Request routing","\u002Fdocs\u002Fproxy\u002Frequest-routing","docs\u002F04.proxy\u002F03.request-routing",{"title":108,"path":109,"stem":110},"Sessions","\u002Fdocs\u002Fproxy\u002Fsessions","docs\u002F04.proxy\u002F04.sessions",{"title":112,"path":113,"stem":114},"Directives","\u002Fdocs\u002Fproxy\u002Fdirectives","docs\u002F04.proxy\u002F05.directives",{"title":116,"path":117,"stem":118},"Idempotency and budgets","\u002Fdocs\u002Fproxy\u002Fidempotency-and-budgets","docs\u002F04.proxy\u002F06.idempotency-and-budgets",{"title":120,"path":121,"stem":122},"Rate limiting","\u002Fdocs\u002Fproxy\u002Frate-limiting","docs\u002F04.proxy\u002F07.rate-limiting",{"title":124,"path":125,"stem":126},"Provider adapters","\u002Fdocs\u002Fproxy\u002Fprovider-adapters","docs\u002F04.proxy\u002F08.provider-adapters",{"title":128,"path":129,"stem":130},"Auth caching","\u002Fdocs\u002Fproxy\u002Fauth-caching","docs\u002F04.proxy\u002F09.auth-caching",{"title":132,"path":133,"stem":134},"Configuration","\u002Fdocs\u002Fproxy\u002Fconfiguration","docs\u002F04.proxy\u002F10.configuration",{"title":136,"path":137,"stem":138},"Provider routing and resilience","\u002Fdocs\u002Fproxy\u002Fprovider-routing-and-resilience","docs\u002F04.proxy\u002F11.provider-routing-and-resilience",{"title":140,"path":141,"stem":142,"children":143},"Memory","\u002Fdocs\u002Fmemory","docs\u002F05.memory\u002Findex",[144,145,149,153],{"title":140,"path":141,"stem":142},{"title":146,"path":147,"stem":148},"Memory overview","\u002Fdocs\u002Fmemory\u002Foverview","docs\u002F05.memory\u002F01.overview",{"title":150,"path":151,"stem":152},"Write path","\u002Fdocs\u002Fmemory\u002Fwrite-path","docs\u002F05.memory\u002F02.write-path",{"title":154,"path":155,"stem":156},"Search and lifecycle","\u002Fdocs\u002Fmemory\u002Fsearch-and-lifecycle","docs\u002F05.memory\u002F03.search-and-lifecycle",{"title":158,"path":159,"stem":160,"children":161},"Context","\u002Fdocs\u002Fcontext","docs\u002F06.context\u002Findex",[162,163,167],{"title":158,"path":159,"stem":160},{"title":164,"path":165,"stem":166},"Assembly pipeline","\u002Fdocs\u002Fcontext\u002Foverview","docs\u002F06.context\u002F01.overview",{"title":168,"path":169,"stem":170},"Ranking and packing","\u002Fdocs\u002Fcontext\u002Franking-and-packing","docs\u002F06.context\u002F02.ranking-and-packing",{"title":172,"path":173,"stem":174,"children":175},"Intelligence","\u002Fdocs\u002Fintelligence","docs\u002F07.intelligence\u002Findex",[176,177,181,185,189],{"title":172,"path":173,"stem":174},{"title":178,"path":179,"stem":180},"Workers","\u002Fdocs\u002Fintelligence\u002Fworkers","docs\u002F07.intelligence\u002F01.workers",{"title":182,"path":183,"stem":184},"Extraction","\u002Fdocs\u002Fintelligence\u002Fextraction","docs\u002F07.intelligence\u002F02.extraction",{"title":186,"path":187,"stem":188},"Embedder","\u002Fdocs\u002Fintelligence\u002Fembedder","docs\u002F07.intelligence\u002F03.embedder",{"title":190,"path":191,"stem":192},"Extraction evaluation","\u002Fdocs\u002Fintelligence\u002Fevaluation","docs\u002F07.intelligence\u002F04.evaluation",{"title":194,"path":195,"stem":196,"children":197},"API reference","\u002Fdocs\u002Fapi-reference","docs\u002F08.api-reference\u002Findex",[198,199,203,207,211,215,219,223],{"title":194,"path":195,"stem":196},{"title":200,"path":201,"stem":202},"Chat completions","\u002Fdocs\u002Fapi-reference\u002Fchat-completions","docs\u002F08.api-reference\u002F01.chat-completions",{"title":204,"path":205,"stem":206},"Responses","\u002Fdocs\u002Fapi-reference\u002Fresponses","docs\u002F08.api-reference\u002F02.responses",{"title":208,"path":209,"stem":210},"Errors","\u002Fdocs\u002Fapi-reference\u002Ferrors","docs\u002F08.api-reference\u002F03.errors",{"title":212,"path":213,"stem":214},"Health and metrics","\u002Fdocs\u002Fapi-reference\u002Fproxy-health","docs\u002F08.api-reference\u002F04.proxy-health",{"title":216,"path":217,"stem":218},"HTTP route inventory","\u002Fdocs\u002Fapi-reference\u002Fhttp-routes","docs\u002F08.api-reference\u002F05.http-routes",{"title":220,"path":221,"stem":222},"Management API","\u002Fdocs\u002Fapi-reference\u002Fmanagement-api","docs\u002F08.api-reference\u002F06.management-api",{"title":224,"path":225,"stem":226},"Auth gRPC (ValidateToken, ValidateAgent)","\u002Fdocs\u002Fapi-reference\u002Fauth-grpc","docs\u002F08.api-reference\u002F07.auth-grpc",{"title":228,"path":229,"stem":230,"children":231},"MCP","\u002Fdocs\u002Fmcp","docs\u002F09.mcp\u002Findex",[232,233,237],{"title":228,"path":229,"stem":230},{"title":234,"path":235,"stem":236},"Memory server","\u002Fdocs\u002Fmcp\u002Fmemory-server","docs\u002F09.mcp\u002F01.memory-server",{"title":238,"path":239,"stem":240},"Operator gateway","\u002Fdocs\u002Fmcp\u002Foperator-gateway","docs\u002F09.mcp\u002F02.operator-gateway",{"title":242,"path":243,"stem":244,"children":245},"Security","\u002Fdocs\u002Fsecurity","docs\u002F10.security\u002Findex",[246,247,251,254,258,262],{"title":242,"path":243,"stem":244},{"title":248,"path":249,"stem":250},"Security overview","\u002Fdocs\u002Fsecurity\u002Foverview","docs\u002F10.security\u002F01.overview",{"title":100,"path":252,"stem":253},"\u002Fdocs\u002Fsecurity\u002Fauthentication","docs\u002F10.security\u002F02.authentication",{"title":255,"path":256,"stem":257},"Tenant isolation","\u002Fdocs\u002Fsecurity\u002Ftenant-isolation","docs\u002F10.security\u002F03.tenant-isolation",{"title":259,"path":260,"stem":261},"Secrets and keys","\u002Fdocs\u002Fsecurity\u002Fsecrets-and-keys","docs\u002F10.security\u002F04.secrets-and-keys",{"title":263,"path":264,"stem":265},"Prompt injection","\u002Fdocs\u002Fsecurity\u002Fprompt-injection","docs\u002F10.security\u002F05.prompt-injection",{"title":267,"path":268,"stem":269,"children":270},"Operations","\u002Fdocs\u002Foperations","docs\u002F11.operations\u002Findex",[271,272,276,280,284,288,292,296,300,304,308],{"title":267,"path":268,"stem":269},{"title":273,"path":274,"stem":275},"Observability","\u002Fdocs\u002Foperations\u002Fobservability","docs\u002F11.operations\u002F01.observability",{"title":277,"path":278,"stem":279},"Traces and ClickHouse","\u002Fdocs\u002Foperations\u002Ftraces-and-clickhouse","docs\u002F11.operations\u002F02.traces-and-clickhouse",{"title":281,"path":282,"stem":283},"Health checks","\u002Fdocs\u002Foperations\u002Fhealth-checks","docs\u002F11.operations\u002F03.health-checks",{"title":285,"path":286,"stem":287},"Incident response","\u002Fdocs\u002Foperations\u002Fincident-response","docs\u002F11.operations\u002F04.incident-response",{"title":289,"path":290,"stem":291},"Troubleshooting","\u002Fdocs\u002Foperations\u002Ftroubleshooting","docs\u002F11.operations\u002F05.troubleshooting",{"title":293,"path":294,"stem":295},"Billing and budgets","\u002Fdocs\u002Foperations\u002Fbilling-and-budgets","docs\u002F11.operations\u002F06.billing-and-budgets",{"title":297,"path":298,"stem":299},"Evidence and relay","\u002Fdocs\u002Foperations\u002Fevidence-and-relay","docs\u002F11.operations\u002F07.evidence-and-relay",{"title":301,"path":302,"stem":303},"Console","\u002Fdocs\u002Foperations\u002Fconsole","docs\u002F11.operations\u002F08.console",{"title":305,"path":306,"stem":307},"Failure modes and recovery","\u002Fdocs\u002Foperations\u002Ffailure-and-recovery","docs\u002F11.operations\u002F09.failure-and-recovery",{"title":309,"path":310,"stem":311},"Data lifecycle and deletion","\u002Fdocs\u002Foperations\u002Fdata-lifecycle-and-deletion","docs\u002F11.operations\u002F10.data-lifecycle-and-deletion",{"title":313,"path":314,"stem":315,"children":316},"Deployment","\u002Fdocs\u002Fdeployment","docs\u002F12.deployment\u002Findex",[317,318,322,326,330],{"title":313,"path":314,"stem":315},{"title":319,"path":320,"stem":321},"Docker Compose (dev)","\u002Fdocs\u002Fdeployment\u002Fdocker-compose","docs\u002F12.deployment\u002F01.docker-compose",{"title":323,"path":324,"stem":325},"Environment variables","\u002Fdocs\u002Fdeployment\u002Fenvironment-variables","docs\u002F12.deployment\u002F02.environment-variables",{"title":327,"path":328,"stem":329},"Kubernetes","\u002Fdocs\u002Fdeployment\u002Fkubernetes","docs\u002F12.deployment\u002F03.kubernetes",{"title":331,"path":332,"stem":333},"Production readiness","\u002Fdocs\u002Fdeployment\u002Fproduction-readiness","docs\u002F12.deployment\u002F04.production-readiness",{"title":335,"path":336,"stem":337,"children":338},"Reference","\u002Fdocs\u002Freference","docs\u002F13.reference\u002Findex",[339,340,344,348,352],{"title":335,"path":336,"stem":337},{"title":341,"path":342,"stem":343},"Glossary","\u002Fdocs\u002Freference\u002Fglossary","docs\u002F13.reference\u002F01.glossary",{"title":345,"path":346,"stem":347},"Roadmap and gates","\u002Fdocs\u002Freference\u002Froadmap","docs\u002F13.reference\u002F02.roadmap",{"title":349,"path":350,"stem":351},"Architecture decisions","\u002Fdocs\u002Freference\u002Fadr","docs\u002F13.reference\u002F03.adr",{"title":353,"path":354,"stem":355},"Compatibility and versioning","\u002Fdocs\u002Freference\u002Fcompatibility","docs\u002F13.reference\u002F04.compatibility",{"id":357,"title":27,"audience":358,"author":359,"authorUrl":359,"body":360,"coverIndex":359,"coverLabel":359,"coverTone":359,"date":359,"decisionStatus":359,"description":1051,"excerpt":359,"extension":1052,"featured":1053,"historical":1053,"meta":1054,"navigation":515,"path":28,"readingTime":359,"scope":1055,"seo":1056,"sourceOfTruth":1057,"status":370,"stem":29,"tags":359,"verifiedDate":371,"__hash__":1058},"docs\u002Fdocs\u002F01.getting-started\u002F04.local-development.md","contributor",null,{"type":361,"value":362,"toc":1041},"minimark",[363,367,372,377,416,419,423,442,449,453,578,589,593,708,723,726,762,766,807,811,935,939,1010,1014,1037],[364,365,366],"p",{},"This page is for working on IBEX itself. It assumes Docker Compose is running and migrations have been applied.",[368,369],"page-status",{"status":370,"verified":371},"IMPLEMENTED","2026-10-21",[373,374,376],"h2",{"id":375},"_1-start-dependencies","1. Start dependencies",[378,379,384],"pre",{"className":380,"code":381,"language":382,"meta":383,"style":383},"language-bash shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","make compose-dev-up\nmake db-migrate\nmake db-seed\n","bash","",[385,386,387,400,408],"code",{"__ignoreMap":383},[388,389,392,396],"span",{"class":390,"line":391},"line",1,[388,393,395],{"class":394},"sYn-s","make",[388,397,399],{"class":398},"sTbE_"," compose-dev-up\n",[388,401,403,405],{"class":390,"line":402},2,[388,404,395],{"class":394},[388,406,407],{"class":398}," db-migrate\n",[388,409,411,413],{"class":390,"line":410},3,[388,412,395],{"class":394},[388,414,415],{"class":398}," db-seed\n",[364,417,418],{},"The Compose stack provides PostgreSQL + pgvector, Redis, ClickHouse, and MinIO. Application services run on the host.",[373,420,422],{"id":421},"_2-generate-protobufs","2. Generate protobufs",[378,424,426],{"className":380,"code":425,"language":382,"meta":383,"style":383},"make proto-gen\nbash infra\u002Fscripts\u002Fcontext-proto-gen.sh\n",[385,427,428,435],{"__ignoreMap":383},[388,429,430,432],{"class":390,"line":391},[388,431,395],{"class":394},[388,433,434],{"class":398}," proto-gen\n",[388,436,437,439],{"class":390,"line":402},[388,438,382],{"class":394},[388,440,441],{"class":398}," infra\u002Fscripts\u002Fcontext-proto-gen.sh\n",[364,443,444,445,448],{},"Run ",[385,446,447],{},"make proto-gen"," before Go tests that depend on generated auth\u002Fproxy protobufs. The context service has its own generation script.",[373,450,452],{"id":451},"_3-start-auth-then-proxy","3. Start auth, then proxy",[378,454,456],{"className":380,"code":455,"language":382,"meta":383,"style":383},"# Terminal 1\nPOSTGRES_DSN=postgres:\u002F\u002Fibex:ibex@localhost:5432\u002Fibex?sslmode=disable \\\nIBEX_GRPC_PORT=9091 \\\ngo run .\u002Fservices\u002Fauth\u002Fcmd\u002Fauth\n\n# Terminal 2\nIBEX_ENV=development \\\nIBEX_AUTH_GRPC_ADDR=127.0.0.1:9091 \\\nIBEX_AUTH_VALIDATE_TIMEOUT=2s \\\nREDIS_URL=redis:\u002F\u002Flocalhost:6379\u002F0 \\\nPOSTGRES_DSN=postgres:\u002F\u002Fibex:ibex@localhost:5432\u002Fibex?sslmode=disable \\\ngo run .\u002Fservices\u002Fproxy\u002Fcmd\u002Fproxy\n",[385,457,458,464,488,498,510,517,523,536,544,552,560,568],{"__ignoreMap":383},[388,459,460],{"class":390,"line":391},[388,461,463],{"class":462},"s9Tkl","# Terminal 1\n",[388,465,466,470,474,477,480,482,485],{"class":390,"line":402},[388,467,469],{"class":468},"sSC40","POSTGRES_DSN",[388,471,473],{"class":472},"soVBu","=",[388,475,476],{"class":398},"postgres:\u002F\u002Fibex:ibex@localhost:5432\u002Fibex?",[388,478,479],{"class":468},"sslmode",[388,481,473],{"class":472},[388,483,484],{"class":398},"disable",[388,486,487],{"class":394}," \\\n",[388,489,490,494],{"class":390,"line":410},[388,491,493],{"class":492},"sftqT","IBEX_GRPC_PORT=9091 ",[388,495,497],{"class":496},"se3Ec","\\\n",[388,499,501,504,507],{"class":390,"line":500},4,[388,502,503],{"class":492},"go ",[388,505,506],{"class":398},"run",[388,508,509],{"class":398}," .\u002Fservices\u002Fauth\u002Fcmd\u002Fauth\n",[388,511,513],{"class":390,"line":512},5,[388,514,516],{"emptyLinePlaceholder":515},true,"\n",[388,518,520],{"class":390,"line":519},6,[388,521,522],{"class":462},"# Terminal 2\n",[388,524,526,529,531,534],{"class":390,"line":525},7,[388,527,528],{"class":468},"IBEX_ENV",[388,530,473],{"class":472},[388,532,533],{"class":398},"development",[388,535,487],{"class":394},[388,537,539,542],{"class":390,"line":538},8,[388,540,541],{"class":492},"IBEX_AUTH_GRPC_ADDR=127.0.0.1:9091 ",[388,543,497],{"class":496},[388,545,547,550],{"class":390,"line":546},9,[388,548,549],{"class":492},"IBEX_AUTH_VALIDATE_TIMEOUT=2s ",[388,551,497],{"class":496},[388,553,555,558],{"class":390,"line":554},10,[388,556,557],{"class":492},"REDIS_URL=redis:\u002F\u002Flocalhost:6379\u002F0 ",[388,559,497],{"class":496},[388,561,563,566],{"class":390,"line":562},11,[388,564,565],{"class":492},"POSTGRES_DSN=postgres:\u002F\u002Fibex:ibex@localhost:5432\u002Fibex?sslmode=disable ",[388,567,497],{"class":496},[388,569,571,573,575],{"class":390,"line":570},12,[388,572,503],{"class":492},[388,574,506],{"class":398},[388,576,577],{"class":398}," .\u002Fservices\u002Fproxy\u002Fcmd\u002Fproxy\n",[364,579,580,581,584,585,588],{},"Why ",[385,582,583],{},"IBEX_AUTH_VALIDATE_TIMEOUT=2s"," locally? Argon2 verification often exceeds the production 50 ms budget on a developer machine, producing ",[385,586,587],{},"503 SERVICE_DEGRADED"," before the request reaches the provider.",[373,590,592],{"id":591},"_4-start-optional-services","4. Start optional services",[594,595,596,612],"table",{},[597,598,599],"thead",{},[600,601,602,606,609],"tr",{},[603,604,605],"th",{},"Service",[603,607,608],{},"Needed for",[603,610,611],{},"Typical local port",[613,614,615,628,640,654,664,682,695],"tbody",{},[600,616,617,620,623],{},[618,619,220],"td",{},[618,621,622],{},"Console, tenant management",[618,624,625],{},[385,626,627],{},"8010",[600,629,630,632,635],{},[618,631,140],{},[618,633,634],{},"Memory writes, search, context",[618,636,637],{},[385,638,639],{},"8005",[600,641,642,645,648],{},[618,643,644],{},"Context assembly",[618,646,647],{},"Memory injection on chat",[618,649,650,651],{},"Pick a free gRPC port, e.g. ",[385,652,653],{},"9092",[600,655,656,658,661],{},[618,657,186],{},[618,659,660],{},"Vector writes and search",[618,662,663],{},"Pick a free HTTP port",[600,665,666,669,672],{},[618,667,668],{},"Worker",[618,670,671],{},"Extraction, deletion, billing tasks",[618,673,674,675,678,679],{},"metrics ",[385,676,677],{},"8006",", enqueue ",[385,680,681],{},"8007",[600,683,684,687,690],{},[618,685,686],{},"MCP memory",[618,688,689],{},"MCP memory tools",[618,691,692],{},[385,693,694],{},"8090",[600,696,697,700,703],{},[618,698,699],{},"MCP operator",[618,701,702],{},"Read-only operator tools",[618,704,705],{},[385,706,707],{},"8091",[364,709,710,711,714,715,718,719,722],{},"Run Python services from their directories with ",[385,712,713],{},"uv sync --frozen --extra dev"," (or ",[385,716,717],{},"--group dev"," where the service README says so), then ",[385,720,721],{},"uvicorn"," or the documented entrypoint.",[364,724,725],{},"The context service must stay on loopback or a trusted network boundary:",[378,727,729],{"className":380,"code":728,"language":382,"meta":383,"style":383},"PYTHONPATH=packages\u002Fproto\u002Fgen\u002Fpython \\\nIBEX_CONTEXT_GRPC_ADDR=127.0.0.1:9092 \\\n  services\u002Fcontext\u002F.venv\u002Fbin\u002Fpython -m app\n",[385,730,731,743,750],{"__ignoreMap":383},[388,732,733,736,738,741],{"class":390,"line":391},[388,734,735],{"class":468},"PYTHONPATH",[388,737,473],{"class":472},[388,739,740],{"class":398},"packages\u002Fproto\u002Fgen\u002Fpython",[388,742,487],{"class":394},[388,744,745,748],{"class":390,"line":402},[388,746,747],{"class":492},"IBEX_CONTEXT_GRPC_ADDR=127.0.0.1:9092 ",[388,749,497],{"class":496},[388,751,752,755,759],{"class":390,"line":410},[388,753,754],{"class":398},"  services\u002Fcontext\u002F.venv\u002Fbin\u002Fpython",[388,756,758],{"class":757},"sz9Cv"," -m",[388,760,761],{"class":398}," app\n",[373,763,765],{"id":764},"_5-verify","5. Verify",[378,767,769],{"className":380,"code":768,"language":382,"meta":383,"style":383},"curl -s http:\u002F\u002Flocalhost:8080\u002Fhealth\ncurl -s http:\u002F\u002Flocalhost:8080\u002Fready\ncurl -s http:\u002F\u002Flocalhost:8081\u002Fready\nmake dev-smoke\n",[385,770,771,782,791,800],{"__ignoreMap":383},[388,772,773,776,779],{"class":390,"line":391},[388,774,775],{"class":394},"curl",[388,777,778],{"class":757}," -s",[388,780,781],{"class":398}," http:\u002F\u002Flocalhost:8080\u002Fhealth\n",[388,783,784,786,788],{"class":390,"line":402},[388,785,775],{"class":394},[388,787,778],{"class":757},[388,789,790],{"class":398}," http:\u002F\u002Flocalhost:8080\u002Fready\n",[388,792,793,795,797],{"class":390,"line":410},[388,794,775],{"class":394},[388,796,778],{"class":757},[388,798,799],{"class":398}," http:\u002F\u002Flocalhost:8081\u002Fready\n",[388,801,802,804],{"class":390,"line":500},[388,803,395],{"class":394},[388,805,806],{"class":398}," dev-smoke\n",[373,808,810],{"id":809},"test-targets","Test targets",[594,812,813,823],{},[597,814,815],{},[600,816,817,820],{},[603,818,819],{},"Target",[603,821,822],{},"Scope",[613,824,825,835,845,855,865,875,885,895,905,915,925],{},[600,826,827,832],{},[618,828,829],{},[385,830,831],{},"make test-proxy",[618,833,834],{},"Go proxy unit tests",[600,836,837,842],{},[618,838,839],{},[385,840,841],{},"go test -tags=integration .\u002Fservices\u002Fproxy\u002F...",[618,843,844],{},"Proxy integration",[600,846,847,852],{},[618,848,849],{},[385,850,851],{},"make test-auth",[618,853,854],{},"Auth unit tests",[600,856,857,862],{},[618,858,859],{},[385,860,861],{},"make test-memory",[618,863,864],{},"Memory unit tests",[600,866,867,872],{},[618,868,869],{},[385,870,871],{},"make test-memory-integration",[618,873,874],{},"Memory with PostgreSQL",[600,876,877,882],{},[618,878,879],{},[385,880,881],{},"make test-context",[618,883,884],{},"Context tests",[600,886,887,892],{},[618,888,889],{},[385,890,891],{},"make test-worker",[618,893,894],{},"Worker unit tests",[600,896,897,902],{},[618,898,899],{},[385,900,901],{},"make test-worker-integration",[618,903,904],{},"Worker with PostgreSQL\u002FRedis",[600,906,907,912],{},[618,908,909],{},[385,910,911],{},"make test-embedder",[618,913,914],{},"Embedder tests",[600,916,917,922],{},[618,918,919],{},[385,920,921],{},"make test-mcp-memory",[618,923,924],{},"MCP memory tests",[600,926,927,932],{},[618,928,929],{},[385,930,931],{},"make test-mcp-operator",[618,933,934],{},"MCP operator tests",[373,936,938],{"id":937},"common-local-failures","Common local failures",[594,940,941,951],{},[597,942,943],{},[600,944,945,948],{},[603,946,947],{},"Symptom",[603,949,950],{},"Likely cause",[613,952,953,963,974,984,994,1002],{},[600,954,955,960],{},[618,956,957,959],{},[385,958,587],{}," on chat",[618,961,962],{},"Auth too slow or unreachable",[600,964,965,971],{},[618,966,967,970],{},[385,968,969],{},"401"," after seeding",[618,972,973],{},"PAT and agent ID do not match seed output",[600,975,976,981],{},[618,977,978],{},[385,979,980],{},"501 PROVIDER_NOT_CONFIGURED",[618,982,983],{},"Model not in the active registry",[600,985,986,991],{},[618,987,988],{},[385,989,990],{},"relation does not exist",[618,992,993],{},"Migrations not applied",[600,995,996,999],{},[618,997,998],{},"Queue tasks never run",[618,1000,1001],{},"Worker not listening to the right queue",[600,1003,1004,1007],{},[618,1005,1006],{},"Context retrieval returns fallback",[618,1008,1009],{},"Context service disabled, unavailable, or over deadline",[373,1011,1013],{"id":1012},"rules","Rules",[1015,1016,1017,1025,1028,1031,1034],"ul",{},[1018,1019,1020,1021,1024],"li",{},"Never run ",[385,1022,1023],{},"db-seed"," against staging or production.",[1018,1026,1027],{},"Never expose context assembly to an untrusted network.",[1018,1029,1030],{},"Never enable stdio MCP in a deployed environment.",[1018,1032,1033],{},"Never reuse Compose credentials outside local development.",[1018,1035,1036],{},"Never treat a local smoke test as hosted acceptance.",[1038,1039,1040],"style",{},"html pre.shiki code .sYn-s, html code.shiki .sYn-s{--shiki-light:#E2931D;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .sTbE_, html code.shiki .sTbE_{--shiki-light:#91B859;--shiki-default:#B56959;--shiki-dark:#C98A7D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s9Tkl, html code.shiki .s9Tkl{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#A0ADA0;--shiki-default-font-style:inherit;--shiki-dark:#758575DD;--shiki-dark-font-style:inherit}html pre.shiki code .sSC40, html code.shiki .sSC40{--shiki-light:#90A4AE;--shiki-default:#B07D48;--shiki-dark:#BD976A}html pre.shiki code .soVBu, html code.shiki .soVBu{--shiki-light:#39ADB5;--shiki-default:#999999;--shiki-dark:#666666}html pre.shiki code .sftqT, html code.shiki .sftqT{--shiki-light:#90A4AE;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .se3Ec, html code.shiki .se3Ec{--shiki-light:#90A4AE;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sz9Cv, html code.shiki .sz9Cv{--shiki-light:#91B859;--shiki-default:#A65E2B;--shiki-dark:#C99076}",{"title":383,"searchDepth":402,"depth":402,"links":1042},[1043,1044,1045,1046,1047,1048,1049,1050],{"id":375,"depth":402,"text":376},{"id":421,"depth":402,"text":422},{"id":451,"depth":402,"text":452},{"id":591,"depth":402,"text":592},{"id":764,"depth":402,"text":765},{"id":809,"depth":402,"text":810},{"id":937,"depth":402,"text":938},{"id":1012,"depth":402,"text":1013},"Run the Go and Python services from source, with the dependency stack in Compose.","md",false,{},"shipped-local",{"title":27,"description":1051},"Makefile; infra\u002Fcompose\u002Fdev; services\u002F*\u002FREADME.md","0ecj1_PoBw9G0I14RFnEDbdcP0uW0dYhe9iILoFGJcA",[1060,1062],{"title":23,"path":24,"stem":25,"description":1061,"children":-1},"Run IBEX Harness locally and send a mock-mode chat completion in about five minutes.",{"title":31,"path":32,"stem":33,"description":1063,"children":-1},"Answers to common setup, security, and capability-boundary questions.",1792875073401]