Commit 6554cd

2026-03-13 18:23:36 Claude (MCP): [mcp] Create Phase 1 gate results page
/dev/null .. Dev/Phase_1_Gate_Results.md
@@ 0,0 1,56 @@
+ ---
+ category: reference
+ tags: [meta, phase-1, gate]
+ last_updated: 2026-03-13
+ confidence: high
+ ---
+
+ # Phase 1 Gate Results
+
+ Validation performed 2026-03-13. Results for each exit criterion from [[Design/Phase_Gates]].
+
+ ## Summary
+
+ **6/7 criteria PASS. 1 pending human validation (MCP from Claude.ai).**
+
+ ## Results
+
+ | Criterion | Result | Notes |
+ |-----------|--------|-------|
+ | Web UI works | **PASS** | Human confirmed: pages load, edit, save at dev.wikibot.io |
+ | REST API works | **PASS** (11/12) | All CRUD, search, semantic search, history endpoints work. Minor issue: `GET /pages/{path}/links` returns 404 (route treats path as page name). MCP `get_links` tool works via different code path. |
+ | MCP works (all 12 tools) | **PENDING** | Blocked on P1-9 (OAuth routing). P1-9 now fixed and deployed. Awaiting human test from Claude.ai. |
+ | Semantic search works | **PASS** | 5/5 queries returned relevant results. On-topic distances 0.46–0.79, off-topic 0.89+ (correctly low confidence). Index has ~233 chunks across ~30 pages. |
+ | Git authorship | **PASS** | API commits show "Claude (MCP)" as expected. Historical "Claude (Dev)" from earlier config. One "Otterwiki Robot" initial commit. No anomalies. |
+ | Routing + TLS | **PASS** (6/6) | TLSv1.3, Amazon RSA 2048, cert expires 2026-09-26. Custom domain resolves. HTTPS-only (no port 80 — acceptable). Non-ASCII URLs work. |
+ | Architecture decision | **PASS** | Documented: separate Lambdas for Otterwiki (VPC+EFS) and MCP (stateless, no VPC). Rationale in mcp_server.py docstring. |
+
+ ## Performance
+
+ | Endpoint | Cold | Warm | Assessment |
+ |----------|------|------|------------|
+ | Wiki page (`/Home`) | 1.0s | 0.5s | Acceptable |
+ | API health | 0.25s | 0.25s | Fast |
+ | Authenticated API endpoints | — | — | Not timed (auth header issue in test agent) but functional tests passed in < 1s |
+
+ ## Issues Found
+
+ ### Minor: `/pages/{path}/links` route (REST API)
+
+ `GET /api/v1/pages/Home/links` returns 404 — the Flask router treats `Home/links` as a two-segment page path rather than recognizing `/links` as a sub-resource. The `/history` sub-resource works fine. The MCP `get_links` tool works correctly (uses a different URL pattern). Low priority — does not block gate.
+
+ ### Fixed: P1-9 MCP OAuth Routing
+
+ OAuth discovery endpoints were routed to Otterwiki instead of MCP Lambda. Fixed by adding `ANY /.well-known/{proxy+}` API Gateway route and correcting `MCP_BASE_URL`. See [[Tasks/P1-9_MCP_OAuth_Routing]].
+
+ ### Note: API auth header
+
+ The REST API uses `Authorization: Bearer <token>`, not `X-API-Key`. Some test agents initially used the wrong header. Not a bug — just a documentation clarification.
+
+ ## Remaining Validation
+
+ - [ ] **Human test: MCP from Claude.ai** — Connect to `https://dev.wikibot.io/mcp` via Claude.ai MCP connector (leave Client ID/Secret blank). Exercise all 12 tools.
+
+ ## Go/No-Go
+
+ Pending the MCP-from-Claude.ai validation. All other criteria pass.
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9