ExamNovaDocumentation
Offline readyChangelog
Developer guide

Extend ExamNova without weakening assessment trust.

Start with the boundary affected by your change. Each module names the responsibility, data flow, invariants, failure modes, safe extension approach, required tests, and release gate.

MaintainerIntegratorSecurity reviewer

Architecture

Keep the public webroot narrow, controllers thin, domain decisions testable, tenant context explicit, and private files authorized.

Self-hosted deployment layoutThe public webroot exposes only public assets while application code, private storage, and environment configuration stay outside it.BrowserPublic webrootLaravel appPrivate storageDatabaseQueue / mail
Self-hosted deployment layout. The public webroot exposes only public assets while application code, private storage, and environment configuration stay outside it.

Tenant and permission rules

Authentication, institute membership, permission, ownership, and record state are separate required checks.

Tenant authorization request flowEvery protected request must pass authentication, institute membership, permission, ownership, and record-state checks.RequestAuthenticateInstitutePermissionOwnershipStateAction
Tenant authorization request flow. Every protected request must pass authentication, institute membership, permission, ownership, and record-state checks.

Assessment state

Revisions, snapshots, attempts, evidence, marks, moderation, publication, and documents preserve the decisions that produced a result.

Marking and publication stateObjective and manual marks become a result only after required review, moderation, approval, and publication.Auto markManual markModerateApprovePublishDocument
Marking and publication state. Objective and manual marks become a result only after required review, moderation, approval, and publication.

Security boundary

Treat content, files, external URLs, SSO claims, webhook payloads, provider responses, and update artifacts as untrusted.

REST and CSV integration contract

Use stable external IDs, validation, idempotency, conflict reports, auditable runs, and published-only outbound results.

Assessment integration flowExternal IDs enter through validated runs; only finalized results leave through controlled exports.SourceValidateMap IDsConflict reportAssessmentPublished resultExport
Assessment integration flow. External IDs enter through validated runs; only finalized results leave through controlled exports.

UI, jobs, and files

Keep server authorization authoritative, jobs retryable, files private, and failures recoverable.

Testing

Test tenant isolation, state transitions, adversarial input, idempotency, recovery, and the complete seeded assessment journey.

Extension points

Extend through complete domain contracts, not isolated UI controls or unscoped queries.