Compare commits

...

4 Commits

Author SHA1 Message Date
coreci-coo db35142fdc docs(verbiage): TL;DR prologues per comms-etiquette v1.0 (applies coreci/inboxos-v1#193)
InboxOS — PR CI / Fast offline tests (pull_request) Successful in 42s
InboxOS — PR CI / 100MB historical e2e (pull_request) Successful in 12m38s
InboxOS — PR CI / Live Ollama extract smoke (pull_request) Failing after 20s
2026-10-19 21:58:08 +00:00
grimacing 1a63533fa0 Update .gitea/workflows/live-pipeline.yml
InboxOS — PR CI / Fast offline tests (pull_request) Successful in 32s
InboxOS — PR CI / 100MB historical e2e (pull_request) Successful in 11m5s
InboxOS — PR CI / Live Ollama extract smoke (pull_request) Successful in 59s
2026-06-11 02:47:06 +00:00
saa f692ac2d33 docs(roadmap): correct v1.5 status line — Pillar I Gate passed
InboxOS — PR CI / Fast offline tests (pull_request) Successful in 33s
InboxOS — PR CI / 100MB historical e2e (pull_request) Successful in 11m56s
InboxOS — PR CI / Live Ollama extract smoke (pull_request) Successful in 57s
PR !108 was merged by grimacing on 2026-06-10. This document-only
revision updates the v1.5 MINOR status from 'pending Pillar I Gate
approval' to 'Pillar I Gate passed' so the Roadmap stays in lockstep
with the Gitea audit chain.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-06-11 01:11:18 +00:00
cto-ciagent ea210ed909 docs(architecture,trd): v1.5 scope \u2014 Mailbox & Administrative Management Interface
InboxOS — PR CI / Fast offline tests (pull_request) Successful in 32s
InboxOS — PR CI / Live Ollama extract smoke (pull_request) Successful in 41s
InboxOS — PR CI / 100MB historical e2e (pull_request) Successful in 11m24s
- Update docs/architecture/v1.md to cover v1.5 MINOR scope
  - Add trust boundaries H (Presentation) and I (Application API)
  - Add component addendum (Mailbox Owner Dashboard, Ops Console, API server, RBAC middleware)
  - Add v1.5 data flow diagram and idempotency notes
  - Update references to umbrella #99, Architecture #114, TRD #115
- Create docs/trd/mailbox-admin-interface.md with full INTV-5 TRD
  - Functional/non-functional requirements, API contracts, data model
  - Story map + Mermaid dependency graph for 20 Stories (#116..#135)
  - Test plan, acceptance criteria, out-of-scope declarations

Traces to: INTV-5 #109, MAJOR v1 #99, Architecture #114, TRD #115
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-06-10 20:32:01 +00:00
4 changed files with 326 additions and 9 deletions
+2 -2
View File
@@ -60,8 +60,8 @@ name: InboxOS — Live Pipeline
on:
schedule:
# Every 5 minutes. Adjust if you want a slower cadence.
- cron: "*/5 * * * *"
# Every 60 minutes. Adjust if you want a slower cadence.
- cron: "0 * * * *"
workflow_dispatch:
inputs:
since_uid:
+58 -6
View File
@@ -1,6 +1,6 @@
# InboxOS — Architecture (v1 / MAJOR v1)
> **Pillar II gate artefact.** Owned by the CTO. Scoped to **MAJOR v1** per the Strategic Roadmap (`docs/roadmap.md`); covers all shipped MINORs (v1.0..v1.3) and the active MINOR (v1.4) of InboxOS. The CTO maintains this document; revisions follow the Pillar II Gate (PR merge by the Client, or Issue approval for smaller deltas).
> **Pillar II gate artefact.** Owned by the CTO. Scoped to **MAJOR v1** per the Strategic Roadmap (`docs/roadmap.md`); covers all shipped MINORs (v1.0..v1.4) and the active MINOR (v1.5) of InboxOS. The CTO maintains this document; revisions follow the Pillar II Gate (PR merge by the Client, or Issue approval for smaller deltas).
>
> **Traces to:** [`docs/roadmap.md`](./roadmap.md) §MAJOR scope; MAJOR v1 umbrella [#26](https://git.cloudinit.dev/jc-capital/inboxos/issues/26); Pillar I Gate PR [inboxos#25](https://git.cloudinit.dev/jc-capital/inboxos/pulls/25).
>
@@ -42,10 +42,10 @@ We are **building** the orchestration, the extraction contract, the runbook tool
### 1.3 Out of scope (v1.x)
- Multi-tenant / multi-inbox support. InboxOS is single-tenant, single-inbox.
- Mobile / web operator surface beyond NocoDB views and CLI scripts. The NocoDB UI is the operator dashboard.
- Mobile / web operator surface beyond NocoDB views and CLI scripts. **Exception:** v1.5 introduces a role-based web dashboard (Mailbox Owner + Admin/Operator) scoped to INTV-5.
- External LLM providers (OpenAI, Anthropic, etc.). The threat model assumes the LLM is local.
- Real-time push (webhook, push notification). The 5-minute live cron is the SLA.
- v1.5+ deferred items (DEF-V1.4-1..5: container hardening expansion, encryption-at-rest, data-retention purge, NocoDB audit log schema, encrypted offsite backup).
- v1.6+ deferred items (DEF-V1.5-1..5: dark mode, custom theming per tenant, OAuth/SAML federation, row-level database security, advanced analytics / PDF reports).
---
@@ -198,6 +198,58 @@ Every write path has a single, named, idempotent function. This is the **smalles
---
## 4.5 Data flow \u2014 v1.5 Mailbox & Administrative Management Interface
The v1.5 MINOR adds a **Web UI layer** (trust boundary H \u2014 "Presentation") that sits behind the existing Caddy reverse proxy (boundary B) and reads from the Data plane (boundary D) via a new **App API layer** (boundary I \u2014 "Application API"). No new persistence services are added; the Web UI reuses NocoDB, SeaweedFS logs, and the existing observability pipeline.
### 4.5.1 New trust boundaries for v1.5
| # | Trust boundary | What lives here | Trust posture | Auth model |
|---|---|---|---|---|
| H | **Presentation** | React/Vue SPA (Mailbox Owner Dashboard, Admin/Operator Ops Console) | Self-hosted static files served by Caddy; same trust as Caddy | Session cookie (`HttpOnly`, `Secure`, `SameSite=Strict`) |
| I | **Application API** | New lightweight API server (e.g., FastAPI/Flask) proxying NocoDB and log queries | Runs on `inboxos-net`; only the Presentation layer reaches it | Bearer token + RBAC middleware; token issued on login |
**Trust flow rules (v1.5 addendum):**
- **H → I**: Presentation SPA calls Application API with bearer token. Token carries role claim.
- **I → D**: Application API queries NocoDB (read-only for dashboard) and SeaweedFS logs (read-only for metrics). No writes from I into D except admin config (PATCH to NocoDB `global_config` table).
- **I → C**: Application API does NOT call Gitea or runners. The CI pipeline remains unchanged.
- **B → H**: Caddy serves the static SPA bundle. TLS 1.2+ terminates at Caddy.
### 4.5.2 v1.5 component addendum
| # | Component | Boundary | Role | Source of truth |
|---|---|---|---|---|
| 13 | **Mailbox Owner Dashboard** | H | Static SPA; paginated email list, search/filter, archive/mark actions. Reads from Application API. | `frontend/mailbox-owner/` |
| 14 | **Admin/Operator Ops Console** | H | Static SPA; metrics, logs, user permission management, global config. Reads/writes via Application API. | `frontend/admin-console/` |
| 15 | **Application API server** | I | Proxies NocoDB queries, enforces RBAC, serves auth endpoints (`/auth/me`, `/login`, `/logout`). | `backend/api/` |
| 16 | **RBAC middleware** | I | Role check on every request; redirects unauthorized roles; \u003c 50 ms overhead. | `backend/api/middleware/rbac.py` |
### 4.5.3 v1.5 data flow diagram
```
Caddy (boundary B) ──▶ static SPA bundle (boundary H)
│
├──▶ Mailbox Owner Dashboard (read-only on Application API)
│
└──▶ Admin/Operator Ops Console (read + admin config on Application API)
│
└──▶ Application API (boundary I)
│
├──(REST /read)──▶ NocoDB (boundary D)
│
├──(S3 GET)─────▶ SeaweedFS logs (boundary D)
│
└──(REST /write)──▶ NocoDB global_config (boundary D)
```
### 4.5.4 Idempotency and reversibility (v1.5)
- **Admin config writes** (`PATCH /admin/config`) are deterministic overwrites on the `global_config` table (natural key = `config_key`).
- **Permission changes** (`PATCH /admin/users/:id/role`) update the `user_roles` bridge table; re-running the same PATCH yields the same state.
- **Audit logs** (`POST /audit/log`) are append-only; deduplication is by `(user_id, action, timestamp, ip_hash)`.
---
## 5. Infrastructure
### 5.1 Host & network
@@ -324,7 +376,7 @@ The `scripts/cost_report.py` workflow produces a monthly NocoDB / S3 / Ollama ro
- `main` — production; receives Pillar III PRs only after dual approval (CPO + CTO) and the PR CI green.
- `release/v1` — long-lived integration branch for v1 (per SAA SOP §6.3; branched from `main` HEAD at the Pillar I Gate).
- `initiative/INTV-{1,2,3,4}-*` — reserved names for Pillar III integration per Initiative. Branch creation is the engineering team's first action on Pillar II Gate passage.
- `initiative/INTV-{1,2,3,4,5}-*` — reserved names for Pillar III integration per Initiative. Branch creation is the engineering team's first action on Pillar II Gate passage.
- `epic/EPIC-INB-...` — reserved names per Epic. Sub-branches per Story.
- `feature/<short-slug>` — ad-hoc working branches for the engineering team. Rebased on the relevant `epic/` branch before merge.
@@ -448,6 +500,6 @@ On merge, a Gitea comment on the MAJOR v1 umbrella records the Gate decision. Th
- [`docs/security/dpia.md`](./security/dpia.md) — DPIA (REQ-INB-58).
- [`docs/security/threat-model.md`](./security/threat-model.md) — STRIDE threat model (REQ-INB-59).
- [`docs/quickstart.md`](./quickstart.md) — 15-minute green-field spin-up.
- TRDs: [`docs/trd/operator-self-service.md`](./trd/operator-self-service.md), [`docs/trd/security-compliance.md`](./trd/security-compliance.md), [`docs/trd/dual-approval-governance.md`](./trd/dual-approval-governance.md), [`docs/trd/tech-debt.md`](./trd/tech-debt.md).
- Gitea: MAJOR v1 umbrella [#26](https://git.cloudinit.dev/jc-capital/inboxos/issues/26); Pillar I Gate PR [inboxos#25](https://git.cloudinit.dev/jc-capital/inboxos/pulls/25); v1.4.0 re-dispatch [#24](https://git.cloudinit.dev/jc-capital/inboxos/issues/24).
- TRDs: [`docs/trd/operator-self-service.md`](./trd/operator-self-service.md), [`docs/trd/security-compliance.md`](./trd/security-compliance.md), [`docs/trd/dual-approval-governance.md`](./trd/dual-approval-governance.md), [`docs/trd/tech-debt.md`](./trd/tech-debt.md), [`docs/trd/mailbox-admin-interface.md`](./trd/mailbox-admin-interface.md).
- Gitea: MAJOR v1 umbrella [#99](https://git.cloudinit.dev/jc-capital/inboxos/issues/99); Architecture Issue [#114](https://git.cloudinit.dev/jc-capital/inboxos/issues/114); Pillar I Gate PR [inboxos#108](https://git.cloudinit.dev/jc-capital/inboxos/pulls/108); v1.4.0 re-dispatch [#24](https://git.cloudinit.dev/jc-capital/inboxos/issues/24).
- Paperclip: CTO routine [CIA-45](/CIA/issues/CIA-45); CTO hire [CIA-5](/CIA/issues/CIA-5).
+4 -1
View File
@@ -1,5 +1,8 @@
# InboxOS - Strategic Roadmap (`docs/roadmap.md`)
**TL;DR** — InboxOS — self-hosted personal ERP/CRM pipeline. Prompts-as-code, Gitea Actions, NocoDB, Ollama, SeaweedFS, Papra. This file explains how to stand it up and who to contact; the machinery detail stays lower under Details.
> **Author/maintainer (content):** [CPO](/INB/agents/cpo) — sole author of milestones, sequencing, and per-MINOR requirements.
> **Author/maintainer (governance):** [SAA](/CIA/agents/saa) — owns the MAJOR Umbrella binding, the `## MAJOR scope` declaration, the `## MINOR release list`, and the Pillar I Gate PRs that bind this Roadmap to the Gitea hierarchy.
> **Project:** InboxOS (`/INB/projects/inboxos`)
@@ -34,7 +37,7 @@ The MINOR names below are used verbatim to name Gitea Milestones (SAA SOP §6.3,
- **v1.2 - Initial Pipeline Hardening** — papra + imapclient + schema discipline. _Status: shipped._
- **v1.3 - Stable Cut** — stable post-recovery cut. _Status: shipped; release quarantined and recovered per [INB-295](/INB/issues/INB-295) / inboxos#17. No further commits under this MINOR without a fresh Pillar I Gate round._
- **v1.4 - Operator UX + Security Hardening** — operator tooling (scripts, dashboards, tutorials), NocoDB views, container hardening, DPIA, threat model, PII scrub (held by `REQ-INB-57` until board approval lands). _Status: active, re-dispatching per inboxos#24 to enforce dual-approval governance on the v1.4.0 wave._
- **v1.5 - Mailbox & Administrative Management Interface** — role-based UI/UX for Mailbox Owners and Admin/Operators, RBAC routing, and design-system compliance. _Status: declared, pending Pillar I Gate approval._
- **v1.5 - Mailbox & Administrative Management Interface** — role-based UI/UX for Mailbox Owners and Admin/Operators, RBAC routing, and design-system compliance. _Status: Pillar I Gate passed (PR !108 merged by grimacing, 2026-06-10). Active; CTO handoff in progress._
- **Backlog** — approved v1 work not yet scheduled into a MINOR. _Status: open._
The Gitea Milestones in the repo carry the **title only** form (`v1.0-MVP`, `v1.1-Beta`, `v1.2-initial`, `v1.4`) for historical reasons. The SAA will:
+262
View File
@@ -0,0 +1,262 @@
# TRD \u2014 INTV-5: Mailbox & Administrative Management Interface (v1.5)
> **Pillar II Gate artefact.** Owned by the CTO. Traces to [INTV-5 #109](https://git.cloudinit.dev/jc-capital/inboxos/issues/109) and the MAJOR v1 umbrella [#99](https://git.cloudinit.dev/jc-capital/inboxos/issues/99). Cross-links to [`docs/architecture/v1.md`](./architecture/v1.md).
> **Status:** Draft \u2014 awaiting Client approval via Pillar II Gate PR.
---
## 1. Initiative scope
**INTV-5** delivers a polished, role-based Mailbox & Administrative Management Interface for InboxOS v1.5.
**Success criteria:**
1. A Mailbox Owner View exists where owners can view, search, and manage ingested emails.
2. An Admin/Operator Ops Console exists providing observability and administrative controls.
3. RBAC automatically routes users and prevents cross-role access.
4. UI/UX passes design-system compliance (responsive, accessible, consistent).
**Out of scope:**
- Email ingestion engine backend (existing pipeline).
- Third-party email client integrations.
- Advanced analytics / PDF reports (v1.6+ candidate).
- Dark mode, custom theming per tenant (v1.6+ candidate).
- OAuth/SAML federation (v1.6+ candidate).
---
## 2. Functional requirements
| ID | Requirement | Acceptance criteria |
|---|---|---|
| FR-1 | Mailbox Owner can view paginated list of ingested emails. | ≤ 500 ms search/filter latency on reference dataset. |
| FR-2 | Mailbox Owner can archive or mark emails as processed. | Actions persist within 1 s; visual feedback confirms. |
| FR-3 | Admin/Operator can view ingestion rates, error logs, system latency. | Metrics refresh ≤ 30 s; sourced from existing NocoDB/logs. |
| FR-4 | Admin/Operator can manage user permissions and global config. | Permission changes take effect within 60 s. |
| FR-5 | RBAC routes users to the correct view automatically. | No manual URL bypass can reach a protected view. |
| FR-6 | All v1.5 views are responsive and design-system compliant. | Lighthouse accessibility ≥ 90; design-system lint passes in CI. |
---
## 3. Non-functional requirements
| ID | Requirement | Target |
|---|---|---|
| NFR-1 | RBAC latency overhead | < 50 ms per request. |
| NFR-2 | Dashboard search/filter latency | < 500 ms on reference dataset. |
| NFR-3 | Permission propagation latency | < 60 s after change. |
| NFR-4 | Lighthouse accessibility score | ≥ 90 on both views. |
| NFR-5 | CI design-system lint | Blocks merge on failure. |
---
## 4. API contracts
### 4.1 Mailbox data query
```
GET /api/v1/mailbox?search=<query>&filter=status:<status>&page=<page>&limit=50
Headers: Authorization: Bearer <token>
Response: {
"data": [{ "message_id", "subject", "sender", "status", "date" }],
"meta": { "page", "limit", "total", "has_more" }
}
```
### 4.2 Mailbox actions
```
POST /api/v1/mailbox/:message_id/archive
POST /api/v1/mailbox/:message_id/mark-processed
Response: { "ok": true, "message_id" }
```
### 4.3 Observability metrics
```
GET /api/v1/admin/metrics
Headers: Authorization: Bearer <token>
Response: {
"ingestion_rate_5m", "error_count_5m", "system_latency_p99"
}
```
### 4.4 Admin config
```
GET /api/v1/admin/config
POST /api/v1/admin/config
GET /api/v1/admin/users
PATCH /api/v1/admin/users/:id/role
```
### 4.5 RBAC middleware
```
GET /api/v1/auth/me
Response: { "user_id", "role", "permissions": [] }
```
---
## 5. Data model
### 5.1 Users / Roles (new tables in NocoDB)
| Table | Key columns | Notes |
|---|---|---|
| `users` | `user_id` (PK), `email`, `created_at` | Natural key = email. |
| `roles` | `role_id` (PK), `role_name` (owner|admin|operator) | Enum enforced at app layer. |
| `user_roles` | `user_id`, `role_id`, `assigned_at`, `assigned_by` | Many-to-many bridge. |
| `audit_log` | `event_id`, `user_id`, `action`, `resource`, `timestamp`, `ip_hash` | GDPR-friendly; IP hashed. |
### 5.2 Migration plan
- `apply_schemas.py --check` extended to verify new tables.
- Seed script creates default roles on first deploy.
- Migration is idempotent (CREATE IF NOT EXISTS).
---
## 6. Dependencies
### Internal
- `blockedBy` INTV-2 (PII scrub must not be bypassed by new UI).
- Coordinated with INTV-4 (tech-debt lane) \u2014 no schema conflicts.
### External
- NocoDB REST API (existing).
- Existing observability logs (SeaweedFS / runner artifacts).
---
## 7. Test plan
| Layer | What | How |
|---|---|---|
| Unit | RBAC middleware | `pytest` with mocked roles. |
| Integration | API endpoints | `pytest` against local NocoDB fixture. |
| E2E | Dashboard flows | Playwright / Cypress (headless) against dev server. |
| Accessibility | Lighthouse CI | Enforced in PR CI (`lighthouse ≥ 90`). |
| Security | RBAC bypass attempts | Automated pentest script (security-engineer). |
---
## 8. Acceptance criteria (measurable)
- [ ] All 4 Epics reach `done` in v1.5 Milestone with passing CI.
- [ ] RBAC enforces role separation at routing layer (no manual URL bypass).
- [ ] Both views are responsive and pass design-system lint.
- [ ] Lighthouse accessibility score ≥ 90 on both views.
- [ ] Search/filter latency < 500 ms on reference dataset.
---
## 9. Story map + dependency graph
### 9.1 Story list (20 Stories across 4 Epics)
**Epic A \u2014 Mailbox Owner Dashboard (#112)**
- S1 #116 \u2014 Spec Mailbox Owner Dashboard API contract (`domain/backend`, `pattern/a`, `cto-approved`)
- S2 #117 \u2014 Implement Mailbox Owner Dashboard backend API (`domain/backend`, `pattern/a`)
- S3 #118 \u2014 Spec Mailbox Owner Dashboard UI (`domain/ux`, `pattern/b`, `cto-approved`)
- S4 #119 \u2014 Implement Mailbox Owner Dashboard frontend (`domain/frontend`, `pattern/b`)
- S5 #120 \u2014 QA Mailbox Owner Dashboard integration tests (`domain/security`, `pattern/e`)
**Epic B \u2014 Admin/Operator Ops Console (#110)**
- S1 #121 \u2014 Spec Ops Console API contract (`domain/backend`, `pattern/a`, `cto-approved`)
- S2 #122 \u2014 Implement Ops Console backend API (`domain/backend`, `pattern/a`)
- S3 #123 \u2014 Spec Ops Console UI (`domain/ux`, `pattern/b`, `cto-approved`)
- S4 #124 \u2014 Implement Ops Console frontend (`domain/frontend`, `pattern/b`)
- S5 #125 \u2014 QA Ops Console integration tests (`domain/security`, `pattern/e`)
**Epic C \u2014 RBAC & Auth Layer (#111)**
- S1 #126 \u2014 Spec RBAC API contract and middleware (`domain/backend`, `pattern/a`, `cto-approved`)
- S2 #127 \u2014 Implement RBAC middleware and role checks (`domain/backend`, `pattern/a`)
- S3 #128 \u2014 Spec Users/Roles data model (`domain/data-model`, `pattern/d`, `cto-approved`)
- S4 #129 \u2014 Implement Users/Roles tables and migrations (`domain/data-pipeline`, `pattern/d`)
- S5 #130 \u2014 Integrate RBAC middleware with frontend routing (`domain/frontend`, `pattern/e`)
- S6 #131 \u2014 Security test RBAC enforcement verification (`domain/security`, `pattern/e`)
**Epic D \u2014 Design-System Compliance (#113)**
- S1 #132 \u2014 Spec design-system token set and lint rules (`domain/ux`, `pattern/b`, `cto-approved`)
- S2 #133 \u2014 Implement design-system tokens in frontend (`domain/frontend`, `pattern/b`)
- S3 #134 \u2014 Implement responsive layouts and navigation patterns (`domain/frontend`, `pattern/b`)
- S4 #135 \u2014 Add design-system lint to CI (`domain/devops`, `pattern/d`)
### 9.2 Mermaid dependency graph
```mermaid
graph TD
%% Spec nodes (cto-approved)
A_S1["A-S1 #116 API spec (backend)"]
A_S3["A-S3 #118 UI spec (ux)"]
B_S1["B-S1 #121 API spec (backend)"]
B_S3["B-S3 #123 UI spec (ux)"]
C_S1["C-S1 #126 RBAC spec (backend)"]
C_S3["C-S3 #128 Data spec (data-model)"]
D_S1["D-S1 #132 Design spec (ux)"]
%% Implementation nodes
A_S2["A-S2 #117 API impl (backend)"]
A_S4["A-S4 #119 UI impl (frontend)"]
A_S5["A-S5 #120 QA (security)"]
B_S2["B-S2 #122 API impl (backend)"]
B_S4["B-S4 #124 UI impl (frontend)"]
B_S5["B-S5 #125 QA (security)"]
C_S2["C-S2 #127 RBAC impl (backend)"]
C_S4["C-S4 #129 Data impl (data-pipeline)"]
C_S5["C-S5 #130 RBAC integrate (frontend)"]
C_S6["C-S6 #131 Pentest (security)"]
D_S2["D-S2 #133 Tokens impl (frontend)"]
D_S3["D-S3 #134 Layout impl (frontend)"]
D_S4["D-S4 #135 Lint CI (devops)"]
%% Dependencies
A_S1 --> A_S2
A_S2 --> A_S4
A_S3 --> A_S4
A_S4 --> A_S5
A_S2 --> A_S5
B_S1 --> B_S2
B_S2 --> B_S4
B_S3 --> B_S4
B_S4 --> B_S5
B_S2 --> B_S5
C_S1 --> C_S2
C_S1 --> C_S5
C_S2 --> C_S5
C_S3 --> C_S4
C_S4 --> C_S5
C_S2 --> C_S6
C_S5 --> C_S6
D_S1 --> D_S2
D_S1 --> D_S3
D_S2 --> D_S4
D_S1 --> D_S4
%% Cross-Initiative dependencies
C_S2 --> A_S4
C_S2 --> B_S4
C_S5 --> A_S4
C_S5 --> B_S4
D_S2 --> A_S4
D_S2 --> B_S4
D_S3 --> A_S4
D_S3 --> B_S4
```
---
## 10. Out of scope
- OAuth/SAML federation (future MINOR).
- Row-level database security (future enhancement).
- Dark mode / custom theming per tenant (future MINOR).
- Advanced analytics / PDF reports (future MINOR).
- PII scrub implementation (handled by INTV-2).
---
## 11. References
- [`docs/architecture/v1.md`](./architecture/v1.md) \u2014 System architecture (trust boundaries, components).
- [`docs/roadmap.md`](./roadmap.md) \u2014 Strategic Roadmap (Pillar I artefact).
- Gitea: INTV-5 [#109](https://git.cloudinit.dev/jc-capital/inboxos/issues/109); TRD Issue [#115](https://git.cloudinit.dev/jc-capital/inboxos/issues/115); Epics [#112](https://git.cloudinit.dev/jc-capital/inboxos/issues/112), [#110](https://git.cloudinit.dev/jc-capital/inboxos/issues/110), [#111](https://git.cloudinit.dev/jc-capital/inboxos/issues/111), [#113](https://git.cloudinit.dev/jc-capital/inboxos/issues/113).
- Paperclip: CTO routine [CIA-80](/CIA/issues/CIA-80).