Skip to content

SDLC & Quality

Field Value
Status live (current-state)
Owner DIR / INFRA
Applies to How Partile plans, builds, reviews, tests, and ships changes - across all idea worktrees and the data room.
Last updated 2026-06-10
Evidence Git history across partile-infra / partile-mobile / partile-ops / partile-cloudflare / partile-dataroom; Atelier idea/PR trails; smoke suites; mobile PR-19 parser tests (npm run test:parser); mobile PR-20 selector-contract tests (npm run test:selectors); mobile PR-21 automation seam checks (npm run test:automation); mobile PR-22 Maestro static checks (npm run test:maestro); ../policies/change-management-policy.md; ../procedures/release-review-procedure.md; ../control-register.md (OPS-04, GOV-01/03/04).

Current State

Partile is built through Atelier, a director/executor workflow over isolated Git worktrees. Change management via reviewed, version-controlled PRs is the actual operating practice (OPS-04 implemented; the change-management policy is the one policy marked adopted). Quality is enforced today by per-PR review, runnable smoke suites, and static checks - not by a full CI/security pipeline, which does not exist yet.

The Atelier workflow

  • Work is organized as ideas (infra, mobile, ops, cloudflare, dataroom), each a Git worktree, each advancing through numbered PRs.
  • Each PR carries a written spec.md (intent, constraints, acceptance criteria, out-of-scope). An executor implements; a director reviews.
  • The executor records a notes.md report (what changed, verification, deviations). The director's review produces a reflection.md and a decision.md (pass / revise). A revise pass addresses reflection items without expanding scope (e.g. infra PR-13's hardening revise; infra PR-12's folded-in fixture fix).
  • Worktree isolation keeps each idea's changes separate. Commit discipline is taken seriously enough that ops PR-8 was first held, then passed via a selected-file commit rather than let a whole-worktree commit sweep in unrelated dirty PR-7 deploy artifacts.

Review & release discipline

  • Changes land via reviewed PRs to main; main is the integration point and the audit trail (OPS-04).
  • The release-review procedure (../procedures/release-review-procedure.md) is the pre-merge checklist: spec/scope match, review done, tests pass, security review for sensitive surfaces (authz-in-SQL/no-IDOR, block separation, sanitized errors, consent-tier honoured), a secret/PII rg scan, git diff --check, control-register upkeep, decision-log entry, and counsel-queue capture.
  • Evidence upkeep (GOV-03, operational): every PR touching privacy/security/data/ML/safety/availability updates the relevant control row or states why it is unaffected. The data room accrues as a byproduct of shipping, not a pre-audit sprint. Material decisions are logged with date + rationale in READINESS.md (GOV-01, operational). This very pack follows the same per-PR/per-subject upkeep rule (README.md upkeep section).

Test & smoke strategy

The repo's established pattern is runnable smoke scripts, not a pytest harness (every infra PR ships app/<area>_smoke.py, run via docker compose run --rm api python -m app.<name>_smoke). Current backend coverage:

Smoke Proves
smoke, auth_smoke core API health; auth/session flow
presence_smoke boarding-pass-gated presence intake/validation (now-relative fixtures, manual/self-reported rejection, raw-field no-echo)
match_smoke, matching_smoke, conversation_smoke candidate gen/expiry, read paths
safety_smoke all 4 block-enforcement points, block teardown, report capture + sanitized 422, every retention class (incl. "recent matched conversation NOT prematurely deleted" and RETENTION_ENABLED=false no-op)
rate_limit_smoke 429+Retry-After, per-IP/per-user buckets, fail-closed 503 on Redis-down and on malformed config, RATE_LIMIT_ENABLED=false bypass
guardrail_smoke APP_ENV=production disables /internal/dev/*

Other current checks: mobile tsc --noEmit typecheck plus mobile npm run test:parser for synthetic BCBP parser coverage and npm run test:selectors for the stable QA testID namespace and npm run test:automation for the hard-gated local/dev automation seams and npm run test:maestro for headless static validation of the Maestro E2E flow suite; ops iac-check + tofu fmt -check / validate (scope-gated, credential-scan + out-of-scope scan); git diff --check on every PR; compileall on the backend. Live manual smoke (e.g. hammering an endpoint to observe 429) supplements the scripted suites.

Quality Posture Summary

  • Strong for an MVP: disciplined specs, reviewed PRs, isolated worktrees, meaningful smoke coverage of the security/safety/retention/rate-limit paths, named cross-user authz regression coverage, honest per-PR evidence upkeep, and a release checklist with a secret scan.
  • Not yet present: automated CI, automated security/dependency scanning, a formal test framework, operational runbooks/SLOs, and live/CI-enforced mobile E2E execution.

Known Gaps / Next Work

  • No automated CI pipeline. Smokes and checks are run manually/per-PR; security_regression_smoke.py now exists for SEC-15, but wiring it and the rest of the suite into CI is future work (ties to SEC-14/SEC-15).
  • No dependency/SAST scanning and no pre-launch pentest (SEC-14, M5); triage process is drafted (../procedures/vulnerability-triage-procedure.md).
  • Cross-user IDOR regression is manual, not CI-enforced yet (SEC-15) - infra PR-15 added the smoke and found/fixed a conversation block-predicate leak; CI enforcement remains future work.
  • No operational runbooks / SLOs / on-call (OPS-02) - deferred to the planned availability-and-operations.md once the GCP production posture has restore drill evidence, HA decisions, and an operating support model.
  • Incident response not yet exercised - policy + playbook drafted; a tabletop is required before private beta (SEC-13).
  • Mobile on-device testing partially complete (M1). Mobile PR-14 adds the iOS EAS dev-build/auth-smoke checklist; the physical iPhone EAS development build installed and real LinkedIn partile:// auth/deep-link smoke passed on 2026-06-08 after infra hotfix c91bd0f. Mobile commit a820543 records the iOS exempt-encryption declaration in app.json. Android EAS development-build harness exists from mobile PR-12, but emulator/device install and manual QA have not yet run. Mobile PR-18 adds the first physical iPhone product QA evidence: boarding-pass gate/no skip, camera preview, non-flight barcode fail-closed, safe synthetic boarding-pass barcode -> sanitized confirm -> verified presence -> Home/unlock, image import, and cancel/no-barcode/PDF fail-closed. PR-18 also fixed the observed scanner preview hard gate. Mobile PR-19 adds the first automated mobile QA layer: synthetic BCBP parser fixtures and npm run test:parser, covering valid derived-only output, fail-closed invalids, default TTL, malformed optional fields, and sanitized test output without raw payloads. Mobile PR-20 adds the second layer: a stable non-sensitive selector/screen-state contract and npm run test:selectors for auth, Home, boarding-pass gate, scan/import/confirm, candidates, conversations, and safety/report controls. Mobile PR-21 adds the third layer: hard-gated local/dev automation seams for in-memory QA sign-in, synthetic scan/import controls, and an in-memory presence/API path, plus npm run test:automation for the gate and non-sensitive fixtures. Mobile PR-22 adds the fourth layer: .maestro/ flows for QA sign-in, gate-locked, valid scan/import unlock, and scanner/import fail-closed paths, plus npm run test:maestro static validation. Live Maestro execution and CI wiring are still future work.
  • Commit-isolation tooling is still useful; ops PR-8 required a manual selected-file commit because normal atl pass stages the whole worktree.
  • Change management & release review: ../policies/change-management-policy.md, ../procedures/release-review-procedure.md.
  • Secure development: ../policies/secure-development-policy.md.
  • Vulnerability triage: ../procedures/vulnerability-triage-procedure.md.
  • Controls: ../control-register.md (OPS-04, GOV-01/03/04, SEC-14/15).
  • Backlog & decisions: READINESS.md (director-root).