Role-based access in the UI (read-only observer vs. full owner), API key scoping, how to lock down a company to read-only for external auditors, and policy enforcement at the API layer.
Configure Paperclip for regulated industries, enforce data handling policies at the company level, and understand what controls Paperclip provides vs what you must implement yourself.
| Control | Paperclip provides |
|---|---|
| Multi-tenant isolation | company_id boundary on every table |
| Spending limits | Budget auto-pause at agent and company level |
| Human oversight | Approval gates with audit trail |
| Data encryption | At-rest encryption via Supabase/PostgreSQL; in-transit via TLS |
| Secret management | API keys via env vars, never stored in DB |
| Audit logging | Automatic logging of all agent actions and approvals |
| Control | Your responsibility |
|---|---|
| User authentication | Supabase Auth, Auth0, or your own JWT |
| Role-based access | Which humans can see/manage which company |
| Data residency | Choose EU/US Supabase region or self-host |
| PII handling | Scrub PII from issue descriptions before seeding |
| Model data usage | Review Anthropic/OpenAI data usage policies |
Never seed customer PII directly into issues.description:
// Before creating an issue from a support ticket:
import { scrub } from './pii-scrubber'; // your scrubbing library
const safeDescription = scrub(ticket.body, {
patterns: ['email', 'phone', 'credit_card', 'ssn'],
replacement: '[REDACTED]'
});
await createIssue({ description: safeDescription });
For the right to erasure, implement a deletion cascade:
-- Remove all data for a specific user across all their activity
-- (assumes a user_id column on issues if users submit them directly)
DELETE FROM cost_events WHERE agent_id IN (SELECT id FROM agents WHERE /* user filter */);
DELETE FROM approvals WHERE requesting_agent_id IN (...);
DELETE FROM issues WHERE company_id = 'user-company-id';
DELETE FROM agents WHERE company_id = 'user-company-id';
DELETE FROM companies WHERE id = 'user-company-id';
Before using Anthropic or OpenAI in a regulated context:
For HIPAA environments: use the http adapter pointing at a self-hosted Ollama or a HIPAA BAA-covered service.
Add input validation in your issue-creation API layer:
// Reject issues whose descriptions match a PII pattern
function validateIssueContent(description: string) {
const PII_REGEX = /\b\d{3}-\d{2}-\d{4}\b/; // SSN pattern
if (PII_REGEX.test(description)) {
throw new Error('Issue description contains PII; scrub before submitting');
}
}