Some checks failed
CI / Lint, typecheck, test (pull_request) Successful in 5m40s
CI / Build container images (pull_request) Successful in 4m34s
CI / Auth e2e pack (pull_request) Successful in 9m7s
CI / Import/export fidelity gate (pull_request) Successful in 1m0s
CD / Deploy to Test (push) Blocked by required conditions
CD / Smoke tests against Test (push) Blocked by required conditions
CD / Promote to Int (push) Blocked by required conditions
CI / Auth e2e pack (push) Blocked by required conditions
CI / Import/export fidelity gate (push) Blocked by required conditions
CI / Build container images (push) Blocked by required conditions
CD / Build and push images (push) Has been cancelled
CI / Lint, typecheck, test (push) Has been cancelled
New pages take max(instance default, parent level); moving a subtree under a higher-classified parent raises every member below that level. No move-like path (reposition, trash-promote, purge-promote) lowers a level as a side effect — pinned by test. Raising is ordinary editorial work; lowering requires the dedicated capability canLowerClassification (pond-wide Pond Admin) in the central permission model. Both directions are audited (page.classification_raised/_lowered, catalogue v1.1) with old value, new value, actor and page. Co-Authored-By: Claude Fable 5 (1M context) <noreply@anthropic.com>
64 lines
3.1 KiB
TypeScript
64 lines
3.1 KiB
TypeScript
/**
|
|
* The audit event catalogue (issue #201): every action id the trail may
|
|
* carry, with the severity the stdout line is stamped with. This const is
|
|
* the CODE half of the published catalogue in
|
|
* `docs/architecture/audit-events.md` — `audit-catalogue.test.ts` fails
|
|
* whenever the two drift, so an id cannot be added, renamed, or removed
|
|
* without its documentation moving in the same commit.
|
|
*
|
|
* Compatibility promise (the reason this exists): ids are never repurposed.
|
|
* New events may be added (minor catalogue version); an id that stops being
|
|
* emitted is retired in the catalogue document, its meaning frozen forever —
|
|
* so an operator's SIEM rules survive our releases.
|
|
*/
|
|
export const AUDIT_EVENTS = {
|
|
'api.token_created': { severity: 'info' },
|
|
'api.token_revoked': { severity: 'info' },
|
|
'api.write': { severity: 'info' },
|
|
'audit.pruned': { severity: 'info' },
|
|
'auth.email_verified': { severity: 'info' },
|
|
'auth.login_failed': { severity: 'warning' },
|
|
'auth.login_succeeded': { severity: 'info' },
|
|
'auth.password_reset': { severity: 'notice' },
|
|
'auth.signup': { severity: 'info' },
|
|
'backup.restore_requested': { severity: 'warning' },
|
|
'backup.run_triggered': { severity: 'info' },
|
|
'backup.settings_changed': { severity: 'notice' },
|
|
'file.integrity_failed': { severity: 'critical' },
|
|
'grant.created': { severity: 'notice' },
|
|
'grant.deleted': { severity: 'notice' },
|
|
'job.triggered': { severity: 'info' },
|
|
'member.added': { severity: 'notice' },
|
|
'member.removed': { severity: 'notice' },
|
|
'member.role_changed': { severity: 'notice' },
|
|
'page.classification_lowered': { severity: 'warning' },
|
|
'page.classification_raised': { severity: 'notice' },
|
|
'plugin.installed': { severity: 'notice' },
|
|
'plugin.mode_set': { severity: 'notice' },
|
|
'plugin.pond_toggled': { severity: 'info' },
|
|
'plugin.uninstalled': { severity: 'notice' },
|
|
'pond.purged': { severity: 'notice' },
|
|
'quota.override_cleared': { severity: 'notice' },
|
|
'quota.override_set': { severity: 'notice' },
|
|
'settings.changed': { severity: 'notice' },
|
|
'setup.admin_created': { severity: 'notice' },
|
|
'setup.completed': { severity: 'info' },
|
|
'setup.preseeded': { severity: 'info' },
|
|
'setup.smtp_stored': { severity: 'info' },
|
|
'user.deleted': { severity: 'notice' },
|
|
'user.disabled_set': { severity: 'notice' },
|
|
'user.pseudonymized': { severity: 'notice' },
|
|
'user.site_admin_set': { severity: 'notice' },
|
|
'user.verification_resent': { severity: 'info' },
|
|
} as const satisfies Record<string, { severity: AuditSeverity }>;
|
|
|
|
/** Severity vocabulary of the catalogue — syslog-inspired, four levels are
|
|
* enough for rule routing (critical pages someone, warning feeds detection,
|
|
* notice is configuration drift, info is lifecycle noise). */
|
|
export type AuditSeverity = 'info' | 'notice' | 'warning' | 'critical';
|
|
|
|
/** A catalogued action id — the ONLY thing {@link AuditService.record}
|
|
* accepts, so an uncatalogued event cannot be emitted (compile-time), and
|
|
* the doc fence keeps the catalogue document in step (test-time). */
|
|
export type AuditAction = keyof typeof AUDIT_EVENTS;
|