Regulatory & scientific awareness
Affinis is a demonstration. It is not a validated GxP system, it has no qualification or validation package, and nothing here is a compliance claim. What follows is what the app implements, and what it deliberately does not.
ALCOA+ — what each principle means here
- Attributable
- Every write carries the acting user; the demo has no login, so the header's menu names who is acting and that name goes on the record. System actions are attributed to `system` with the engine version that produced them.
- Legible
- Units are never implicit, timestamps are ISO 8601 in UTC to the second with the zone written out, numbers follow one set of rules in one module, and a missing value is an em dash with its reason — never a zero.
- Contemporaneous
- The server's clock stamps every record at the moment it is written. A client's time is never trusted and never stored.
- Original
- Raw well values are write-once: the database refuses UPDATE and DELETE on them through a trigger, not through application code. The source file's SHA-256 is kept beside them.
- Accurate
- The 4PL engine and the QC metrics are tested against reference values computed independently with SciPy, and every derived value can be recomputed from the raw data plus the parameters stored next to it.
- Complete
- Masked wells stay visible, struck through and counted (“19 / 20 points”). Rejected fits stay readable. Superseded versions stay readable. Nothing is ever deleted.
- Consistent
- One audit trail, in sequence, hash-chained in the database so a removed or altered row breaks the chain — and the app can prove it has not, on demand.
- Enduring
- PostgreSQL with append-only tables. The nightly demo reset is the single exception: it truncates and reloads the committed synthetic seed, and reports itself.
- Available
- The audit trail is a page, each record carries its own history, and the raw data exports as CSV with the demo banner repeated in it.
The frameworks this is modelled on
- 21 CFR Part 11 (FDA) — electronic records and signatures
- Sets what an electronic record and an electronic signature must carry to stand in for paper: the signer's identity, the meaning of the signature, the time, a link to the exact record, audit trails, and controls over who may do what.
- In Affinis: the signature stores its meaning, the signer re-authenticates every time, the manifestation shows name, meaning, UTC time and a SHA-256 of the signed record, and approval locks the record so a correction must be a new version with a stated reason.
- EU GMP Annex 11 — computerised systems
- The European counterpart: risk management, validation, data integrity, audit trails that are reviewed, and controls for change and configuration.
- In Affinis: the audit trail is append-only and reviewable as a screen, derived data is versioned with its parameters, and every significant design decision is written down as an ADR in the repository.
- OECD GLP — good laboratory practice
- Governs how non-clinical safety studies are planned, performed and reported: raw data, study director, SOPs, archiving.
- In Affinis: raw data is immutable and traceable, and every result carries the method and the engine version that produced it. Affinis is a discovery tool, which is upstream of GLP, and says so.
- Assay Guidance Manual (NCATS/NIH)
- The reference for assay quality: Z′, signal window, control variability, and when a plate should be rejected.
- In Affinis: the QC rules below, applied automatically, with an override possible only through a signed exception.
Assay QC — the rules this demo applies (QC-STD v3)
| Metric | Rule | What it tells you |
|---|---|---|
| Z′-factor | ≥ 0.5 | How well the controls separate relative to their scatter. Above 0.5 an assay is considered excellent for screening. |
| Signal window | ≥ 2 | The usable separation between the controls, in units of the high control's own variability. |
| Signal / background | ≥ 3 | The ratio of the two control means — a coarse check that the assay is responding at all. |
| CV high control | ≤ 10 % | Scatter of the uninhibited wells; a high CV points at dispensing or reading. |
| CV low control | ≤ 10 % | Scatter of the fully inhibited wells, where the signal is small and relative noise grows. |
| Masked wells | ≤ 5 % | How much of the plate was excluded. Past a few percent, the plate is being rescued rather than read. |
A plate failing any rule is rejected automatically. The thresholds are the conventional ones from the Assay Guidance Manual; Z′ is Zhang, Chung & Oldenburg (1999).
What Affinis does not claim
- Validation. There is no URS, no IQ/OQ/PQ, no traceability matrix and no validation report.
- Qualified infrastructure. This runs on one small server with no qualified hosting, no disaster-recovery plan and no change-control board.
- Identity. There is no login, no identity provider, no password policy and no account lockout; the signature's password check is simulated and the dialog says so.
- Segregation of duties. Anyone can act as anyone from the header menu — the opposite of what a real system must enforce.
- A tamper-proof store. The audit chain detects alteration; it does not prevent it. A database superuser can still disable a trigger, which is why real systems add privilege separation and WORM storage.
- Real data of any kind. Every compound, result, decision and person in this app is invented.