# Mosaic Stack - Full Codebase Review: Executive Summary

**Date:** 2026-02-05
**Scope:** Full codebase (apps/api, apps/web, apps/orchestrator, apps/coordinator, packages/\*)
**Method:** 7 parallel review agents covering security, code quality, and QA/test coverage

---

## At a Glance

| Dimension                   | Findings | Critical | High   | Medium | Low    |
| --------------------------- | -------- | -------- | ------ | ------ | ------ |
| Security - API              | 28       | 4        | 7      | 13     | 4      |
| Security - Web              | 37       | 2        | 9      | 14     | 12     |
| Security - Orch/Coord       | 30       | 6        | 9      | 12     | 3      |
| Code Quality - API          | 7        | 3        | 2      | 2      | 0      |
| Code Quality - Web          | 12       | 5        | 2      | 3      | 2      |
| Code Quality - Orchestrator | 10       | 3        | 3      | 3      | 1      |
| **Totals**                  | **124**  | **23**   | **32** | **47** | **22** |

**QA/Test Coverage:** Separate grading per workspace (see report 03).

---

## Top 10 Most Urgent Findings

These are the findings that pose the greatest risk and should be addressed first:

### 1. No Authentication on Orchestrator API (SEC-ORCH-2)

**Severity: CRITICAL** | The entire orchestrator API (spawn, kill, kill-all, status) has zero authentication. Any network client can drain API credits or kill all agents.

### 2. RLS Context Never Applied in Service Layer (SEC-API-4)

**Severity: CRITICAL** | The RLS infrastructure exists (withWorkspaceContext, setWorkspaceContext) but no service actually uses it. Tenant isolation relies entirely on application-level WHERE clauses.

### 3. WikiLinkRenderer Stored XSS (SEC-WEB-2)

**Severity: CRITICAL** | WikiLinkRenderer passes HTML through dangerouslySetInnerHTML. DOMPurify only sanitizes wiki-link display text; surrounding HTML is rendered raw. Stored XSS.

### 4. Secret Scanner Returns "Clean" on Error (SEC-ORCH-1)

**Severity: CRITICAL** | When scanFile() fails for any reason, it returns `{ hasSecrets: false }`. A file that couldn't be read is indistinguishable from a clean file.

### 5. Docker Sandbox Disabled by Default (SEC-ORCH-3)

**Severity: CRITICAL** | Agents run directly on the host without container isolation unless `SANDBOX_ENABLED=true` is explicitly set.

### 6. Unauthenticated Inter-Service Communication (SEC-ORCH-4)

**Severity: CRITICAL** | Orchestrator communicates with coordinator over plain HTTP with no authentication. Quality gate responses can be spoofed.

### 7. Guards Swallow DB Errors as Auth Failures (SEC-API-2, SEC-API-3)

**Severity: CRITICAL** | WorkspaceGuard and PermissionGuard catch all database errors and return false/null, converting infrastructure failures into misleading "access denied" responses.

### 8. OIDC Config Silently Degrades to Empty Strings (SEC-API-1)

**Severity: CRITICAL** | Missing OIDC env vars default to empty strings instead of failing fast. The discovery URL becomes a relative path.

### 9. Redis KEYS Command in Production (CQ-ORCH-3, SEC-ORCH-5)

**Severity: CRITICAL** | listTasks() and listAgents() use the blocking `KEYS` command. This can freeze the entire Redis instance under load.

### 10. OAuth Callback Open Redirect (SEC-WEB-1)

**Severity: CRITICAL** | The OAuth error parameter is passed unsanitized into router.push(), enabling phishing attacks.

---

## Summary by Workspace

### apps/api (NestJS)

- **Security:** Strong Prisma query safety, timing-safe comparisons, good guard chain. Weak: RLS never applied, guards swallow DB errors, OIDC silent degradation, admin guard conflates workspace ownership with system admin.
- **Code Quality:** Good architecture overall. Memory leaks in WebSocket gateway and runner-jobs. Hardcoded TODO values in federation OIDC.
- **Test Grade: B-** (2,174 tests, but 21 untested services including the 916-line knowledge.service.ts)

### apps/web (Next.js)

- **Security:** API client has good CSRF handling, but multiple components bypass it with raw fetch(). WikiLinkRenderer XSS. Mock data shipped in production paths. Dual auth mechanisms.
- **Code Quality:** Stale closures in hooks, boolean logic bug in mindmap editor, race conditions in autocomplete, no React.memo usage, no CSP headers.
- **Test Grade: C+** (555 tests, 76 untested components/pages, 23 skipped tests)

### apps/orchestrator (NestJS)

- **Security:** No API authentication, no rate limiting, sandbox disabled by default, unauthenticated inter-service communication, YOLO mode bypasses all quality gates.
- **Code Quality:** Unbounded session Map, KEYS command, TOCTOU race conditions in state transitions, N+1 queries, force-remove Docker containers.
- **Test Grade: A** (452 tests, near-complete coverage, well-structured)

### apps/coordinator (Python/FastAPI)

- **Security:** Prompt injection via issue body, queue file corruption silently discarded, orchestration loops swallow all exceptions, Mock import in production code.
- **Test Grade: D** (504 tests exist but only 16% line coverage reported -- likely test configuration issue)

### packages/\*

- **shared:** Adequate (1 test file, covers utilities)
- **ui:** 9 of 10 components untested (Grade: D+)
- **config/skills:** No tests needed

---

## Remediation Approach

Findings are organized into three reports for detailed remediation planning:

| Report              | File                        | Contents                                             |
| ------------------- | --------------------------- | ---------------------------------------------------- |
| Security Review     | `01-security-review.md`     | All 95 security findings across API, Web, Orch/Coord |
| Code Quality Review | `02-code-quality-review.md` | All 29 code quality findings                         |
| QA & Test Coverage  | `03-qa-test-coverage.md`    | Test gaps, anti-patterns, coverage grades            |

### Suggested Remediation Phases

**Phase 1 - Critical Security (1-2 days)**

- Add authentication to orchestrator API
- Fix WikiLinkRenderer XSS
- Fix secret scanner error handling
- Fix guards swallowing DB errors
- Validate OIDC configuration at startup

**Phase 2 - High Security + Infrastructure (2-3 days)**

- Enable Docker sandbox by default
- Add inter-service authentication
- Replace KEYS with SCAN in Valkey
- Sanitize OAuth callback parameters
- Route all fetch() through API client (CSRF)
- Remove/gate mock data in production paths

**Phase 3 - Code Quality + Memory Leaks (1-2 days)**

- Fix memory leaks (WebSocket, runner-jobs, Valkey listeners, session Map)
- Fix stale closures in React hooks
- Fix boolean logic bug in mindmap editor
- Add runtime validation for deserialized data
- Fix N+1 queries

**Phase 4 - Test Coverage (2-3 days)**

- Investigate coordinator 16% coverage
- Add tests for knowledge.service.ts, admin.guard.ts, embeddings.service.ts
- Re-enable 23 skipped widget tests
- Add tests for untested UI components
- Replace placeholder assertions

---

## Positive Observations

The codebase demonstrates strong engineering in several areas:

- Prisma parameterized queries throughout (no raw SQL injection)
- Timing-safe API key comparison
- Federation private keys encrypted at rest (AES-256-GCM)
- Comprehensive zip bomb protection
- Guard chain consistency (Auth -> Workspace -> Permission)
- Orchestrator test coverage is excellent (A grade)
- State machine validation prevents invalid agent transitions
- Webhook signature verification uses hmac.compare_digest()
- Good separation of concerns across NestJS modules
