Properties
category: reference tags: [dev, phase-1] last_updated: 2026-03-13 confidence: high
Phase 1 Progress
Task Status
| Task | Status | Branch/Repo | Notes |
|---|---|---|---|
| P1-1 | Complete | otterwiki fork, wikibot-io branch |
Lambda adapter using apig-wsgi (not Mangum — Mangum is ASGI-only, Flask is WSGI). EFS requirements documented. 325 tests pass. |
| P1-2 | Complete | otterwiki-semantic-search, merged to main |
FAISS backend + Bedrock embedding adapter. ChromaDB still default. 56 tests pass. |
| P1-3 | Complete | wikibot-io, merged to main |
Otterwiki on Lambda with EFS. URL: https://jj75wak0pj.execute-api.us-east-1.amazonaws.com. Cold start ~3.1s, warm 5-600ms. |
| P1-4 | Complete | wikibot-io, merged to main |
REST API plugin on Lambda. 20 integration tests pass. Plugin loaded via explicit import (entry points stripped in build). |
| P1-5 | In progress | wikibot-io, feat/P1-5-mcp-lambda |
Full MCP server replacing P0-7 PoC. |
| P1-6 | In progress | wikibot-io, feat/P1-6-semantic-search-lambda |
FAISS + Bedrock on Lambda with VPC endpoint. |
| P1-7 | Complete | wikibot-io, merged to main |
Custom domain dev.wikibot.io with ACM TLS. Single API Gateway, path-based routing. |
| P1-8 | Not started | — | E2E test. Blocked on P1-5, P1-6. |
Architecture Decisions
apig-wsgi instead of Mangum (P1-1 / P1-3)
Mangum v0.15+ is ASGI-only. Otterwiki is Flask/WSGI. Switched to apig-wsgi which directly adapts WSGI apps for API Gateway v2 events.
Zip package + Lambda layer instead of Docker (P1-3)
Docker daemon not available in dev container. Zip approach: pip install --target with --platform manylinux2014_x86_64. Package size: 73MB uncompressed / 24MB compressed. Git binary from lambci/git-lambda2 layer.
Single API Gateway (P1-7)
Consolidated MCP and otterwiki onto one API Gateway. A custom domain can only map to one API Gateway. Routes: $default → otterwiki, ANY /mcp and ANY /mcp/{proxy+} → MCP Lambda.
MCP on separate Lambda, no VPC (P0-7)
MCP Lambda needs internet access for WorkOS JWKS endpoint. Putting it in VPC would require NAT. Since MCP doesn't need EFS, SimpleLambdaComponent (no VPC) is simpler and cheaper.
Plugin loading via explicit import (P1-4)
Build step strips .dist-info directories to save space, which breaks pluggy's load_setuptools_entrypoints(). Workaround: import otterwiki_api in lambda_init.py triggers self-registration before the Flask app initializes.
Endpoints
| Endpoint | Status |
|---|---|
https://dev.wikibot.io/ |
Live — Otterwiki web UI |
https://dev.wikibot.io/api/v1/health |
Live — REST API |
https://dev.wikibot.io/mcp |
Live — MCP (P0-7 PoC, being replaced by P1-5) |
Also Completed (Track B / Prerequisites)
| Task | Status | Notes |
|---|---|---|
| P0-7 | Complete | FastMCP + WorkOS OAuth on Lambda. 15 tests. Merged to main. |
| WorkOS config | Complete | Google, Apple, GitHub OAuth providers. API key + Client ID in Pulumi config. AuthKit domain: appreciative-seed-37-staging.authkit.app. DCR + CIMD enabled. |
| Pulumi fix | Complete | Added PULUMI_BACKEND_URL to pulumi.sh to avoid conflicts with other Pulumi backends. |