Technology Diligence Pack¶
| Field | Value |
|---|---|
| Status | live (baseline pack - first 5 documents authored in dataroom PR-2) |
| Owner | DIR / INFRA |
| Applies to | The CTO / technology due-diligence pack: the narrative technical story behind Partile's controls, policies, and registers. |
| Last updated | 2026-06-14 |
| Review cadence | Per-PR when a document's subject changes (upkeep rule below); full pass annually once the platform stabilizes. |
Purpose¶
Give a diligence team, an enterprise security reviewer, or a prospective CTO hire a faithful current-state picture of the Partile platform: what exists, how it works, what evidence backs it, and what is knowingly incomplete. The tone is diligence, not pitch - "this is what exists, this is the evidence, these are the gaps." It complements the controls/policies/registers; it does not duplicate them.
Navigation tip: the static data-room intranet (
../intranet/index.html, open from disk) lists this pack as its "Technology diligence" entry point alongside the control register, registers, and product docs. The Markdown here remains canonical.
Honest scope (what is and is not true today)¶
Current platform state, by idea worktree:
- infra through PR-30 - backend (FastAPI/Postgres/Redis + worker) with
block/report enforcement, retention sweeps, shared Redis-backed rate limiting,
account erasure, cross-user authz regression coverage, and LinkedIn signed
id_tokenJWKS verification implemented and smoke-verified locally. PR-17 adds the consent-gated event foundation (user_consents,app_events,emit_event); PR-18 wires auth/presence/match/safety product hookpoints throughtry_emit_event; PR-19 adds workermatch.candidate_proposed/match.expiredhookpoints as actor-scoped T1 rows; PR-20 adds the k-anonymous T2 snapshot boundary; PR-21 implements the backend boarding-pass-gated/presencecontract and rejects manual/self-reported/unverified product presence; PR-22 implements backend message send and metadata-onlymessage.sent; PR-23 implements the in-window directory; PR-24 implements request-with-note connection requests and connection lifecycle events; PR-25 implements professional profile fields and intent tags; PR-26 implements internal-signal relevance ranking; PR-27 implements key-gated cached Claude match rationale; PR-28 implements key-gated advisory Claude profile interview; PR-29 implements the persistent accepted-connections list. PR-30 adds tagged pre-launch mock seed/purge tooling (users.is_seed) for production-like testing, with purge verification before GA. Post-PR-20 hotfixc91bd0faligns the LinkedIn OIDC issuer default to current provider metadata after the first iPhone auth smoke exposed the drift. Actual model training is still future. - mobile through PR-26 - React Native client; the API seam preserves
429+Retry-After, block/report safety UI is implemented, Android EAS development-build profiles plus an emulator/device QA checklist exist, and the app now exposes consent privacy choices foranalytics,ml_training, andmarketing. Mobile PR-14 adds the iOS EAS dev-build/auth-smoke checklist; on 2026-06-08 the physical iPhone EAS development build installed and real LinkedInpartile://auth/deep-link smoke passed after infra hotfixc91bd0f. Mobile commita820543records the iOS exempt-encryption Info.plist declaration and checklist note. Mobile PR-15 adds the boarding-pass UI/state gate, removes manual presence creation, and fresh-checks presence before candidate/conversation product requests. Mobile PR-16 adds camera barcode scan, on-device BCBP parsing, sanitized confirmation, and document-verified presence creation without raw barcode retention. Mobile PR-17 adds Photos/Files image import through local barcode decode, the same confirmation/submission path, cache-copy cleanup, and fail-closed unsupported/ PDF/non-image states. Mobile PR-18 physically verifies the iPhone product path (auth, boarding-pass gate/no skip, camera preview, non-flight barcode failure, safe synthetic boarding-pass barcode -> sanitized confirm -> verified presence -> unlock, image import, cancel/no-barcode/PDF fail-closed) and fixes the scanner preview hard gate by removing prematureCameraView.isAvailableAsync()failure while preserving sanitizedonMountError. Mobile PR-19 adds the first automated parser QA: synthetic BCBP fixtures plusnpm run test:parser, proving valid derived-only output, fail-closed invalids, default TTL, and no raw payload/PII fields in parser results or test output. Mobile PR-20 adds the stable QA selector/screen-state contract: centralized non-sensitivetestIDs,npm run test:selectors, anddocs/mobile-qa-selectors.mdcovering auth, Home, boarding-pass gate, scan/import/confirm, locked/unlocked product surfaces, and safety/report controls without product behavior changes. Mobile PR-21 adds hard-gated local/dev automation seams (__DEV__plusEXPO_PUBLIC_PARTILE_QA_AUTOMATION=1): in-memory QA sign-in, synthetic scan/import controls, an in-memory presence/API seam for the gated MVP, andnpm run test:automation. The flag is default-off and absent from EAS/app config, so the seam is not a beta/product bypass. Mobile PR-22 adds the first app-specific Maestro E2E scaffold (.maestro/) plusnpm run test:maestrostatic validation for QA sign-in, gate-locked, valid scan/import unlock, and fail-closed negative paths. Mobile PR-23 implements message composer/send; PR-24 implements the directory screen plus local-only stars; PR-25 implements request-with-note, incoming/outgoing requests, accept-to-conversation, and block/report on directory plus incoming-request cards; PR-26 implements profile headline/summary/intent-tag editing. Live Maestro execution, Android install/manual QA, mobile AI interview UI, and propose-to-meet remain operator-owned/future. - ops through the GCP production stack plus selfheal PR-1 -
partile-ops: infra/envs/prod-gcp/defines the live production runtime inpartile-prod/europe-west2: Cloud Run API, scheduled Cloud Run Jobs, Cloud SQL PostgreSQL private IP with backups/PITR, Memorystore Redis on the private VPC, Secret Manager, dedicated service accounts, GCS remote state, Artifact Registry, and Cloudflare Worker origin rewrite forapi.partile.app. selfheal PR-1 adds the privateremediation-responderCloud Run service in SHADOW mode (ENFORCE=false), alert delivery from Cloud Monitoring throughpartile-prod-remediation-alerts, least-privilege responder/Push invoker service accounts, and the keylesspartile-controldirector prod-access path with theottoprocess-separation caveat tracked as an open action. The earlier AWS ECS/Fargate staging path is superseded / not adopted; its account-levelRunTaskblocker no longer blocks production. - cloudflare through PR-5 plus live publication consistency update - a dev
API tunnel still exists for local/manual auth testing; production API traffic
uses the ops-tracked Cloudflare Worker at
api.partile.app; the data-room intranet is published atdataroom.partile.appthrough Cloudflare Pages and protected by Cloudflare Access. - GCP production exists, but no real user data, no operational SLO/on-call process, no completed third-party pentest, and no SOC 2 / ISO 27001 certification. Current production is a low-cost MVP posture; HA upgrades, restore drills, staging-before-GA, seed purge-before-GA, remediation shadow-to-enforce, and control-plane identity hardening are open items.
Documents¶
| # | Document | Status | Covers |
|---|---|---|---|
| 1 | architecture-overview.md |
live | Components, request/worker flows, trust boundaries |
| 2 | data-architecture.md |
live | Persisted data classes, Redis ephemera, retention/erasure, event/ML boundary |
| 3 | security-architecture.md |
live | Auth/session, authz, intake hardening, rate limiting, safety, secrets/TLS, gaps |
| 4 | infrastructure-and-deployment.md |
live | Local/dev, GCP production, Cloudflare API/data-room edges, superseded AWS path, open items |
| 5 | sdlc-and-quality.md |
live | Atelier workflow, review/release discipline, test/smoke strategy, quality gaps |
| 6 | availability-and-operations.md |
planned | SLOs, restore drills, HA/DR, on-call/runbooks (deferred - needs operational maturity) |
| 7 | ml-platform.md |
planned | Event pipeline, consent gating, anonymization boundary, model lifecycle |
| 8 | scalability-plan.md |
planned | Capacity model toward 1M users; datastore scaling |
Documents 6-8 are deliberately not written yet: availability/ops needs restore-drill, SLO/on-call, and HA decisions to mature, and ML/scalability need firmer event/capacity assumptions. They remain planned follow-ons.
Reading order¶
architecture-overview.md- the map.data-architecture.md- what data exists and how it is governed.security-architecture.md- how it is protected and where it is not yet.infrastructure-and-deployment.md- where it runs (and what is blocked).sdlc-and-quality.md- how changes land and how quality is assured.
Relationship to the rest of the data room¶
The pack references, it does not re-author. Each document links to the
control register (../control-register.md), the relevant policies
(../policies/*.md), procedures (../procedures/*.md), registers
(../registers/*.md), the evidence register (../evidence/evidence-register.md),
and - by path label - the director-root readiness narratives
(readiness/*.md, which live outside this worktree by design).
Upkeep rule¶
When a PR materially changes a subject covered here (architecture, data model,
security posture, deployment, or the development process), the author updates the
relevant document's Current State / Evidence / Known Gaps sections and
its Last updated date - same per-PR discipline as the control register
(../policies/change-management-policy.md).
No-secrets reminder¶
This pack is Tier 1 (Git-safe). No secrets, credentials, .env values,
token-bearing URLs, OAuth/handoff codes, full ARNs, raw cloud JSON, image
digests, or raw account identifiers. Safe labels (DATABASE_URL,
REDIS_URL, APP_ENV, RATE_LIMIT_*) are fine; values are not. Public
project DNS names (e.g. the dev tunnel hostname) may appear as already-public
context. See ../policies/data-classification-and-handling-policy.md.