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.