ZERONE GRC
Core GRC
GovernanceRisk ManagementCompliance ManagementControlsPolicy Management
Security & Operations
Incident ManagementAsset InventoryEvidence ManagementIntegrationsReports & Dashboards
Assurance & Continuity
Vendor RiskBusiness Continuity / BIAAudit & FindingsAction PlansData Inventory
Explore the platformPricing
Security & Compliance
ISO 27001CIS ControlsNIST CSFNIST 800-53PCI DSS
Privacy & Governance
GDPRSOC 2COBITITILISO 22301 / BCM
Internal & Local
Internal PoliciesLocal RegulatoryData ClassificationBCM RequirementsCustom Frameworks
See framework coverage
By team
For GRC TeamsFor Information SecurityFor Risk ManagementFor Compliance Teams
By use case
For Internal AuditFor IT OperationsFor Executive ManagementFor Vendors / Third Parties
Explore the platformHow it works
Administrator Documentation

ZERONE Platform Administration Guide

How to administer the platform, module by module — Discovery, CMDB, inventory, configuration compliance, risk, controls, evidence, remediation, endpoint agent, DLP, SIEM and reporting. This guide is written from the real implementation; every capability is markedImplemented Partial Planned Not Found so you never rely on behaviour the platform does not yet provide.

Build 1.9.6Audience: Admins · GRC · Security · AuditorsCyber governance, from Zero to One

1Platform Overview

Zerone is an integrated GRC + cybersecurity governance platform. It unifies asset discovery, a continuously-validated CMDB, multi-domain inventory (software / data / accounts), configuration-benchmark compliance, a central risk register with policy/control/framework mapping, evidence and audit readiness, remediation, an on-host endpoint agent, DLP decisioning, SIEM forwarding and reporting — moving an organization from fragmented, manual security to unified, measurable, control-driven governance.

Architecture

  • Frontend: static HTML + per-page JavaScript served by the FastAPI app.
  • Backend: FastAPI + SQLAlchemy; SQLite by default, PostgreSQL supported. Two API generations coexist — prefer /api/v1/* (legacy /api/* lacks separation-of-duties + audit on some routes).
  • Optional Redis: caching / sessions / throttling, with transparent in-memory fallback (single-worker installs run without Redis).
  • Endpoint agent: a real OS service (Windows/Linux/macOS) that registers over TLS and posts collector data.
  • Background daemons: discovery scheduler, inventory-refresh scheduler, SIEM forwarder, license heartbeat.
Discovery (credential scan / agent) → CMDB (asset created/updated, lifecycle status) → Enrichment: Software / Data / Account inventory + Config-Compliance → Findings → Risk Automation → Risk Register (mapped to policy/control/framework) → Remediation + Evidence + Exceptions → Notifications + SIEM forwarding + Reports + Audit log

2Core Concepts

TermMeaning in Zerone
AssetA configuration item (assets) with ip/mac/os, owner, BU, environment, criticality and lifecycle status.
CMDBThe authoritative asset inventory + its reachability/credential/managed lifecycle and history.
DiscoveryCredential- and agent-based detection of live hosts and facts; never installs anything silently.
Service credentialVault-stored credential (WinRM/SSH/SNMP/API) for read-only scans; secret encrypted, never shown.
AgentThe real on-host Zerone service that collects, and (with a connector) enforces DLP.
Control / Risk / Policy / FrameworkSafeguard / exposure entry / governing document / standard with domains-requirements.
Evidence / Finding / Remediation / ExceptionProof artifact / detected gap / assigned fix / time-bound approved acceptance.
Drift event / Freshness statusDetected change between snapshots / whether inventory is up to date.

3Roles & Responsibilities Implemented

A rank-based RBAC matrix (role → module → action → scope) resolves the permissive union across a user's active roles; scope order all > assigned > dept > own > none. ~27 customer roles across 4 ranks + vendor-only roles. Segregation of Duties is enforced on role assignment (18 seeded rules; conflicts hard-blocked).

Recommended roleActual role(s)RankScope
Platform Administratoradministrator, grc_admin3Full platform
Security Architectsecurity_architect2Discovery/CMDB/controls
GRC / Compliance Managergrc_manager, compliance_manager, ciso2–3Frameworks/controls/programs
Risk Managerrisk_manager2Risk register
Auditorauditor, external_auditor, soc_analyst1–2Read + evidence review
System Administratorit_manager, asset_manager, operator2Assets/discovery/agents
Asset / Control / Evidence Ownerasset_manager, control_owner, evidence_owner1–2Assigned / own
Business Unit Ownerdept_manager2Department
Read-only Executiveexecutive_viewer, board_viewer, readonly0Dashboards/reports only
Vendor (external)vendor_* rolesVendor Portal only

4Access Control & Administration

CapabilityStatusNotes
User creation / scoped role assignmentImplementedUsers & Admin APIs; SoD pre-check on assignment.
RBAC (role→permission)ImplementedMatrix + permission engine.
ABAC (attribute/BU scoping)PartialModel + evaluator exist but not wired into requests — advisory. BU scoping today = RBAC scopes.
MFA (TOTP) / SSO (Entra/OIDC) / LDAP-ADImplementedTOTP+QR; OIDC auth-code + group→role; ldap3 + shadow provisioning.
Sessions / login throttling / JWTImplementedIdle+absolute lifetimes; per-IP+account lockout (needs Redis for multi-worker durability).
Service-account rotation lifecyclePlannedapi_integration role exists; rotate credentials operationally.

5Dashboards Implemented

Executive dashboard + analytics read aggregate KPIs: open/critical risks, compliance %, inventory freshness, discovery status, remediation status. Drops in compliance % = new failed checks; rising stale % = growing blind spots; overdue remediation = accountability gaps.

NoteAnalytics date/dept/module filters were removed — they were never backed by the API. Reports export to XLSX/CSV (no PDF / no scheduling).

6Discovery Implemented

A discovery profile (the schedule) carries: target (CIDR/IP/list), ports, frequency, credential(s), business unit, environment, scan window, probe methods, allowed ports, enrichment scope, max concurrency (32), timeout (5s), missed-scan threshold (3), stale-days (30). Scans are bounded TCP-connect probes; no aggressive scanning by default; scanning does not require a credential (credential is only used to authenticate/enrich). Hostname = NetBIOS + cleaned reverse-DNS, overridden by the credential/agent OS name.

Create profile → scheduler runs due profile → TCP probe (only "up" hosts recorded) → reconcile: IP match → UP (reset misses); no match → dedup ladder (MAC 95 / fingerprint 85 / hostname 60) strong → move asset (no duplicate) · weak → owner review · none → create ONBOARDING CANDIDATE (review_required — NOT a managed/production asset) → in-scope not detected → missed++ → NOT_SEEN → DOWN (threshold) → prolonged → RETIRE_CANDIDATE (never auto-deleted) → (auto_connect) credential probe → success promotes candidate to onboarded (opt-in) / failed → stays a candidate → enrichment of ONBOARDED, authenticated, stale assets → risk bridge + notifications (new host, cred fail)
Trust boundaryReachability ≠ authentication ≠ onboarding. A host that merely answered a probe is not a managed CMDB asset — it is anonboarding candidate (onboarding_state=review_required, managed_status=discovered,environment=unknown, not authorized). It becomes managed only after a successful credential authentication on an opt-in schedule or an explicit approval. SeeCMDB → Onboarding candidates.
LifecycleEvery change is written toasset_status_history (append-only); reachability transitions raise drift events.Nothing is auto-deleted. CMDB statuses: UP · DOWN · NOT_SEEN · NEW_HOST · UNKNOWN · credential SUCCESS/FAILED/UNAUTHENTICATED/NOT_CONFIGURED · managed MANAGED/DISCOVERED/EXCLUDED/RETIRE_CANDIDATE/RETIRED · admin DECOMMISSIONED.

Surfaces: discovery.html; /api/discovery/{summary,drift,review-queue,candidates,retire-candidates}, /assets/{id}/history.

7CMDB / Assets Implemented

What the CMDB is

The CMDB (assets, cmdb_inventory.html, /api/assets) is the authoritative inventory of every managed asset and the single source of truth the rest of the platform builds on (inventory, compliance, vulnerabilities, risk, ISMS scope). Each asset carriesfour independent lifecycle axes, deliberately kept separate:

AxisColumnMeaning
Reachability (network)current_reachability_statusup / down / not_seen / new_host / unknown
Credential (auth)credential_statussuccess / failed / unauthenticated / not_configured
Managed (governance)managed_statusmanaged / discovered / excluded / retire_candidate / retired
Onboarding (trust)onboarding_statethe discovery-candidate decision lifecycle (see below)
Core ruleReachability is not authentication, and authentication is not onboarding approval. A discovered host is never silently classified as a managed production server — it enters as a candidate and must be authenticated and/or approved before it becomes a managed asset.

The end-to-end pipeline

From first sight of a host to a governed risk, every stage is explicit, auditable and reversible:

Discovery probe → identity match / dedup → Onboarding Candidate (review_required) → credential authentication (safe, scoped) → onboarding decision (auth on opt-in schedule, or human approve) → managed CMDB asset → authenticated enrichment (software / accounts / data) → vulnerability + configuration benchmark → findings → Risk Automation → canonical Risk Register (grc_risks) → remediation Action → verify → close

Onboarding candidates & the decision

Newly-discovered hosts appear in the Onboarding Candidates panel at the top ofcmdb_inventory.html. A candidate is not a managed asset: it is created withstatus=candidate, managed_status=discovered, environment=unknown,criticality=low, not authorized, and onboarding_state=review_required.

Candidate lifecycle: detected → identity_matching → credential_matching → authentication_succeeded / authentication_failed → review_required → approved_for_onboarding → onboarded / rejected / ignored.

Approve

Onboards the host as a managed, active CMDB asset (managed_status=managed, status=active, authorized). Do this once you have confirmed it is a real, in-scope asset.

Reject

Excludes the host (managed_status=excluded,onboarding_state=rejected). The row is kept for audit — nothing is deleted.

Ignore

Acknowledges the host (ignored) and hides it from the queue without onboarding it.
Auto-onboardA discovery schedule configured toauto-connect with a credential is treated as the operator's explicit opt-in: a successful authentication promotes the candidate straight to onboarded. A failed auth leaves it a candidate for a human to decide. Every decision records the actor, time and reason inasset_status_history.

Credential safety

Authentication uses scoped Credential Vault service accounts (WinRM for Windows, SSH for Linux/mac), with three safety controls:

ControlBehaviour
Scoped resolutionOnly a credential whose IP-range covers the host is used — the resolver refuses an out-of-scope credential (no spraying an arbitrary secret at a host).
Auth-failure breakerRepeated auth rejections increment consecutive_auth_failures and back off exponentially (auth_backoff_until), so a wrong stored credential can never keep tripping a target's account-lockout.
Real connection testPOST /api/credentials/{id}/test runs a genuine OS-appropriate WinRM/SSH probe when a target is known. Secrets are never returned, logged, or shown in any response or error.

Collection & honest freshness

Onboarded, authenticated assets are enriched by one shared engine (software → vulnerability → accounts → configuration → data). Per-module outcomes are tracked on the collection job, and asset freshness is honest about partial failure:

PrincipleIf any attempted module fails, the asset is marked partial (not fresh) and last_refreshed_at is notstamped — so it stays due and retries. Only the modules that actually succeeded are snapshotted. A failure in one collector never falsely marks the asset (or another module) successful.

Configuration-benchmark assignment

The configuration benchmark (CIS) for an asset is resolved deterministically: an explicit per-asset assignment wins, else the active policy matching the asset's OS family (and version). If the OS is unknown or no policy matches that OS, the asset is left unassigned — it is never scored against a benchmark for the wrong OS (e.g. a Linux host against a Windows baseline), and a benchmark is never chosen "because a vulnerability was found".

Risk unification — one canonical register

Every automated risk source — configuration failures, framework non-conformity, external-scanner CVEs, inventory drift and asset-posture — now writes the single canonical Risk Register(grc_risks) through the shared risk bridge, deduplicated so the same condition seen by two paths converges onto one risk (an external-scanner CVE and the built-in scan collapse together). Closure is verification-gated — a passing re-scan, a scanner "not-seen" or a reviewed drift closes the linked risk, and a human-edited risk is never auto-closed.

MigrationThe legacy per-asset risk_registerrows are preserved read-only with an optional canonical_risk_id link; no register is duplicated and nothing is destructively rebuilt.

Reachability, retirement & history

Assets not seen across scans go not_seen → down (threshold-gated) and, after prolonged absence, become retire candidates surfaced in a separate panel. Nothing is ever auto-deleted — a human keeps, retires (soft, kept for records) or deletes (rank 3). Every reachability / credential / managed / onboarding change is appended toasset_status_history.

The CMDB screen

cmdb_inventory.html shows, top to bottom: platform metrics, security-coverage and freshness strips, the Onboarding Candidates panel (approve / reject / ignore), the Retire Candidates panel, and the main asset table with reachability / credential / managed / onboardingbadges, filters and per-asset detail. All confirmations use the platform's styled dialog and toast — never native browser pop-ups.

CapabilityStatus
Onboarding-candidate queue + approve/reject/ignore (audited, never deletes)Implemented
Create/update (manual + auto), owner/BU/env/criticality editImplemented
Duplicate prevention / dedup ladder / uncertain-match review queueImplemented
Status history + reachability/credential/managed/onboarding columns + retire queueImplemented
Never auto-delete (down → retire-candidate; delete = human, rank 3)Implemented
Rich asset-type auto-classification (full taxonomy)Partial

Supporting Assets Register — governance overlay

The Assets & Inventory → Supporting Assets page (supporting_assets.html) is the canonical register of everything that supports the organisation's services and information — not just discovered technical systems, but external services, people/roles, organizational architecture and physical facilities. Because the CMDB Asset requires a unique IP and a technical schema, it cannot hold non-technical assets; the Supporting Assets Register is therefore agovernance overlay — a SupportingAsset (SA-####) with an optional1:1 link to the CMDB asset. Technical inventory/software/accounts/vulnerabilities stay authoritative in CMDB (linked, never copied); ownership, governance category, related services, service impact, information-asset dependencies, operational lifecycle and review live here.

  • 15 governance fields: ID · name · description & purpose · governance category (7, separate from the technical type) · owner (+department/vendor) · environment (5) · location/host/platform (readable summary + structured details) · stored Information Assets (M2M) · related Service (M2M → the Services Register / bcm_products) · service impact (5, per service) · operational status (5) · inventory/registration number (text) · last review · notes.
  • Services come from the existing Services Register (IaaS/Co-location/BaaS/DRaaS/Sima/… areseeded idempotently); overall impact is derived as the highest active service impact.
  • Manual + automated: register manually (non-technical assets need no IP/host/OS), or ingest viaPOST /supporting-assets/observe from discovery/agent/credential/cloud/import. Modes:propose_only (reconciliation queue), auto_create_draft (default — unverified),auto_create_active (policy-gated; never activates an incomplete record).
  • Identity & no duplicates: matches on CMDB link / external id / (source, record)idempotency key / name — never IP alone. Verdicts exact/probable/conflict/new; a Reconciliation Inbox lets an analyst merge/create/ignore/defer. Re-scans never duplicate an asset.
  • Field authority: inventory refresh updates observation fields (last seen, collection/credential status, technical location) but never overwrites a confirmed governance field, reduces service impact, removes an owner, or cancels an asset. Discovery does not cancel an unreachable asset.

How it works, day to day

  1. Register. Assets & Inventory → Supporting Assets → fill name + governance category; save asPlanned (default) or Active. Non-technical assets (people, external services, org units, facilities) need no IP/hostname/OS. To go Active, an internal owner or responsible department + a category are required.
  2. Enrich in the drawer. Open a row → tabs for Information Assets (link what the asset stores/processes/hosts), Services & Impact (link services from the Services Register and set a per-service impact — the overall impact is derived as the highest active),Technical (CMDB), Provenance, Reviews, History.
  3. Discovered assets flow in automatically. The existing Subnet Discovery → Live Host → Credential → Collection → Risk pipeline is unchanged; a discovered technical host is ingested viaobserve as an unverified draft (or a reconciliation proposal) and auto-linked to its CMDB record — never duplicated on re-scan. An analyst confirms governance fields and flips it to Active.
  4. Reconcile. The Reconciliation Inbox tab lists automation proposals with observed-vs- confirmed conflicts; merge to a confirmed asset, create a draft, ignore or defer.
  5. Review & export. Record reviews (cadence-driven next-review + overdue), and export the 15-column Azerbaijani CSV.

CMDB linking — link ≠ add to CMDB

The Technical (CMDB) tab lets you link an existing CMDB record 1:1 (search by asset id / name / IP → Link; Unlink to detach). It does not create a CMDB row and cannot push a non-conforming asset into CMDB — the endpoint accepts only an existing CMDB asset (404 otherwise) and rejects a record already linked elsewhere (409, one-to-one). Only link when the supporting asset has a real technical counterpart in CMDB (e.g. “Core banking DB” → db01). Assets that donot correspond to a CMDB record — people, external services, org architecture, physical facilities — are not added to CMDB; they live in the Supporting Assets Register unlinked. That separation is the whole point of the overlay: non-technical assets are never forced into the CMDB's IP/host schema.

AttentionWhat to watch: (1) governance category isseparate from the technical CMDB type, service impact from CMDB criticality, and operational status from reachability/credential/collection state — don't conflate them. (2) A confirmed manual field (owner, category, environment, impact) is protected from automated overwrite; automation only fills empty fields and raises a conflict for the rest. (3) A lower service impact or a cancellation is neverautomated — it needs an authorized manual change (with reason + audit). (4) An unreachable asset stays operationally Active until a person changes it; discovery never cancels it. (5) Reference a real CMDB counterpart via the CMDB link, not by typing an IP into the location field.
RoleSupporting Assets access
administrator / grc_adminFull (incl. archive)
asset_manager / it_managerCreate/update/review/reconcile/import/automation (no hard delete)
compliance_managerManage information-asset relationships (ISMS)
risk_manager / cisoRead + link + export
auditor / soc_analyst / vuln_managerRead + export
executive_viewerRead only
RestartThe Supporting Assets endpoints and tables are new — a restart applies the additive migration (5 tables) and serves the routes; existing CMDB assets and IDs are preserved. Full reference: docs/supporting_assets/.

Endpoints

GET /api/discovery/candidates (onboarding queue) ·POST /api/discovery/assets/{id}/onboarding?action=approve|reject|ignore (rank-gated, audited) · GET /api/discovery/{summary,review-queue,retire-candidates,drift} ·GET /api/discovery/assets/{id}/history ·POST /api/credentials/{id}/test · GET/POST /api/assets… ·GET/POST /api/v1/supporting-assets….

8Credentials / Service Users Implemented

Vault credentials (CredentialVault): type, username, AES-GCM secret_enc, port, IP-range scope. Matching is strict — exact-IP → narrowest CIDR (+ optional type); a credential whose scope does not cover the host is refused rather than tried. WinRM (Windows) / SSH (Linux) via host_agent; the working credential is remembered and auto-resolved per asset. Repeated auth failures trip an exponential back-off breaker so a wrong credential can't keep hammering a target's lockout. POST /api/credentials/{id}/test runs a real OS-appropriate probe. All usage is written to credential_usage_logsnever the secret, in any response, log, audit line or error.

RuleUse least-privilege read-only service accounts, scope each by IP range, and review credential-failure notifications. Automated rotation isPlanned — rotate operationally.

9Inventory Auto-Refresh Implemented

Re-verifies existing assets on a schedule using the auto-resolved credential (or agent), snapshots inventories, and raises drift. Never deletes inventory. Freshness statuses: Fresh · Due Soon · Stale · Refresh Failed · Unreachable · Credential Failed · Unknown · Disabled.

asset in CMDB → refresh schedule → connect → collect software/data/accounts → compare with previous snapshot → update current + store history → drift event → (significant) auto Risk + Action
CapabilityStatus
Manual per-asset refresh + freshness/history/dashboard (credential auto-resolved per asset)Implemented
Scheduled auto-refresh (per-asset or bulk; frequency by criticality or explicit); daemon picks next_refresh_atImplemented
Drift detection — hashed snapshot diff → drift events (software added/removed/version-changed, account added/removed, privileged account added, sensitive data found/removed)Implemented
Drift review panel + KPI; triage each event Accept / Remediated / False positive (manager, rank 2)Implemented
Auto-raise — a security-significant drift (privileged account / sensitive data) idempotently opens a Risk + a remediation Action, linked back; reviewing the drift resolves themImplemented

Surface: inventory_refresh.html; /api/inventory-refresh/* (incl. /drift,/drift/summary, /drift/{id}/review). Data is stored already-masked; snapshots never delete live inventory. The drift table is shared with the Discovery module's reachability/host drift.

10Software Inventory Implemented

CapabilityStatus
Current (software_installs) vs history separated; added/removed/version-changed events at ingestionImplemented
Normalization + dedup key (Chrome/(x64)/version → one title)Implemented
Server-side pagination/filter/sort/search (page_size 50, max 200), N+1 removed, 13 indexesImplemented
Redis (in-memory fallback) dashboard cache, invalidated on scan/editImplemented
Unauthorized / outdated / EOL flagsImplemented
Async export for very large reportsPlanned (today: bounded 5000-row export)

11Data Inventory Implemented

Scans allow-listed paths, classifies sensitive data, stores masked findings — full sensitive values are never persisted.

CapabilityStatus
Approved-path scope, content-vs-metadata scan (file-type policy)Implemented
Card (Luhn) / IBAN (MOD-97) / AZ-FIN / secrets/API-key/PEM detectionImplemented
Classification labels + auto-label thresholds; masked evidenceImplemented
PII (email) Partial (phone/passport defined, not invoked)
Biometric/health/payroll (admin rule-driven)Partial
Findings → risk (manual), review/exception workflowImplemented

12Account Management Implemented

CapabilityStatus
Collect local users/groups; local-admin/sudoers/root/service/stale detection; risk scoring; findingsImplemented
Masked identifiers; no passwords/hashes storedImplemented
Findings auto-linked to GRC Risk Register / task enginePartial
Account drift / privileged-group-change detectionNot Found

13Configuration Compliance Implemented

Tabs: Dashboard · Benchmark Library · Parser Review · Asset Scan · Scan Results · Manual Review · Exceptions · Remediation · Reports.

Upload benchmark PDF → parse (read-only extraction) → Parser Review → approve → generate policy + checks (approved_for_execution = false) → assign to asset → credential scan (read-only) → results (per-check) → severity-weighted score → failed checks → auto risk + remediation task → re-scan auto-closes on pass → framework rollup bridge
SecurityRemediation never auto-executes; PDF scripts are never run (read-only extraction only); generated checks default to non-executable/manual-review; credential scans are read-only and audited. Reports =client-side CSV; no Settings tab.

14Risk Register Implemented

PrerequisiteExternal framework catalogs (ISO/NIST/CIS/PCI) are not code-seeded — an admin must create them before mapping risks to requirements.

Risk Register — the central register

The Risk Register (grc_risks, /api/v1/risks) is the authoritative register of enterprise risks. Each risk carries a server-generated reference (RISK-0001), an owner, an inherent and residual rating, a treatment/response, links to the mitigating controls, mappings to policies/frameworks, and a full governed lifecycle with review cadence and audit trail. Menu: Risk Management → Risk Register.

Architecturegrc_risks is the single canonical register. Every automated source — configuration failures, framework non-conformity, external-scanner CVEs, inventory drift and asset-posture — is funnelled into it by the risk bridge, deduplicated so the same condition never forks a duplicate. The legacy asset-levelrisk_register is retained read-only for history (with an optionalcanonical_risk_id link); new automated risks are no longer written there.

The workspace

The page is a multi-tab workspace: Dashboard · Risk Register · Incidents ·Control Register / Control Assessment · Residual Risk & Response ·Action Plan · Risk Taxonomy · KRI / Fine-Kinney · Treatment Plans ·Proposals · Reviews · Analytics · SLA · Audit Trail ·Categories · Risk Rating Tables. The register table has filters + a heatmap; opening a risk shows its detail (assessment, treatment, controls, compliance mappings, lifecycle, history).

Risk taxonomy & categories

Risks are classified by a hierarchical taxonomy (grc_risk_categories, managed on the Categories / Risk Taxonomy tabs) — parent/child categories with severity mapping, owner and colour. A risk references one category; the taxonomy drives grouping, heatmap breakdowns and reporting.

Registering a risk

Create a risk (POST /risks): the reference RISK-#### is generated server-side. Fields: title, description, threat scenario, category, owner (required), reviewer, department, asset scope, inherent likelihood & impact, identified date, target closure date, tags. A new risk starts in the Draft/Registered lifecycle state.

Extended register fields — how it works

A supplied 29-column register was compared column-by-column against the canonical platform; only the genuinely missing fields were added (additive), and everything the platform already had was reused — the detailed lifecycle, methodologies and versioned assessments stay canonical. Day to day:

  1. Identity & ownership. Give the risk a title + owner as before. New: record theperson reporting the risk — a platform user, or free text for an external reporter (e.g. a pentest firm). This is separate from the owner/reviewer/creator; a resolved reporter is stamped reporter_source=manual, and automated risks are stampedreporter_source=communication_method=automation.
  2. Communication method. Pick how the risk was communicated — Platform / Email / Meeting / Phone / Ticket / Formal report / Automation / Other. Choosing Other reveals a required note. The list is served from one server-side taxonomy (GET /risks/communication-methods), not hardcoded in the page.
  3. Assets & information. Keep the technical asset scope as before, and link stored Information Assets (POST /risks/{id}/information-assets) — one may be marked primary; classification and C/I/A/Cr are read live from the Information Asset Register, never copied.
  4. Threat / nonconformity / master / incident links reuse the existing relationship registers (Threat Register, Risk Findings, master-child relationships, incident links) — nothing is duplicated.
  5. Methodology & scoring are unchanged and server-authoritative: Standard 5×5 (likelihood × impact), ATV-500 (threat_likelihood × nonconformity_severity × asset_total, 1–500) and Fine-Kinney. The completeness report is now methodology-aware — ATV-500 factor checks apply only to ATV-500 risks, so a 5×5 risk is never dinged for them.
  6. Status & dates. The detail view keeps the detailed lifecycle as canonical and derives a coarse Open/Closed compatibility view, plus the last assessment date from the current versioned assessment. Export CSV (button on the register) emits the 21 Azerbaijani columns.
AttentionWhat to watch: (1) reporter is not the owner — don't reuse one for the other. (2) Updating the Threat Catalog or a source finding doesnot silently rescore existing risks; a material upstream change routes the risk to the reassessment queue instead. (3) Residual risk is reduced only by approved control assessments — a mapped control without an approved assessment changes nothing. (4) The coarse Open/Closed value is a compatibility view only; closing a risk still enforces the full governance workflow (treatment, residual, evidence, approval). (5) C/I/A/Cr come from the Information Asset valuation — edit them in the valuation workflow, not by hand on the risk. Full reference: docs/risk_register_extended/.

Inherent vs residual & the rating matrix

Risk is scored on a 5×5 matrix: likelihood and impact each 1–5 (Very Low · Low · Medium · High · Very High); score = likelihood × impact (1–25); the score maps to a rating band (Low / Medium / High / Critical). Inherent = before controls; residual = after the mitigating controls are considered.

LevelValueColourFinancial-loss band (AZN, bank context)
Very High5red> 1,500,000
High4orange500,000 – 1,500,000
Medium3yellow150,000 – 500,000
Low2light-green50,000 – 150,000
Very Low1green0 – 50,000

The impact scales (financial, capital, EBITDA, safety, …) and rating bands are configurableon the Risk Rating Tables tab. A Fine-Kinney method (probability × exposure × consequence) is also available for the KRI / operational-safety context.

NoteRating thresholds can differ between the manual register and the automation engine — this is a deliberate calibration, not a bug.

Treatment, response & residual

Each risk gets a response (response_type): mitigate ·accept · transfer · avoid, with response notes. Treatment is planned on Treatment Plans / Action Plan tabs (linked to corrective actions), and theResidual Risk & Response tab records the post-treatment residual rating. Proposalssupport a propose→review workflow for treatment decisions.

Risk acceptance & exceptions

Accepting a risk (POST /risks/{id}/accept) records the accepting authority, acceptance date, rationale and an acceptance expiry (so acceptance is time-boxed and re-reviewed).

Separation of dutiesA risk owner registers and proposes, but acceptance requires risk_manager or higher — an owner cannot self-accept their own risk. Expired acceptances surface as a governance flag for re-decision.

Controls linkage

Risks link to the mitigating internal controls (grc_risk_controls,/risks/{id}/controls): each link carries the control's effectiveness(effective/partial/ineffective/not_tested), a relationship type(primary/supporting/compensating/preventive/detective) and coverage. This is the same authoritative Control Library — a control's assessed effectiveness informs the residual rating.

Compliance & policy mappings

The Compliance tab maps a risk to governance context (grc_risk_mappings,/risks/{id}/mappings) with a mapping type — violates · impacts· mitigated_by · related_to — targeting a framework requirement, policy document, internal control or clause, with an optional gap description. Picker source:GET /risks/mapping-options. This ties a risk to the requirements/policies it threatens or is mitigated by, feeding compliance rollups.

KRIs (Key Risk Indicators)

KRIs (/risks/kris) are measurable indicators with thresholds (green/amber/red) linked to a risk; measurements (/kris/{id}/measurements) are recorded over time so a breached threshold signals rising risk. The KRI / Fine-Kinney tab manages them.

Lifecycle, review cadence & governance

A risk moves through a governed lifecycle (lifecycle_status): Draft → Registered → Under Review → Treatment Planned → Treatment In Progress → Pending Evidence → Pending Approval → Accepted / Exception Approved / Mitigated → Closed, plus Overdue · Reopened · Cancelled. Actions:/review (advances the review cadence), /close, /reopen,/escalate. Every status change, review and date change is written to append-only history (risk_status_history · risk_review_history ·risk_date_change_history). Missing/overdue review dates surface as governance flags.

Risk automation — findings become risks

The Risk Automation engine converts technical findings (vulnerability, configuration-compliance, account, data, software, asset-governance, framework and discovery collectors) into scoredgrc_risks entries — via rules on Risk Rules (auto-create risk/task; notify on new risk). Imports: POST /risks/import/from-vulns|from-controls|from-alerts.

finding (vuln / config / scan) → rule match → score (L×I, asset-criticality/EDR/severity adjustments) → rating gate → upsert grc_risks (auto_created=true, risk_source, related_module/asset, dedupe_key) → notify + optional remediation task
Deliberate gateA finding is materialised as a riskonly when it scores High or Critical; Medium/Low findings are recorded on Risk Findings(and can be linked to a risk manually). Rule flags alone don't create a risk — the runtime rating decides. Auto-created risks use an AR-##### reference and default toresponse_type=mitigate.

Auto-created risks are de-duplicated by a dedupe_key (occurrence count + first/last seen) so a recurring finding updates one risk instead of spawning duplicates, and they carry risk_source/related_* so their origin is traceable. Manual edits to an auto-created risk are preserved.

Heatmap, dashboard & analytics

Server-side widgets: GET /risks/heatmap (likelihood×impact grid),/risks/dashboard and /risks/statistics (by status/rating/category, above appetite, overdue review, missing owner, expiring acceptances), plus the Analytics andSLA tabs for trend and treatment-timeliness reporting.

Roles & permissions

ActionRole
View risksread on the risk module
Register / edit own riskrisk_owner (assigned scope), risk_manager
Review · close · reopen · escalaterisk_manager+
Accept a risk (SoD — not the owner)risk_manager or higher (ciso approves cross-domain)
Map to framework/policy/controlrisk_manager
Configure rating tables / taxonomyrisk_manager / grc admin

Enforced on the backend; administer via /api/v1/risks/* (the legacy assetrisk_register routes are technical/asset-scoped).

Risk methodology — opt-in, versioned (5×5 · 1–500 · Fine–Kinney)

Alongside the default Standard 5×5, the platform offers an opt-in, versionedrisk-scoring layer. It does not change the canonical register, recalculate existing risks, or create a second register — every existing risk stays on STANDARD_5X5 and a risk uses another methodology only when it is explicitly scored with one. Administer it fromRisk → Risk Methodology (risk_methodology.html).

ProfileFormulaRange
STANDARD_5X5 defaultLikelihood × Impact1–25
ASSET_THREAT_VULNERABILITY_500Threat Likelihood × Nonconformity Severity × Information-Asset Total Rating1–500
FINE_KINNEYFrequency × Probability × Severity0–2400

For the 1–500 methodology: Asset Total Rating = C + I + A + Authenticity (each 1–5 → 4–20);Residual = Inherent × (1 − Overall Control Effectiveness) (effectiveness 0.00–0.90). Level bands, with a boundary value belonging to the higher band: Very Low ≤99 · Low 100–174 · Medium 175–249 · High 250–350 · Very High ≥351.

  • Server-authoritative scoring. The workspace calculators (Inherent / Asset Total / Residual) call the engine; the stored score is never taken from the client. Each version stores its formula, factor scales, thresholds and rounding as JSON — configurable without code changes.
  • Versions are immutable once published. Edit a draft, then Publish (→ Active, retiring the prior Active) or Retire. A risk records the exact version it was scored with, so history stays reproducible.
  • Supporting registers: Threat Catalog (/risk-threats), versioned Information-Asset Valuations with the Authenticity dimension (/asset-valuations), Risk↔Finding links with an asset-integrity check (/risk-finding-links), and manual nonconformities (/manual-nonconformities).
  • Governance: Risk Appetite thresholds (/risk-appetite — the 1–500 and 5×5 scales get separate ceilings), master/child relationships, risk↔incident links, and aRisk Governance Config whose enforcement flags default OFF:enforce_sod_on_acceptance (owner can't self-approve), require_evidence_for_residual,residual_requires_approval (approver ≠ owner). Enabling a flag changes behaviour only from that point on.

Importing the IT/InfoSec register. Risk → Risk Methodology → Register Import: (1) Parse the .xlsx; (2) Analyze — the importer recomputes every score and reports each row as create / update / error plus discrepancies. It does nottrust the file's numbers (e.g. a file inherent of 277 where 4×4×18 = 288 is flaggedinherent_mismatch; a C+I+A+Authenticity that ≠ the file's asset total is flaggedasset_total_mismatch); nothing is written. (3) Apply — idempotent upsert by risk ref (re-running never duplicates), optionally also creating the threat, nonconformity, risk↔finding link and master/child relationship.

RestartThe methodology endpoints are new — an applicationrestart is required to serve them (the page picks up on reload). All methodology writes require risk_manager+ (version publish/retire and appetite/config: grc_admin+) and are audited.

Threat Register — catalog, observations & controlled automation

The lightweight Threat Catalog in Risk Methodology is the quick editor; the fullRisk → Threat Register (threat_register.html) is the canonical register. Its central rule is a clean separation of three concepts — a catalog record is a reusable definition, not an occurrence:

  • Catalog (/risk-threats, TH-####) — reusable threatdefinitions with the full nine-taxonomy classification (category · source · intent · purpose · vector · target · consequence · detection source · likelihood 1–5), lifecycle and review cadence. Feeds the ATV-500 threat-likelihood factor. Curate one row per distinct threattype — never one per alert.
  • Observations — the actual security signals (SIEM, vuln scan, incident, CERT, vendor). Idempotent by source + record id: a repeated signal bumps the occurrence count and last-seen, it never duplicates the catalog threat. An observation is unmapped until an analyst (or an automation rule) links it to a catalog threat.
  • Automation Inbox — automation proposes, an analyst decides: map to an existing threat, create a draft, merge, reject or defer. Ingest runs in one of three modes —propose_only (default; nothing touches the catalog), auto_map_observation(maps only on an exact fingerprint match) or auto_create_draft (adds a draftthreat, kept out of authoritative scoring until reviewed).

Duplicate detection uses a deterministic fingerprint (normalised name + resolved category/source/intent/purpose/vector/target + external ref) returning exact,probable or new — surfaced as a non-blocking warning on manual create and via a Check-for-duplicates button. Taxonomies are server-authoritative (codes stored, AZ/EN labels + import aliases central); unknown legacy free-text is preserved and flagged aslegacy, never rewritten. A threat's drawer links Targets (assets / processes / services / departments / vendors / subjects), extra taxonomy values, Risks, Controls(effectiveness read live), Observations and Reviews. Export emits the 14 Azerbaijani columns (UTF-8 BOM, injection-safe), and is audited.

The engine never silently rescores existing risks. Likelihood changes are explicit, stamped and recorded in threat history; ATV-500 and historical reproducibility are untouched.

RoleThreat Register access
administrator / grc_adminFull (incl. retire + automation ingest)
risk_manager / cisoCurate catalog, relationships, reconcile, review, export (no retire / no ingest)
soc_analystAs above + run automation ingest (execute)
compliance_manager / auditor / vuln_manager / asset_managerRead + export
executive_viewer / board_viewerRead only
RestartThe Threat Register endpoints and tables are new — an application restart applies the additive migration (15 catalog columns + 7 tables) and serves the routes. Existing TH-#### records and IDs are preserved. Seedocs/threat_register/ for the full reference.

Nonconformity Register — Uyğunsuzluqlar reyestri

The Nonconformity Register (nonconformity_register.html,/api/v1/nonconformities) is the platform's single canonical record of a nonconformity (ISO 27001 cl. 10) — a detected gap or violation against an asset, requirement or control. It is backed by the existing risk_manual_nonconformities table (modelManualNonconformity), promoted to a first-class register rather than a new duplicate module: risks, findings, corrective actions and controls reference the canonical record. Severity (1–5) feeds the ATV-500 methodology's Nonconformity-Severity factor.

How it differs from neighbouring concepts. A finding/vulnerability is raw technical evidence; an issue is a generic remediation ticket; a nonconformityis the governed, audited assertion that a requirement/control is not met; a risk is the potential impact; a CAPA/Action is the corrective work. A nonconformity can be raised from a finding, generate a risk candidate, and be remediated through the Actions/CAPA workflow — each as a link, never a copy.

  • Identity — an immutable, server-generated business ID NC-YYYY-######(race-tolerant; the browser never allocates it). Imported legacy IDs are accepted only after a uniqueness check. The legacy NC-#### ref is preserved.
  • Fields — title, description, category, target object type, affected asset (explicit kind + canonical id → Information / Supporting / CMDB asset; the register always shows the current canonical asset name, not a stale snapshot), violatedrequirement (registered → grc_requirements/framework clause, or a controlled external free-text ref; multi-link, dedup-protected), detection source, timezone-awaredetected-at, optional CVSS (version/vector/base/source — never auto-mapped to severity), canonical numeric severity 1–5 with provenance, stable status codes, polymorphic responsible party (user / department / LDAP group / internal group, with a display snapshot so it renders even if LDAP is offline), remediation plan, review dates and notes.
  • LifecycleQiymətləndirilir → Açıq → Aradan qaldırılma mərhələsində → Qismən aradan qaldırılıb → Bağlanıb, plus Qəbul edilib (accepted). All transitions are enforced server-side. Close requires a closure summary, verification result and either evidence or an approved evidence exception. Accept requires justification and an expiry/next-review date; a severity 4/5 record cannot be accepted by its own creator (separation of duties). A severity change requires a justification and is audited.Reopen (from closed/accepted) requires a reason. Optimistic locking (version counter) blocks lost updates.
  • TraceabilityCreate Risk Candidate raises a draft risk (human-validated in the Risk Register) and links it via RiskFindingLink — it never duplicates a risk and passes severity/asset/evidence as structured inputs (it does not silently overwrite likelihood or asset value). CAPA creates/links an Action(source_type=nonconformity) and advances the record to remediation. Comments/evidence use the platform's polymorphic mechanism. A full history + formal review trail (reviewer, decision, prev/new severity + status) is kept; last_reviewed_at advances only on a formal review, not on every edit.
  • Register UI — server-side summary KPIs (total / per-status / high-severity / overdue remediation / overdue review / automation candidates), server-side filtering, sorting and pagination, active-filter chips, and a filtered/authorised CSV export emitting the 18 Azerbaijani columns (UTF-8 BOM, formula-injection-safe, audited). Taxonomies are server-authoritative (codes stored; AZ/EN labels + import aliases central); unknown legacy values are preserved and flagged for reconciliation, never rewritten.
RoleNonconformity Register access
administrator / grc_adminFull (incl. delete + taxonomy/automation admin)
compliance_manager / auditor / cisoFull operational lifecycle: create/update/assign/review/accept/close/reopen/link/import/export (no hard delete)
risk_manager / security_architectRead + export + review + assign + raise risk candidate (no create/close)
asset_manager / vuln_manager / soc_analyst / it_manager / dept_managerRead + export
executive_viewer / board_viewerRead only
RestartThe register promotes an existing table — arestart applies the additive migration (≈50 new nullable columns onrisk_manual_nonconformities + 3 child tables nc_history/nc_reviews/nc_requirement_links+ an Issue.nonconformity_id cross-link) and a one-time guarded backfill that generatesNC-YYYY-###### ids and maps legacy status/source codes forward. Existing rows andNC-#### refs are preserved. The ISMS "Open nonconformities" KPI now counts this canonical table (previously it counted all open Issues). See docs/nonconformity_register/.Phase 2 (planned): automation-candidate inbox, import wizard, notifications/SLA.

15Policy, Framework & Control Library Implemented

CapabilityStatus
Framework domains/requirements; policy create + versioning + acknowledgementsImplemented
Control library/create/owner; control↔framework / control↔risk / control↔evidenceImplemented
Framework compliance rollup (conformity %, gaps → auto-risks)Implemented
Separated status model + stored effectiveness (Control Library v2)Implemented
Framework library seeded with ISO/NIST/CIS/PCIPartial (admin creates)
Policy clause→framework mappingNot Found
GuidanceAdminister via /api/v1/* — legacy control/evidence routes omit SoD + audit.

Control Library — the canonical register

The Control Library is the single, canonical register of internal controls. Every other module references it — never re-creates it: framework requirements, the ISMS Statement of Applicability, compliance programs, the risk register, evidence, control testing, audits & findings, issues & actions, exceptions, and assets/services/departments. Configuration Compliance provides an automated assurance signal for controls but does not own them. Menu: Compliance & Controls → Control Library.

ConceptAnswersLives in
Framework requirementWhat is required (ISO A.8.9, CIS-1.1.1)grc_framework_domains
Internal controlHow the org satisfies one or more requirementsgrc_controls
Framework mappingThe link between a control and its requirementsgrc_control_mappings
Control implementationWhere/how the control is deployed (M365, VPN…)grc_control_implementations
PrincipleCIS benchmarks stay in Configuration Compliance — never added as internal controls or a Control-Library framework. A control maymap to a CIS requirement and consume its results as a signal.

The separated status model

A control's condition is described by four independent fields — a single mixed "status" is the anti-pattern this removes. A control can be active yet not implemented andnot assessed, so the library never claims a control works just because it exists. The legacy status column is kept only as a mirror of lifecycle status.

FieldQuestionValues
LifecycleWhere is it in its life?draft · pending_approval · active · suspended · retired · archived
ImplementationIs it actually in place?not_implemented · planned · partially_implemented · implemented · not_applicable
AssessmentHas it been tested?not_assessed · assessment_planned · assessment_in_progress · assessed · reassessment_due · overdue
EffectivenessDoes it work?not_assessed · effective · partially_effective · ineffective

Assessment ≠ governance review · effectiveness

Two deliberately decoupled activities. Recording an assessment never advances or completes the governance review, and vice-versa.

Control assessment / testGovernance review
QuestionImplemented correctly & operating effectively?Still necessary, owned, scoped, mapped & scheduled?
UpdatesAssessment cadence + effectiveness (on approval)Review cadence + governance history
EndpointPOST /controls/{id}/testsPOST /controls/{id}/review
Key ruleEffectiveness is set only from the latestapproved assessment, approved by someone other than the tester (SoD). No approved assessment → not_assessed. Historical pass-rate / consecutive failures / overdue reassessment are separate indicators, never the effectiveness value.

Roles & permissions

Enforced on the backend via the permission matrix (module controls); the UI mirrors it via grc-permissions.js and hides any action the API would reject.

ActionPermission
Viewread
Create / edit draftcreate / update (owner-scoped roles limited to their controls)
Approve & activate · complete review · retireapprove
Record assessmentupdate
Approve assessment (independent)approve
Delete (draft & unreferenced only)delete + GRC administrator
Exportexport

Main screen & KPIs

Five grouped KPI card sets are computed server-side (GET /controls/portfolio) — never from the loaded page — each with a tooltip and clickable drill-down that reuses the metric's own backend filter (so count and drill-down always agree): Portfolio · Implementation · Assurance · Evidence · Governance. The filter bar covers lifecycle/implementation/effectiveness/assessment/ type/enforcement/framework/owner plus flag filters; active filters show as removable chips; search is debounced; pagination/sorting are server-side.

Creating a control · validation

The reference (CTL-####) is generated server-side (concurrency-safe). New controls start as Draft. Validation distinguishes blocking errors from advisory warnings:

Blocking errorsNon-blocking warnings
Invalid vocabulary value; maturity outside 1–5; retired/archived without a reason.Active control without owner or next review date; automated control without an automation/monitoring source; owner also reviewer/approver (SoD).

Lifecycle & approval workflow

Draft ──submit──▶ Pending approval ──approve──▶ Active ──▶ Suspended / Retired ──▶ Archived ▲ │ └──────reject────────┘ (returns to Draft with a reason)

Reject requires a reason (→ Draft). Retire requires a reason and returns an impact summary; the control stays visible in historical reporting. Delete is GRC-administrator-only and limited to draft & unreferenced controls — anything with references or history is retired, never physically deleted. Every transition is recorded in the status history + audit trail.

The details drawer (10 tabs)

TabShows
OverviewStatus strip (lifecycle/implementation/effectiveness/assessment/approval), objective, owners, dates, counts.
Implementations & ScopeWhere the control is deployed (M365, VPN…); scope, owner, status, next assessment.
Framework MappingsRequirement-driven mappings (see below).
RisksRisks mitigated — ref, title, ratings, owner, status, relationship & coverage (read-through).
EvidenceRead-through of the Evidence module + coverage summary.
Assessments & TestsRecord assessments, approve, effectiveness, config signal.
Findings & ActionsAudit findings & corrective actions linked to the control.
ExceptionsApproved/expiring/expired exceptions scoped to the control.
Lifecycle & ApprovalsApproval status, workflow buttons per state/permission, status + review history.
Audit TrailEvery recorded action with actor & time.
UXAll confirmations use styled platform dialogs — no native alert/confirm/prompt popups.

Framework mappings — requirement-driven

Mappings link a control to real framework requirements — you never type a reference.

Pick a framework

The requirement picker loads that framework's requirements.

Choose a requirement

Grouping/theme headings are shown but disabled — pick a leaf requirement.

Set mapping type & rationale

satisfies · partially_satisfies · supports · compensating.

Map

The requirement ref is derived from the code; the action is audited. Wrong-framework / theme / duplicate mappings are rejected.

Assessments · evidence coverage · config signal

  • Assessments (POST /controls/{id}/tests): date, result, method, reviewer, population/sample, notes. A fail auto-raises a linked corrective-action Issue. Approval by a different user sets effectiveness.
  • Evidence coverage: read-through of the Evidence module — required / approved-valid / missing / expiring / expired + coverage %. Rejected and expired artifacts are never counted as valid.
  • Configuration-Compliance signal: for a control mapped to requirements that config checks also cover, the latest results roll up into an informational pass/partial/failsignal on the Assessments tab. It is a signal only — it does not set effectiveness.
control mapping (domain) → config_check_requirement_map → configuration_policy_checks → latest configuration_assessment_results (per check, per asset) → passed / failed / warning → signal

ISMS SoA integration

ISMS coverage is derived from the authoritative Control Library: a requirement isimplemented when a mapped control has implementation_status='implemented'(lifecycle active alone is not proof), and a control is effective wheneffectiveness='effective' (its latest approved assessment). These roll up into the SoA implementation-coverage / control-effectiveness / evidence-coverage percentages.

Exports & reports

All server-side and permission-aware (controls:export), each writing an audit event; evidence file contents are never exported: current filtered view, full library, framework mapping report, control assurance report, evidence gaps report, overdue reviews report.

Migration & backfill (existing installs)

New columns are added additively on startup and a one-time, idempotent backfill maps the legacystatus onto the four new fields — conservatively (it never claims implementation/effectiveness the legacy record doesn't evidence). Back up the database before the first migrated start.

legacy statuslifecycleimplementationassessmenteffectiveness
activeactivenot_implementednot_assessednot_assessed
implementedactiveimplementednot_assessednot_assessed
effectiveactiveimplementedassessedeffective
ineffectiveactivenot_implementedassessedineffective
under_reviewactivenot_implementedassessment_in_progressnot_assessed
testedactivenot_implementedassessednot_assessed
retiredretirednot_applicablenot_assessednot_assessed

Troubleshooting

SymptomCause / fix
New fields/endpoints missing after an updateRestart the server to load backend changes & apply migrations (static frontend updates immediately).
KPI count and drill-down disagreeThey share the same server filter — the page is stale; Refresh.
Effectiveness stays not_assessed after a testThe assessment must be approved by a different user.
Can't delete a controlDelete is GRC-admin-only and draft & unreferenced only — retire instead.
A requirement is greyed out in the pickerIt is a theme/heading row — pick a leaf requirement.
Assessment didn't change the review dateCorrect — assessments and governance reviews are separate.

16Evidence Implemented

Use the v1 evidence API: multipart upload with checksum/size/mime, source (manual/automated), owner, validity (valid_from/valid_until), approval withseparation of duties (submitter ≠ approver, mandatory reject comment), and an audit trail. Map evidence to controls/requirements/risks. Track expiry to keep evidence current.

17Remediation

Remediation spans Actions (actions.html), config-compliance tasks, risk tasks and CAPA. Tasks carry owner, due date, priority and source. Config-compliance auto-verifies and closes the risk/task when the check later passes.

NoteDiscovery raises remediation Actions via agent reconciliation. DLP does not auto-create tasks Not Found.

18Exceptions Implemented

Config-compliance exceptions (risk acceptance, expiry, active = counts compliant), DLP exceptions (multi-level security/compliance/admin approvals that short-circuit enforcement), data-classification and policy exceptions. Give every exception an expiry and review it — automatic expiry-enforcement is Partial.

NoteThe ISMS Exceptions Register (see ISMS) gives a single read-through view of all of these — plus risk acceptances and accepted vulnerabilities — from their authoritative sources, with expiry health, instead of a separate copy.

19ISMS (ISO/IEC 27001) Implemented

The ISMS module is a governance & assurance overlay: it references and aggregates the platform's authoritative modules (CMDB, Risk Register, Control Library, Evidence, Audit, Documents, Configuration Compliance) instead of keeping duplicate registers. Every dashboard metric carries its source and calculation. Surface: isms.html; /api/v1/isms/*. Full detail lives in the dedicated ISMS Administration Guide.

CMDB assets → ISMS Scope · ISO requirements + Control Library → Statement of Applicability · KRIs → Objectives · authoritative modules → auto-aggregated Management-Review inputs · six exception sources → Exceptions Register
Area (ISO clause)What it doesStatus
DashboardLive ISO status, risk, assurance & audit-readiness computed from authoritative modulesImplemented
Scope & Context (4.3)Define the ISMS boundary; add existing CMDB assets (never duplicates); approve then activateImplemented
Context & Parties (4.1/4.2)Internal/external issues + interested parties; feed the Management ReviewImplemented
Objectives & Metrics (6.2)Manual measurement or a live KRI-linked auto-metric; admin approvalImplemented
Statement of Applicability (Annex A)93 Annex A controls; applicability + justification; map to Control Library; coverage metricsImplemented
Management Review (9.3)Auto-aggregated 9.3.2 inputs; decisions raise tracked Actions; approval locks the reviewImplemented
CertificationISO certificate lifecycle + Stage 1/2/surveillance audit timeline with expiry healthImplemented
Exceptions RegisterUnified read-through of exceptions/waivers/risk-acceptances from six authoritative sourcesImplemented

Permissions. View = any authenticated user; create/update = Compliance Manager (rank 2); approve / activate / seed Annex A = GRC Admin (rank 3). Every state change is audited.

Information Asset Register — the canonical manual register

The Information Asset Register is the single, canonical record of the organisation'smanually-governed information assets (data sets, databases, documents, systems, physical media). It is distinct from the CMDB (discovered technical assets) — the register reuses CMDB assets as supporting dependencies, never duplicates them. Menu:Compliance & Controls → ISMS → Information Assets. Surface: isms.html (tab);/api/v1/isms/assets*.

Identity + sensitivity + ownership → C/I/A/Cr valuation → server-computed 4-level classification · links → Business Processes / CMDB assets / users & departments / vendors · current valuation → Risk Methodology (ATV-500) · classification → DLP-ready

Fields (manual · computed · discovered)

Manual (user-entered): asset ref (IA-####, auto or manual, unique), name, purpose, description, nature (digital/physical) & detailed type, storage/location, eight explicit Yes/No sensitive-data indicators (PII · bank/payment/insurance · biometric · salary · commercial · risk/incident/audit/vuln · board/committee minutes · other — the last requires a description),is_regulated + regulation types (orthogonal to classification), owner & internal users & external parties, business-process & supporting-asset links, C/I/A/Cr, retention (value + unit), status, review date.Server-computed (never client-trusted): total = C+I+A+Cr, the 4-level classification, completeness %.Proposed by discovery/classification (advisory): automated file-scan findings may proposea higher classification; they never silently lower an approved one — conflicts surface as review items.

Valuation & classification

C/I/A/Cr (each 1–5) are recorded as a versioned InformationAssetValuation (reused, not duplicated): editing them creates a new version and supersedes the prior — only one is current per asset; assessor/approver/status/rationale are retained; history is one click away. Classification is the higher of the total-band and the confidentiality band, on a strictfour-level scale:

LevelTotal 4–20Confidentiality
Public / Açıq1–51–2
Internal / Daxili6–103
Confidential / Konfidensial11–154
Restricted / Məxfi16–205

A sensitive-data flag forces C=5 → Restricted. The form shows a live preview (total-band, C-band, final, driver, explanation); the server always recomputes and validates.

RegulatedThe Data Classification / DLP subsystem keeps its own five-label set (including regulated) unchanged. In the register, regulatedis not a confidentiality level — it is orthogonal metadata (is_regulated + regulation types). A mapping helper collapses regulated/top_secret/criticalrestricted (capturing is_regulated) so a future DLP module consumes one clean 4-level value without any destructive rewrite.

Relationships

Four normalized many-to-many links (no comma-separated ID text), each scope-validated, deduped and audited: supported business processes (BCM Register), supporting assets (CMDB),internal users (users / departments / roles), external parties (registered vendors or a controlled free-text fallback). Managed from the asset's detail drawer with searchable selectors. An asset cannot be deleted while linked risks or active relationships exist — archive it instead.

Roles, audit & export

Permissions (module information_assets): Administrator / GRC Admin = full; CISO & Asset Manager = manage + approve (no delete); Risk Manager, Compliance Manager & Auditor = read + export; others = none. Every write is audited (isms.asset.*) with actor, timestamp, entity and changed fields. Export is a formula-injection-safe, UTF-8 CSV (audited) with the current valuation's C/I/A/Cr, total and classification. The list shows readable owner names (not raw ids), completeness and relationship counts.

Full field/API/migration detail: docs/information_asset_register/.

NoteThe Information Asset Register is now the authoritative manual register (writes re-activated behind the information_assets RBAC module). The other four legacy duplicate-register tabs (ISO Controls, Incidents, SOC Alerts, Cloud Posture) remainremoved from the UI with write endpoints returning HTTP 410 — use the authoritative module instead (Control Library, Incidents, SIEM, Configuration Compliance). Known items: the SoA counts 97 (93 controls + 4 theme headings) instead of 93, and two audit-readiness components read 100 % when there is no data — read the component breakdown, not just the headline score.

20Endpoint Agent Implemented

A real OS service (grc_agent/ + Windows MSI): registers over TLS with token rotation, runs collectors (asset/software/compliance/logs/data/classification/DLP), buffers offline, self-updates (pilot/test/prod rings) and reports health via heartbeat.

CapabilityStatus
Registration, heartbeat/health, policy/CIS sync, telemetry ingestion, offline mode, updateImplemented
Package catalog + platform-generated install command; manual installer (all OS)Implemented
Discovery→agent reconciliation (coverage, candidates, remediation)Implemented
Intune / GPO / SCCM / Ansible deployment templatesNot Found (manual only)
Tamper self-signal / platform-triggered remote uninstallPartial
Best practiceDiscovery creates an agent candidate→ admin approves → enterprise/manual install → agent registers → links to CMDB asset → policy sync → health monitoring. Discovery must not silently install agents (it does not).

21DLP Decision engine

ImportantThe platform decides and records; it does not block by itself. Blocking of USB/clipboard/print/browser-upload/email requires the endpoint agent or a gateway connector (endpoint_agent / email_gateway / web_proxy / casb). The channel list is a classification taxonomy, not OS controls.
CapabilityStatus
Policy + scope, patterns/destinations, action decision, events/incidents, masked evidence, exception workflow, simulation, tamper-evident auditImplemented
Real enforcement (blocking)Needs agent/connector
DLP→risk auto-link / DLP→taskPartial / Not Found

22AI Governance Not Found

There is no AI Governance subsystem today (only a reserved RBAC slot + a dead-link menu item).Recommendation: build it as a new domain module that reuses the existing Risk, Policy/Control, Evidence, Task and Audit engines — AI asset register, Shadow-AI discovery, AI-usage policy, AI risk assessment (new collectors/rules), findings + remediation + audit. Do not duplicate the risk/task/evidence systems.

23Audit & Logs Implemented

Central event_loggerEventLog with automatic secret masking (passwords/tokens/JWT/PAN→last4/IBAN/email); a second GRCAuditLog stream records admin/GRC entity changes. Categories: auth, authz, admin, rbac, api, security, document, workflow, risk, compliance, dlp, agent, siem. Critical events forward to SIEM via a durable queue (LEEF/QRadar).

GapsImmutability isPartial (optional tamper-evident hash-chain; primary tables mutable); retention/purge is Not Found — implement operationally.

24Reports XLSX / CSV

Multi-sheet XLSX (executive / risks / control-effectiveness / vendor-risk / issues / audit-findings / evidence-freshness / KRI) + CSV. Per-module CSV exports (assets, software, inventory, accounts, config-compliance). PDF reports and scheduled reports are Not Found.

25Notifications Implemented

Rule-driven dispatcher matches enabled alert rules, evaluates conditions, resolves recipients (by user, role, or record owner/assignee/creator) and fans out to in-app + email (SMTP, encrypted password, templates, delivery log, retry, daily limit) honoring per-user preferences. Wired events: new host discovered, credential failed, auto-created risks. Create additional alert rules for: asset down/stale, unauthorized software, new privileged account, sensitive data found, failed compliance check, overdue remediation, expired exception.

NoteNotifications route to user emails by role — change the recipient by changing the admin user's email (no separate recipient setting).

26Settings

Settings are distributed: per discovery profile, per-asset refresh schedules, the credential vault, risk-automation rules + severity weights, alert rules + SMTP + per-user prefs, global + per-agent agent config, per-policy DLP enforcement mode + connectors. Evidence/audit retention is Planned.

27Operational Workflows

A · New Asset Discovery

Profile → scan → detect → credential test → CMDB create/update (dedup) → coarse classification → enrichment → refresh → risk/task.

B · Software Refresh

Scheduled refresh → connect → collect → normalize → compare snapshot → update current + write change events → refresh cached counters.

C · Data Inventory

Select approved paths → scan (content/metadata) → detect sensitive data → mask evidence → create finding → link risk.

D · Account Management

Connect → collect users/groups → classify privileged/stale → create findings (drift = Not Found).

E · Configuration Compliance

Upload → parse → review → approve → assign → read-only scan → results → auto risk+remediation → re-scan (auto-close on pass).

F · Risk Management

Create risk → map policy/control/framework → assess inherent → treatment plan → assign owner → add evidence → track remediation → reassess residual.

G · Agent Onboarding

Discovery → candidate → admin approval → install → agent registers (TLS) → CMDB link → policy sync → health monitoring.

H · DLP Event

Agent/connector detects action → posts event → platform evaluates policy → decision (enforced by agent) → event logged → evidence masked → incident/exception/risk.

28Best Practices

  • Assign an owner + business unit to every CMDB asset.
  • Scope discovery profiles tightly; schedule scans off-peak; use least-privilege read-only credentials.
  • Trust thresholds before marking assets DOWN; never auto-delete — use the retire queue; owner-review uncertain matches.
  • Keep evidence current (watch valid_until); give exceptions an expiry.
  • Review credential failures, stale assets, new privileged accounts and agent health regularly.
  • Prefer /api/v1/* (SoD + audit); forward critical events to SIEM; enable the tamper-evident chain for high assurance.

29Troubleshooting

SymptomAction
Discovery finds no hostsCheck target/ports (TCP-connect only), firewall, run history, scan window.
Credential test fails / host UNAUTHENTICATEDWrong secret; WinRM 5985/5986 or SSH 22 blocked; or no credential covers the IP range. See credential_usage_logs.
Duplicate asset createdMAC/hostname absent so dedup couldn't match; resolve via owner-review; ensure agent/credential populates them.
Software inventory slowEnsure build ≥ 1.9.6; don't request page_size > 200.
Inventory not updatingRefresh disabled or credential unresolved (freshness = credential_failed).
Agent not registering / offlineBad/expired token or TLS/URL; heartbeat age > 300s; offline queue buffers until reconnect.
DLP event not createdNo agent/connector posting events — the backend only ingests.
Compliance scan / parser failsCredential/reachability; PDF not text-extractable (parse runs in background, never executes PDF content).
Report export failsXLSX/CSV only (no PDF); large software export capped at 5000 rows.

30Admin Checklists

Initial setup

  1. Create admin + break-glass accounts; enforce MFA.
  2. Connect Entra/LDAP (optional).
  3. Create external frameworks (ISO/NIST/CIS/PCI) — not seeded.
  4. Add vault credentials (least-privilege); create scoped discovery profiles.
  5. Configure inventory-refresh schedules; upload + approve benchmarks; assign to assets.
  6. Define risk-automation rules; create alert rules; configure SIEM forwarding.
  7. Deploy agents to critical hosts; set retention operationally.

Daily

Dashboard · failed discovery jobs · credential failures · high-risk findings · overdue remediation · agent health · DLP high-severity events.

Weekly

New hosts · unauthenticated hosts · stale assets · software changes · account privilege changes · failed compliance checks · risk updates.

Monthly

Risk register · policy/control compliance · evidence expiry · exceptions · admin users · service credentials · management reports.