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.mdreport (what changed, verification, deviations). The director's review produces areflection.mdand adecision.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;mainis 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/PIIrgscan,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 inREADINESS.md(GOV-01,operational). This very pack follows the same per-PR/per-subject upkeep rule (README.mdupkeep 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.pynow 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.mdonce 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 hotfixc91bd0f. Mobile commita820543records the iOS exempt-encryption declaration inapp.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 andnpm 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 andnpm run test:selectorsfor 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, plusnpm run test:automationfor 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, plusnpm run test:maestrostatic 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 passstages the whole worktree.
Links¶
- 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).