Security Whitepaper
CI-1T™ · Collapse Index Labs™
Version 1.9 · February 2026
Security Posture Summary
CI-1T is a stateless, numbers-only prediction-stability engine. This summary captures the key security properties that procurement and security teams evaluate.
frame-ancestors 'none', restricted sourcesTable of Contents
1. Overview
CI-1T is a prediction-stability engine that measures whether AI model outputs are reliable. It accepts numeric prediction scores only - no raw text, images, model weights, or training data ever touch our infrastructure.
This document describes the security architecture across all three components of the CI-1T ecosystem:
- CI-1T API - Rust compute engine hosted on Render.
- CI-1T Dashboard - Astro SSR web application with PocketBase authentication.
- MCP Server - Tooling for IDE and agent integration via the Model Context Protocol.
Audience: Engineering teams, security reviewers, and procurement teams evaluating CI-1T for production use.
2. Architecture
The system follows a defense-in-depth proxy pattern that separates authentication from computation:
Client → Dashboard (Astro SSR) → CI-1T API (Rust)
↑
PocketBase (Auth)
- Authentication boundary: All dashboard API routes (
/api/chat,/api/lab,/api/fleet-session,/api/api-keys) require a valid Bearer token verified against PocketBase viaauth-refreshbefore proxying requests. Token verification is not prefix-only - every request round-trips to PB to confirm the token is valid and not expired. - Ownership enforcement: The
/api/api-keysendpoint enforces per-user ownership on all CRUD operations. Users can only list, create, modify, or delete their own API keys. The PATCH endpoint whitelists writable fields toenabledandnameonly - sensitive fields (key_hash,user,scope) cannot be overwritten. All record IDs are validated with a strict regex to prevent PocketBase filter injection. - Compute engine: The Rust API is a stateless compute service - it processes numeric arrays and returns stability metrics. It holds no user data and performs no authentication itself.
3. Data Handling
What we process
- Prediction scores: Unsigned 16-bit integers (0–65,535) representing Q0.16 fixed-point probabilities. These are the only payload the engine accepts.
- Account metadata: Email and name from OAuth sign-in, stored in PocketBase.
- Chat messages: Forwarded to xAI's Grok API for processing when using Ask AI. We log metadata only (timestamps, message count) - never raw message content. Requires a positive credit balance. Per xAI’s privacy policy, API-submitted data is not used to train their models.
What we never process
- Model weights, architectures, or training data.
- Raw text, images, audio, or any non-numeric input.
- Personally identifiable information beyond OAuth profile data.
Data at rest
The Rust engine is stateless by default. Scores are processed in-memory and discarded after the response is returned. Fleet sessions are held in-memory only and are lost on server restart - there is no disk persistence layer. The hosting environment does not retain swap, memory snapshots, or crash dumps - all in-flight data is ephemeral to the process lifetime.
Internal engine metrics (T1/T2/T3 triplet weights, fleet ratios) are annotated #[serde(skip_serializing)] and never appear in API responses.
4. Authentication & Access Control
- OAuth 2.0: Dashboard sign-in via GitHub, Google, or X (Twitter) through PocketBase. No passwords are stored - authentication is fully delegated to OAuth providers.
- Bearer tokens: Every dashboard API route extracts and validates the Bearer token against PocketBase via
auth-refreshon every request. Invalid or expired tokens are rejected with HTTP 401. Tokens are hashed using a non-cryptographic hash (DJB2) for rate-limit partitioning and audit correlation only - never for authentication or security decisions. DJB2 hash collisions only affect bucket grouping; they cannot elevate privileges, bypass authentication, or access another user’s data. The raw token is never stored server-side. - API keys (dual header support): Programmatic access uses
ci_-prefixed API keys. Keys are accepted via theX-API-Keyheader (preferred) orAuthorization: Bearer ci_...over HTTPS. Keys are SHA-256 hashed at rest in PocketBase - the raw key is never stored. - API key collection rules: The PocketBase
api_keyscollection has all rules set tonull(admin-only). Only server-side code with admin credentials can query or modify key records - unauthenticated PB API access is blocked at the database level.
5. Input Validation
Every component enforces strict input validation:
| Layer | Mechanism | Constraints |
|---|---|---|
| Rust API | Body size limit | 2 MB max payload, preventing memory exhaustion. |
| Rust API | Session caps | Max 100 sessions, 1–10,000 nodes per session. Returns HTTP 503 when exceeded. |
| Dashboard | Rate limiting | 30 requests/minute, 500/day per authenticated user (Ask AI chat). Buckets are keyed by PocketBase user ID (not IP), stored in application memory, and cleaned every 10 minutes. Current deployment is single-instance on Render. |
| Dashboard | Message limits | 20 messages per request, 32,000 chars per message, roles restricted to "user"/"assistant". |
| Dashboard | Score validation | Every score validated as integer 0–65,535 before forwarding to the engine. |
| Dashboard | Record ID validation | Strict regex validation on all PocketBase record IDs to prevent filter injection. |
6. Network Security
- TLS everywhere: All communication between clients, dashboard, API, and PocketBase uses HTTPS with TLS certificate validation enforced.
- Server-side API keys: The xAI API key and any third-party credentials are stored server-side as environment variables and never exposed to the browser. Secrets are rotated on a quarterly cadence or immediately upon suspected exposure. Production and development environments use separate credential sets.
- Stripe redirect whitelist: Stripe checkout and portal redirect URLs are validated against an allowlist of permitted hosts (
collapseindex.org,www.collapseindex.org,localhost:4323). SpoofedHostorX-Forwarded-Hostheaders fall back to a hardcoded origin, preventing open redirect attacks via header injection. - Middleware isolation: The Astro middleware no longer falls back to PocketBase when an
/api/*route returns 404. All PocketBase admin API routes are explicitly listed in a fast-path allowlist - unknown paths are not proxied, preventing exposure of PB’s internal API surface. - DDoS mitigation: Volumetric DDoS protection is provided by Render’s edge network, which handles TLS termination, connection limiting, and upstream rate limiting before traffic reaches the application layer. Application-level rate limiting (per-user bucketing) provides a secondary defense against authenticated abuse.
Security headers
The following HTTP security headers are enforced on production responses:
| Header | Value / Policy |
|---|---|
Strict-Transport-Security | max-age=31536000; includeSubDomains - enforced by Render’s edge network. HTTPS-only; no HTTP fallback. |
X-Frame-Options | DENY - prevents clickjacking via iframe embedding. |
X-Content-Type-Options | nosniff - prevents MIME-type sniffing attacks. |
Referrer-Policy | strict-origin-when-cross-origin - limits referrer leakage to third parties. |
Permissions-Policy | Camera, microphone, geolocation, and other sensitive APIs disabled. |
Cache-Control | no-cache, no-store, must-revalidate on all API and admin routes. Static assets use hashed filenames for cache busting. |
Content-Security-Policy | default-src 'self'; script-src 'self' https://cdnjs.cloudflare.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com; connect-src 'self'; img-src 'self' data:; frame-ancestors 'none'; base-uri 'none'; object-src 'none'; form-action 'self' |
7. LLM Security
The Ask AI chat feature includes multiple layers of prompt injection defense:
- Injection pattern detection: 24+ regex patterns scan incoming messages for known jailbreak techniques - “ignore previous instructions,” “DAN mode,” “show me your prompt,” role impersonation, and similar vectors. Messages are scanned as-is (no Unicode normalization is applied; NFKC normalization for homoglyph-aware scanning is a planned improvement). Matches are rejected with randomized refusal responses. Regex detection is an additive defense layer and is not relied upon as the sole control - it operates alongside role restriction, system prompt isolation, and tool sandboxing.
- System prompt IP protection: The system prompt contains explicit rules forbidding the model from disclosing engine internals, proprietary algorithms, default parameter values, or implementation details.
- Role restriction: Only
"user"and"assistant"roles are accepted. System-role injection via message history is rejected. - Tool sandboxing: The chat system's 7 built-in tools (evaluate scores, fleet evaluate, health check, etc.) execute server-side. Results are streamed via SSE - the client never executes tool logic.
- Metadata-only logging: Chat audit logs record timestamps, message counts, and rate-limit events. Raw message content is never logged.
8. File System & Path Safety
- Session ID encoding: Fleet session IDs in dashboard API routes are passed through
encodeURIComponent()to prevent path injection.
9. Engine Safety Guarantees
The compute engine is designed for deterministic, memory-safe operation:
- Fixed-size buffers: All buffers are statically sized with zero heap allocation on the hot path.
- No overflow: All fixed-point arithmetic uses wider intermediates to prevent overflow, with proper rounding.
- Safety-first defaults: The engine initializes at the most restrictive authority level. Trust must be earned through stable predictions - it is never assumed.
- Value semantics: Output structures are returned by value - no heap cloning or pointer sharing.
- Fault codes: Well-defined fault codes with a watchdog timer for timeout detection.
10. Third-Party Infrastructure
We rely on the following third-party services:
| Service | Purpose | Data shared |
|---|---|---|
| Render | API & dashboard hosting | Numeric scores (in transit), server logs. |
| PocketBase | Authentication | Email, name, OAuth tokens. |
| Stripe | Payment processing | Customer/payment data for credit top-ups. |
| xAI | Chat (Ask AI) | Chat messages (Ask AI, credit-gated). Powered by Grok by xAI. |
| GitHub | Source code, OAuth | OAuth profile for sign-in. |
| Google / X (Twitter) | OAuth sign-in | OAuth profile data only. |
We do not use analytics services, advertising networks, tracking pixels, or third-party cookies.
11. Audit Logging
The dashboard uses a centralized audit logging system that records metadata only:
- Timestamps, service name, event type.
- Hashed user identifiers (for rate-limit correlation).
- Request latency and HTTP status codes.
Audit logs never contain: raw message content, API keys, bearer tokens, email addresses, or any personally identifiable information.
12. Transparency
All CI-1T components - the Rust engine, dashboard, and MCP server - are proprietary. Security-relevant behavior is documented in this whitepaper and our Privacy Policy.
13. What We Don't Do
- No tracking cookies.
- No analytics pixels or third-party analytics services.
- No advertising identifiers.
- No data selling or sharing with data brokers.
- No telemetry or usage reporting.
- No use of your prediction scores to train any models.
14. Security Audit & Hardening Practices
Last audit: February 26, 2026 · Covers commits up to 0e2e3fd (v2.15.0)
Dependency scanning
All codebases are regularly audited for known vulnerabilities in third-party dependencies using native package-manager tooling:
| Component | Tool | Result (Feb 26 2026) |
|---|---|---|
| Dashboard (Astro / npm) | npm audit | 0 vulnerabilities |
| CI-1T API (Rust) | cargo audit | 0 vulnerabilities (2 yanked crate warnings in dev-only criterion) |
| MCP Server (Python) | pip-audit | 0 vulnerabilities |
Static analysis
Rule-based static analysis tools are used to catch patterns that AI-assisted review may miss:
- Bandit - Python static security analyzer. ci1t-mcp: 0 medium+ findings.
- Semgrep - scans Python and TypeScript source for injection, hardcoded secrets, insecure patterns, and common anti-patterns.
- Trivy - scans Dockerfiles and container images (ci1t-api) for misconfigurations and OS-level CVEs.
- GitHub Advanced Security / CodeQL - enabled on CI for automated taint tracking and dataflow analysis on every pull request.
Dynamic testing
Running applications are probed with automated tools that simulate real attacks:
- OWASP ZAP - proxy-based scanner that crawls the dashboard and probes for XSS, CSRF, open redirects, header injection, and other OWASP Top 10 issues.
- Mozilla Observatory - validates HTTP security headers (CSP, HSTS, X-Frame-Options, etc.) on the production domain.
Threat modeling
Each component undergoes a manual threat-model pass covering:
- Where does untrusted input enter? (API payloads, chat messages, webhook URLs)
- How are auth decisions made? (OAuth tokens via PocketBase, Bearer header validation)
- Where are secrets stored and used? (server-side env vars)
- What happens on error paths and 500s? (generic error messages, no stack traces leaked)
- Can rate limits or DoS protections be bypassed? (per-user bucketing, session caps, body size limits)
Adversary categories considered:
- Authenticated malicious user - abuses rate limits, submits injection payloads, attempts privilege escalation via PATCH field overwrite.
- Compromised OAuth token - stolen session used to exfiltrate data or burn credits. Mitigated by per-request PB validation and bounded session lifetimes.
- Stripe replay attacker - replays webhook payloads to double-credit accounts. Mitigated by signature validation, LRU dedup, and atomic writes.
- Prompt injection attacker - attempts to extract system prompt, engine internals, or bypass role restrictions. Mitigated by regex detection, role restriction, and system prompt rules.
- SSRF attacker - crafts webhook URLs targeting internal services or cloud metadata endpoints. Mitigated by URL validation and redirect refusal.
- Supply chain attacker - compromises a transitive dependency. Mitigated by Dependabot, lockfile pinning, and multi-tool audit pipeline.
- Infrastructure compromise (Render) - considered out of scope; mitigated by stateless architecture (no data to exfiltrate from compute containers) and encrypted PB volumes.
OWASP Top 10 alignment
| OWASP Top 10 (2021) | Mitigation |
|---|---|
| A01 Broken Access Control | Per-user key ownership enforcement, admin-only PB collection rules, PATCH field whitelist |
| A02 Cryptographic Failures | SHA-256 key hashing, TLS everywhere, DJB2 used only for non-security bucketing |
| A03 Injection | Strict validation, regex allowlists, no eval(), yaml.safe_load(), PB filter injection prevention |
| A04 Insecure Design | Defense-in-depth proxy pattern, stateless engine, explicit threat modeling |
| A05 Security Misconfiguration | Security headers hardened, SSRF blocking, admin rules enforced on every deploy |
| A06 Vulnerable Components | npm/pip/cargo audit + Dependabot + lockfile pinning + Trivy container scans |
| A07 Auth Failures | OAuth 2.0 delegation, per-request token validation, no password storage |
| A08 Software Integrity | Stripe webhook signature verification, Dependabot alerts, CodeQL on PRs |
| A09 Logging & Monitoring | Centralized audit logging (metadata-only), rate-limit event tracking, no PII in logs |
| A10 SSRF | URL validation, private IP blocking, redirect refusal, cloud metadata blocked |
Least privilege
- Containerized deployment: API runs in a minimal Docker container on Render with no shell access or persistent storage.
- Short-lived tokens: OAuth sessions have bounded lifetimes. Bearer tokens are validated on every request.
- Environment-variable secrets: API keys and credentials are stored in Render’s encrypted environment - never in source control or
.envfiles committed to git. - No broad permissions: The Rust engine has no file-system access, no database access, and no outbound network calls. It receives numbers and returns numbers.
Payment security
- Webhook idempotency: Stripe webhook events are tracked by event ID in a bounded LRU map (max 1,000 entries). Duplicate deliveries return HTTP 200 without double-crediting user accounts. Note: extremely high-volume replay attacks exceeding the LRU capacity could theoretically evict entries and allow re-processing; in practice, Stripe signature validation and the atomic credit writes provide secondary protection.
- Atomic credit operations: Both
deductCredits()andaddUserCredits()re-read the user’s balance from PocketBase before writing, preventing time-of-check/time-of-use (TOCTOU) race conditions on concurrent requests. - Retry-safe webhooks: Webhook processing errors return HTTP 500 so Stripe retries automatically. Previously returned 200 on error, which could silently lose paid credits.
- Stripe signature validation: All webhook payloads are verified via
stripe.webhooks.constructEvent()with the endpoint-specific signing secret before any processing occurs.
Startup security
- No secrets in logs: OAuth provider configuration is logged as a safe summary (character count + provider count) - client IDs and secrets are never echoed to stdout.
- Admin-only collection rules: The
api_keyscollection rules are set tonull(admin-only) on every deploy. A smoke test verifies unauthenticated access is correctly blocked (expects HTTP 403).
Supply chain CVE response
- Lodash prototype pollution (Feb 2026): Transitive lodash <4.17.23 carried a prototype pollution vulnerability. Patched by adding
overrides.lodash: ">=4.17.23"topackage.json. - Markdown link XSS (Feb 2026): Chat markdown renderer accepted arbitrary URL protocols in
[text](url)links, includingjavascript:. Fixed by adding anhttps?://protocol allowlist - non-HTTP links render as plain text. - Rollup path traversal (Feb 2026): Dependabot flagged a High-severity arbitrary file write via path traversal in rollup <4.59.0 (transitive via
astro → vite → rollup). Crafted filenames with../sequences bypassed the sanitizer and allowedpath.resolve()to write outside the output directory. Patched by addingoverrides.rollup: ">=4.59.0"topackage.json. Verified vianpm ls rollup(4.59.0) andnpm audit(0 vulnerabilities).
Continuous monitoring
- GitHub Dependabot: Automatic alerts and pull requests when a dependency CVE is published.
- CI pipeline checks:
npm audit,pip-audit, andcargo auditare run on every build to prevent vulnerable dependencies from shipping. - Manual review cadence: Auth, payment, and data-flow code are reviewed quarterly with an adversarial testing approach focused on bypassing existing controls.
15. Data Retention
| Data | Retention | Encrypted at rest? |
|---|---|---|
| Prediction scores (Rust engine) | Not retained - discarded after response | N/A (in-memory only) |
| Fleet sessions (Rust engine) | Not retained - lost on restart | N/A (in-memory only) |
| PocketBase user data | Retained until account deletion | Yes - Render persistent disk with volume-level encryption |
| PocketBase backups | On-demand via admin dashboard - scheduled weekly, restoration tested quarterly | Yes - stored on encrypted Render disk |
| Stripe payment records | Managed by Stripe per their retention policy | Yes - Stripe PCI DSS Level 1 |
| Audit logs (dashboard) | Stdout only - retained by Render for 7 days | Render-managed |
| Chat messages (xAI) | Forwarded to xAI - subject to xAI’s policy | xAI-managed |
We do not maintain long-term archives of user activity beyond what is described above. Account deletion cascade-removes user records, API keys, and external auth entries from PocketBase.
16. Incident Response
Security incidents are handled according to defined severity levels:
| Severity | Definition | Response target |
|---|---|---|
| Critical | Active exploitation, data breach, or credential exposure | Containment within 1 hour, user notification within 24 hours |
| High | Exploitable vulnerability with no evidence of active exploitation | Patch within 24 hours, disclosure within 72 hours |
| Medium | Vulnerability requiring specific conditions to exploit | Patch within 7 days |
| Low | Defense-in-depth improvement or hardening opportunity | Addressed in next release cycle |
- Containment: Affected services are isolated or taken offline. Credentials rotated immediately if compromise is suspected.
- User notification: Affected users are notified via email with a description of the incident, impact scope, and remediation steps.
- Postmortem: All Critical and High incidents produce a written postmortem within 7 days, including root cause, timeline, and preventive measures. Postmortems for public-facing incidents are published on our blog.
17. Business Continuity & Recovery
| Component | RTO (Recovery Time) | RPO (Data Loss Window) |
|---|---|---|
| CI-1T API (Rust) | < 5 minutes - stateless container, auto-redeploy on failure | Zero - no persistent state |
| Dashboard (Astro SSR) | < 5 minutes - stateless container, auto-redeploy | Zero - state held in PocketBase |
| PocketBase (Auth + Data) | < 30 minutes - restore from backup + redeploy | Up to 7 days (weekly backup cadence) |
| Payment (Stripe) | Stripe SLA - outside our control | Zero - Stripe is the source of truth for payment records |
All compute services run on Render with zero-downtime deploys and automatic health checks. The Rust engine and Astro dashboard are stateless - a fresh container is healthy immediately. PocketBase data resides on an encrypted persistent disk; recovery requires restoring the latest backup to a new volume.
18. Shared Responsibility Model
Security is a shared effort between CI-1T and its users:
| CI-1T is responsible for | You are responsible for |
|---|---|
| Securing the API, dashboard, and PocketBase infrastructure | Protecting your OAuth credentials and API keys |
| Encrypting data in transit (TLS) and at rest (Render volumes) | Not sharing bearer tokens or ci_-prefixed keys |
| Patching dependencies and responding to CVEs | Rotating API keys if compromise is suspected |
| Rate limiting, input validation, and injection defense | Using HTTPS for all API requests |
| Incident response and vulnerability disclosure | Reporting security issues to ask@collapseindex.org |
19. Security Program
CI-1T maintains a documented security program with the following governance structure:
- Named security owner: Alex Kwon (Founder) serves as the designated security lead responsible for all security decisions, incident response, and control maintenance.
- Annual risk assessment: A formal threat-model review of all components is conducted annually, covering new features, dependency changes, and evolving attack surfaces.
- Quarterly access review: OAuth provider configurations, PocketBase admin credentials, Render access, and Stripe dashboard permissions are audited quarterly. Unused credentials are revoked.
- Change management: All code changes require pull request review. Security-relevant changes (auth, payment, rate limiting, prompt injection) are flagged for additional scrutiny. Direct pushes to
mainare prohibited for security-sensitive paths. - Security training: As a solo-founder operation, the security owner maintains currency through adversarial testing, CVE monitoring, and active participation in security communities.
20. SOC 2 Alignment
CI-1T aligns its controls with the SOC 2 Trust Services Criteria (Security, Availability, Confidentiality). While not yet formally certified, the following mapping demonstrates control alignment:
| SOC 2 Criterion | CI-1T Controls |
|---|---|
| CC6 - Logical Access | OAuth 2.0 delegation, per-request token validation, API key SHA-256 hashing, admin-only PB rules, per-user ownership enforcement, PATCH field whitelist |
| CC7 - Change Management | PR-based workflow, Dependabot alerts, CodeQL on PRs, Bandit/Semgrep static analysis, zero-downtime deploys |
| CC8 - Monitoring | Centralized audit logging (metadata-only), rate-limit event tracking, Render health checks, npm/pip/cargo audit pipeline |
| CC9 - Risk Mitigation | Defense-in-depth architecture, incident response SLAs, quarterly secret rotation, formal threat modeling, OWASP Top 10 alignment |
21. Key Management
API keys, secrets, and credentials follow a formalized lifecycle:
| Control | Implementation |
|---|---|
| Generation | User API keys (ci_-prefixed) generated via crypto.randomUUID() - 128 bits of cryptographic entropy. Server secrets use Render’s encrypted environment variable store. |
| Storage | API keys SHA-256 hashed at rest in PocketBase. Raw keys shown once at creation, never stored. |
| Rotation | Server-side secrets (xAI, Stripe, PB admin) rotated on a quarterly cadence or immediately upon suspected exposure. Production and development environments use separate credential sets. |
| Revocation | Users can disable or delete API keys via the dashboard. Disabled keys are rejected on the next request. Admin can revoke any key via PocketBase admin. |
| Compromise detection | Unusual rate-limit spikes and authentication failures are logged. GitHub secret scanning is enabled on all repositories to detect accidentally committed credentials. |
| Usage logging | API key usage recorded via audit logs (hashed key ID, timestamp, endpoint, status code). Raw keys never appear in logs. |
22. Access Governance
- Role-based access: Three access tiers exist - (1) end users (OAuth, dashboard features), (2) API key holders (programmatic access, scoped permissions), (3) admin (PocketBase admin, Render console, Stripe dashboard). Each tier has distinct permissions with no overlap.
- Principle of least privilege: The Rust engine has zero access to user data, databases, or network. Dashboard API routes only access the specific PocketBase collections they need. No service account has broad permissions.
- Admin MFA: PocketBase admin access requires credentials stored in Render’s encrypted environment. Render console access is protected by the provider account’s MFA. Stripe dashboard requires its own MFA.
- Offboarding: When a team member leaves (or in a solo-founder scenario, if the project transfers ownership): all admin credentials are rotated, OAuth provider configurations are reviewed, Render access tokens are regenerated, and Stripe API keys are rolled.
- Quarterly access audit: All active admin sessions, OAuth provider configurations, and API key counts are reviewed quarterly. Dormant credentials are revoked.
23. Log Governance
Audit and application logs follow formal governance:
- Access restriction: Application logs are written to Render’s managed log stream. Only the Render account owner can access log data. Logs are not accessible to end users or API consumers.
- Data classification: Logs contain metadata only - timestamps, service names, event types, hashed identifiers, HTTP status codes, and latency. PII (emails, tokens, message content) is never logged.
- Retention: Render retains log data for 7 days. For compliance-sensitive deployments, log forwarding to a customer-managed SIEM or long-term store can be configured at the Render level.
- Tamper resistance: Logs are managed by Render’s infrastructure and are append-only from the application’s perspective. The application cannot modify or delete previously written log entries.
- Review cadence: Logs are reviewed as part of the quarterly security audit, with particular attention to authentication failures, rate-limit events, and unusual traffic patterns.
- Alerting: Render provides built-in health check failure alerts. Rate-limit threshold breaches are logged with sufficient detail for post-incident analysis.
24. Security Roadmap
The following hardening milestones are planned or in progress:
| Milestone | Status | Target |
|---|---|---|
| Strict Content Security Policy | Shipped | v1.8 (Feb 2026) |
| SOC 2 control alignment documentation | Shipped | v1.8 (Feb 2026) |
| Formal access governance & key management policy | Shipped | v1.8 (Feb 2026) |
| Unicode NFKC normalization for prompt injection | Planned | Q2 2026 |
| Persistent webhook idempotency (DB-backed) | Planned | Q2 2026 |
| Distributed rate limiting (Redis) | Planned | Q2 2026 |
| SBOM generation (CycloneDX) per build | Planned | Q3 2026 |
| Daily PocketBase backups (RPO < 24 hr) | Planned | Q3 2026 |
| Annual third-party penetration test | Planned | 2026 |
| SOC 2 Type I readiness assessment | Evaluating | 2027 |
25. Vulnerability Disclosure
We operate a responsible disclosure policy. If you discover a security vulnerability in any CI-1T component:
- Security contact: ask@collapseindex.org
- Acknowledgment: Within 48 hours of receipt.
- Scope: API, dashboard, PocketBase configuration, MCP server.
- Safe harbor: Security researchers acting in good faith will not face legal action for responsibly reported vulnerabilities.
Please do not publicly disclose vulnerabilities until we have had a reasonable opportunity to address them. We aim to resolve Critical issues within 24 hours and High issues within 7 days of confirmation.
26. Contact
For general security questions or to request this whitepaper in PDF format:
Collapse Index Labs™ · Alex Kwon · Santa Clara County, California