{"service":"e28e-harness","phase":"MVP1 Phases 0-6 LIVE: stubs + retrieveKnowledge (Vectorize + curated_qa FTS5) + sessions/events/audit_log (D1) + time-decay context engine + 10-step harness loop (POST /chat) + Auth #50 (CF Access Email-OTP) + Answer Principle + Knowledge Gap Feedback Loop (unanswered queue + curated Q&A) + Leverage AI draft-answer + smart-answer classification (factual/procedural/diagnostic) + team invite (POST /admin/team/invite) + tenant-config GET/PATCH (refs #251)","endpoints":["GET /health — liveness (unauthenticated)","GET /test — exercise every stub end-to-end (Bearer: owner only)","GET /retrieve?q=<text>&tenant_id=<id?>&domain=<domain?>&top_k=<n?> — real Vectorize retrieval (Bearer: owner|member)","GET /whoami — return AuthContext (Bearer: any role)","POST /chat — harness loop: retrieve+model+events (Bearer: owner|member) — body: { session_id?, message }","GET /sessions/:id/events — session transcript + RBAC scope (Bearer: owner|member)","GET /admin/events?employee_id=&type=&from=&to=&q=&limit=&cursor= — tenant-wide event query (Bearer: owner only)","GET /admin/sessions?employee_id=&from=&to=&has_unanswered=&status=&limit=&cursor= — sessions browser: list/filter sessions (Bearer: owner only, refs #733)","GET /admin/sessions/:session_id — session detail: all events in chronological order (Bearer: owner only, refs #733)","DELETE /admin/conversations/:session_id — soft-archive a conversation (archived_at set; rows retained, recoverable); owner-only (refs #968)","GET /admin/activation — onboarding activation funnel + TTV1/TTV2 over existing events (Bearer: owner only)","GET /admin/nudges — funnel-driven onboarding nudges + milestones for in-app banner (Bearer: owner only, refs #374)","GET /admin/cockpit/kpis — Business Cockpit KPIs over existing data (Bearer: owner|operator, refs #406)","GET /admin/cockpit/activity — recent agent activity feed; ?limit=1..200 (Bearer: owner|operator, refs #406)","GET /admin/cockpit/trust-metrics — NFR-7 trust metrics (acceptance ratio / override frequency / setting churn) over existing events (Bearer: owner|operator, refs #428)","GET /admin/cockpit/cache-hit-rate — answer-cache hit rate over existing assistant_response events (Bearer: owner|operator, refs #1234)","POST /admin/telemetry/widget-event — renderer telemetry receiver: widget_mount / widget_validation_failed / widget_render_error (Bearer: any authed role, refs #428)","GET /admin/auth/audit?since=&limit= — sign-in audit history (token_exchange/auth_fail/sign_out) (Bearer: owner only, refs #61)","POST /admin/retention/dry-run — preview retention cold-sweep counts, read-only (Bearer: owner only, refs #76)","POST /admin/curated-qa — create curated Q&A pair (Bearer: owner only) — body: { question_text, answer_text, optional_manual_section_link? }","GET /admin/curated-qa — list active curated Q&A pairs (Bearer: owner|operator)","PATCH /admin/curated-qa/:id — edit answer/source link (Bearer: owner only) — body: { answer_text?, optional_manual_section_link? }","DELETE /admin/curated-qa/:id — soft-delete curated Q&A pair (Bearer: owner only)","POST /admin/skills — create a skill bundle (Bearer: owner only, refs #1154) — body: { name, content, description?, triggerKeywords?, maxTokens? }","GET /admin/skills — list this tenant's skill catalog (Bearer: owner|operator, refs #1154)","PATCH /admin/skills/:id — edit a skill bundle (Bearer: owner only, refs #1154)","DELETE /admin/skills/:id — remove a skill bundle (Bearer: owner|delegated_expert, refs #1154/#1156)","POST /admin/skills/seed-kit — apply a vertical SOP starter kit (skill + curated Q&A rows), idempotent (Bearer: owner only, refs #1154) — body: { vertical }","GET /admin/skills/kits — list the read-only vertical SOP starter-kit catalog (vertical, displayName, jobTypes count, sampleQA count) (Bearer: owner|operator, refs #1157/#1153)","GET /admin/context/suggestions?status=pending|approved|rejected|archived — suggest/approve queue for the Managed Context Lifecycle (Bearer: owner|operator|delegated_expert, refs #1153/#1156)","POST /admin/context/suggestions/:id/approve — approve a pending context suggestion (Bearer: owner|delegated_expert, refs #1153/#1156)","POST /admin/context/suggestions/:id/reject — reject a pending context suggestion (Bearer: owner|delegated_expert, refs #1153/#1156)","POST /admin/context/suggestions/:id/apply — promote an APPROVED suggestion to its live target (Bearer: owner|delegated_expert, refs #1153/#1156)","POST /admin/experts/grant — grant Delegated Expert access to this tenant (Bearer: owner only, refs #1156) — body: { expert_identity }","POST /admin/experts/:grantId/revoke — revoke Delegated Expert access (Bearer: owner only, refs #1156)","GET /admin/experts — list Delegated Expert grants for this tenant (Bearer: owner|operator, refs #1156)","POST /admin/interviewer/start — start (or idempotently resume) the owner's onboarding interview (Bearer: owner only, refs #1272/#373, flag: INTERVIEWER_ENABLED)","GET /admin/interviewer/session — get the active interview session + current prompt (Bearer: owner only, refs #1272/#373, flag: INTERVIEWER_ENABLED)","POST /admin/interviewer/answer — answer the current phase's question, advance to the next (Bearer: owner only, refs #1272/#373, flag: INTERVIEWER_ENABLED) — body: { answer }","POST /admin/interviewer/apply — seed the Confirmed profile from a review-phase session (Bearer: owner only, refs #1272/#373, flag: INTERVIEWER_ENABLED)","GET /admin/entity-types — list this tenant's configured entity taxonomy (Bearer: owner|document_uploader|operator, refs #1238)","POST /admin/entity-types — declare/update one entity type, idempotent on key (Bearer: owner|document_uploader, refs #1238) — body: { key, label, parentTypeKey? }","GET /admin/entities?type_key=&parent_entity_id= — list entities, optionally filtered (Bearer: owner|document_uploader|operator, refs #1238)","POST /admin/entities — create an entity instance (Bearer: owner|document_uploader, refs #1238) — body: { typeKey, name, parentEntityId?, aliases?, attributes?, status? }","GET /admin/entities/:id — get a single entity (Bearer: owner|document_uploader|operator, refs #1238)","PATCH /admin/entities/:id — partial update, incl. alias management (Bearer: owner|document_uploader, refs #1238) — body: { name?, parentEntityId?, aliases?, attributes?, status? }","DELETE /admin/entities/:id — hard-delete an entity (Bearer: owner|document_uploader, refs #1238)","GET /admin/unanswered?status=open|answered|dismissed&from=&to=&employee_id=&limit=&offset= — paginated unanswered question queue (Bearer: owner only)","POST /admin/unanswered/:id/dismiss — set status=dismissed on a queue row (Bearer: owner only)","DELETE /admin/unanswered/:id — permanently delete a queue row (Bearer: owner only)","POST /flag-answer — flag an answer the chat couldn't fully answer; inserts an open unanswered_questions row (Bearer: owner|member|document_uploader|agent) — body: { question_text: string, session_id?: string }","POST /admin/draft-answer — AI-drafted answer for unanswered-question panel (Bearer: owner only) — body: { question: string }","POST /admin/auth/exchange — exchange CF Access JWT for a tenant-scoped bearer token (unauthenticated; header: Cf-Access-Token)","POST /admin/auth/signout — revoke the presented bearer token (Bearer: any role)","POST /admin/team/invite — invite a new team member; sends invite email + adds to CF Access policy (Bearer: owner only) — body: { email, name?, role }","GET /admin/team — list all team members any status (Bearer: owner only)","POST /admin/team/:id/resend-invite — re-send invite email to an existing member (Bearer: owner only)","DELETE /admin/team/:id — cancel a pending invite (Bearer: owner only) — only members with status='invited' can be cancelled; active/deactivated must use the delete-account flow","PATCH /admin/team/:id/role — change an active member's role (Bearer: owner only, refs #271) — body: { role: 'member' | 'document_uploader' }","PATCH /admin/team/:id/deactivate — soft-revoke an active member's access; row + history retained (Bearer: owner only, refs #271)","PATCH /admin/team/:id/reactivate — restore a deactivated member's access (Bearer: owner only, refs #271)","POST /admin/team/:id/delete — delete an account: identity teardown + event anonymization (Bearer: owner only, refs #61)","GET /admin/approvals — list connector actions awaiting approval (Bearer: owner only, refs #392)","POST /admin/approvals/:id/approve — approve a proposed connector action (Bearer: owner only, refs #392)","POST /admin/approvals/:id/reject — reject a proposed connector action (Bearer: owner only, refs #392)","GET /admin/pii/export?employee_id= — GDPR Art. 20 data portability: export sessions + events for an employee (Bearer: owner exports any; member/document_uploader/agent export own only, refs #709)","GET /admin/export — tenant active-state data export: sessions, events, documents, audit_log (Bearer: owner only, refs #714)","GET /admin/pii/scan?employee_id=&customer_tag=&start=&end=&has_dlp_flag=&limit= — list events with potential PII for owner review; content not returned (Bearer: owner only, refs #715)","POST /admin/pii/redact — in-place redact an event's content + emit audit row (Bearer: owner only, refs #715) — body: { event_id, reason }","POST /admin/operators — grant Operator/MSP access to this tenant (Bearer: owner only, refs #732) — body: { email, name? }","DELETE /admin/operators/:email — revoke Operator access by email (Bearer: owner only, refs #732)","GET /admin/operators — list active Operators for this tenant (Bearer: owner only, refs #732)","GET /connectors/catalog — public unauthenticated connector catalog (no auth required, refs #993)","GET /connectors — list connectors with catalog metadata + per-tenant status (Bearer: owner|member|document_uploader, refs #390 #992)","POST /connectors/:id/connect — record connector as connected; body: { account_label? } (Bearer: owner only, refs #992)","POST /connectors/:id/disconnect — record connector as disconnected (Bearer: owner only, refs #992)","GET /admin/tenant-config — get per-tenant agent configuration for Settings screen (Bearer: any authed role, refs #251 / loosened #486 for sidebar BrandMark)","PATCH /admin/tenant-config — update per-tenant agent configuration (Bearer: owner only, refs #251) — body: { agentName?, agentDescription?, welcomeMessage?, exampleQuestions?, agentAvatarUrl? }","POST /admin/tenant-config/avatar — upload agent avatar image to R2 (Bearer: owner only, multipart/form-data field 'file', PNG/JPG/WebP ≤1 MB, refs #486)","GET /public/avatar/:filename — public no-auth avatar serve from R2 (refs #486)"],"bindings_declared":["AI","DB","R2","VECTORIZE","KV"]}