{"meta":{"version":"1.0.0","build":"2026-09-06.6b80a3e","commit":"6b80a3e8d123581477c6113befafd976ee02aada","generatedAt":"2026-09-06T10:46:33.963Z","locales":["en"],"defaultLocale":"en"},"documents":[{"id":"record-lifecycles-and-status","type":"concept","title":"Record lifecycles and status","description":"Why several registers move records through an explicit status (draft, review, approved...) instead of just editing them in place.","status":"published","version":2,"locale":"en","translationKey":"record-lifecycles-and-status","audience":["user","administrator"],"url":"https://docs.sheqcontrolplane.com/concepts/record-lifecycles-and-status/","context":{},"search":{"keywords":["status","lifecycle","workflow","draft","approved","superseded"]},"related":["safe-work-procedures","permits-to-work"],"parentId":null,"prerequisites":[],"nextSteps":[],"deprecated":null,"lastUpdated":"2026-09-06T11:16:14+01:00","sections":[{"heading":"Overview","kind":"overview","html":"<p>A number of SHEQ Control Plane registers — Safe Work Procedures, Permits to Work, Non-Conformance Reports, Concessions, and Inspection &amp; Test Plans among them — give each record an explicit status field that moves it through a defined sequence, rather than treating every record as simply &quot;saved&quot; or &quot;not saved.&quot;</p>\n","text":"A number of SHEQ Control Plane registers — Safe Work Procedures, Permits to Work, Non-Conformance Reports, Concessions, and Inspection & Test Plans among them — give each record an explicit status field that moves it through a defined sequence, rather than treating every record as simply \"saved\" or \"not saved.\""},{"heading":"Why it matters","kind":"overview","html":"<p>Most SHEQ processes have a real-world equivalent to a status: a procedure is being drafted, then reviewed, then approved for use; a permit is requested, then issued, then closed once work finishes. Recording that status explicitly, as a field on the record itself, means the register can be filtered by it, and anyone looking at a record later can tell what stage it was actually at — which matters when an incident investigation or an audit needs to reconstruct what was true at a particular point in time, not just what the record looks like today.</p>\n","text":"Most SHEQ processes have a real-world equivalent to a status: a procedure is being drafted, then reviewed, then approved for use; a permit is requested, then issued, then closed once work finishes. Recording that status explicitly, as a field on the record itself, means the register can be filtered by it, and anyone looking at a record later can tell what stage it was actually at — which matters when an incident investigation or an audit needs to reconstruct what was true at a particular point in time, not just what the record looks like today."},{"heading":"How it works","kind":"workflow","html":"<p>Each register defines its own status values and its own meaning for them — there's no single shared &quot;status&quot; concept enforced across every module, because different processes genuinely have different stages (compare Safe Work Procedures' draft → review → approved → superseded to Permits to Work's requested → issued → closed). Moving a record between statuses is done the same way as editing any other field, gated by that register's ordinary write permission (e.g. <code>safe_work_procedures:write</code>) — there's no separate, more restrictive &quot;approve&quot; permission or workflow engine layered on top. A Viewer can't do it (no write access at all); anyone with write access to the register can, whether the edit is to the title or to the status field. See <a href=\"/modules/settings/\">Settings</a> for how roles and permissions actually work today.</p>\n","text":"Each register defines its own status values and its own meaning for them — there's no single shared \"status\" concept enforced across every module, because different processes genuinely have different stages (compare Safe Work Procedures' draft → review → approved → superseded to Permits to Work's requested → issued → closed). Moving a record between statuses is done the same way as editing any other field, gated by that register's ordinary write permission (e.g. safe_work_procedures:write) — there's no separate, more restrictive \"approve\" permission or workflow engine layered on top. A Viewer can't do it (no write access at all); anyone with write access to the register can, whether the edit is to the title or to the status field. See Settings for how roles and permissions actually work today."},{"heading":"What happens next","kind":"workflow","html":"<p>When reading a module's own documentation, its Fields section lists the exact status values it uses and what each one means for that specific register.</p>\n","text":"When reading a module's own documentation, its Fields section lists the exact status values it uses and what each one means for that specific register."}]},{"id":"navigating-the-application","type":"getting-started","title":"Navigating the application","description":"How the sidebar, breadcrumbs, command palette and module pages fit together.","status":"published","version":1,"locale":"en","translationKey":"navigating-the-application","audience":["user"],"url":"https://docs.sheqcontrolplane.com/getting-started/navigating-the-application/","context":{},"search":{"keywords":["navigation","sidebar","command palette","search","shortcuts"]},"related":[],"parentId":null,"prerequisites":["what-is-sheq-control-plane"],"nextSteps":[],"deprecated":null,"lastUpdated":"2026-09-06T06:46:29+01:00","sections":[{"heading":"Overview","kind":"overview","html":"<p>The application has three navigation surfaces: a sidebar (grouped by SHEQ discipline, always visible on desktop), a breadcrumb trail at the top of every page, and a command palette for keyboard-driven navigation.</p>\n","text":"The application has three navigation surfaces: a sidebar (grouped by SHEQ discipline, always visible on desktop), a breadcrumb trail at the top of every page, and a command palette for keyboard-driven navigation."},{"heading":"How it works","kind":"workflow","html":"<p>The sidebar groups every module the same way this documentation does — Safety, Risk &amp; Procedures, People, Assets &amp; Contractors, Governance &amp; Legal, Environmental, Quality, Management System — plus Settings under Administration. On narrower screens the sidebar collapses behind a menu button; the same groups and items are still there.</p>\n<p>Every module follows the same page pattern: a list page (filter, sort, paginate), a detail page for a single record, and create/edit forms. Detail and edit pages publish their record's own label (for example, an incident's short description) so the breadcrumb trail reads naturally instead of showing a raw ID.</p>\n","text":"The sidebar groups every module the same way this documentation does — Safety, Risk & Procedures, People, Assets & Contractors, Governance & Legal, Environmental, Quality, Management System — plus Settings under Administration. On narrower screens the sidebar collapses behind a menu button; the same groups and items are still there. Every module follows the same page pattern: a list page (filter, sort, paginate), a detail page for a single record, and create/edit forms. Detail and edit pages publish their record's own label (for example, an incident's short description) so the breadcrumb trail reads naturally instead of showing a raw ID."},{"heading":"Actions","kind":"contextual","html":"<p>Press &lt;kbd&gt;⌘K&lt;/kbd&gt; (&lt;kbd&gt;Ctrl&lt;/kbd&gt;+&lt;kbd&gt;K&lt;/kbd&gt; on Windows/Linux) anywhere in the application to open the command palette. It searches every module by name and surfaces a &quot;Quick actions&quot; group — one keystroke to jump straight to a module's own create form (for example, &quot;Report a new incident&quot;) without navigating there first.</p>\n","text":"Press <kbd>⌘K</kbd> (<kbd>Ctrl</kbd>+<kbd>K</kbd> on Windows/Linux) anywhere in the application to open the command palette. It searches every module by name and surfaces a \"Quick actions\" group — one keystroke to jump straight to a module's own create form (for example, \"Report a new incident\") without navigating there first."},{"heading":"What happens next","kind":"workflow","html":"<p>Continue to the <a href=\"/modules/\">Modules</a> section, or jump straight to the module you need.</p>\n","text":"Continue to the Modules section, or jump straight to the module you need."}]},{"id":"what-is-sheq-control-plane","type":"getting-started","title":"What is SHEQ Control Plane?","description":"A single system of record for Safety, Health, Environment and Quality management — incidents, hazards, procedures, permits, training, audits, and the compliance registers that tie them together.","status":"published","version":1,"locale":"en","translationKey":"what-is-sheq-control-plane","audience":["user","evaluator"],"url":"https://docs.sheqcontrolplane.com/getting-started/what-is-sheq-control-plane/","context":{},"search":{"keywords":["sheq","overview","introduction","what is"]},"related":[],"parentId":null,"prerequisites":[],"nextSteps":["navigating-the-application"],"deprecated":null,"lastUpdated":"2026-09-06T06:46:29+01:00","sections":[{"heading":"Overview","kind":"overview","html":"<p>SHEQ Control Plane is a system of record for Safety, Health, Environment and Quality (SHEQ) management. It replaces the spreadsheets, paper registers and shared folders that most organisations use to track incidents, hazards, safe work procedures, permits, training, audits and legal compliance, with one connected application where every record can reference every other record it actually depends on.</p>\n<p>The product is organised as a set of registers — Incidents, Hazards, Safe Work Procedures, Permits to Work, Training &amp; Certificates, and around two dozen more — grouped the same way in the application's own navigation as in this documentation: Safety, Risk &amp; Procedures, People, Assets &amp; Contractors, Governance &amp; Legal, Environmental, Quality, and Management System.</p>\n","text":"SHEQ Control Plane is a system of record for Safety, Health, Environment and Quality (SHEQ) management. It replaces the spreadsheets, paper registers and shared folders that most organisations use to track incidents, hazards, safe work procedures, permits, training, audits and legal compliance, with one connected application where every record can reference every other record it actually depends on. The product is organised as a set of registers — Incidents, Hazards, Safe Work Procedures, Permits to Work, Training & Certificates, and around two dozen more — grouped the same way in the application's own navigation as in this documentation: Safety, Risk & Procedures, People, Assets & Contractors, Governance & Legal, Environmental, Quality, and Management System."},{"heading":"Why it matters","kind":"overview","html":"<p>SHEQ failures are rarely caused by a single missing document — they're caused by information that exists somewhere but wasn't connected to the decision that needed it: a permit issued without checking the hazard it covers, a contractor let on site with an expired medical certificate, a procedure followed after it was already superseded. SHEQ Control Plane's registers are relational on purpose (a Permit to Work links to the Hazard and Safe Work Procedure it's for; a Contractor's site-access status is derived from four separate compliance records, not entered by hand) so that the connection is enforced by the system rather than relying on someone remembering to check.</p>\n","text":"SHEQ failures are rarely caused by a single missing document — they're caused by information that exists somewhere but wasn't connected to the decision that needed it: a permit issued without checking the hazard it covers, a contractor let on site with an expired medical certificate, a procedure followed after it was already superseded. SHEQ Control Plane's registers are relational on purpose (a Permit to Work links to the Hazard and Safe Work Procedure it's for; a Contractor's site-access status is derived from four separate compliance records, not entered by hand) so that the connection is enforced by the system rather than relying on someone remembering to check."},{"heading":"How it works","kind":"workflow","html":"<p>Each register follows the same basic shape: a list view with filtering and sorting, a detail view, and create/edit forms. Registers that have a lifecycle (Safe Work Procedures, Permits to Work, Non-Conformance Reports, Concessions, Inspection &amp; Test Plans) move through explicit statuses — draft, review, approved, superseded, and similar — rather than being edited in place indefinitely, so there's always a record of what was true at a given point in time.</p>\n","text":"Each register follows the same basic shape: a list view with filtering and sorting, a detail view, and create/edit forms. Registers that have a lifecycle (Safe Work Procedures, Permits to Work, Non-Conformance Reports, Concessions, Inspection & Test Plans) move through explicit statuses — draft, review, approved, superseded, and similar — rather than being edited in place indefinitely, so there's always a record of what was true at a given point in time."},{"heading":"What happens next","kind":"workflow","html":"<p>Start with <a href=\"/getting-started/navigating-the-application/\">Navigating the application</a> to get oriented, then go to whichever module matches what you need to do first — the <a href=\"/modules/\">Modules</a> section documents all of them.</p>\n","text":"Start with Navigating the application to get oriented, then go to whichever module matches what you need to do first — the Modules section documents all of them."}]},{"id":"ohs-appointments","type":"module","title":"OHS Appointments","description":"Statutory OHS appointment structure (Section 16(2) appointees, First Aiders, Fire Marshals and similar) and the competency expiry that keeps each one valid.","status":"published","version":1,"locale":"en","translationKey":"ohs-appointments","module":"appointments","audience":["user","administrator"],"url":"https://docs.sheqcontrolplane.com/modules/ohs-appointments/","context":{"helpKeys":["appointments","ohs-appointment.create","ohs-appointment.edit","appointments.create","appointments.edit"],"screens":["appointments.list","appointments.detail","appointments.create","appointments.edit"],"applicationRoutes":["/appointments","/appointments/new","/appointments/:id","/appointments/:id/edit"]},"search":{"keywords":["ohs appointment","section 16","first aider","fire marshal","statutory appointment"]},"related":["training-certificates"],"parentId":null,"prerequisites":[],"nextSteps":[],"deprecated":null,"lastUpdated":"2026-09-06T11:18:58+01:00","sections":[{"heading":"Overview","kind":"overview","html":"<p>The OHS Appointments register records statutory health and safety appointments — a Section 16(2) appointee, a First Aider, a Fire Marshal, or any similar designated role — together with the training that makes each appointment currently valid.</p>\n","text":"The OHS Appointments register records statutory health and safety appointments — a Section 16(2) appointee, a First Aider, a Fire Marshal, or any similar designated role — together with the training that makes each appointment currently valid."},{"heading":"Why it matters","kind":"overview","html":"<p>Statutory OHS appointments are a legal requirement in many jurisdictions, and each one is only valid while the appointee's underlying competency (first-aid certification, fire-marshal training, and so on) hasn't lapsed. Tracking the appointment and its training expiry in one record means the register can show, at a glance, which statutory appointments are still actually backed by current training.</p>\n","text":"Statutory OHS appointments are a legal requirement in many jurisdictions, and each one is only valid while the appointee's underlying competency (first-aid certification, fire-marshal training, and so on) hasn't lapsed. Tracking the appointment and its training expiry in one record means the register can show, at a glance, which statutory appointments are still actually backed by current training."},{"heading":"How it works","kind":"workflow","html":"<p>Appointment type and section are both free text rather than a fixed list — this register doesn't constrain them to a predefined set of statutory roles, since the exact appointment types and how &quot;section&quot; is used varies by organisation and jurisdiction. Each appointment carries its own training expiry date, independent of any other register.</p>\n","text":"Appointment type and section are both free text rather than a fixed list — this register doesn't constrain them to a predefined set of statutory roles, since the exact appointment types and how \"section\" is used varies by organisation and jurisdiction. Each appointment carries its own training expiry date, independent of any other register."},{"heading":"This screen","kind":"contextual","html":"<p>The list page shows every appointment with an overdue/due-soon/on-track badge computed from its training expiry date, filterable and sortable by person, training expiry, or when the record was created/updated.</p>\n","text":"The list page shows every appointment with an overdue/due-soon/on-track badge computed from its training expiry date, filterable and sortable by person, training expiry, or when the record was created/updated."},{"heading":"Fields","kind":"field-reference","html":"<ul>\n<li><strong>Person</strong> — required. Who holds this appointment.</li>\n<li><strong>Appointment type</strong> — required, free text (e.g. &quot;Section 16(2) Appointee&quot;, &quot;First Aider&quot;, &quot;Fire Marshal&quot;).</li>\n<li><strong>Section</strong> — required, free text. The department, site or area this appointment covers.</li>\n<li><strong>Training expiry</strong> — required. When the underlying competency training lapses.</li>\n</ul>\n","text":"Person — required. Who holds this appointment. Appointment type — required, free text (e.g. \"Section 16(2) Appointee\", \"First Aider\", \"Fire Marshal\"). Section — required, free text. The department, site or area this appointment covers. Training expiry — required. When the underlying competency training lapses."},{"heading":"Actions","kind":"contextual","html":"<p>Saving validates that all four fields are present before submitting.</p>\n","text":"Saving validates that all four fields are present before submitting."},{"heading":"What happens next","kind":"workflow","html":"<p>There's no automatic notification when an appointment's training expiry approaches or passes in the current version of the product — the due-soon/overdue badge on the list page is the mechanism for surfacing it. An appointment record isn't linked to the same person's entries in <a href=\"/modules/training-certificates/\">Training &amp; Certificates</a> by a shared field, even though the underlying competency may also be logged there.</p>\n","text":"There's no automatic notification when an appointment's training expiry approaches or passes in the current version of the product — the due-soon/overdue badge on the list page is the mechanism for surfacing it. An appointment record isn't linked to the same person's entries in Training & Certificates by a shared field, even though the underlying competency may also be logged there."},{"heading":"FAQ","kind":"reference","html":"<p><strong>Why aren't appointment types a fixed dropdown list?</strong> Statutory appointment structures vary enough between organisations and jurisdictions that the register deliberately leaves both Appointment type and Section as free text rather than assuming one fixed taxonomy.</p>\n","text":"Why aren't appointment types a fixed dropdown list? Statutory appointment structures vary enough between organisations and jurisdictions that the register deliberately leaves both Appointment type and Section as free text rather than assuming one fixed taxonomy."}]},{"id":"audit-inspection-schedule","type":"module","title":"Audit & Inspection Schedule","description":"Scheduled and completed internal and external audits, with a running count of open findings for each.","status":"published","version":1,"locale":"en","translationKey":"audit-inspection-schedule","module":"audits","audience":["user","administrator"],"url":"https://docs.sheqcontrolplane.com/modules/audit-inspection-schedule/","context":{"helpKeys":["audits","audit.create","audit.edit","audits.create","audits.edit"],"screens":["audits.list","audits.detail","audits.create","audits.edit"],"applicationRoutes":["/audits","/audits/new","/audits/:id","/audits/:id/edit"]},"search":{"keywords":["audit","inspection","iso 45001","compliance audit","findings"]},"related":["legal-register"],"parentId":null,"prerequisites":[],"nextSteps":[],"deprecated":null,"lastUpdated":"2026-09-06T11:18:58+01:00","sections":[{"heading":"Overview","kind":"overview","html":"<p>The Audit &amp; Inspection Schedule tracks every internal and external audit — from an internal HSE audit to an ISO 45001 surveillance audit, a legal compliance audit, or a client audit — through scheduling, execution, and completion, with a count of open findings on each.</p>\n","text":"The Audit & Inspection Schedule tracks every internal and external audit — from an internal HSE audit to an ISO 45001 surveillance audit, a legal compliance audit, or a client audit — through scheduling, execution, and completion, with a count of open findings on each."},{"heading":"Why it matters","kind":"overview","html":"<p>An audit that produces findings which are never tracked to closure has limited value beyond the day it was conducted. Recording an open-findings count directly on the audit record, alongside its status, means a glance at the schedule shows not just what audits happened but what work they left behind.</p>\n","text":"An audit that produces findings which are never tracked to closure has limited value beyond the day it was conducted. Recording an open-findings count directly on the audit record, alongside its status, means a glance at the schedule shows not just what audits happened but what work they left behind."},{"heading":"How it works","kind":"workflow","html":"<p>An audit is scheduled with a type, scope, auditor and scheduled date, in status <code>scheduled</code>. It moves to <code>in-progress</code> and then <code>completed</code> as it happens. The <strong>open findings count is a plain number field entered by whoever manages the audit</strong> — it isn't computed from a separate findings sub-record in the current version of the product, so keeping it accurate is a manual responsibility of whoever updates the audit as its findings are worked through and closed.</p>\n","text":"An audit is scheduled with a type, scope, auditor and scheduled date, in status scheduled. It moves to in-progress and then completed as it happens. The open findings count is a plain number field entered by whoever manages the audit — it isn't computed from a separate findings sub-record in the current version of the product, so keeping it accurate is a manual responsibility of whoever updates the audit as its findings are worked through and closed."},{"heading":"This screen","kind":"contextual","html":"<p>The list page shows every audit with its type, status, scheduled date and open-findings count, filterable and sortable. The detail page shows the full record; create and edit forms share the same fields.</p>\n","text":"The list page shows every audit with its type, status, scheduled date and open-findings count, filterable and sortable. The detail page shows the full record; create and edit forms share the same fields."},{"heading":"Fields","kind":"field-reference","html":"<ul>\n<li><strong>Audit type</strong> — required. One of Internal HSE Audit, ISO 45001 Surveillance, Legal Compliance Audit, Client Audit.</li>\n<li><strong>Scope</strong> — required, free text. What the audit covers.</li>\n<li><strong>Auditor</strong> — required. Who is conducting the audit.</li>\n<li><strong>Scheduled date</strong> — required.</li>\n<li><strong>Status</strong> — one of <code>scheduled</code>, <code>in-progress</code>, <code>completed</code>.</li>\n<li><strong>Open findings</strong> — a non-negative integer, entered and kept up to date manually as findings are raised and closed.</li>\n</ul>\n","text":"Audit type — required. One of Internal HSE Audit, ISO 45001 Surveillance, Legal Compliance Audit, Client Audit. Scope — required, free text. What the audit covers. Auditor — required. Who is conducting the audit. Scheduled date — required. Status — one of scheduled, in-progress, completed. Open findings — a non-negative integer, entered and kept up to date manually as findings are raised and closed."},{"heading":"Actions","kind":"contextual","html":"<p>Creating or editing an audit validates that the open-findings count is a non-negative whole number; every other field follows the same required-field rules as the other registers.</p>\n","text":"Creating or editing an audit validates that the open-findings count is a non-negative whole number; every other field follows the same required-field rules as the other registers."},{"heading":"What happens next","kind":"workflow","html":"<p>A &quot;Legal Compliance Audit&quot; is a natural place to work through open items in the <a href=\"/modules/legal-register/\">Legal Register</a>, though the two aren't linked by a relational field — cross-reference manually. There's no automatic notification tied to an audit's status changing or its open-findings count remaining above zero; both are fields for whoever manages the schedule to monitor directly.</p>\n","text":"A \"Legal Compliance Audit\" is a natural place to work through open items in the Legal Register, though the two aren't linked by a relational field — cross-reference manually. There's no automatic notification tied to an audit's status changing or its open-findings count remaining above zero; both are fields for whoever manages the schedule to monitor directly."},{"heading":"FAQ","kind":"reference","html":"<p><strong>Does completing an audit require open findings to be zero?</strong> No — an audit can be marked <code>completed</code> with a non-zero open-findings count; the count and the status are independent fields, since findings often remain open (being worked through corrective action) well after the audit visit itself has finished.</p>\n<p><strong>Is there a separate register for individual findings?</strong> Not in the current version — findings are tracked as a single count on the audit record, not as individual line items.</p>\n","text":"Does completing an audit require open findings to be zero? No — an audit can be marked completed with a non-zero open-findings count; the count and the status are independent fields, since findings often remain open (being worked through corrective action) well after the audit visit itself has finished. Is there a separate register for individual findings? Not in the current version — findings are tracked as a single count on the audit record, not as individual line items."}]},{"id":"calibration-register","type":"module","title":"Calibration Register","description":"Instrument calibration records and due dates, so a measuring device is never used past the point its readings can be trusted.","status":"published","version":1,"locale":"en","translationKey":"calibration-register","module":"calibration","audience":["user","administrator"],"url":"https://docs.sheqcontrolplane.com/modules/calibration-register/","context":{"helpKeys":["calibration","calibration-register-entry.create","calibration-register-entry.edit","calibration.create","calibration.edit"],"screens":["calibration.list","calibration.detail","calibration.create","calibration.edit"],"applicationRoutes":["/quality/calibration","/quality/calibration/new","/quality/calibration/:id","/quality/calibration/:id/edit"]},"search":{"keywords":["calibration","instrument","gauge","measuring equipment","calibration due"]},"related":["material-certification"],"parentId":null,"prerequisites":[],"nextSteps":[],"deprecated":null,"lastUpdated":"2026-09-06T11:18:58+01:00","sections":[{"heading":"Overview","kind":"overview","html":"<p>The Calibration Register logs every measuring instrument your organisation relies on for quality or safety decisions — its serial number, when it was last calibrated, who calibrated it, the certificate number, and when it's due for calibration again.</p>\n","text":"The Calibration Register logs every measuring instrument your organisation relies on for quality or safety decisions — its serial number, when it was last calibrated, who calibrated it, the certificate number, and when it's due for calibration again."},{"heading":"Why it matters","kind":"overview","html":"<p>A measurement is only as trustworthy as the instrument that took it. An out-of-calibration gauge or instrument can silently produce readings that are wrong by a consistent margin, which is far more dangerous than an instrument that obviously fails, because nothing about the reading itself looks wrong. Tracking a due date per instrument, separately from when it was last calibrated, makes it possible to see at a glance which instruments are approaching or past the point where their readings should no longer be relied on.</p>\n","text":"A measurement is only as trustworthy as the instrument that took it. An out-of-calibration gauge or instrument can silently produce readings that are wrong by a consistent margin, which is far more dangerous than an instrument that obviously fails, because nothing about the reading itself looks wrong. Tracking a due date per instrument, separately from when it was last calibrated, makes it possible to see at a glance which instruments are approaching or past the point where their readings should no longer be relied on."},{"heading":"How it works","kind":"workflow","html":"<p>Each entry is a single instrument's calibration record: what the instrument is, its serial number, the date it was calibrated, the date it's next due, who performed the calibration, and the certificate number issued for that calibration. There is no separate &quot;in service&quot; / &quot;out of service&quot; status field — an instrument's currency is read directly from whether its calibration due date has passed, not from a separately maintained state.</p>\n","text":"Each entry is a single instrument's calibration record: what the instrument is, its serial number, the date it was calibrated, the date it's next due, who performed the calibration, and the certificate number issued for that calibration. There is no separate \"in service\" / \"out of service\" status field — an instrument's currency is read directly from whether its calibration due date has passed, not from a separately maintained state."},{"heading":"This screen","kind":"contextual","html":"<p>The list page shows every instrument with its calibration due date, and can be sorted by due date or by when the record was created or updated, so instruments coming due soonest can be found quickly. The detail page shows the full record; create and edit forms share the same fields.</p>\n","text":"The list page shows every instrument with its calibration due date, and can be sorted by due date or by when the record was created or updated, so instruments coming due soonest can be found quickly. The detail page shows the full record; create and edit forms share the same fields."},{"heading":"Fields","kind":"field-reference","html":"<ul>\n<li><strong>Instrument</strong> — required. What the instrument is (e.g. &quot;Digital torque wrench&quot;).</li>\n<li><strong>Serial number</strong> — required. The instrument's own serial number, for positive identification.</li>\n<li><strong>Calibration date</strong> — required. When this calibration was performed.</li>\n<li><strong>Calibration due</strong> — required. When the instrument is next due for calibration.</li>\n<li><strong>Calibrated by</strong> — required. Who or which calibration body performed the calibration.</li>\n<li><strong>Certificate number</strong> — required. The certificate issued for this calibration, for traceability back to the calibration provider's own records.</li>\n</ul>\n","text":"Instrument — required. What the instrument is (e.g. \"Digital torque wrench\"). Serial number — required. The instrument's own serial number, for positive identification. Calibration date — required. When this calibration was performed. Calibration due — required. When the instrument is next due for calibration. Calibrated by — required. Who or which calibration body performed the calibration. Certificate number — required. The certificate issued for this calibration, for traceability back to the calibration provider's own records."},{"heading":"Actions","kind":"contextual","html":"<p>Creating or editing an entry validates that every field above is present before it can be saved — there's no optional field on this form.</p>\n","text":"Creating or editing an entry validates that every field above is present before it can be saved — there's no optional field on this form."},{"heading":"What happens next","kind":"workflow","html":"<p>There is no automated reminder or block triggered by an instrument's calibration due date passing in the current version of the product — the due date is a field to sort and monitor, the same way <a href=\"/modules/safe-work-procedures/\">Safe Work Procedures</a>' review dates work, not an enforced gate on using the instrument elsewhere in the system.</p>\n","text":"There is no automated reminder or block triggered by an instrument's calibration due date passing in the current version of the product — the due date is a field to sort and monitor, the same way Safe Work Procedures' review dates work, not an enforced gate on using the instrument elsewhere in the system."},{"heading":"FAQ","kind":"reference","html":"<p><strong>Can one instrument have more than one calibration record over time?</strong> Yes — nothing prevents creating a new entry for the same instrument (matched by serial number) each time it's recalibrated, which keeps a full calibration history rather than overwriting the previous one. The register doesn't automatically link successive calibrations of the same instrument together; that's inferred from matching serial numbers, not a stored relationship.</p>\n","text":"Can one instrument have more than one calibration record over time? Yes — nothing prevents creating a new entry for the same instrument (matched by serial number) each time it's recalibrated, which keeps a full calibration history rather than overwriting the previous one. The register doesn't automatically link successive calibrations of the same instrument together; that's inferred from matching serial numbers, not a stored relationship."}]},{"id":"chemicals-sds","type":"module","title":"Chemicals & SDS","description":"Safety Data Sheet register for every chemical on site, with its hazard class, SDS version and review date, and whether decanting is approved.","status":"published","version":1,"locale":"en","translationKey":"chemicals-sds","module":"chemicals","audience":["user","administrator"],"url":"https://docs.sheqcontrolplane.com/modules/chemicals-sds/","context":{"helpKeys":["chemicals","chemical.create","chemical.edit","chemicals.create","chemicals.edit"],"screens":["chemicals.list","chemicals.detail","chemicals.create","chemicals.edit"],"applicationRoutes":["/chemicals","/chemicals/new","/chemicals/:id","/chemicals/:id/edit"]},"search":{"keywords":["chemical","sds","safety data sheet","hazard class","decanting"]},"related":[],"parentId":null,"prerequisites":[],"nextSteps":[],"deprecated":null,"lastUpdated":"2026-09-06T11:18:58+01:00","sections":[{"heading":"Overview","kind":"overview","html":"<p>The Chemicals &amp; SDS register lists every chemical in use, its Safety Data Sheet (SDS) version and review date, its hazard class, and whether it's approved for decanting into smaller containers.</p>\n","text":"The Chemicals & SDS register lists every chemical in use, its Safety Data Sheet (SDS) version and review date, its hazard class, and whether it's approved for decanting into smaller containers."},{"heading":"Why it matters","kind":"overview","html":"<p>An SDS that's several revisions behind the manufacturer's current version can be actively misleading about how a chemical should be handled. Tracking the SDS version and review date as first-class fields — not just a filename in a shared folder — makes it possible to see, at a glance, which chemicals are due for a fresh SDS check. Decanting approval matters separately because decanting a chemical into an unlabelled or incorrectly labelled container is a common way hazard information gets lost between the original container and the point of use.</p>\n","text":"An SDS that's several revisions behind the manufacturer's current version can be actively misleading about how a chemical should be handled. Tracking the SDS version and review date as first-class fields — not just a filename in a shared folder — makes it possible to see, at a glance, which chemicals are due for a fresh SDS check. Decanting approval matters separately because decanting a chemical into an unlabelled or incorrectly labelled container is a common way hazard information gets lost between the original container and the point of use."},{"heading":"How it works","kind":"workflow","html":"<p>Each chemical is a single record: its name, hazard classification, the version and date of its current SDS, when that SDS is next due for review, and a yes/no on whether decanting is approved for it. There's no separate lifecycle/status for a chemical record — it's a straightforward register, not a workflow.</p>\n","text":"Each chemical is a single record: its name, hazard classification, the version and date of its current SDS, when that SDS is next due for review, and a yes/no on whether decanting is approved for it. There's no separate lifecycle/status for a chemical record — it's a straightforward register, not a workflow."},{"heading":"This screen","kind":"contextual","html":"<p>The list page shows every chemical with its SDS review date, filterable and sortable by name or review date. The detail page shows the full record; create and edit forms share the same fields.</p>\n","text":"The list page shows every chemical with its SDS review date, filterable and sortable by name or review date. The detail page shows the full record; create and edit forms share the same fields."},{"heading":"Fields","kind":"field-reference","html":"<ul>\n<li><strong>Name</strong> — required. The chemical's name.</li>\n<li><strong>Hazard class</strong> — required. Its hazard classification.</li>\n<li><strong>SDS version</strong> — required. The version identifier of the current Safety Data Sheet on file.</li>\n<li><strong>SDS date</strong> — required. The date of that SDS version.</li>\n<li><strong>SDS review date</strong> — required. When the SDS is next due to be checked against the manufacturer's current version.</li>\n<li><strong>Decanting approved</strong> — a checkbox. Whether decanting this chemical into smaller containers is approved.</li>\n</ul>\n","text":"Name — required. The chemical's name. Hazard class — required. Its hazard classification. SDS version — required. The version identifier of the current Safety Data Sheet on file. SDS date — required. The date of that SDS version. SDS review date — required. When the SDS is next due to be checked against the manufacturer's current version. Decanting approved — a checkbox. Whether decanting this chemical into smaller containers is approved."},{"heading":"Actions","kind":"contextual","html":"<p>Creating or editing a chemical validates every text/date field as required; decanting approval is a plain checkbox with no further validation.</p>\n","text":"Creating or editing a chemical validates every text/date field as required; decanting approval is a plain checkbox with no further validation."},{"heading":"What happens next","kind":"workflow","html":"<p>There's no automated action tied to a chemical's SDS review date passing in the current version of the product — it's a field to sort and filter the register by, not a triggered reminder.</p>\n","text":"There's no automated action tied to a chemical's SDS review date passing in the current version of the product — it's a field to sort and filter the register by, not a triggered reminder."},{"heading":"FAQ","kind":"reference","html":"<p><strong>Does this register store the actual SDS document?</strong> No — it stores the SDS's version and dates as reference fields, not the document itself. Keep the actual SDS file wherever your organisation's document store already lives.</p>\n","text":"Does this register store the actual SDS document? No — it stores the SDS's version and dates as reference fields, not the document itself. Keep the actual SDS file wherever your organisation's document store already lives."}]},{"id":"client-feedback","type":"module","title":"Client Feedback","description":"Client complaints, compliments and suggestions, and the corrective action taken and closure of each.","status":"published","version":1,"locale":"en","translationKey":"client-feedback","module":"client-feedback","audience":["user","administrator"],"url":"https://docs.sheqcontrolplane.com/modules/client-feedback/","context":{"helpKeys":["client-feedback","client-feedback.create","client-feedback.edit"],"screens":["client-feedback.list","client-feedback.detail","client-feedback.create","client-feedback.edit"],"applicationRoutes":["/quality/client-feedback","/quality/client-feedback/new","/quality/client-feedback/:id","/quality/client-feedback/:id/edit"]},"search":{"keywords":["client feedback","complaint","compliment","customer complaint","corrective action"]},"related":["internal-feedback","non-conformance-reports"],"parentId":null,"prerequisites":[],"nextSteps":[],"deprecated":null,"lastUpdated":"2026-09-06T06:46:29+01:00","sections":[{"heading":"Overview","kind":"overview","html":"<p>Client Feedback logs every piece of feedback received from a client — complaints, compliments, and suggestions — along with whatever corrective action was taken and whether it's been closed out.</p>\n","text":"Client Feedback logs every piece of feedback received from a client — complaints, compliments, and suggestions — along with whatever corrective action was taken and whether it's been closed out."},{"heading":"Why it matters","kind":"overview","html":"<p>A client complaint that's resolved informally and never recorded teaches the organisation nothing the next time something similar happens. Logging every piece of feedback, not just complaints, also means genuinely useful compliments and suggestions aren't lost either — both are signal about what's working and what isn't.</p>\n","text":"A client complaint that's resolved informally and never recorded teaches the organisation nothing the next time something similar happens. Logging every piece of feedback, not just complaints, also means genuinely useful compliments and suggestions aren't lost either — both are signal about what's working and what isn't."},{"heading":"How it works","kind":"workflow","html":"<p>Each record captures the client, when the feedback was received, its nature (Complaint, Compliment, or Suggestion), a description, and — where applicable — the corrective action taken. A record is <code>open</code> until the matter is resolved, at which point it's marked <code>closed</code> with a closure date.</p>\n","text":"Each record captures the client, when the feedback was received, its nature (Complaint, Compliment, or Suggestion), a description, and — where applicable — the corrective action taken. A record is open until the matter is resolved, at which point it's marked closed with a closure date."},{"heading":"This screen","kind":"contextual","html":"<p>The list page shows every feedback record with its nature and status, and can be filtered and sorted by date received, nature, status, or when the record was created or updated. The detail page shows the full record; create and edit forms share the same fields.</p>\n","text":"The list page shows every feedback record with its nature and status, and can be filtered and sorted by date received, nature, status, or when the record was created or updated. The detail page shows the full record; create and edit forms share the same fields."},{"heading":"Fields","kind":"field-reference","html":"<ul>\n<li><strong>Client</strong> — required. Who the feedback came from.</li>\n<li><strong>Date received</strong> — required.</li>\n<li><strong>Nature of feedback</strong> — required. One of Complaint, Compliment, Suggestion.</li>\n<li><strong>Description</strong> — required. What the feedback actually was.</li>\n<li><strong>Corrective action</strong> — optional. What was done in response — most relevant for a Complaint, but available on any record.</li>\n<li><strong>Status</strong> — <code>open</code> or <code>closed</code>. New records default to <code>open</code>.</li>\n<li><strong>Closure date</strong> — optional. When the record was closed out.</li>\n</ul>\n","text":"Client — required. Who the feedback came from. Date received — required. Nature of feedback — required. One of Complaint, Compliment, Suggestion. Description — required. What the feedback actually was. Corrective action — optional. What was done in response — most relevant for a Complaint, but available on any record. Status — open or closed. New records default to open. Closure date — optional. When the record was closed out."},{"heading":"Actions","kind":"contextual","html":"<p>Marking a record <code>closed</code> is a direct field edit like any other — there's no required corrective action or closure date before a record can be closed; both are free to leave blank.</p>\n","text":"Marking a record closed is a direct field edit like any other — there's no required corrective action or closure date before a record can be closed; both are free to leave blank."},{"heading":"What happens next","kind":"workflow","html":"<p>There's no automatic link from a Complaint here to a <a href=\"/modules/non-conformance-reports/\">Non-Conformance Report</a> in the current version of the product — if a complaint warrants a full NCR investigation (root cause, correction, preventive action), that's raised as a separate record in that register, cross-referenced only by whatever text the two records share (client name, date, description), not a stored relationship.</p>\n","text":"There's no automatic link from a Complaint here to a Non-Conformance Report in the current version of the product — if a complaint warrants a full NCR investigation (root cause, correction, preventive action), that's raised as a separate record in that register, cross-referenced only by whatever text the two records share (client name, date, description), not a stored relationship."},{"heading":"FAQ","kind":"reference","html":"<p><strong>Is Client Feedback the same as a Non-Conformance Report?</strong> No — Client Feedback is a lighter-weight log of anything a client raises; a Non-Conformance Report is a more structured investigation with explicit root-cause and corrective/preventive-action fields. Use this register for the initial record of what the client said, and raise an NCR separately if it needs a full investigation.</p>\n","text":"Is Client Feedback the same as a Non-Conformance Report? No — Client Feedback is a lighter-weight log of anything a client raises; a Non-Conformance Report is a more structured investigation with explicit root-cause and corrective/preventive-action fields. Use this register for the initial record of what the client said, and raise an NCR separately if it needs a full investigation."}]},{"id":"hs-committee","type":"module","title":"H&S Committee","description":"Health and safety committee meetings, who attended, what was decided, and whether the minutes were filed.","status":"published","version":1,"locale":"en","translationKey":"hs-committee","module":"committee","audience":["user","administrator"],"url":"https://docs.sheqcontrolplane.com/modules/hs-committee/","context":{"helpKeys":["committee","hs-committee-meeting.create","hs-committee-meeting.edit","committee.create","committee.edit"],"screens":["committee.list","committee.detail","committee.create","committee.edit"],"applicationRoutes":["/committee","/committee/new","/committee/:id","/committee/:id/edit"]},"search":{"keywords":["committee","hs committee","safety committee","meeting minutes"]},"related":["emergency-preparedness","hr-action-log"],"parentId":null,"prerequisites":[],"nextSteps":[],"deprecated":null,"lastUpdated":"2026-09-06T11:18:58+01:00","sections":[{"heading":"Overview","kind":"overview","html":"<p>The H&amp;S Committee register logs health and safety committee meetings: when they happened, who attended, what key actions came out of them, when the next meeting is, and whether the minutes were formally filed.</p>\n","text":"The H&S Committee register logs health and safety committee meetings: when they happened, who attended, what key actions came out of them, when the next meeting is, and whether the minutes were formally filed."},{"heading":"Why it matters","kind":"overview","html":"<p>A committee's effectiveness shows up in whether decisions actually get tracked and followed through, not just in whether a meeting happened. Recording key actions and a &quot;minutes filed&quot; flag on the meeting record itself — rather than only in a separate minutes document — keeps a lightweight, searchable trail of what the committee decided, directly in the same system as the modules those decisions usually concern (permits, hazards, procedures, and similar).</p>\n","text":"A committee's effectiveness shows up in whether decisions actually get tracked and followed through, not just in whether a meeting happened. Recording key actions and a \"minutes filed\" flag on the meeting record itself — rather than only in a separate minutes document — keeps a lightweight, searchable trail of what the committee decided, directly in the same system as the modules those decisions usually concern (permits, hazards, procedures, and similar)."},{"heading":"How it works","kind":"workflow","html":"<p>Each meeting record captures the meeting date, a list of attendees, key actions agreed, the next meeting date, and whether minutes were filed. Key actions is optional — a meeting can be logged before its actions are written up, and edited later once they are.</p>\n","text":"Each meeting record captures the meeting date, a list of attendees, key actions agreed, the next meeting date, and whether minutes were filed. Key actions is optional — a meeting can be logged before its actions are written up, and edited later once they are."},{"heading":"This screen","kind":"contextual","html":"<p>The list page shows every meeting with its date, whether minutes were filed, and the next meeting date, filterable and sortable. The detail page shows the full record including attendees and key actions; create and edit forms share the same fields.</p>\n","text":"The list page shows every meeting with its date, whether minutes were filed, and the next meeting date, filterable and sortable. The detail page shows the full record including attendees and key actions; create and edit forms share the same fields."},{"heading":"Fields","kind":"field-reference","html":"<ul>\n<li><strong>Meeting date</strong> — required.</li>\n<li><strong>Attendees</strong> — required, free text. Who attended the meeting.</li>\n<li><strong>Key actions</strong> — optional, free text. What the committee decided or actioned.</li>\n<li><strong>Next meeting</strong> — required. When the committee next convenes.</li>\n<li><strong>Minutes filed</strong> — a yes/no flag for whether formal minutes have been filed for this meeting, independent of whether key actions have been recorded here.</li>\n</ul>\n","text":"Meeting date — required. Attendees — required, free text. Who attended the meeting. Key actions — optional, free text. What the committee decided or actioned. Next meeting — required. When the committee next convenes. Minutes filed — a yes/no flag for whether formal minutes have been filed for this meeting, independent of whether key actions have been recorded here."},{"heading":"Actions","kind":"contextual","html":"<p>Creating or editing a meeting requires a meeting date, an attendee list, and a next-meeting date; key actions can be left blank and added once minutes are finalised.</p>\n","text":"Creating or editing a meeting requires a meeting date, an attendee list, and a next-meeting date; key actions can be left blank and added once minutes are finalised."},{"heading":"What happens next","kind":"workflow","html":"<p>A key action arising from a committee meeting that concerns a specific employee is a natural candidate for an <a href=\"/modules/hr-action-log/\">HR Action Log</a> entry, and an action about emergency readiness belongs in <a href=\"/modules/emergency-preparedness/\">Emergency Preparedness</a> — neither is linked automatically; record it in the relevant register once the committee has decided on it.</p>\n","text":"A key action arising from a committee meeting that concerns a specific employee is a natural candidate for an HR Action Log entry, and an action about emergency readiness belongs in Emergency Preparedness — neither is linked automatically; record it in the relevant register once the committee has decided on it."},{"heading":"FAQ","kind":"reference","html":"<p><strong>Is there a fixed committee membership list?</strong> No — attendees are recorded per meeting as free text, not drawn from a fixed roster, so ad hoc or rotating attendance is captured accurately meeting by meeting.</p>\n<p><strong>What if minutes are filed outside the system (e.g. as a signed paper document)?</strong> Set &quot;Minutes filed&quot; to yes on the meeting record regardless of where the physical or digital minutes document itself lives — this register doesn't store the minutes document, only the fact that it exists.</p>\n","text":"Is there a fixed committee membership list? No — attendees are recorded per meeting as free text, not drawn from a fixed roster, so ad hoc or rotating attendance is captured accurately meeting by meeting. What if minutes are filed outside the system (e.g. as a signed paper document)? Set \"Minutes filed\" to yes on the meeting record regardless of where the physical or digital minutes document itself lives — this register doesn't store the minutes document, only the fact that it exists."}]},{"id":"concessions","type":"module","title":"Concessions","description":"Deviation requests with an approval chain recorded as plain text, not a modelled workflow.","status":"published","version":1,"locale":"en","translationKey":"concessions","module":"concessions","audience":["user","administrator"],"url":"https://docs.sheqcontrolplane.com/modules/concessions/","context":{"helpKeys":["concessions","concession.create","concession.edit","concessions.create","concessions.edit"],"screens":["concessions.list","concessions.detail","concessions.create","concessions.edit"],"applicationRoutes":["/quality/concessions","/quality/concessions/new","/quality/concessions/:id","/quality/concessions/:id/edit"]},"search":{"keywords":["concession","deviation","waiver","approval"]},"related":["non-conformance-reports"],"parentId":null,"prerequisites":[],"nextSteps":[],"deprecated":null,"lastUpdated":"2026-09-06T11:18:58+01:00","sections":[{"heading":"Overview","kind":"overview","html":"<p>A Concession is a request to accept a deviation from a requirement for a Product, Service, or Process — a formal way of saying &quot;this doesn't meet the specification, but we're asking to use/accept it anyway&quot; — recorded with a category, the person requesting it, and a decision.</p>\n","text":"A Concession is a request to accept a deviation from a requirement for a Product, Service, or Process — a formal way of saying \"this doesn't meet the specification, but we're asking to use/accept it anyway\" — recorded with a category, the person requesting it, and a decision."},{"heading":"Why it matters","kind":"overview","html":"<p>Deviations happen; the risk isn't that they happen but that they go unrecorded, or that &quot;who approved this and on what basis&quot; becomes unanswerable later. A Concession record exists specifically to capture that decision — who requested it, what the current approval stage is, and (once decided) the decision notes and date — as a permanent record independent of whatever informal conversation led to it.</p>\n","text":"Deviations happen; the risk isn't that they happen but that they go unrecorded, or that \"who approved this and on what basis\" becomes unanswerable later. A Concession record exists specifically to capture that decision — who requested it, what the current approval stage is, and (once decided) the decision notes and date — as a permanent record independent of whatever informal conversation led to it."},{"heading":"How it works","kind":"workflow","html":"<p>A concession is created <code>pending</code>, with an <code>approver_sequence</code> and <code>current_stage</code> describing who needs to approve it and where it currently sits in that sequence — both of these are plain text fields, not a modelled workflow engine, so the actual routing and enforcement of &quot;who approves next&quot; is a matter of convention and manual field updates, not something the application enforces automatically. It ends <code>approved</code> or <code>rejected</code>, with decision notes and a decision date recorded at that point.</p>\n","text":"A concession is created pending, with an approver_sequence and current_stage describing who needs to approve it and where it currently sits in that sequence — both of these are plain text fields, not a modelled workflow engine, so the actual routing and enforcement of \"who approves next\" is a matter of convention and manual field updates, not something the application enforces automatically. It ends approved or rejected, with decision notes and a decision date recorded at that point."},{"heading":"This screen","kind":"contextual","html":"<p>The list page shows every concession with its number, category and status, filterable/sortable by date raised, status, or when the record was created/updated. The detail page shows the full record including the approver sequence and current stage; create and edit forms share the same fields.</p>\n","text":"The list page shows every concession with its number, category and status, filterable/sortable by date raised, status, or when the record was created/updated. The detail page shows the full record including the approver sequence and current stage; create and edit forms share the same fields."},{"heading":"Fields","kind":"field-reference","html":"<ul>\n<li><strong>Concession number</strong> — required. This request's own identifying reference.</li>\n<li><strong>Description</strong> — required. What's being deviated from and why.</li>\n<li><strong>Category</strong> — required. One of Product, Service, Process.</li>\n<li><strong>Requested by</strong> — required.</li>\n<li><strong>Date raised</strong> — required.</li>\n<li><strong>Approver sequence</strong> — free text describing who needs to approve this concession, in order. Not validated or enforced by the application — a convention, not a workflow.</li>\n<li><strong>Current stage</strong> — free text describing where in that sequence the concession currently sits. Updated manually as it moves through approval.</li>\n<li><strong>Status</strong> — one of <code>pending</code>, <code>approved</code>, <code>rejected</code>.</li>\n<li><strong>Decision notes</strong> / <strong>Decision date</strong> — recorded once a decision is made.</li>\n</ul>\n","text":"Concession number — required. This request's own identifying reference. Description — required. What's being deviated from and why. Category — required. One of Product, Service, Process. Requested by — required. Date raised — required. Approver sequence — free text describing who needs to approve this concession, in order. Not validated or enforced by the application — a convention, not a workflow. Current stage — free text describing where in that sequence the concession currently sits. Updated manually as it moves through approval. Status — one of pending, approved, rejected. Decision notes / Decision date — recorded once a decision is made."},{"heading":"Actions","kind":"contextual","html":"<p>Moving a concession to <code>approved</code> or <code>rejected</code> is a direct field edit, available to anyone with edit access to this register — the <code>approver_sequence</code>/<code>current_stage</code> fields describe an approval process for the humans involved, but nothing in the application enforces that the recorded stage has actually signed off before the status changes.</p>\n","text":"Moving a concession to approved or rejected is a direct field edit, available to anyone with edit access to this register — the approver_sequence/current_stage fields describe an approval process for the humans involved, but nothing in the application enforces that the recorded stage has actually signed off before the status changes."},{"heading":"What happens next","kind":"workflow","html":"<p>Nothing else in the product reacts automatically to a concession's status. If a concession was raised because of a <a href=\"/modules/non-conformance-reports/\">Non-Conformance Report</a>, cross-reference the two by their own reference numbers — they aren't linked by a relational field.</p>\n","text":"Nothing else in the product reacts automatically to a concession's status. If a concession was raised because of a Non-Conformance Report, cross-reference the two by their own reference numbers — they aren't linked by a relational field."},{"heading":"FAQ","kind":"reference","html":"<p><strong>Can the approver sequence be more than one person?</strong> Yes — since it's a free-text field, describe as many stages as your process actually has (e.g. &quot;QA Manager → Client → Project Director&quot;); the application has no fixed limit or structure on it.</p>\n","text":"Can the approver sequence be more than one person? Yes — since it's a free-text field, describe as many stages as your process actually has (e.g. \"QA Manager → Client → Project Director\"); the application has no fixed limit or structure on it."}]},{"id":"contractors","type":"module","title":"Contractors","description":"Section 37(2) contractor management, with site-access compliance derived automatically from four gating checks.","status":"published","version":1,"locale":"en","translationKey":"contractors","module":"contractors","audience":["user","administrator"],"url":"https://docs.sheqcontrolplane.com/modules/contractors/","context":{"helpKeys":["contractors","contractor.create","contractor.edit","contractors.create","contractors.edit"],"screens":["contractors.list","contractors.detail","contractors.create","contractors.edit"],"applicationRoutes":["/contractors","/contractors/new","/contractors/:id","/contractors/:id/edit"]},"search":{"keywords":["contractor","section 37","sec 37(2)","site access","coid","mandatary agreement"]},"related":["permits-to-work"],"parentId":null,"prerequisites":[],"nextSteps":[],"deprecated":null,"lastUpdated":"2026-09-06T11:18:58+01:00","sections":[{"heading":"Overview","kind":"overview","html":"<p>The Contractors register tracks every contractor company working on site under a Section 37(2) mandatary agreement, and shows, for each one, whether it currently meets the requirements to be on site at all.</p>\n","text":"The Contractors register tracks every contractor company working on site under a Section 37(2) mandatary agreement, and shows, for each one, whether it currently meets the requirements to be on site at all."},{"heading":"Why it matters","kind":"overview","html":"<p>Section 37(2) of the Occupational Health and Safety Act makes the client responsible for confirming a contractor's compliance before letting them work — a responsibility that's easy to lose track of when it depends on several separate things staying valid at once (a signed agreement, an appointed responsible person, current COID cover, current medicals). Deriving one compliance status from all four means there's a single answer to &quot;can this contractor be on site right now,&quot; rather than four separate fields someone has to cross-check by hand.</p>\n","text":"Section 37(2) of the Occupational Health and Safety Act makes the client responsible for confirming a contractor's compliance before letting them work — a responsibility that's easy to lose track of when it depends on several separate things staying valid at once (a signed agreement, an appointed responsible person, current COID cover, current medicals). Deriving one compliance status from all four means there's a single answer to \"can this contractor be on site right now,\" rather than four separate fields someone has to cross-check by hand."},{"heading":"How it works","kind":"workflow","html":"<p>Compliance status is not a field anyone sets — it's computed every time the record is viewed, from four inputs: whether the mandatary agreement is signed, whether a Section 16(2) appointee is in place, and the COID and medical expiry dates. If either of the two structural checks (agreement signed, Sec 16(2) appointee) is missing, the contractor is <strong>missing</strong> compliance, regardless of the dates. Otherwise, the status is driven by whichever of the two expiry dates is soonest: <strong>expired</strong> if that date has already passed, <strong>expiring</strong> if it falls within the next 30 days, and <strong>compliant</strong> otherwise.</p>\n","text":"Compliance status is not a field anyone sets — it's computed every time the record is viewed, from four inputs: whether the mandatary agreement is signed, whether a Section 16(2) appointee is in place, and the COID and medical expiry dates. If either of the two structural checks (agreement signed, Sec 16(2) appointee) is missing, the contractor is missing compliance, regardless of the dates. Otherwise, the status is driven by whichever of the two expiry dates is soonest: expired if that date has already passed, expiring if it falls within the next 30 days, and compliant otherwise."},{"heading":"This screen","kind":"contextual","html":"<p>The list page shows every contractor with its computed compliance status, and can be filtered and sorted by company name or either expiry date. The detail page shows the full record including both structural checks and both expiry dates; create and edit forms share the same fields.</p>\n","text":"The list page shows every contractor with its computed compliance status, and can be filtered and sorted by company name or either expiry date. The detail page shows the full record including both structural checks and both expiry dates; create and edit forms share the same fields."},{"heading":"Fields","kind":"field-reference","html":"<ul>\n<li><strong>Company</strong> — required. The contractor company's name.</li>\n<li><strong>Contact</strong> — required. The contractor's contact person.</li>\n<li><strong>Mandatary agreement signed</strong> — a checkbox. One of the two structural gates for compliance.</li>\n<li><strong>Sec 16(2) appointed</strong> — a checkbox. Whether a Section 16(2) appointee is in place for this contractor. The other structural gate.</li>\n<li><strong>COID expiry</strong> — required date. Compensation for Occupational Injuries and Diseases cover expiry.</li>\n<li><strong>Medical expiry</strong> — required date. Expiry of the contractor's medical clearance.</li>\n</ul>\n","text":"Company — required. The contractor company's name. Contact — required. The contractor's contact person. Mandatary agreement signed — a checkbox. One of the two structural gates for compliance. Sec 16(2) appointed — a checkbox. Whether a Section 16(2) appointee is in place for this contractor. The other structural gate. COID expiry — required date. Compensation for Occupational Injuries and Diseases cover expiry. Medical expiry — required date. Expiry of the contractor's medical clearance."},{"heading":"Actions","kind":"contextual","html":"<p>Creating or editing a contractor validates the required fields (company, contact, both expiry dates) before saving; the two structural checks are plain checkboxes with no validation beyond being present. There is no separate &quot;approve for site access&quot; action — compliance status is always the derived read of the four fields above, never a status a user sets directly.</p>\n","text":"Creating or editing a contractor validates the required fields (company, contact, both expiry dates) before saving; the two structural checks are plain checkboxes with no validation beyond being present. There is no separate \"approve for site access\" action — compliance status is always the derived read of the four fields above, never a status a user sets directly."},{"heading":"What happens next","kind":"workflow","html":"<p>A contractor's compliance status has no automated downstream effect elsewhere in the product in the current version — it is not, for example, checked when a <a href=\"/modules/permits-to-work/\">Permit to Work</a> is issued. It is a read-only signal for whoever is managing site access to check before letting a contractor's people on site.</p>\n","text":"A contractor's compliance status has no automated downstream effect elsewhere in the product in the current version — it is not, for example, checked when a Permit to Work is issued. It is a read-only signal for whoever is managing site access to check before letting a contractor's people on site."},{"heading":"FAQ","kind":"reference","html":"<p><strong>Why is a contractor showing &quot;missing&quot; even though both expiry dates are in the future?</strong> Because &quot;missing&quot; only looks at the two structural checks (agreement signed, Sec 16(2) appointed) — both must be true before the expiry dates are even considered. Fix whichever checkbox is unticked.</p>\n<p><strong>What happens exactly 30 days before an expiry date?</strong> The contractor's status becomes &quot;expiring&quot; from 30 days out (inclusive) until the date passes, at which point it becomes &quot;expired.&quot; This is the same 30-day window used elsewhere in the product wherever an expiry badge is shown.</p>\n","text":"Why is a contractor showing \"missing\" even though both expiry dates are in the future? Because \"missing\" only looks at the two structural checks (agreement signed, Sec 16(2) appointed) — both must be true before the expiry dates are even considered. Fix whichever checkbox is unticked. What happens exactly 30 days before an expiry date? The contractor's status becomes \"expiring\" from 30 days out (inclusive) until the date passes, at which point it becomes \"expired.\" This is the same 30-day window used elsewhere in the product wherever an expiry badge is shown."}]},{"id":"dashboard","type":"module","title":"Dashboard","description":"An operational overview composed from live Incidents and Hazards data — what needs attention today, not a general-purpose reporting view.","status":"published","version":1,"locale":"en","translationKey":"dashboard","module":"dashboard","audience":["user","administrator","evaluator"],"url":"https://docs.sheqcontrolplane.com/modules/dashboard/","context":{"helpKeys":["dashboard"],"screens":["dashboard"],"applicationRoutes":["/"]},"search":{"keywords":["dashboard","home","overview","kpi"]},"related":["hazards-risk-register"],"parentId":null,"prerequisites":[],"nextSteps":["hazards-risk-register"],"deprecated":null,"lastUpdated":"2026-09-06T06:46:29+01:00","sections":[{"heading":"Overview","kind":"overview","html":"<p>The Dashboard is the application's home screen — an operational summary composed from live Incidents and Hazards data. It is not a general-purpose reporting or analytics view across every module; there is no dedicated dashboard/aggregate API endpoint behind it, only the real Incidents and Hazards services.</p>\n","text":"The Dashboard is the application's home screen — an operational summary composed from live Incidents and Hazards data. It is not a general-purpose reporting or analytics view across every module; there is no dedicated dashboard/aggregate API endpoint behind it, only the real Incidents and Hazards services."},{"heading":"Why it matters","kind":"overview","html":"<p>Landing on a blank list of modules gives no sense of what actually needs attention right now. Surfacing open incidents, high-severity items, and hazards due for review as soon as you log in turns the dashboard into a starting point for the day's work rather than just a menu.</p>\n","text":"Landing on a blank list of modules gives no sense of what actually needs attention right now. Surfacing open incidents, high-severity items, and hazards due for review as soon as you log in turns the dashboard into a starting point for the day's work rather than just a menu."},{"heading":"How it works","kind":"workflow","html":"<p>The dashboard fetches the most recent page of incidents and the most recent page of hazards (capped at 100 records each, an approximation the product accepts at its current scale rather than a true full-dataset aggregate) and computes: open incident count, high-severity open incident count, incidents flagged as triggering a Safe Work Procedure review, total hazard count, high-risk hazard count (risk score of 15 or above), and hazards due for review within 30 days. It also lists the five most recent incidents and the five hazards soonest due for review.</p>\n","text":"The dashboard fetches the most recent page of incidents and the most recent page of hazards (capped at 100 records each, an approximation the product accepts at its current scale rather than a true full-dataset aggregate) and computes: open incident count, high-severity open incident count, incidents flagged as triggering a Safe Work Procedure review, total hazard count, high-risk hazard count (risk score of 15 or above), and hazards due for review within 30 days. It also lists the five most recent incidents and the five hazards soonest due for review."},{"heading":"This screen","kind":"contextual","html":"<p>Stat cards summarise the counts above; two tables below list the recent incidents and the soonest-due hazard reviews, each linking through to that record's own detail page.</p>\n","text":"Stat cards summarise the counts above; two tables below list the recent incidents and the soonest-due hazard reviews, each linking through to that record's own detail page."},{"heading":"Actions","kind":"contextual","html":"<p>&quot;Log hazard&quot; and &quot;Report incident&quot; quick-action buttons are shown when the current user has the corresponding write permission — the dashboard is the one screen where a permission check visibly changes what's on the page, since it directly surfaces both modules' create actions.</p>\n","text":"\"Log hazard\" and \"Report incident\" quick-action buttons are shown when the current user has the corresponding write permission — the dashboard is the one screen where a permission check visibly changes what's on the page, since it directly surfaces both modules' create actions."},{"heading":"What happens next","kind":"workflow","html":"<p>Use the dashboard as a starting point, then go to <a href=\"/modules/incidents-near-misses/\">Incidents &amp; Near Misses</a> or <a href=\"/modules/hazards-risk-register/\">Hazard &amp; Risk Register</a> for the full register behind whichever number caught your attention.</p>\n","text":"Use the dashboard as a starting point, then go to Incidents & Near Misses or Hazard & Risk Register for the full register behind whichever number caught your attention."}]},{"id":"document-control","type":"module","title":"Document Control","description":"Drawing and document revision control — which revision is current, its status, and who it's been distributed to.","status":"published","version":1,"locale":"en","translationKey":"document-control","module":"doc-control","audience":["user","administrator"],"url":"https://docs.sheqcontrolplane.com/modules/document-control/","context":{"helpKeys":["doc-control","controlled-document.create","controlled-document.edit","doc-control.create","doc-control.edit"],"screens":["doc-control.list","doc-control.detail","doc-control.create","doc-control.edit"],"applicationRoutes":["/quality/documents","/quality/documents/new","/quality/documents/:id","/quality/documents/:id/edit"]},"search":{"keywords":["document control","drawing register","revision","for construction","distribution"]},"related":["safe-work-procedures"],"parentId":null,"prerequisites":[],"nextSteps":[],"deprecated":null,"lastUpdated":"2026-09-06T11:18:58+01:00","sections":[{"heading":"Overview","kind":"overview","html":"<p>Document Control tracks controlled documents — drawings, specifications, method statements and quality plans — by document number and revision, so it's always possible to tell which revision is the current one and where it's been distributed.</p>\n","text":"Document Control tracks controlled documents — drawings, specifications, method statements and quality plans — by document number and revision, so it's always possible to tell which revision is the current one and where it's been distributed."},{"heading":"Why it matters","kind":"overview","html":"<p>Working from the wrong revision of a drawing or specification is a common and entirely preventable source of quality failures on site. A document register that records revision, status and distribution explicitly means &quot;is this the right version?&quot; has a definite answer, rather than depending on whoever printed the copy in someone's hand having remembered to check.</p>\n","text":"Working from the wrong revision of a drawing or specification is a common and entirely preventable source of quality failures on site. A document register that records revision, status and distribution explicitly means \"is this the right version?\" has a definite answer, rather than depending on whoever printed the copy in someone's hand having remembered to check."},{"heading":"How it works","kind":"workflow","html":"<p>Each record is one document at one revision: its title, document number, revision identifier, document type, and status. Status moves through <code>draft</code> → <code>for-construction</code> → <code>superseded</code> — <code>for-construction</code> marking the point at which a document is released as the current, authoritative version to work from, and <code>superseded</code> marking that a later revision has replaced it.</p>\n","text":"Each record is one document at one revision: its title, document number, revision identifier, document type, and status. Status moves through draft → for-construction → superseded — for-construction marking the point at which a document is released as the current, authoritative version to work from, and superseded marking that a later revision has replaced it."},{"heading":"This screen","kind":"contextual","html":"<p>The list page shows every controlled document with its status, and can be filtered and sorted by title, status, issue date, or when the record was created or updated. The detail page shows the full record, including who it was distributed to; create and edit forms share the same fields.</p>\n","text":"The list page shows every controlled document with its status, and can be filtered and sorted by title, status, issue date, or when the record was created or updated. The detail page shows the full record, including who it was distributed to; create and edit forms share the same fields."},{"heading":"Fields","kind":"field-reference","html":"<ul>\n<li><strong>Document title</strong> — required. What the document is (e.g. &quot;Foundation Layout — Block C&quot;).</li>\n<li><strong>Document number</strong> — required. The organisation's own document numbering, distinct from the title.</li>\n<li><strong>Revision</strong> — required. The revision identifier for this specific version (e.g. &quot;Rev B&quot;).</li>\n<li><strong>Document type</strong> — required. One of Drawing, Specification, Method Statement, Quality Plan.</li>\n<li><strong>Status</strong> — one of <code>draft</code>, <code>for-construction</code>, <code>superseded</code>. New documents default to <code>draft</code>.</li>\n<li><strong>Issue date</strong> — optional. When this revision was issued.</li>\n<li><strong>Distributed to</strong> — optional, free text. Who this revision was distributed to.</li>\n</ul>\n","text":"Document title — required. What the document is (e.g. \"Foundation Layout — Block C\"). Document number — required. The organisation's own document numbering, distinct from the title. Revision — required. The revision identifier for this specific version (e.g. \"Rev B\"). Document type — required. One of Drawing, Specification, Method Statement, Quality Plan. Status — one of draft, for-construction, superseded. New documents default to draft. Issue date — optional. When this revision was issued. Distributed to — optional, free text. Who this revision was distributed to."},{"heading":"Actions","kind":"contextual","html":"<p>Creating a new revision of an existing document is done by creating a new record with the same document number and a new revision identifier, then marking the previous revision <code>superseded</code> — the register doesn't automatically supersede an earlier revision when a new one is created for the same document number.</p>\n","text":"Creating a new revision of an existing document is done by creating a new record with the same document number and a new revision identifier, then marking the previous revision superseded — the register doesn't automatically supersede an earlier revision when a new one is created for the same document number."},{"heading":"What happens next","kind":"workflow","html":"<p>There's no distribution notification sent when a document's status changes to <code>for-construction</code> in the current version of the product — &quot;Distributed to&quot; is a record of who received it, entered manually, not a triggered action.</p>\n","text":"There's no distribution notification sent when a document's status changes to for-construction in the current version of the product — \"Distributed to\" is a record of who received it, entered manually, not a triggered action."},{"heading":"FAQ","kind":"reference","html":"<p><strong>Does the register prevent two records sharing the same document number and revision?</strong> No — document number and revision are both plain text fields with no uniqueness check, so keeping them consistent (one <code>for-construction</code> revision per document number at a time) is a matter of register discipline, not something the system enforces.</p>\n","text":"Does the register prevent two records sharing the same document number and revision? No — document number and revision are both plain text fields with no uniqueness check, so keeping them consistent (one for-construction revision per document number at a time) is a matter of register discipline, not something the system enforces."}]},{"id":"emergency-preparedness","type":"module","title":"Emergency Preparedness","description":"First aiders, fire marshals, emergency contacts and evacuation drills, each tracked with when they were last done and when they're next due.","status":"published","version":1,"locale":"en","translationKey":"emergency-preparedness","module":"emergency","audience":["user","administrator"],"url":"https://docs.sheqcontrolplane.com/modules/emergency-preparedness/","context":{"helpKeys":["emergency","emergency-preparedness.create","emergency-preparedness.edit","emergency.create","emergency.edit"],"screens":["emergency.list","emergency.detail","emergency.create","emergency.edit"],"applicationRoutes":["/emergency","/emergency/new","/emergency/:id","/emergency/:id/edit"]},"search":{"keywords":["emergency preparedness","first aider","fire marshal","evacuation drill","emergency contact"]},"related":["hs-committee"],"parentId":null,"prerequisites":[],"nextSteps":[],"deprecated":null,"lastUpdated":"2026-09-06T11:18:58+01:00","sections":[{"heading":"Overview","kind":"overview","html":"<p>Emergency Preparedness tracks the people and activities that keep your site ready to respond to an emergency: designated first aiders, fire marshals, emergency contacts, and evacuation drills — each as its own record with a last-done date and a next-due date.</p>\n","text":"Emergency Preparedness tracks the people and activities that keep your site ready to respond to an emergency: designated first aiders, fire marshals, emergency contacts, and evacuation drills — each as its own record with a last-done date and a next-due date."},{"heading":"Why it matters","kind":"overview","html":"<p>Emergency readiness decays silently if it isn't tracked on a schedule: a first aider's certification lapses, a fire marshal leaves the organisation and isn't replaced, an evacuation drill hasn't run in over a year. Because every item type shares the same last-done/next-due structure, the register gives one place to see everything that's coming due for renewal or re-doing, regardless of what kind of readiness item it is.</p>\n","text":"Emergency readiness decays silently if it isn't tracked on a schedule: a first aider's certification lapses, a fire marshal leaves the organisation and isn't replaced, an evacuation drill hasn't run in over a year. Because every item type shares the same last-done/next-due structure, the register gives one place to see everything that's coming due for renewal or re-doing, regardless of what kind of readiness item it is."},{"heading":"How it works","kind":"workflow","html":"<p>Each record is one of four item types — Evacuation Drill, First Aider, Fire Marshal, or Emergency Contact — tied to a person or location, with a last-done date and a next-due date. There's no separate &quot;expired&quot; status; a record whose next-due date has passed is simply a record whose date field is in the past, visible to anyone sorting or filtering the list by that field.</p>\n","text":"Each record is one of four item types — Evacuation Drill, First Aider, Fire Marshal, or Emergency Contact — tied to a person or location, with a last-done date and a next-due date. There's no separate \"expired\" status; a record whose next-due date has passed is simply a record whose date field is in the past, visible to anyone sorting or filtering the list by that field."},{"heading":"This screen","kind":"contextual","html":"<p>The list page shows every item with its type, the associated person or location, and both dates, filterable and sortable. The detail page shows the full record; create and edit forms share the same fields.</p>\n","text":"The list page shows every item with its type, the associated person or location, and both dates, filterable and sortable. The detail page shows the full record; create and edit forms share the same fields."},{"heading":"Fields","kind":"field-reference","html":"<ul>\n<li><strong>Item type</strong> — required. One of Evacuation Drill, First Aider, Fire Marshal, Emergency Contact.</li>\n<li><strong>Person or location</strong> — required. Who holds this responsibility (for a First Aider or Fire Marshal) or where it applies (for a drill).</li>\n<li><strong>Last date</strong> — required. When this was last done or last confirmed.</li>\n<li><strong>Next due</strong> — required. When it needs to be done or reconfirmed again.</li>\n</ul>\n","text":"Item type — required. One of Evacuation Drill, First Aider, Fire Marshal, Emergency Contact. Person or location — required. Who holds this responsibility (for a First Aider or Fire Marshal) or where it applies (for a drill). Last date — required. When this was last done or last confirmed. Next due — required. When it needs to be done or reconfirmed again."},{"heading":"Actions","kind":"contextual","html":"<p>Creating or editing a record requires both dates to be set — there's no way to log an item without a next-due date, since an emergency-preparedness item with no future check-in date defeats the purpose of tracking it at all.</p>\n","text":"Creating or editing a record requires both dates to be set — there's no way to log an item without a next-due date, since an emergency-preparedness item with no future check-in date defeats the purpose of tracking it at all."},{"heading":"What happens next","kind":"workflow","html":"<p>Reviewing upcoming emergency-preparedness due dates is a natural standing item for an <a href=\"/modules/hs-committee/\">H&amp;S Committee</a> meeting, though the two registers aren't linked by a relational field in the current version — cross-reference manually when preparing a meeting's agenda.</p>\n","text":"Reviewing upcoming emergency-preparedness due dates is a natural standing item for an H&S Committee meeting, though the two registers aren't linked by a relational field in the current version — cross-reference manually when preparing a meeting's agenda."},{"heading":"FAQ","kind":"reference","html":"<p><strong>Can one person be recorded as both a First Aider and a Fire Marshal?</strong> Yes — create two separate records, one per item type, since each type tracks its own independent last-done/next-due cycle.</p>\n<p><strong>Does an overdue item block anything else in the product?</strong> No — it's a visible signal in this register only; it doesn't currently gate any other module or workflow.</p>\n","text":"Can one person be recorded as both a First Aider and a Fire Marshal? Yes — create two separate records, one per item type, since each type tracks its own independent last-done/next-due cycle. Does an overdue item block anything else in the product? No — it's a visible signal in this register only; it doesn't currently gate any other module or workflow."}]},{"id":"environmental-compliance-register","type":"module","title":"Compliance Register","description":"Environmental legal findings (ELCA-style) — each observation tied to a specific legal requirement, a compliance verdict, and a corrective action with an owner and due date.","status":"published","version":1,"locale":"en","translationKey":"environmental-compliance-register","module":"env-compliance","audience":["user","administrator"],"url":"https://docs.sheqcontrolplane.com/modules/environmental-compliance-register/","context":{"helpKeys":["env-compliance","environmental-compliance.create","environmental-compliance.edit","env-compliance.create","env-compliance.edit"],"screens":["env-compliance.list","env-compliance.detail","env-compliance.create","env-compliance.edit"],"applicationRoutes":["/environmental/compliance","/environmental/compliance/new","/environmental/compliance/:id","/environmental/compliance/:id/edit"]},"search":{"keywords":["environmental compliance","elca","legal requirement","environmental finding"]},"related":["environmental-metrics-log"],"parentId":null,"prerequisites":[],"nextSteps":[],"deprecated":null,"lastUpdated":"2026-09-06T11:18:58+01:00","sections":[{"heading":"Overview","kind":"overview","html":"<p>The Compliance Register is an ELCA-style (Environmental Legal Compliance Assessment) log: every finding pairs an observation with the specific legal requirement it's assessed against, a compliance verdict, and — where needed — a corrective action, owner and due date.</p>\n","text":"The Compliance Register is an ELCA-style (Environmental Legal Compliance Assessment) log: every finding pairs an observation with the specific legal requirement it's assessed against, a compliance verdict, and — where needed — a corrective action, owner and due date."},{"heading":"Why it matters","kind":"overview","html":"<p>An environmental audit finding is only actionable if it's clear exactly which legal requirement it relates to and what a &quot;compliant&quot; verdict actually means for that requirement. Structuring every record as observation-plus-legal-requirement-plus-verdict, rather than a free-text audit note, keeps that link explicit for every finding, not just the ones someone remembered to cross-reference.</p>\n","text":"An environmental audit finding is only actionable if it's clear exactly which legal requirement it relates to and what a \"compliant\" verdict actually means for that requirement. Structuring every record as observation-plus-legal-requirement-plus-verdict, rather than a free-text audit note, keeps that link explicit for every finding, not just the ones someone remembered to cross-reference."},{"heading":"How it works","kind":"workflow","html":"<p>Each finding is categorised (Air Quality, Water Management, Waste Management, Hazardous Substances, Energy &amp; GHG, Fauna &amp; Flora, Fire Protection, International Laws, or General), records the observation and the legal requirement it's assessed against, and carries a compliance verdict: <code>compliant</code>, <code>non-compliant</code>, <code>query-non-compliant</code>, <code>observation</code>, or <code>fyi</code>. A finding also has its own open/closed status, separate from the compliance verdict — a non-compliant finding stays <code>open</code> until its corrective action is complete, then moves to <code>closed</code>, while the verdict itself (<code>non-compliant</code>) remains part of the historical record.</p>\n","text":"Each finding is categorised (Air Quality, Water Management, Waste Management, Hazardous Substances, Energy & GHG, Fauna & Flora, Fire Protection, International Laws, or General), records the observation and the legal requirement it's assessed against, and carries a compliance verdict: compliant, non-compliant, query-non-compliant, observation, or fyi. A finding also has its own open/closed status, separate from the compliance verdict — a non-compliant finding stays open until its corrective action is complete, then moves to closed, while the verdict itself (non-compliant) remains part of the historical record."},{"heading":"This screen","kind":"contextual","html":"<p>The list page shows every finding with its category, compliance verdict, and open/closed status, filterable and sortable by due date, compliance status, or status. The detail page shows the full finding; create and edit forms share the same fields.</p>\n","text":"The list page shows every finding with its category, compliance verdict, and open/closed status, filterable and sortable by due date, compliance status, or status. The detail page shows the full finding; create and edit forms share the same fields."},{"heading":"Fields","kind":"field-reference","html":"<ul>\n<li><strong>Category</strong> — required. One of Air Quality, Water Management, Waste Management, Hazardous Substances, Energy &amp; GHG, Fauna &amp; Flora, Fire Protection, International Laws, General.</li>\n<li><strong>Observation</strong> — required. What was observed.</li>\n<li><strong>Legal requirement</strong> — required. The specific legal requirement this observation is assessed against.</li>\n<li><strong>Compliance status</strong> — required. One of <code>compliant</code>, <code>non-compliant</code>, <code>query-non-compliant</code>, <code>observation</code>, <code>fyi</code>.</li>\n<li><strong>Recommendation</strong> — optional. The corrective action recommended, if any.</li>\n<li><strong>Responsible person</strong> — required. Who owns following up on this finding.</li>\n<li><strong>Due date</strong> — required. When the corrective action is due.</li>\n<li><strong>Status</strong> — <code>open</code> or <code>closed</code>. Independent of the compliance verdict.</li>\n</ul>\n","text":"Category — required. One of Air Quality, Water Management, Waste Management, Hazardous Substances, Energy & GHG, Fauna & Flora, Fire Protection, International Laws, General. Observation — required. What was observed. Legal requirement — required. The specific legal requirement this observation is assessed against. Compliance status — required. One of compliant, non-compliant, query-non-compliant, observation, fyi. Recommendation — optional. The corrective action recommended, if any. Responsible person — required. Who owns following up on this finding. Due date — required. When the corrective action is due. Status — open or closed. Independent of the compliance verdict."},{"heading":"Actions","kind":"contextual","html":"<p>Creating or editing a finding requires category, observation, legal requirement, compliance status, responsible person, and due date; the recommendation field is optional (findings verdicted <code>compliant</code>/<code>fyi</code> often won't need one).</p>\n","text":"Creating or editing a finding requires category, observation, legal requirement, compliance status, responsible person, and due date; the recommendation field is optional (findings verdicted compliant/fyi often won't need one)."},{"heading":"What happens next","kind":"workflow","html":"<p>Closing a finding is a direct status edit — there's no separate sign-off step or notification triggered by it in the current version of the product. A finding's compliance status has no automated effect on other registers such as <a href=\"/modules/environmental-metrics-log/\">Metrics Log</a> or the <a href=\"/modules/legal-register/\">Legal Register</a>; relate them manually where they cover the same underlying requirement.</p>\n","text":"Closing a finding is a direct status edit — there's no separate sign-off step or notification triggered by it in the current version of the product. A finding's compliance status has no automated effect on other registers such as Metrics Log or the Legal Register; relate them manually where they cover the same underlying requirement."},{"heading":"FAQ","kind":"reference","html":"<p><strong>What's the difference between &quot;non-compliant&quot; and &quot;query-non-compliant&quot;?</strong> Both are compliance-status verdicts; <code>query-non-compliant</code> is for a finding where non-compliance is suspected but not yet confirmed — use <code>non-compliant</code> once it is.</p>\n","text":"What's the difference between \"non-compliant\" and \"query-non-compliant\"? Both are compliance-status verdicts; query-non-compliant is for a finding where non-compliance is suspected but not yet confirmed — use non-compliant once it is."}]},{"id":"environmental-metrics-log","type":"module","title":"Metrics Log","description":"Numeric readings over time — water, waste, energy and air-quality — each tagged with a period, value and unit.","status":"published","version":1,"locale":"en","translationKey":"environmental-metrics-log","module":"env-metrics","audience":["user","administrator"],"url":"https://docs.sheqcontrolplane.com/modules/environmental-metrics-log/","context":{"helpKeys":["env-metrics","environmental-metric.create","environmental-metric.edit","env-metrics.create","env-metrics.edit"],"screens":["env-metrics.list","env-metrics.detail","env-metrics.create","env-metrics.edit"],"applicationRoutes":["/environmental/metrics","/environmental/metrics/new","/environmental/metrics/:id","/environmental/metrics/:id/edit"]},"search":{"keywords":["environmental metrics","water consumption","waste","energy usage","air quality"]},"related":["environmental-compliance-register"],"parentId":null,"prerequisites":[],"nextSteps":[],"deprecated":null,"lastUpdated":"2026-09-06T11:18:58+01:00","sections":[{"heading":"Overview","kind":"overview","html":"<p>The Metrics Log records numeric environmental readings over time — water consumption, waste generated, energy usage, and air-quality monitoring — each entry a single measurement for a named metric, period, value and unit.</p>\n","text":"The Metrics Log records numeric environmental readings over time — water consumption, waste generated, energy usage, and air-quality monitoring — each entry a single measurement for a named metric, period, value and unit."},{"heading":"Why it matters","kind":"overview","html":"<p>Environmental performance is inherently a trend, not a point-in-time fact — whether water consumption is improving or worsening only means something measured against previous periods. Storing every reading as its own record, rather than overwriting a single &quot;current value&quot; field, is what makes that trend visible later.</p>\n","text":"Environmental performance is inherently a trend, not a point-in-time fact — whether water consumption is improving or worsening only means something measured against previous periods. Storing every reading as its own record, rather than overwriting a single \"current value\" field, is what makes that trend visible later."},{"heading":"How it works","kind":"workflow","html":"<p>Each entry is tagged with a category (Water consumption, Waste generated, Energy usage, or Air quality monitoring), a specific metric name (free text, so an organisation can track whatever it actually measures within a category), a period, a numeric value, and a unit.</p>\n","text":"Each entry is tagged with a category (Water consumption, Waste generated, Energy usage, or Air quality monitoring), a specific metric name (free text, so an organisation can track whatever it actually measures within a category), a period, a numeric value, and a unit."},{"heading":"This screen","kind":"contextual","html":"<p>The list page shows every reading with its category and period, filterable and sortable by period or category. The detail page shows the full entry; create and edit forms share the same fields.</p>\n","text":"The list page shows every reading with its category and period, filterable and sortable by period or category. The detail page shows the full entry; create and edit forms share the same fields."},{"heading":"Fields","kind":"field-reference","html":"<ul>\n<li><strong>Category</strong> — required. One of Water consumption, Waste generated, Energy usage, Air quality monitoring.</li>\n<li><strong>Metric name</strong> — required. What specifically is being measured (e.g. &quot;Site potable water&quot; or &quot;Diesel generator run-hours&quot;).</li>\n<li><strong>Period</strong> — required. The period this reading is for.</li>\n<li><strong>Value</strong> — required, numeric, cannot be negative.</li>\n<li><strong>Unit</strong> — required. The unit the value is expressed in (e.g. &quot;kL&quot;, &quot;kWh&quot;, &quot;tonnes&quot;).</li>\n</ul>\n","text":"Category — required. One of Water consumption, Waste generated, Energy usage, Air quality monitoring. Metric name — required. What specifically is being measured (e.g. \"Site potable water\" or \"Diesel generator run-hours\"). Period — required. The period this reading is for. Value — required, numeric, cannot be negative. Unit — required. The unit the value is expressed in (e.g. \"kL\", \"kWh\", \"tonnes\")."},{"heading":"Actions","kind":"contextual","html":"<p>Creating or editing a reading validates category, metric name, period and unit as required, and value as a non-negative number.</p>\n","text":"Creating or editing a reading validates category, metric name, period and unit as required, and value as a non-negative number."},{"heading":"What happens next","kind":"workflow","html":"<p>There's no automated trend chart, alert threshold, or rollup computed from these readings in the current version of the product — the log is the record itself. Findings in the <a href=\"/modules/environmental-compliance-register/\">Compliance Register</a> that relate to a metric here (e.g. a water-usage limit) are recorded separately; relate them manually if useful.</p>\n","text":"There's no automated trend chart, alert threshold, or rollup computed from these readings in the current version of the product — the log is the record itself. Findings in the Compliance Register that relate to a metric here (e.g. a water-usage limit) are recorded separately; relate them manually if useful."},{"heading":"FAQ","kind":"reference","html":"<p><strong>Can &quot;value&quot; be a rate rather than a total?</strong> Yes — the field is just a number with a unit you choose; whether it represents a total, an average, or a rate for the period is a convention your organisation sets and should keep consistent within each metric name.</p>\n","text":"Can \"value\" be a rate rather than a total? Yes — the field is just a number with a unit you choose; whether it represents a total, an average, or a rate for the period is a convention your organisation sets and should keep consistent within each metric name."}]},{"id":"equipment-inspections","type":"module","title":"Equipment Inspections","description":"Pass/fail inspection results for machines, ladders and other equipment, with each asset's next inspection due date.","status":"published","version":1,"locale":"en","translationKey":"equipment-inspections","module":"equipment","audience":["user","administrator"],"url":"https://docs.sheqcontrolplane.com/modules/equipment-inspections/","context":{"helpKeys":["equipment","equipment-check.create","equipment-check.edit","equipment.create","equipment.edit"],"screens":["equipment.list","equipment.detail","equipment.create","equipment.edit"],"applicationRoutes":["/equipment","/equipment/new","/equipment/:id","/equipment/:id/edit"]},"search":{"keywords":["equipment","inspection","ladder","machine","pass fail"]},"related":[],"parentId":null,"prerequisites":[],"nextSteps":[],"deprecated":null,"lastUpdated":"2026-09-06T11:18:58+01:00","sections":[{"heading":"Overview","kind":"overview","html":"<p>The Equipment Inspections register logs the result of every inspection carried out on a machine, ladder, or other piece of equipment, and when that asset's next inspection is due.</p>\n","text":"The Equipment Inspections register logs the result of every inspection carried out on a machine, ladder, or other piece of equipment, and when that asset's next inspection is due."},{"heading":"Why it matters","kind":"overview","html":"<p>Equipment that fails an inspection but keeps getting used because the failed result lives only in a paper checklist is a real hazard, not a paperwork gap. Recording every inspection as its own record, with a clear pass/fail result and the asset it was for, keeps a full history per asset rather than only the most recent check.</p>\n","text":"Equipment that fails an inspection but keeps getting used because the failed result lives only in a paper checklist is a real hazard, not a paperwork gap. Recording every inspection as its own record, with a clear pass/fail result and the asset it was for, keeps a full history per asset rather than only the most recent check."},{"heading":"How it works","kind":"workflow","html":"<p>Each inspection record captures the asset, its type (Machine, Ladder, or Equipment), when it was last inspected, when the next inspection is due, the result (pass or fail), and who inspected it. There's no separate &quot;asset register&quot; distinct from the inspection log — each record is one inspection event tied to a named asset.</p>\n","text":"Each inspection record captures the asset, its type (Machine, Ladder, or Equipment), when it was last inspected, when the next inspection is due, the result (pass or fail), and who inspected it. There's no separate \"asset register\" distinct from the inspection log — each record is one inspection event tied to a named asset."},{"heading":"This screen","kind":"contextual","html":"<p>The list page shows every inspection with its result and next-due date, filterable and sortable by result or next-due date. The detail page shows the full record; create and edit forms share the same fields.</p>\n","text":"The list page shows every inspection with its result and next-due date, filterable and sortable by result or next-due date. The detail page shows the full record; create and edit forms share the same fields."},{"heading":"Fields","kind":"field-reference","html":"<ul>\n<li><strong>Asset</strong> — required. The name or identifier of the machine, ladder, or equipment inspected.</li>\n<li><strong>Asset type</strong> — required. One of Machine, Ladder, Equipment.</li>\n<li><strong>Last inspection</strong> — required date.</li>\n<li><strong>Next due</strong> — required date. When this asset is next due for inspection.</li>\n<li><strong>Result</strong> — required. Pass or fail.</li>\n<li><strong>Inspector</strong> — required. Who carried out the inspection.</li>\n</ul>\n","text":"Asset — required. The name or identifier of the machine, ladder, or equipment inspected. Asset type — required. One of Machine, Ladder, Equipment. Last inspection — required date. Next due — required date. When this asset is next due for inspection. Result — required. Pass or fail. Inspector — required. Who carried out the inspection."},{"heading":"Actions","kind":"contextual","html":"<p>Creating or editing an inspection record validates every field as required. There's no separate action to &quot;retire&quot; or &quot;take out of service&quot; an asset that fails — a failed result is simply the value of the Result field on that inspection's record.</p>\n","text":"Creating or editing an inspection record validates every field as required. There's no separate action to \"retire\" or \"take out of service\" an asset that fails — a failed result is simply the value of the Result field on that inspection's record."},{"heading":"What happens next","kind":"workflow","html":"<p>A failed result has no automated downstream effect elsewhere in the product in the current version — it's a value on the record, meant to be visible to whoever reviews the register, not a trigger that blocks other actions (such as issuing a <a href=\"/modules/permits-to-work/\">Permit to Work</a> that would use the asset).</p>\n","text":"A failed result has no automated downstream effect elsewhere in the product in the current version — it's a value on the record, meant to be visible to whoever reviews the register, not a trigger that blocks other actions (such as issuing a Permit to Work that would use the asset)."},{"heading":"FAQ","kind":"reference","html":"<p><strong>Can the same asset have more than one inspection record?</strong> Yes — each inspection is its own record, so an asset that's inspected repeatedly over time will have one record per inspection, giving a full history rather than a single &quot;current status&quot; field.</p>\n","text":"Can the same asset have more than one inspection record? Yes — each inspection is its own record, so an asset that's inspected repeatedly over time will have one record per inspection, giving a full history rather than a single \"current status\" field."}]},{"id":"hazards-risk-register","type":"module","title":"Hazard & Risk Register","description":"HIRA-style hazard identification and risk assessment — every hazard scored by likelihood and severity, with the controls in place to reduce it.","status":"published","version":1,"locale":"en","translationKey":"hazards-risk-register","module":"hazards","audience":["user","administrator"],"url":"https://docs.sheqcontrolplane.com/modules/hazards-risk-register/","context":{"helpKeys":["hazards","hazard.create","hazard.edit","hazards.create","hazards.edit"],"screens":["hazards.list","hazards.detail","hazards.create","hazards.edit"],"applicationRoutes":["/hazards","/hazards/new","/hazards/:id","/hazards/:id/edit"]},"search":{"keywords":["hazard","risk","hira","risk assessment","likelihood","severity","risk score"]},"related":["safe-work-procedures","permits-to-work"],"parentId":null,"prerequisites":[],"nextSteps":["safe-work-procedures"],"deprecated":null,"lastUpdated":"2026-09-06T11:18:58+01:00","sections":[{"heading":"Overview","kind":"overview","html":"<p>The Hazard &amp; Risk Register is a HIRA-style (Hazard Identification and Risk Assessment) log of every identified hazard for a given activity, scored numerically so hazards can be compared and prioritised rather than just listed.</p>\n","text":"The Hazard & Risk Register is a HIRA-style (Hazard Identification and Risk Assessment) log of every identified hazard for a given activity, scored numerically so hazards can be compared and prioritised rather than just listed."},{"heading":"Why it matters","kind":"overview","html":"<p>A hazard that's identified but not scored tends to get treated with whatever attention it happened to get when someone first noticed it, not the attention its actual risk warrants. Scoring likelihood and severity separately, then deriving a risk score and band from both, gives a consistent basis for deciding what needs a control put in place now versus what can be monitored.</p>\n","text":"A hazard that's identified but not scored tends to get treated with whatever attention it happened to get when someone first noticed it, not the attention its actual risk warrants. Scoring likelihood and severity separately, then deriving a risk score and band from both, gives a consistent basis for deciding what needs a control put in place now versus what can be monitored."},{"heading":"How it works","kind":"workflow","html":"<p>Each hazard record captures the activity it relates to, a description of the hazard itself, the controls currently in place, an owner, and a review date. Likelihood and severity are each entered on a numeric scale; the register derives a <strong>risk score</strong> (likelihood × severity) and a <strong>risk band</strong> — low (score below 8), medium (8–14), or high (15 and above) — automatically, so the band is always consistent with the two inputs rather than a separately-entered judgement call that can drift out of sync with them.</p>\n","text":"Each hazard record captures the activity it relates to, a description of the hazard itself, the controls currently in place, an owner, and a review date. Likelihood and severity are each entered on a numeric scale; the register derives a risk score (likelihood × severity) and a risk band — low (score below 8), medium (8–14), or high (15 and above) — automatically, so the band is always consistent with the two inputs rather than a separately-entered judgement call that can drift out of sync with them."},{"heading":"This screen","kind":"contextual","html":"<p>The list page shows every hazard with its computed risk score/band, and can be filtered and sorted by likelihood, severity, review date, or when the record was created/updated. The detail page shows the full assessment; create and edit forms share the same fields.</p>\n","text":"The list page shows every hazard with its computed risk score/band, and can be filtered and sorted by likelihood, severity, review date, or when the record was created/updated. The detail page shows the full assessment; create and edit forms share the same fields."},{"heading":"Fields","kind":"field-reference","html":"<ul>\n<li><strong>Activity</strong> — required. The task or situation the hazard relates to (e.g. &quot;Roof access for gutter cleaning&quot;).</li>\n<li><strong>Hazard</strong> — required. What the hazard actually is (e.g. &quot;Fall from height&quot;).</li>\n<li><strong>Likelihood</strong> — required, numeric. How likely the hazard is to result in harm, on the register's rating scale.</li>\n<li><strong>Severity</strong> — required, numeric. How severe the harm would be if it occurred.</li>\n<li><strong>Controls</strong> — required. The controls currently in place to reduce likelihood and/or severity.</li>\n<li><strong>Owner</strong> — required. Who is responsible for this hazard assessment staying current.</li>\n<li><strong>Review date</strong> — required. When this assessment is next due to be reconsidered.</li>\n</ul>\n<p>Risk score and risk band are not entered — they're computed from Likelihood × Severity every time the record is viewed, so they can never be out of sync with the two fields that produce them.</p>\n","text":"Activity — required. The task or situation the hazard relates to (e.g. \"Roof access for gutter cleaning\"). Hazard — required. What the hazard actually is (e.g. \"Fall from height\"). Likelihood — required, numeric. How likely the hazard is to result in harm, on the register's rating scale. Severity — required, numeric. How severe the harm would be if it occurred. Controls — required. The controls currently in place to reduce likelihood and/or severity. Owner — required. Who is responsible for this hazard assessment staying current. Review date — required. When this assessment is next due to be reconsidered. Risk score and risk band are not entered — they're computed from Likelihood × Severity every time the record is viewed, so they can never be out of sync with the two fields that produce them."},{"heading":"What happens next","kind":"workflow","html":"<p>A hazard is not automatically linked to anything else when created, but a <a href=\"/modules/permits-to-work/\">Permit to Work</a> issued for the activity it covers should be linked to it directly using the permit's relational picker — this is what lets a permit show, at issue time, exactly which assessed risk and controls apply to the work it authorises. A high-risk-band hazard is not blocked from any action elsewhere in the product in the current version — the band is a prioritisation signal for the people managing the register, not an automated gate.</p>\n","text":"A hazard is not automatically linked to anything else when created, but a Permit to Work issued for the activity it covers should be linked to it directly using the permit's relational picker — this is what lets a permit show, at issue time, exactly which assessed risk and controls apply to the work it authorises. A high-risk-band hazard is not blocked from any action elsewhere in the product in the current version — the band is a prioritisation signal for the people managing the register, not an automated gate."},{"heading":"FAQ","kind":"reference","html":"<p><strong>What are the likelihood/severity scales?</strong> Both are plain numeric fields — the register doesn't enforce a fixed rating scale (e.g. 1–5) at the data level; align on one scale within your organisation and use it consistently, since the risk-band thresholds (8 and 15) are fixed and assume a shared scale across every hazard.</p>\n<p><strong>Can a hazard be linked to more than one Safe Work Procedure?</strong> Yes — linking happens from the Permit to Work side (a permit references one hazard and one procedure), so any number of permits, each covering a different procedure, can reference the same hazard.</p>\n","text":"What are the likelihood/severity scales? Both are plain numeric fields — the register doesn't enforce a fixed rating scale (e.g. 1–5) at the data level; align on one scale within your organisation and use it consistently, since the risk-band thresholds (8 and 15) are fixed and assume a shared scale across every hazard. Can a hazard be linked to more than one Safe Work Procedure? Yes — linking happens from the Permit to Work side (a permit references one hazard and one procedure), so any number of permits, each covering a different procedure, can reference the same hazard."}]},{"id":"hr-action-log","type":"module","title":"HR Action Log","description":"Disciplinary actions against employees, optionally noted as linked to a safety or compliance event elsewhere in the system.","status":"published","version":1,"locale":"en","translationKey":"hr-action-log","module":"hractions","audience":["user","administrator"],"url":"https://docs.sheqcontrolplane.com/modules/hr-action-log/","context":{"helpKeys":["hractions","hr-action.create","hr-action.edit","hractions.create","hractions.edit"],"screens":["hractions.list","hractions.detail","hractions.create","hractions.edit"],"applicationRoutes":["/hr-actions","/hr-actions/new","/hr-actions/:id","/hr-actions/:id/edit"]},"search":{"keywords":["hr action","disciplinary","warning","dismissal","counselling"]},"related":["hs-committee"],"parentId":null,"prerequisites":[],"nextSteps":[],"deprecated":null,"lastUpdated":"2026-09-06T11:18:58+01:00","sections":[{"heading":"Overview","kind":"overview","html":"<p>The HR Action Log records disciplinary actions taken against an employee — counselling through to dismissal — and can note, in free text, which safety or compliance event the action follows from.</p>\n","text":"The HR Action Log records disciplinary actions taken against an employee — counselling through to dismissal — and can note, in free text, which safety or compliance event the action follows from."},{"heading":"Why it matters","kind":"overview","html":"<p>Disciplinary follow-through matters for SHEQ the same way it matters for any workplace policy: an incident or non-conformance that never results in any accountability tends to recur. Logging the action directly, with an open/closed status and an optional follow-up date, gives a simple way to see what disciplinary matters are still open.</p>\n","text":"Disciplinary follow-through matters for SHEQ the same way it matters for any workplace policy: an incident or non-conformance that never results in any accountability tends to recur. Logging the action directly, with an open/closed status and an optional follow-up date, gives a simple way to see what disciplinary matters are still open."},{"heading":"How it works","kind":"workflow","html":"<p>An action has a type (Counselling, Verbal warning, Written warning, Final warning, Dismissal), an action date, a status (<code>open</code>/<code>closed</code>), and an optional follow-up date. The <strong>&quot;linked to&quot; field is deliberately free text, not a relational link</strong> to the actual incident, hazard or non-conformance record it follows from — it's a note for a human reader, not a foreign key the system enforces or validates. This is a considered simplification: HR actions concern an individual's employment record and don't need to participate in the same cross-module relational integrity that, for example, a Permit to Work's hazard/procedure links do.</p>\n","text":"An action has a type (Counselling, Verbal warning, Written warning, Final warning, Dismissal), an action date, a status (open/closed), and an optional follow-up date. The \"linked to\" field is deliberately free text, not a relational link to the actual incident, hazard or non-conformance record it follows from — it's a note for a human reader, not a foreign key the system enforces or validates. This is a considered simplification: HR actions concern an individual's employment record and don't need to participate in the same cross-module relational integrity that, for example, a Permit to Work's hazard/procedure links do."},{"heading":"This screen","kind":"contextual","html":"<p>The list page shows every action with its employee, type, status and follow-up date, filterable and sortable. The detail page shows the full record including the free-text &quot;linked to&quot; note; create and edit forms share the same fields.</p>\n","text":"The list page shows every action with its employee, type, status and follow-up date, filterable and sortable. The detail page shows the full record including the free-text \"linked to\" note; create and edit forms share the same fields."},{"heading":"Fields","kind":"field-reference","html":"<ul>\n<li><strong>Employee</strong> — required. Who the action concerns.</li>\n<li><strong>Linked to</strong> — optional, free text. A note about which event this action follows from (e.g. &quot;Incident INC-2026-014&quot; or &quot;NCR raised 2026-03-02&quot;) — not validated against any other register.</li>\n<li><strong>Action type</strong> — required. One of Counselling, Verbal warning, Written warning, Final warning, Dismissal.</li>\n<li><strong>Action date</strong> — required.</li>\n<li><strong>Status</strong> — <code>open</code> or <code>closed</code>.</li>\n<li><strong>Follow-up date</strong> — optional. When to check back on this action.</li>\n</ul>\n","text":"Employee — required. Who the action concerns. Linked to — optional, free text. A note about which event this action follows from (e.g. \"Incident INC-2026-014\" or \"NCR raised 2026-03-02\") — not validated against any other register. Action type — required. One of Counselling, Verbal warning, Written warning, Final warning, Dismissal. Action date — required. Status — open or closed. Follow-up date — optional. When to check back on this action."},{"heading":"Actions","kind":"contextual","html":"<p>Creating or editing an action requires an employee name, an action type, and an action date; &quot;linked to&quot; and &quot;follow-up date&quot; can both be left blank.</p>\n","text":"Creating or editing an action requires an employee name, an action type, and an action date; \"linked to\" and \"follow-up date\" can both be left blank."},{"heading":"What happens next","kind":"workflow","html":"<p>There's no automatic status change or reminder when a follow-up date passes — it's a field to filter and sort by, the same as the &quot;linked to&quot; note is a field for a human to read, not for the system to act on. If an action originates from something discussed in an <a href=\"/modules/hs-committee/\">H&amp;S Committee</a> meeting, record it here separately; the two registers aren't linked.</p>\n","text":"There's no automatic status change or reminder when a follow-up date passes — it's a field to filter and sort by, the same as the \"linked to\" note is a field for a human to read, not for the system to act on. If an action originates from something discussed in an H&S Committee meeting, record it here separately; the two registers aren't linked."},{"heading":"FAQ","kind":"reference","html":"<p><strong>Why isn't &quot;linked to&quot; a real link to the incident/NCR/hazard record?</strong> By design — an HR action concerns an individual's employment record, which is a different category of data from a SHEQ event record, and the product deliberately keeps them loosely coupled (a text note) rather than creating a formal cross-module reference for something that's ultimately a human-resources decision, not a safety-system one.</p>\n<p><strong>Can an employee have more than one open action at a time?</strong> Yes — there's no restriction preventing multiple open actions against the same employee.</p>\n","text":"Why isn't \"linked to\" a real link to the incident/NCR/hazard record? By design — an HR action concerns an individual's employment record, which is a different category of data from a SHEQ event record, and the product deliberately keeps them loosely coupled (a text note) rather than creating a formal cross-module reference for something that's ultimately a human-resources decision, not a safety-system one. Can an employee have more than one open action at a time? Yes — there's no restriction preventing multiple open actions against the same employee."}]},{"id":"incidents-near-misses","type":"module","title":"Incidents & Near Misses","description":"Report and investigate incidents and near-miss events, with an optional flag to prompt a Safe Work Procedure review.","status":"published","version":1,"locale":"en","translationKey":"incidents-near-misses","module":"incidents","audience":["user","administrator"],"url":"https://docs.sheqcontrolplane.com/modules/incidents-near-misses/","context":{"helpKeys":["incidents","incident.create","incident.edit","incidents.create","incidents.edit"],"screens":["incidents.list","incidents.detail","incidents.create","incidents.edit"],"applicationRoutes":["/incidents","/incidents/new","/incidents/:id","/incidents/:id/edit"]},"search":{"keywords":["incident","near miss","investigation","root cause","corrective action"]},"related":["hazards-risk-register","safe-work-procedures"],"parentId":null,"prerequisites":[],"nextSteps":["hazards-risk-register"],"deprecated":null,"lastUpdated":"2026-09-06T11:18:58+01:00","sections":[{"heading":"Overview","kind":"overview","html":"<p>The Incidents &amp; Near Misses register logs both incidents (something happened) and near misses (something almost happened) using the same form and the same investigation fields, distinguished only by an Incident Type field.</p>\n","text":"The Incidents & Near Misses register logs both incidents (something happened) and near misses (something almost happened) using the same form and the same investigation fields, distinguished only by an Incident Type field."},{"heading":"Why it matters","kind":"overview","html":"<p>Near misses are the cheapest source of safety information an organisation has — they show where a control is failing before it actually causes harm, at no cost. Logging them in the same register as real incidents, with the same investigation rigor, means a near miss doesn't quietly disappear into a verbal report that goes nowhere.</p>\n","text":"Near misses are the cheapest source of safety information an organisation has — they show where a control is failing before it actually causes harm, at no cost. Logging them in the same register as real incidents, with the same investigation rigor, means a near miss doesn't quietly disappear into a verbal report that goes nowhere."},{"heading":"How it works","kind":"workflow","html":"<p>Every record has a status — <code>open</code>, <code>investigating</code>, or <code>closed</code> — and severity — <code>Low</code>, <code>Medium</code>, or <code>High</code>. Investigation is captured as three free-text fields: why it happened, the corrective action taken, and how it was prevented from happening again. A record can also be flagged to trigger a Safe Work Procedure review.</p>\n","text":"Every record has a status — open, investigating, or closed — and severity — Low, Medium, or High. Investigation is captured as three free-text fields: why it happened, the corrective action taken, and how it was prevented from happening again. A record can also be flagged to trigger a Safe Work Procedure review."},{"heading":"This screen","kind":"contextual","html":"<p>The list page shows every incident/near miss with its date, type, severity and status, filterable and sortable by any of those, and supports CSV import/export (the list page's column headers, including &quot;Trigger SWP review&quot;, map directly to import columns). The detail page shows the full investigation; create and edit forms share the same fields.</p>\n","text":"The list page shows every incident/near miss with its date, type, severity and status, filterable and sortable by any of those, and supports CSV import/export (the list page's column headers, including \"Trigger SWP review\", map directly to import columns). The detail page shows the full investigation; create and edit forms share the same fields."},{"heading":"Fields","kind":"field-reference","html":"<ul>\n<li><strong>Incident date</strong> — required.</li>\n<li><strong>Incident type</strong> — required. <code>Incident</code> or <code>Near miss</code>.</li>\n<li><strong>Description</strong> — required, up to 10,000 characters. What happened.</li>\n<li><strong>Severity</strong> — required. <code>Low</code>, <code>Medium</code>, or <code>High</code>.</li>\n<li><strong>Status</strong> — <code>open</code>, <code>investigating</code>, or <code>closed</code>.</li>\n<li><strong>Why it happened</strong> — optional, up to 10,000 characters.</li>\n<li><strong>Corrective action</strong> — optional, up to 10,000 characters. What was done in response.</li>\n<li><strong>How prevented</strong> — optional, up to 10,000 characters. What will stop it happening again.</li>\n<li><strong>Trigger SWP review</strong> — a checkbox, shown as a &quot;Flagged for SWP review&quot; badge on the detail page when set. This is an informational flag only: it does not link to a specific Safe Work Procedure record or change any procedure's status automatically — it's a signal to whoever manages the <a href=\"/modules/safe-work-procedures/\">Safe Work Procedures</a> register that this incident may mean a procedure needs re-review.</li>\n</ul>\n","text":"Incident date — required. Incident type — required. Incident or Near miss. Description — required, up to 10,000 characters. What happened. Severity — required. Low, Medium, or High. Status — open, investigating, or closed. Why it happened — optional, up to 10,000 characters. Corrective action — optional, up to 10,000 characters. What was done in response. How prevented — optional, up to 10,000 characters. What will stop it happening again. Trigger SWP review — a checkbox, shown as a \"Flagged for SWP review\" badge on the detail page when set. This is an informational flag only: it does not link to a specific Safe Work Procedure record or change any procedure's status automatically — it's a signal to whoever manages the Safe Work Procedures register that this incident may mean a procedure needs re-review."},{"heading":"Actions","kind":"contextual","html":"<p>Saving validates the required fields (date, type, description, severity) before submitting. There is no separate &quot;close investigation&quot; action distinct from setting Status to <code>closed</code> directly.</p>\n","text":"Saving validates the required fields (date, type, description, severity) before submitting. There is no separate \"close investigation\" action distinct from setting Status to closed directly."},{"heading":"What happens next","kind":"workflow","html":"<p>An incident with Trigger SWP review set doesn't automatically do anything elsewhere in the product — someone managing Safe Work Procedures needs to notice the flag and act on it manually. If the incident relates to a specific assessed risk, consider also recording or updating the corresponding entry in the <a href=\"/modules/hazards-risk-register/\">Hazard &amp; Risk Register</a>; the two registers aren't linked by a shared field, so that connection is made by whoever is doing the investigation, not by the system.</p>\n","text":"An incident with Trigger SWP review set doesn't automatically do anything elsewhere in the product — someone managing Safe Work Procedures needs to notice the flag and act on it manually. If the incident relates to a specific assessed risk, consider also recording or updating the corresponding entry in the Hazard & Risk Register; the two registers aren't linked by a shared field, so that connection is made by whoever is doing the investigation, not by the system."},{"heading":"FAQ","kind":"reference","html":"<p><strong>What's the difference between an incident and a near miss?</strong> Only the Incident Type field — both use identical investigation fields, so a near miss gets the same rigor as an incident that caused harm.</p>\n<p><strong>Can I bulk-import incidents?</strong> Yes — the list page supports CSV import/export; the CSV column headers match the field labels shown on the list page exactly, including &quot;Trigger SWP review&quot; (accepts &quot;Yes&quot;/anything else as false).</p>\n","text":"What's the difference between an incident and a near miss? Only the Incident Type field — both use identical investigation fields, so a near miss gets the same rigor as an incident that caused harm. Can I bulk-import incidents? Yes — the list page supports CSV import/export; the CSV column headers match the field labels shown on the list page exactly, including \"Trigger SWP review\" (accepts \"Yes\"/anything else as false)."}]},{"id":"internal-feedback","type":"module","title":"Internal Feedback","description":"Cross-department feedback — complaints, compliments and suggestions raised internally between departments, and their acknowledgement and closure.","status":"published","version":1,"locale":"en","translationKey":"internal-feedback","module":"internal-feedback","audience":["user","administrator"],"url":"https://docs.sheqcontrolplane.com/modules/internal-feedback/","context":{"helpKeys":["internal-feedback","internal-feedback.create","internal-feedback.edit"],"screens":["internal-feedback.list","internal-feedback.detail","internal-feedback.create","internal-feedback.edit"],"applicationRoutes":["/quality/internal-feedback","/quality/internal-feedback/new","/quality/internal-feedback/:id","/quality/internal-feedback/:id/edit"]},"search":{"keywords":["internal feedback","cross-department","complaint","compliment","suggestion"]},"related":["client-feedback"],"parentId":null,"prerequisites":[],"nextSteps":[],"deprecated":null,"lastUpdated":"2026-09-06T06:46:29+01:00","sections":[{"heading":"Overview","kind":"overview","html":"<p>Internal Feedback logs feedback raised between departments within the organisation — complaints, compliments and suggestions — separately from feedback received from clients.</p>\n","text":"Internal Feedback logs feedback raised between departments within the organisation — complaints, compliments and suggestions — separately from feedback received from clients."},{"heading":"Why it matters","kind":"overview","html":"<p>Cross-department friction (a handover that keeps going wrong, a process one team relies on that another team keeps missing) is exactly the kind of recurring quality issue that's easy to raise once verbally and then never actually track. A dedicated register gives internal process feedback the same visibility as client-facing feedback, instead of it only ever being discussed informally.</p>\n","text":"Cross-department friction (a handover that keeps going wrong, a process one team relies on that another team keeps missing) is exactly the kind of recurring quality issue that's easy to raise once verbally and then never actually track. A dedicated register gives internal process feedback the same visibility as client-facing feedback, instead of it only ever being discussed informally."},{"heading":"How it works","kind":"workflow","html":"<p>Each record captures which department the feedback is from, which department it's directed to, its nature (Complaint, Compliment, or Suggestion), a description, and when it was raised. A record can be acknowledged by naming who acknowledged it, and moves from <code>open</code> to <code>closed</code> once resolved.</p>\n","text":"Each record captures which department the feedback is from, which department it's directed to, its nature (Complaint, Compliment, or Suggestion), a description, and when it was raised. A record can be acknowledged by naming who acknowledged it, and moves from open to closed once resolved."},{"heading":"This screen","kind":"contextual","html":"<p>The list page shows every record with its nature and status, filterable and sortable by date raised, nature, status, or when the record was created or updated. The detail page shows the full record, including the from/to departments and who acknowledged it; create and edit forms share the same fields.</p>\n","text":"The list page shows every record with its nature and status, filterable and sortable by date raised, nature, status, or when the record was created or updated. The detail page shows the full record, including the from/to departments and who acknowledged it; create and edit forms share the same fields."},{"heading":"Fields","kind":"field-reference","html":"<ul>\n<li><strong>From department</strong> — required. Which department raised the feedback.</li>\n<li><strong>To department</strong> — required. Which department it's directed to.</li>\n<li><strong>Nature of feedback</strong> — required. One of Complaint, Compliment, Suggestion.</li>\n<li><strong>Description</strong> — required.</li>\n<li><strong>Date raised</strong> — required.</li>\n<li><strong>Acknowledged by</strong> — optional. Who from the receiving department acknowledged the feedback.</li>\n<li><strong>Status</strong> — <code>open</code> or <code>closed</code>.</li>\n</ul>\n","text":"From department — required. Which department raised the feedback. To department — required. Which department it's directed to. Nature of feedback — required. One of Complaint, Compliment, Suggestion. Description — required. Date raised — required. Acknowledged by — optional. Who from the receiving department acknowledged the feedback. Status — open or closed."},{"heading":"Actions","kind":"contextual","html":"<p>Recording who acknowledged a piece of feedback is a plain text field, entered manually — there's no notification sent to the &quot;to department&quot; when a record is created, and no requirement to fill in &quot;Acknowledged by&quot; before closing a record.</p>\n","text":"Recording who acknowledged a piece of feedback is a plain text field, entered manually — there's no notification sent to the \"to department\" when a record is created, and no requirement to fill in \"Acknowledged by\" before closing a record."},{"heading":"What happens next","kind":"workflow","html":"<p>Nothing is triggered automatically when a record's status changes — closing a record is a direct field edit, the same as any other, available to any user with edit access to this register.</p>\n","text":"Nothing is triggered automatically when a record's status changes — closing a record is a direct field edit, the same as any other, available to any user with edit access to this register."},{"heading":"FAQ","kind":"reference","html":"<p><strong>How is this different from <a href=\"/modules/client-feedback/\">Client Feedback</a>?</strong> Same shape (nature, description, status), but Internal Feedback is between departments within the organisation, while Client Feedback is from an external client — the two are separate registers with no shared or linked records.</p>\n","text":"How is this different from Client Feedback? Same shape (nature, description, status), but Internal Feedback is between departments within the organisation, while Client Feedback is from an external client — the two are separate registers with no shared or linked records."}]},{"id":"inspection-test-plans","type":"module","title":"Inspection & Test Plans","description":"Hold and witness points for controlled activities, moved through the same draft/review/approved/superseded lifecycle as Safe Work Procedures.","status":"published","version":1,"locale":"en","translationKey":"inspection-test-plans","module":"itps","audience":["user","administrator"],"url":"https://docs.sheqcontrolplane.com/modules/inspection-test-plans/","context":{"helpKeys":["itps","inspection-test-plan.create","inspection-test-plan.edit","itps.create","itps.edit"],"screens":["itps.list","itps.detail","itps.create","itps.edit"],"applicationRoutes":["/quality/itps","/quality/itps/new","/quality/itps/:id","/quality/itps/:id/edit"]},"search":{"keywords":["itp","inspection and test plan","hold point","witness point","quality control"]},"related":["safe-work-procedures","non-conformance-reports"],"parentId":null,"prerequisites":[],"nextSteps":[],"deprecated":null,"lastUpdated":"2026-09-06T11:18:58+01:00","sections":[{"heading":"Overview","kind":"overview","html":"<p>An Inspection &amp; Test Plan (ITP) defines the hold points and witness points for a controlled activity — the points in a process where work must stop for an inspection (a hold point) or where an inspection may be witnessed without necessarily stopping work (a witness point), together with a reference and revision number for the plan itself.</p>\n","text":"An Inspection & Test Plan (ITP) defines the hold points and witness points for a controlled activity — the points in a process where work must stop for an inspection (a hold point) or where an inspection may be witnessed without necessarily stopping work (a witness point), together with a reference and revision number for the plan itself."},{"heading":"Why it matters","kind":"overview","html":"<p>Quality control on a controlled activity depends on inspections happening at the right point in the process, not after the fact. Recording hold and witness points as fields on a versioned plan — rather than in a separate document nobody checks against the current revision — keeps the plan itself as the single reference for what inspection is required and when.</p>\n","text":"Quality control on a controlled activity depends on inspections happening at the right point in the process, not after the fact. Recording hold and witness points as fields on a versioned plan — rather than in a separate document nobody checks against the current revision — keeps the plan itself as the single reference for what inspection is required and when."},{"heading":"How it works","kind":"workflow","html":"<p>An ITP moves through the same four-stage lifecycle as <a href=\"/modules/safe-work-procedures/\">Safe Work Procedures</a> — <code>draft</code>, <code>review</code>, <code>approved</code>, <code>superseded</code> — using the identical status values, though the two are tracked as separate fields on separate records rather than a single shared concept in the underlying data. As with procedures, the expected pattern is to create a new revision when a plan changes materially and mark the previous one <code>superseded</code>, rather than editing an approved plan in place.</p>\n","text":"An ITP moves through the same four-stage lifecycle as Safe Work Procedures — draft, review, approved, superseded — using the identical status values, though the two are tracked as separate fields on separate records rather than a single shared concept in the underlying data. As with procedures, the expected pattern is to create a new revision when a plan changes materially and mark the previous one superseded, rather than editing an approved plan in place."},{"heading":"This screen","kind":"contextual","html":"<p>The list page shows every plan with its reference, revision, status and review date, filterable/sortable by review date, status, or when the record was created/updated. The detail page shows the full plan including hold and witness points; create and edit forms share the same fields.</p>\n","text":"The list page shows every plan with its reference, revision, status and review date, filterable/sortable by review date, status, or when the record was created/updated. The detail page shows the full plan including hold and witness points; create and edit forms share the same fields."},{"heading":"Fields","kind":"field-reference","html":"<ul>\n<li><strong>Activity</strong> — required. The controlled activity this plan covers.</li>\n<li><strong>ITP reference</strong> — required. The plan's own identifying reference number.</li>\n<li><strong>Revision</strong> — required. This plan's revision identifier — bump it when the plan changes materially.</li>\n<li><strong>Hold points</strong> — optional free text. Points in the activity where work must stop for inspection before continuing.</li>\n<li><strong>Witness points</strong> — optional free text. Points where an inspection may be witnessed without necessarily halting work.</li>\n<li><strong>Status</strong> — one of <code>draft</code>, <code>review</code>, <code>approved</code>, <code>superseded</code>.</li>\n<li><strong>Approved by</strong> — optional. Recorded once a plan reaches <code>approved</code>.</li>\n<li><strong>Review date</strong> — required. When this plan is next due to be reconsidered.</li>\n</ul>\n","text":"Activity — required. The controlled activity this plan covers. ITP reference — required. The plan's own identifying reference number. Revision — required. This plan's revision identifier — bump it when the plan changes materially. Hold points — optional free text. Points in the activity where work must stop for inspection before continuing. Witness points — optional free text. Points where an inspection may be witnessed without necessarily halting work. Status — one of draft, review, approved, superseded. Approved by — optional. Recorded once a plan reaches approved. Review date — required. When this plan is next due to be reconsidered."},{"heading":"Actions","kind":"contextual","html":"<p>Moving a plan between statuses, including to <code>approved</code>, is a direct field edit, gated by the same write permission as any other change to this register — there is no separate, more restrictive approval permission layered on top (see <a href=\"/modules/settings/\">Settings</a>).</p>\n","text":"Moving a plan between statuses, including to approved, is a direct field edit, gated by the same write permission as any other change to this register — there is no separate, more restrictive approval permission layered on top (see Settings)."},{"heading":"What happens next","kind":"workflow","html":"<p>A non-conformance found during an inspection against this plan's hold or witness points would typically be logged as its own <a href=\"/modules/non-conformance-reports/\">Non-Conformance Report</a> — the two registers are not linked by a relational field today, so cross-reference them by ITP reference/NCR number manually if needed.</p>\n","text":"A non-conformance found during an inspection against this plan's hold or witness points would typically be logged as its own Non-Conformance Report — the two registers are not linked by a relational field today, so cross-reference them by ITP reference/NCR number manually if needed."},{"heading":"FAQ","kind":"reference","html":"<p><strong>Are hold points enforced anywhere else in the product?</strong> No — they're descriptive fields on the plan record. Nothing elsewhere in the application currently blocks progress on a related record because a hold point exists.</p>\n","text":"Are hold points enforced anywhere else in the product? No — they're descriptive fields on the plan record. Nothing elsewhere in the application currently blocks progress on a related record because a hold point exists."}]},{"id":"legal-register","type":"module","title":"Legal Register","description":"The legislation that applies to your operations, how it applies, and your current compliance status against each entry.","status":"published","version":1,"locale":"en","translationKey":"legal-register","module":"legal-register","audience":["user","administrator"],"url":"https://docs.sheqcontrolplane.com/modules/legal-register/","context":{"helpKeys":["legal-register","legal-register.create","legal-register.edit"],"screens":["legal-register.list","legal-register.detail","legal-register.create","legal-register.edit"],"applicationRoutes":["/legal-register","/legal-register/new","/legal-register/:id","/legal-register/:id/edit"]},"search":{"keywords":["legal register","legislation","compliance","law","regulation","applicable law"]},"related":["audit-inspection-schedule"],"parentId":null,"prerequisites":[],"nextSteps":[],"deprecated":null,"lastUpdated":"2026-09-06T06:46:29+01:00","sections":[{"heading":"Overview","kind":"overview","html":"<p>The Legal Register is the log of legislation, regulations and other legal requirements that apply to your organisation's operations, together with how each one applies and your current compliance status against it.</p>\n","text":"The Legal Register is the log of legislation, regulations and other legal requirements that apply to your organisation's operations, together with how each one applies and your current compliance status against it."},{"heading":"Why it matters","kind":"overview","html":"<p>SHEQ legal compliance is only as good as your knowledge of what actually applies to you and whether you currently meet it. A register that names the specific piece of legislation, records in your own words how it applies to your operations, and tracks compliance status directly against that entry — rather than compliance status living in a spreadsheet disconnected from the legislation it refers to — makes it possible to answer &quot;are we compliant?&quot; one entry at a time instead of reconstructing the answer from memory during an audit.</p>\n","text":"SHEQ legal compliance is only as good as your knowledge of what actually applies to you and whether you currently meet it. A register that names the specific piece of legislation, records in your own words how it applies to your operations, and tracks compliance status directly against that entry — rather than compliance status living in a spreadsheet disconnected from the legislation it refers to — makes it possible to answer \"are we compliant?\" one entry at a time instead of reconstructing the answer from memory during an audit."},{"heading":"How it works","kind":"workflow","html":"<p>Each entry has a compliance status of <code>compliant</code>, <code>non-compliant</code>, or <code>under-review</code>, and a next review date independent of that status — so a currently-compliant entry still comes back around for reassessment on its own schedule. New entries default to <code>under-review</code> until someone confirms the actual status.</p>\n","text":"Each entry has a compliance status of compliant, non-compliant, or under-review, and a next review date independent of that status — so a currently-compliant entry still comes back around for reassessment on its own schedule. New entries default to under-review until someone confirms the actual status."},{"heading":"This screen","kind":"contextual","html":"<p>The list page shows every legal register entry with its reference, title, compliance status and next review date, filterable and sortable by any of those. The detail page shows the full entry; create and edit forms share the same fields.</p>\n","text":"The list page shows every legal register entry with its reference, title, compliance status and next review date, filterable and sortable by any of those. The detail page shows the full entry; create and edit forms share the same fields."},{"heading":"Fields","kind":"field-reference","html":"<ul>\n<li><strong>Title</strong> — required. A readable name for the legal requirement (e.g. &quot;Occupational Health and Safety Act — General Machinery Regulations&quot;).</li>\n<li><strong>Reference</strong> — required. The specific legislative reference (act, regulation number, section).</li>\n<li><strong>Applicability</strong> — required, free text. How this requirement actually applies to your operations — not a copy of the legislation itself, but your own assessment of relevance.</li>\n<li><strong>Compliance status</strong> — one of <code>compliant</code>, <code>non-compliant</code>, <code>under-review</code>. Defaults to <code>under-review</code> for a new entry.</li>\n<li><strong>Next review date</strong> — required. When this entry's applicability and compliance status should next be reassessed.</li>\n</ul>\n","text":"Title — required. A readable name for the legal requirement (e.g. \"Occupational Health and Safety Act — General Machinery Regulations\"). Reference — required. The specific legislative reference (act, regulation number, section). Applicability — required, free text. How this requirement actually applies to your operations — not a copy of the legislation itself, but your own assessment of relevance. Compliance status — one of compliant, non-compliant, under-review. Defaults to under-review for a new entry. Next review date — required. When this entry's applicability and compliance status should next be reassessed."},{"heading":"Actions","kind":"contextual","html":"<p>Creating or editing an entry validates all required fields, including a non-empty applicability description — a legal register entry with just a title and reference but no explanation of how it applies to you is treated as incomplete.</p>\n","text":"Creating or editing an entry validates all required fields, including a non-empty applicability description — a legal register entry with just a title and reference but no explanation of how it applies to you is treated as incomplete."},{"heading":"What happens next","kind":"workflow","html":"<p>There is no automated notification when a review date passes or when a status is set to <code>non-compliant</code> in the current version of the product — both are fields to filter and sort the register by, not triggers. An <a href=\"/modules/audit-inspection-schedule/\">Audit &amp; Inspection Schedule</a> entry (e.g. a &quot;Legal Compliance Audit&quot;) is a natural place to work through this register's <code>non-compliant</code>/<code>under-review</code> entries, but the two registers aren't linked by a relational field — cross-reference them manually.</p>\n","text":"There is no automated notification when a review date passes or when a status is set to non-compliant in the current version of the product — both are fields to filter and sort the register by, not triggers. An Audit & Inspection Schedule entry (e.g. a \"Legal Compliance Audit\") is a natural place to work through this register's non-compliant/under-review entries, but the two registers aren't linked by a relational field — cross-reference them manually."},{"heading":"FAQ","kind":"reference","html":"<p><strong>Can compliance status be tracked per site or per department?</strong> No — each entry represents one compliance position for the organisation as a whole; there's no per-location breakdown in the current version.</p>\n<p><strong>What happens to an entry when legislation is repealed or superseded?</strong> The register doesn't have a distinct &quot;repealed&quot; status — update the entry's applicability to reflect the change, or delete it if it no longer applies at all.</p>\n","text":"Can compliance status be tracked per site or per department? No — each entry represents one compliance position for the organisation as a whole; there's no per-location breakdown in the current version. What happens to an entry when legislation is repealed or superseded? The register doesn't have a distinct \"repealed\" status — update the entry's applicability to reflect the change, or delete it if it no longer applies at all."}]},{"id":"management-review","type":"module","title":"Management Review","description":"Management review meetings — inputs reviewed, decisions and actions agreed, and whether minutes were filed.","status":"published","version":1,"locale":"en","translationKey":"management-review","module":"management-review","audience":["user","administrator"],"url":"https://docs.sheqcontrolplane.com/modules/management-review/","context":{"helpKeys":["management-review","management-review.create","management-review.edit"],"screens":["management-review.list","management-review.detail","management-review.create","management-review.edit"],"applicationRoutes":["/management/review","/management/review/new","/management/review/:id","/management/review/:id/edit"]},"search":{"keywords":["management review","meeting minutes","management system"]},"related":["objectives-targets"],"parentId":null,"prerequisites":[],"nextSteps":[],"deprecated":null,"lastUpdated":"2026-09-06T06:46:29+01:00","sections":[{"heading":"Overview","kind":"overview","html":"<p>Management Review is a log of management review meetings — a record of who attended, what inputs were reviewed, what was decided, and when the next review is due.</p>\n","text":"Management Review is a log of management review meetings — a record of who attended, what inputs were reviewed, what was decided, and when the next review is due."},{"heading":"Why it matters","kind":"overview","html":"<p>Most SHEQ management-system standards require periodic management review as a formal mechanism for leadership to look at how the system is performing and decide what needs to change. A dated, filed record of these meetings is what makes that review demonstrable — to an auditor, or simply to the organisation itself — rather than something that happens informally and leaves no trace.</p>\n","text":"Most SHEQ management-system standards require periodic management review as a formal mechanism for leadership to look at how the system is performing and decide what needs to change. A dated, filed record of these meetings is what makes that review demonstrable — to an auditor, or simply to the organisation itself — rather than something that happens informally and leaves no trace."},{"heading":"How it works","kind":"workflow","html":"<p>Each meeting record captures its date, attendees, and two free-text fields for what was reviewed and what was decided, plus the date the next review is due and whether the meeting's minutes have been filed. There's no enforced structure or checklist for what inputs a review must cover — the register records what actually happened, not a template of what should have.</p>\n","text":"Each meeting record captures its date, attendees, and two free-text fields for what was reviewed and what was decided, plus the date the next review is due and whether the meeting's minutes have been filed. There's no enforced structure or checklist for what inputs a review must cover — the register records what actually happened, not a template of what should have."},{"heading":"This screen","kind":"contextual","html":"<p>The list page shows every recorded review meeting with its date, next review date, and whether minutes are filed, filterable and sortable accordingly. The detail page shows the full record; create and edit forms share the same fields.</p>\n","text":"The list page shows every recorded review meeting with its date, next review date, and whether minutes are filed, filterable and sortable accordingly. The detail page shows the full record; create and edit forms share the same fields."},{"heading":"Fields","kind":"field-reference","html":"<ul>\n<li><strong>Review date</strong> — required. When the meeting happened.</li>\n<li><strong>Attendees</strong> — required free text. Who was present.</li>\n<li><strong>Inputs reviewed</strong> — optional free text. What was looked at (e.g. incident trends, audit findings, objective progress).</li>\n<li><strong>Decisions/actions</strong> — optional free text. What was decided and any actions agreed.</li>\n<li><strong>Next review date</strong> — required. When the next management review is due.</li>\n<li><strong>Minutes filed</strong> — a checkbox; whether the formal minutes document has been filed elsewhere.</li>\n</ul>\n","text":"Review date — required. When the meeting happened. Attendees — required free text. Who was present. Inputs reviewed — optional free text. What was looked at (e.g. incident trends, audit findings, objective progress). Decisions/actions — optional free text. What was decided and any actions agreed. Next review date — required. When the next management review is due. Minutes filed — a checkbox; whether the formal minutes document has been filed elsewhere."},{"heading":"What happens next","kind":"workflow","html":"<p>Nothing is triggered automatically from a management review record — decisions and actions recorded here are free text, not linked to other registers (for example, an action to review an <a href=\"/modules/objectives-targets/\">Objective</a> doesn't create or update that objective's record). The &quot;minutes filed&quot; checkbox is a manual attestation, not a file upload — the actual minutes document is expected to be kept wherever your organisation's documents normally live.</p>\n","text":"Nothing is triggered automatically from a management review record — decisions and actions recorded here are free text, not linked to other registers (for example, an action to review an Objective doesn't create or update that objective's record). The \"minutes filed\" checkbox is a manual attestation, not a file upload — the actual minutes document is expected to be kept wherever your organisation's documents normally live."}]},{"id":"material-certification","type":"module","title":"Material Certification","description":"Material and equipment compliance certificates — mill certificates, certificates of conformance, test certificates and concrete test results — with a compliance status per item.","status":"published","version":1,"locale":"en","translationKey":"material-certification","module":"material-certs","audience":["user","administrator"],"url":"https://docs.sheqcontrolplane.com/modules/material-certification/","context":{"helpKeys":["material-certs","material-certificate.create","material-certificate.edit","material-certs.create","material-certs.edit"],"screens":["material-certs.list","material-certs.detail","material-certs.create","material-certs.edit"],"applicationRoutes":["/quality/material-certs","/quality/material-certs/new","/quality/material-certs/:id","/quality/material-certs/:id/edit"]},"search":{"keywords":["material certificate","mill certificate","certificate of conformance","test certificate","batch","lot"]},"related":[],"parentId":null,"prerequisites":[],"nextSteps":[],"deprecated":null,"lastUpdated":"2026-09-06T11:18:58+01:00","sections":[{"heading":"Overview","kind":"overview","html":"<p>The Material Certification register records the compliance documentation received for materials and equipment used on a project — mill certificates, certificates of conformance, test certificates, and concrete test results — each tied to a specific item, supplier, and batch or lot number.</p>\n","text":"The Material Certification register records the compliance documentation received for materials and equipment used on a project — mill certificates, certificates of conformance, test certificates, and concrete test results — each tied to a specific item, supplier, and batch or lot number."},{"heading":"Why it matters","kind":"overview","html":"<p>Traceability from an installed material back to the certificate that proves it meets specification is a common audit requirement, and it only works if the certificate is logged against the specific batch/lot it covers at the time it's received, rather than filed separately and matched up after the fact.</p>\n","text":"Traceability from an installed material back to the certificate that proves it meets specification is a common audit requirement, and it only works if the certificate is logged against the specific batch/lot it covers at the time it's received, rather than filed separately and matched up after the fact."},{"heading":"How it works","kind":"workflow","html":"<p>Each certificate record has its own compliance status — <code>compliant</code>, <code>non-compliant</code>, or <code>pending-review</code> — set independently for that specific item/batch, so the register can show at a glance which received materials are cleared for use and which are still awaiting review or have failed to meet specification.</p>\n","text":"Each certificate record has its own compliance status — compliant, non-compliant, or pending-review — set independently for that specific item/batch, so the register can show at a glance which received materials are cleared for use and which are still awaiting review or have failed to meet specification."},{"heading":"This screen","kind":"contextual","html":"<p>The list page shows every certificate with its item, supplier, certificate type and compliance status, filterable/sortable by date received, compliance status, or when the record was created/updated. The detail page shows the full record; create and edit forms share the same fields.</p>\n","text":"The list page shows every certificate with its item, supplier, certificate type and compliance status, filterable/sortable by date received, compliance status, or when the record was created/updated. The detail page shows the full record; create and edit forms share the same fields."},{"heading":"Fields","kind":"field-reference","html":"<ul>\n<li><strong>Item</strong> — required. The material or equipment the certificate covers.</li>\n<li><strong>Supplier</strong> — required.</li>\n<li><strong>Certificate type</strong> — required. One of Mill Certificate, Certificate of Conformance, Test Certificate, Concrete Test Result.</li>\n<li><strong>Certificate reference</strong> — required. The certificate's own identifying reference.</li>\n<li><strong>Date received</strong> — required.</li>\n<li><strong>Batch/lot</strong> — required. The specific batch or lot this certificate covers — this is what ties the certificate to a physical, traceable quantity of material rather than the material type in general.</li>\n<li><strong>Compliance status</strong> — one of <code>compliant</code>, <code>non-compliant</code>, <code>pending-review</code>.</li>\n</ul>\n","text":"Item — required. The material or equipment the certificate covers. Supplier — required. Certificate type — required. One of Mill Certificate, Certificate of Conformance, Test Certificate, Concrete Test Result. Certificate reference — required. The certificate's own identifying reference. Date received — required. Batch/lot — required. The specific batch or lot this certificate covers — this is what ties the certificate to a physical, traceable quantity of material rather than the material type in general. Compliance status — one of compliant, non-compliant, pending-review."},{"heading":"Actions","kind":"contextual","html":"<p>Setting compliance status is a direct field edit, done by whoever reviews the certificate against the required specification — the application doesn't perform any automatic compliance check itself.</p>\n","text":"Setting compliance status is a direct field edit, done by whoever reviews the certificate against the required specification — the application doesn't perform any automatic compliance check itself."},{"heading":"What happens next","kind":"workflow","html":"<p>A material logged as <code>non-compliant</code> here isn't automatically blocked anywhere else in the product (for example, it doesn't prevent a related <a href=\"/modules/procurement/\">Procurement</a> request or site delivery) — treat compliance status as the record of the review outcome for whoever manages the register, not an enforced gate.</p>\n","text":"A material logged as non-compliant here isn't automatically blocked anywhere else in the product (for example, it doesn't prevent a related Procurement request or site delivery) — treat compliance status as the record of the review outcome for whoever manages the register, not an enforced gate."},{"heading":"FAQ","kind":"reference","html":"<p><strong>Can one certificate cover more than one batch/lot?</strong> The register records one batch/lot per certificate entry — if a single certificate document actually covers several batches, log one entry per batch so each is independently traceable and independently reviewable.</p>\n","text":"Can one certificate cover more than one batch/lot? The register records one batch/lot per certificate entry — if a single certificate document actually covers several batches, log one entry per batch so each is independently traceable and independently reviewable."}]},{"id":"medical-surveillance","type":"module","title":"Medical Surveillance","description":"Occupational health surveillance exams — baseline, periodic and exit — and the fitness outcome each one produces.","status":"published","version":1,"locale":"en","translationKey":"medical-surveillance","module":"medical","audience":["user","administrator"],"url":"https://docs.sheqcontrolplane.com/modules/medical-surveillance/","context":{"helpKeys":["medical","medical-examination.create","medical-examination.edit","medical.create","medical.edit"],"screens":["medical.list","medical.detail","medical.create","medical.edit"],"applicationRoutes":["/medical","/medical/new","/medical/:id","/medical/:id/edit"]},"search":{"keywords":["medical surveillance","occupational health","fitness for work","baseline exam","exit exam"]},"related":["ppe-register"],"parentId":null,"prerequisites":[],"nextSteps":[],"deprecated":null,"lastUpdated":"2026-09-06T11:18:58+01:00","sections":[{"heading":"Overview","kind":"overview","html":"<p>The Medical Surveillance register tracks occupational health examinations — baseline (on starting a role with a health risk exposure), periodic (repeated at an interval), and exit (on leaving that role) — and the fitness-for-work outcome each one produced.</p>\n<blockquote>\n<p><strong>Note:</strong> the product's navigation and this documentation call this module &quot;Medical Surveillance&quot;; the underlying data model uses the term &quot;medical examination&quot; for each individual record — the two names refer to the same thing.</p>\n</blockquote>\n","text":"The Medical Surveillance register tracks occupational health examinations — baseline (on starting a role with a health risk exposure), periodic (repeated at an interval), and exit (on leaving that role) — and the fitness-for-work outcome each one produced. Note: the product's navigation and this documentation call this module \"Medical Surveillance\"; the underlying data model uses the term \"medical examination\" for each individual record — the two names refer to the same thing."},{"heading":"Why it matters","kind":"overview","html":"<p>Occupational health surveillance exists to catch work-related health effects early enough to act on them, and to establish a documented fitness status before, during and after an exposure period. A register that tracks exam type and next-due date the same way as any other statutory deadline means surveillance intervals don't rely on someone's memory of when the last exam happened.</p>\n","text":"Occupational health surveillance exists to catch work-related health effects early enough to act on them, and to establish a documented fitness status before, during and after an exposure period. A register that tracks exam type and next-due date the same way as any other statutory deadline means surveillance intervals don't rely on someone's memory of when the last exam happened."},{"heading":"How it works","kind":"workflow","html":"<p>Each examination record captures who was examined, what type of exam it was, when it happened, when the next one is due, and the resulting fitness status — <code>fit</code>, <code>fit-restricted</code>, or <code>unfit</code>. Every exam is its own record; the register doesn't automatically chain a periodic exam's next-due date into a new scheduled record.</p>\n","text":"Each examination record captures who was examined, what type of exam it was, when it happened, when the next one is due, and the resulting fitness status — fit, fit-restricted, or unfit. Every exam is its own record; the register doesn't automatically chain a periodic exam's next-due date into a new scheduled record."},{"heading":"This screen","kind":"contextual","html":"<p>The list page shows every examination with a due-soon/overdue badge computed from its next-due date, filterable and sortable by person, next-due date, or when the record was created/updated.</p>\n","text":"The list page shows every examination with a due-soon/overdue badge computed from its next-due date, filterable and sortable by person, next-due date, or when the record was created/updated."},{"heading":"Fields","kind":"field-reference","html":"<ul>\n<li><strong>Person</strong> — required. Who was examined.</li>\n<li><strong>Exam type</strong> — required. <code>Baseline</code>, <code>Periodic</code>, or <code>Exit</code>.</li>\n<li><strong>Exam date</strong> — required. When the examination took place.</li>\n<li><strong>Next due</strong> — required. When the next examination is due.</li>\n<li><strong>Fitness status</strong> — required. <code>fit</code>, <code>fit-restricted</code>, or <code>unfit</code>.</li>\n</ul>\n","text":"Person — required. Who was examined. Exam type — required. Baseline, Periodic, or Exit. Exam date — required. When the examination took place. Next due — required. When the next examination is due. Fitness status — required. fit, fit-restricted, or unfit."},{"heading":"Actions","kind":"contextual","html":"<p>Saving validates that all five fields are present and that exam type/fitness status are one of the allowed values.</p>\n","text":"Saving validates that all five fields are present and that exam type/fitness status are one of the allowed values."},{"heading":"What happens next","kind":"workflow","html":"<p>A <code>fit-restricted</code> or <code>unfit</code> outcome doesn't automatically change anything elsewhere in the product in the current version — for example, it doesn't restrict what the same person can be assigned to in <a href=\"/modules/ppe-register/\">PPE Register</a> or any other module. It's a record for whoever is managing occupational health to act on directly.</p>\n","text":"A fit-restricted or unfit outcome doesn't automatically change anything elsewhere in the product in the current version — for example, it doesn't restrict what the same person can be assigned to in PPE Register or any other module. It's a record for whoever is managing occupational health to act on directly."},{"heading":"FAQ","kind":"reference","html":"<p><strong>Why does the database call this &quot;medical examination&quot; instead of &quot;medical surveillance&quot;?</strong> Medical surveillance is the overall programme; each visit to the doctor is one examination. The record type name follows the latter since that's what each row in the register actually is.</p>\n","text":"Why does the database call this \"medical examination\" instead of \"medical surveillance\"? Medical surveillance is the overall programme; each visit to the doctor is one examination. The record type name follows the latter since that's what each row in the register actually is."}]},{"id":"non-conformance-reports","type":"module","title":"Non-Conformance Reports","description":"Log a non-conformance, then work through root cause, correction and preventive action until the investigation is complete.","status":"published","version":1,"locale":"en","translationKey":"non-conformance-reports","module":"ncrs","audience":["user","administrator"],"url":"https://docs.sheqcontrolplane.com/modules/non-conformance-reports/","context":{"helpKeys":["ncrs","non-conformance-report.create","non-conformance-report.edit","ncrs.create","ncrs.edit"],"screens":["ncrs.list","ncrs.detail","ncrs.create","ncrs.edit"],"applicationRoutes":["/quality/ncrs","/quality/ncrs/new","/quality/ncrs/:id","/quality/ncrs/:id/edit"]},"search":{"keywords":["ncr","non-conformance","root cause","corrective action","preventive action","quality"]},"related":["inspection-test-plans","concessions"],"parentId":null,"prerequisites":[],"nextSteps":[],"deprecated":null,"lastUpdated":"2026-09-06T11:18:58+01:00","sections":[{"heading":"Overview","kind":"overview","html":"<p>A Non-Conformance Report (NCR) records a single instance of work, material or documentation that didn't meet requirements — a category (Material, Workmanship, Documentation, or Client complaint), a severity (Minor, Major, Critical), and a narrative that's built up as the investigation proceeds: root cause, correction action, and preventive action.</p>\n","text":"A Non-Conformance Report (NCR) records a single instance of work, material or documentation that didn't meet requirements — a category (Material, Workmanship, Documentation, or Client complaint), a severity (Minor, Major, Critical), and a narrative that's built up as the investigation proceeds: root cause, correction action, and preventive action."},{"heading":"Why it matters","kind":"overview","html":"<p>Recording that something went wrong is only half the job — the value is in the narrative that explains why it happened (root cause), what was done about this specific instance (correction), and what will stop it happening again (preventive action). Keeping all three as distinct fields on the same record, rather than one free-text &quot;notes&quot; field, makes it possible to tell at a glance whether an NCR has actually been investigated or just logged.</p>\n","text":"Recording that something went wrong is only half the job — the value is in the narrative that explains why it happened (root cause), what was done about this specific instance (correction), and what will stop it happening again (preventive action). Keeping all three as distinct fields on the same record, rather than one free-text \"notes\" field, makes it possible to tell at a glance whether an NCR has actually been investigated or just logged."},{"heading":"How it works","kind":"workflow","html":"<p>An NCR starts <code>open</code>, moves to <code>in-progress</code> while it's being worked, and <code>closed</code> once resolved, with a closure date and the person who verified the closure recorded on the record. The application derives whether an NCR's investigation is complete directly from its three narrative fields — root cause, correction action and preventive action all being present — rather than from a separate flag, so &quot;investigated&quot; always means those three fields are actually filled in, never a checkbox someone forgot to leave in sync with the real content.</p>\n","text":"An NCR starts open, moves to in-progress while it's being worked, and closed once resolved, with a closure date and the person who verified the closure recorded on the record. The application derives whether an NCR's investigation is complete directly from its three narrative fields — root cause, correction action and preventive action all being present — rather than from a separate flag, so \"investigated\" always means those three fields are actually filled in, never a checkbox someone forgot to leave in sync with the real content."},{"heading":"This screen","kind":"contextual","html":"<p>The list page shows every NCR with its number, category, severity and status, filterable/sortable by date raised, severity, status, or when the record was created/updated. The detail page shows the full narrative; create and edit forms share the same fields.</p>\n","text":"The list page shows every NCR with its number, category, severity and status, filterable/sortable by date raised, severity, status, or when the record was created/updated. The detail page shows the full narrative; create and edit forms share the same fields."},{"heading":"Fields","kind":"field-reference","html":"<ul>\n<li><strong>NCR number</strong> — required. This report's own identifying reference.</li>\n<li><strong>Description</strong> — required. What the non-conformance is.</li>\n<li><strong>Date raised</strong> — required.</li>\n<li><strong>Raised by</strong> — required.</li>\n<li><strong>Category</strong> — required. One of Material, Workmanship, Documentation, Client complaint.</li>\n<li><strong>Severity</strong> — required. One of Minor, Major, Critical.</li>\n<li><strong>Root cause</strong> — optional. Filled in once the investigation identifies why the non-conformance occurred.</li>\n<li><strong>Correction action</strong> — optional. What was done to fix this specific instance.</li>\n<li><strong>Preventive action</strong> — optional. What will prevent recurrence.</li>\n<li><strong>Status</strong> — one of <code>open</code>, <code>in-progress</code>, <code>closed</code>.</li>\n<li><strong>Closure date</strong> / <strong>Verified by</strong> — recorded once the NCR is closed.</li>\n</ul>\n","text":"NCR number — required. This report's own identifying reference. Description — required. What the non-conformance is. Date raised — required. Raised by — required. Category — required. One of Material, Workmanship, Documentation, Client complaint. Severity — required. One of Minor, Major, Critical. Root cause — optional. Filled in once the investigation identifies why the non-conformance occurred. Correction action — optional. What was done to fix this specific instance. Preventive action — optional. What will prevent recurrence. Status — one of open, in-progress, closed. Closure date / Verified by — recorded once the NCR is closed."},{"heading":"Actions","kind":"contextual","html":"<p>Closing an NCR is a direct status edit — the application does not currently block closing an NCR whose root cause/correction/preventive action fields are still empty. Treat &quot;investigation complete&quot; (all three narrative fields present) as the standard to close against even though it isn't enforced as a hard rule yet.</p>\n","text":"Closing an NCR is a direct status edit — the application does not currently block closing an NCR whose root cause/correction/preventive action fields are still empty. Treat \"investigation complete\" (all three narrative fields present) as the standard to close against even though it isn't enforced as a hard rule yet."},{"heading":"What happens next","kind":"workflow","html":"<p>There is no automatic link from an NCR back to the <a href=\"/modules/inspection-test-plans/\">Inspection &amp; Test Plan</a> or other record that surfaced it, and no notification is triggered by any status change in the current version of the product — cross-reference related records by their own reference numbers in the Description field if useful.</p>\n","text":"There is no automatic link from an NCR back to the Inspection & Test Plan or other record that surfaced it, and no notification is triggered by any status change in the current version of the product — cross-reference related records by their own reference numbers in the Description field if useful."},{"heading":"FAQ","kind":"reference","html":"<p><strong>What's the difference between an NCR and a Concession?</strong> An NCR records something that already happened and didn't meet requirements; a <a href=\"/modules/concessions/\">Concession</a> is a request to accept a deviation — often raised <em>because of</em> an NCR, but the two registers aren't linked by a relational field today.</p>\n","text":"What's the difference between an NCR and a Concession? An NCR records something that already happened and didn't meet requirements; a Concession is a request to accept a deviation — often raised because of an NCR, but the two registers aren't linked by a relational field today."}]},{"id":"objectives-targets","type":"module","title":"Objectives & Targets","description":"SHEQ objectives, their targets, and progress against them, tracked by category and status so drift shows up before a target date is missed.","status":"published","version":1,"locale":"en","translationKey":"objectives-targets","module":"objectives","audience":["user","administrator"],"url":"https://docs.sheqcontrolplane.com/modules/objectives-targets/","context":{"helpKeys":["objectives","sheq-objective.create","sheq-objective.edit","objectives.create","objectives.edit"],"screens":["objectives.list","objectives.detail","objectives.create","objectives.edit"],"applicationRoutes":["/management/objectives","/management/objectives/new","/management/objectives/:id","/management/objectives/:id/edit"]},"search":{"keywords":["objectives","targets","sheq objectives","management system","kpi"]},"related":["management-review"],"parentId":null,"prerequisites":[],"nextSteps":[],"deprecated":null,"lastUpdated":"2026-09-06T11:18:58+01:00","sections":[{"heading":"Overview","kind":"overview","html":"<p>Objectives &amp; Targets records the SHEQ objectives your organisation has set — a Safety, Health, Environment or Quality goal, what target it's measured against, and how progress toward it is going.</p>\n","text":"Objectives & Targets records the SHEQ objectives your organisation has set — a Safety, Health, Environment or Quality goal, what target it's measured against, and how progress toward it is going."},{"heading":"Why it matters","kind":"overview","html":"<p>A management system built entirely around reacting to incidents and non-conformances never shows whether things are actually improving. Objectives give a forward-looking counterpart: a stated target, an owner accountable for it, a target date, and an explicit status so drift is visible before the target date arrives rather than only being discovered when it's missed.</p>\n","text":"A management system built entirely around reacting to incidents and non-conformances never shows whether things are actually improving. Objectives give a forward-looking counterpart: a stated target, an owner accountable for it, a target date, and an explicit status so drift is visible before the target date arrives rather than only being discovered when it's missed."},{"heading":"How it works","kind":"workflow","html":"<p>Each objective belongs to one of four categories — Safety, Health, Environment, Quality — and carries a free-text target and current-progress note alongside a status of <code>on-track</code>, <code>at-risk</code>, or <code>off-track</code>. There is no computed logic behind the status; it's a direct judgement call entered by the owner, updated as progress is reviewed.</p>\n","text":"Each objective belongs to one of four categories — Safety, Health, Environment, Quality — and carries a free-text target and current-progress note alongside a status of on-track, at-risk, or off-track. There is no computed logic behind the status; it's a direct judgement call entered by the owner, updated as progress is reviewed."},{"heading":"This screen","kind":"contextual","html":"<p>The list page shows every objective with its category, status and target date, filterable and sortable by any of those. The detail page shows the full record; create and edit forms share the same fields.</p>\n","text":"The list page shows every objective with its category, status and target date, filterable and sortable by any of those. The detail page shows the full record; create and edit forms share the same fields."},{"heading":"Fields","kind":"field-reference","html":"<ul>\n<li><strong>Objective</strong> — required. What the objective is.</li>\n<li><strong>Category</strong> — required. One of Safety, Health, Environment, Quality.</li>\n<li><strong>Target</strong> — required. What &quot;achieved&quot; looks like for this objective.</li>\n<li><strong>Current progress</strong> — optional free text describing where things stand right now.</li>\n<li><strong>Owner</strong> — required. Who is accountable for this objective.</li>\n<li><strong>Target date</strong> — required. When the objective should be met by.</li>\n<li><strong>Status</strong> — one of <code>on-track</code>, <code>at-risk</code>, <code>off-track</code>. Defaults to <code>on-track</code> for a new objective.</li>\n</ul>\n","text":"Objective — required. What the objective is. Category — required. One of Safety, Health, Environment, Quality. Target — required. What \"achieved\" looks like for this objective. Current progress — optional free text describing where things stand right now. Owner — required. Who is accountable for this objective. Target date — required. When the objective should be met by. Status — one of on-track, at-risk, off-track. Defaults to on-track for a new objective."},{"heading":"What happens next","kind":"workflow","html":"<p>Objectives are commonly discussed and updated as part of a <a href=\"/modules/management-review/\">Management Review</a> meeting, though the two registers aren't linked by a data relationship — a management review's &quot;inputs reviewed&quot; and &quot;decisions/actions&quot; fields are free text, so referencing an objective there is a matter of writing it into those fields, not a relational link.</p>\n","text":"Objectives are commonly discussed and updated as part of a Management Review meeting, though the two registers aren't linked by a data relationship — a management review's \"inputs reviewed\" and \"decisions/actions\" fields are free text, so referencing an objective there is a matter of writing it into those fields, not a relational link."}]},{"id":"permits-to-work","type":"module","title":"Permits to Work","description":"Issue, track and close permits linked directly to the Hazard and Safe Work Procedure records they're for.","status":"published","version":1,"locale":"en","translationKey":"permits-to-work","module":"permits","audience":["user","administrator"],"url":"https://docs.sheqcontrolplane.com/modules/permits-to-work/","context":{"helpKeys":["permits","permit-to-work.create","permit-to-work.edit","permits.create","permits.edit"],"screens":["permits.list","permits.detail","permits.create","permits.edit"],"applicationRoutes":["/permits","/permits/new","/permits/:id","/permits/:id/edit"]},"search":{"keywords":["permit","permit to work","ptw","hot work","confined space","lock-out tag-out"]},"related":["hazards-risk-register","safe-work-procedures","hazard-to-permit-to-work"],"parentId":null,"prerequisites":["safe-work-procedures","hazards-risk-register"],"nextSteps":[],"deprecated":null,"lastUpdated":"2026-09-06T11:18:58+01:00","sections":[{"heading":"Overview","kind":"overview","html":"<p>A Permit to Work authorises a specific piece of high-risk work — hot work, confined space entry, working at heights, lock-out/tag-out, or excavation — for a defined location and time window, and (unlike most of the other registers) links directly to the exact Hazard and Safe Work Procedure records it relies on, not just a text description of them.</p>\n","text":"A Permit to Work authorises a specific piece of high-risk work — hot work, confined space entry, working at heights, lock-out/tag-out, or excavation — for a defined location and time window, and (unlike most of the other registers) links directly to the exact Hazard and Safe Work Procedure records it relies on, not just a text description of them."},{"heading":"Why it matters","kind":"overview","html":"<p>The value of a permit system comes from someone actually checking, at the moment work starts, that the assessed hazard and the approved procedure for it exist and are being followed — not from having a form on file. Because a permit's hazard and procedure fields are real relational links resolved against the live Hazard and Safe Work Procedures registers (not free text), a permit can only reference records that actually exist in the system, and anyone viewing an issued permit can open the exact hazard assessment and procedure it was issued against.</p>\n","text":"The value of a permit system comes from someone actually checking, at the moment work starts, that the assessed hazard and the approved procedure for it exist and are being followed — not from having a form on file. Because a permit's hazard and procedure fields are real relational links resolved against the live Hazard and Safe Work Procedures registers (not free text), a permit can only reference records that actually exist in the system, and anyone viewing an issued permit can open the exact hazard assessment and procedure it was issued against."},{"heading":"How it works","kind":"workflow","html":"<p>A permit is requested for a permit type, location and requester, then optionally linked to a hazard and/or procedure. It's created as <code>requested</code>, moved to <code>issued</code> once work is authorised to begin, and <code>closed</code> once the work is finished. An issued permit carries an issue date and a valid-until date; a permit still marked <code>issued</code> after its valid-until date has passed is a real site-safety concern, not just a stale record, and the register treats it as expired for display purposes without changing its stored status automatically.</p>\n","text":"A permit is requested for a permit type, location and requester, then optionally linked to a hazard and/or procedure. It's created as requested, moved to issued once work is authorised to begin, and closed once the work is finished. An issued permit carries an issue date and a valid-until date; a permit still marked issued after its valid-until date has passed is a real site-safety concern, not just a stale record, and the register treats it as expired for display purposes without changing its stored status automatically."},{"heading":"This screen","kind":"contextual","html":"<p>The list page shows every permit with its type, status, and validity, and can be filtered/sorted by type, status, or valid-until date. The detail page shows the full permit including its linked hazard and procedure, if any; create and edit forms use the same fields, with the hazard/procedure fields presented as pickers over the live registers rather than free text.</p>\n","text":"The list page shows every permit with its type, status, and validity, and can be filtered/sorted by type, status, or valid-until date. The detail page shows the full permit including its linked hazard and procedure, if any; create and edit forms use the same fields, with the hazard/procedure fields presented as pickers over the live registers rather than free text."},{"heading":"Fields","kind":"field-reference","html":"<ul>\n<li><strong>Permit type</strong> — required. One of Hot work, Confined space entry, Working at heights, Lock-out / Tag-out, Excavation.</li>\n<li><strong>Location</strong> — required. Where the work is happening.</li>\n<li><strong>Requested by</strong> — required. Who requested the permit.</li>\n<li><strong>Linked hazard</strong> — optional. Resolved against the live <a href=\"/modules/hazards-risk-register/\">Hazard &amp; Risk Register</a> — pick the specific hazard assessment this work relates to.</li>\n<li><strong>Linked procedure</strong> — optional. Resolved against the live <a href=\"/modules/safe-work-procedures/\">Safe Work Procedures</a> register — pick the specific procedure this work will follow.</li>\n<li><strong>Status</strong> — one of <code>requested</code>, <code>issued</code>, <code>closed</code>.</li>\n<li><strong>Issue date</strong> / <strong>Valid until</strong> — set once a permit is issued; define the window during which the permit authorises work.</li>\n</ul>\n<p>Clearing a previously-linked hazard or procedure on the edit form removes the link (saved as no link) rather than leaving the previous value in place — the two are treated identically to any other field on the form.</p>\n","text":"Permit type — required. One of Hot work, Confined space entry, Working at heights, Lock-out / Tag-out, Excavation. Location — required. Where the work is happening. Requested by — required. Who requested the permit. Linked hazard — optional. Resolved against the live Hazard & Risk Register — pick the specific hazard assessment this work relates to. Linked procedure — optional. Resolved against the live Safe Work Procedures register — pick the specific procedure this work will follow. Status — one of requested, issued, closed. Issue date / Valid until — set once a permit is issued; define the window during which the permit authorises work. Clearing a previously-linked hazard or procedure on the edit form removes the link (saved as no link) rather than leaving the previous value in place — the two are treated identically to any other field on the form."},{"heading":"What happens next","kind":"workflow","html":"<p>There is no separate approval workflow or notification triggered by changing a permit's status in the current version of the product — moving a permit to <code>issued</code> or <code>closed</code> is a direct field edit, available to any user with edit access to this register. A permit whose valid-until date has passed while still <code>issued</code> is flagged as expired wherever the permit is displayed, as a visual signal for whoever is monitoring the register, not as an automatic status change or block.</p>\n","text":"There is no separate approval workflow or notification triggered by changing a permit's status in the current version of the product — moving a permit to issued or closed is a direct field edit, available to any user with edit access to this register. A permit whose valid-until date has passed while still issued is flagged as expired wherever the permit is displayed, as a visual signal for whoever is monitoring the register, not as an automatic status change or block."},{"heading":"FAQ","kind":"reference","html":"<p><strong>Can a permit exist without a linked hazard or procedure?</strong> Yes — both links are optional, since not every permit type necessarily has a corresponding hazard/procedure record already in the system. Link them whenever the underlying records exist; an unlinked permit is valid but gives a reader less to go on.</p>\n<p><strong>What happens to a permit if its linked hazard or procedure is later changed?</strong> Nothing automatically — the link is to that specific record, and the permit doesn't re-validate against the hazard's or procedure's current content or status after being saved.</p>\n","text":"Can a permit exist without a linked hazard or procedure? Yes — both links are optional, since not every permit type necessarily has a corresponding hazard/procedure record already in the system. Link them whenever the underlying records exist; an unlinked permit is valid but gives a reader less to go on. What happens to a permit if its linked hazard or procedure is later changed? Nothing automatically — the link is to that specific record, and the permit doesn't re-validate against the hazard's or procedure's current content or status after being saved."}]},{"id":"ppe-register","type":"module","title":"PPE Register","description":"Personal protective equipment issue records and their replacement schedule.","status":"published","version":1,"locale":"en","translationKey":"ppe-register","module":"ppe","audience":["user","administrator"],"url":"https://docs.sheqcontrolplane.com/modules/ppe-register/","context":{"helpKeys":["ppe","ppe-issue.create","ppe-issue.edit","ppe.create","ppe.edit"],"screens":["ppe.list","ppe.detail","ppe.create","ppe.edit"],"applicationRoutes":["/ppe","/ppe/new","/ppe/:id","/ppe/:id/edit"]},"search":{"keywords":["ppe","personal protective equipment","replacement schedule"]},"related":["medical-surveillance"],"parentId":null,"prerequisites":[],"nextSteps":[],"deprecated":null,"lastUpdated":"2026-09-06T11:18:58+01:00","sections":[{"heading":"Overview","kind":"overview","html":"<p>The PPE Register records personal protective equipment issued to a person — what item, to what standard, when issued, and when it's due for replacement.</p>\n","text":"The PPE Register records personal protective equipment issued to a person — what item, to what standard, when issued, and when it's due for replacement."},{"heading":"Why it matters","kind":"overview","html":"<p>PPE that's past its replacement date is a control that looks like it's in place but may no longer actually be protective — a hard hat or harness with an expired service life doesn't stop being worn just because it's overdue. Tracking replacement due dates the same way as any other date-driven compliance deadline surfaces that gap before it becomes invisible.</p>\n","text":"PPE that's past its replacement date is a control that looks like it's in place but may no longer actually be protective — a hard hat or harness with an expired service life doesn't stop being worn just because it's overdue. Tracking replacement due dates the same way as any other date-driven compliance deadline surfaces that gap before it becomes invisible."},{"heading":"How it works","kind":"workflow","html":"<p>Each issue is its own record: who received it, what item, which standard it's rated to, when it was issued, and when it's due for replacement. Re-issuing replacement PPE is recorded as a new record (or an edit to the existing one), not as an automatic renewal.</p>\n","text":"Each issue is its own record: who received it, what item, which standard it's rated to, when it was issued, and when it's due for replacement. Re-issuing replacement PPE is recorded as a new record (or an edit to the existing one), not as an automatic renewal."},{"heading":"This screen","kind":"contextual","html":"<p>The list page shows every PPE issue with a due-soon/overdue badge computed from its replacement-due date, filterable and sortable by replacement due date or when the record was created/updated.</p>\n","text":"The list page shows every PPE issue with a due-soon/overdue badge computed from its replacement-due date, filterable and sortable by replacement due date or when the record was created/updated."},{"heading":"Fields","kind":"field-reference","html":"<ul>\n<li><strong>Person</strong> — required. Who the PPE was issued to.</li>\n<li><strong>PPE item</strong> — required, free text (e.g. &quot;Safety harness&quot;, &quot;Hard hat&quot;).</li>\n<li><strong>Standard</strong> — required, free text. The rating/standard the item is certified to (e.g. an EN or SANS standard number).</li>\n<li><strong>Issue date</strong> — required.</li>\n<li><strong>Replacement due</strong> — required. When this item is due to be replaced.</li>\n</ul>\n","text":"Person — required. Who the PPE was issued to. PPE item — required, free text (e.g. \"Safety harness\", \"Hard hat\"). Standard — required, free text. The rating/standard the item is certified to (e.g. an EN or SANS standard number). Issue date — required. Replacement due — required. When this item is due to be replaced."},{"heading":"Actions","kind":"contextual","html":"<p>Saving validates that all five fields are present.</p>\n","text":"Saving validates that all five fields are present."},{"heading":"What happens next","kind":"workflow","html":"<p>There's no automatic notification when a PPE item approaches or passes its replacement-due date — the due-soon/overdue badge is the mechanism for surfacing it. PPE issue records aren't linked to <a href=\"/modules/medical-surveillance/\">Medical Surveillance</a> or any other people-related register by a shared field, even where the same person appears in both.</p>\n","text":"There's no automatic notification when a PPE item approaches or passes its replacement-due date — the due-soon/overdue badge is the mechanism for surfacing it. PPE issue records aren't linked to Medical Surveillance or any other people-related register by a shared field, even where the same person appears in both."},{"heading":"FAQ","kind":"reference","html":"<p><strong>Can one person have multiple PPE items tracked?</strong> Yes — each item issued is its own record, so a person with several PPE items has one record per item.</p>\n","text":"Can one person have multiple PPE items tracked? Yes — each item issued is its own record, so a person with several PPE items has one record per item."}]},{"id":"procurement","type":"module","title":"Procurement","description":"Purchase requests that record whether an SDS and compliance certificate are on file for the item, alongside the usual approval status.","status":"published","version":1,"locale":"en","translationKey":"procurement","module":"procurement","audience":["user","administrator"],"url":"https://docs.sheqcontrolplane.com/modules/procurement/","context":{"helpKeys":["procurement","procurement-request.create","procurement-request.edit","procurement.create","procurement.edit"],"screens":["procurement.list","procurement.detail","procurement.create","procurement.edit"],"applicationRoutes":["/procurement","/procurement/new","/procurement/:id","/procurement/:id/edit"]},"search":{"keywords":["procurement","purchase request","sds on file","compliance certificate"]},"related":["chemicals-sds"],"parentId":null,"prerequisites":[],"nextSteps":[],"deprecated":null,"lastUpdated":"2026-09-06T11:18:58+01:00","sections":[{"heading":"Overview","kind":"overview","html":"<p>The Procurement register logs purchase requests — what's being bought, who requested it, and its approval status — and, for categories like Chemical and Machinery where it matters, whether an SDS and a compliance certificate are already on file for the item.</p>\n","text":"The Procurement register logs purchase requests — what's being bought, who requested it, and its approval status — and, for categories like Chemical and Machinery where it matters, whether an SDS and a compliance certificate are already on file for the item."},{"heading":"Why it matters","kind":"overview","html":"<p>Buying a chemical or piece of machinery before its Safety Data Sheet or compliance certificate is available creates a gap between when the item arrives and when it can actually be used safely. Recording those two checks as explicit fields on the request — visible on the same screen as the approval status — makes that gap visible to whoever is deciding whether to approve the purchase, instead of being a fact that lives only in someone's memory.</p>\n","text":"Buying a chemical or piece of machinery before its Safety Data Sheet or compliance certificate is available creates a gap between when the item arrives and when it can actually be used safely. Recording those two checks as explicit fields on the request — visible on the same screen as the approval status — makes that gap visible to whoever is deciding whether to approve the purchase, instead of being a fact that lives only in someone's memory."},{"heading":"How it works","kind":"workflow","html":"<p>Each request records the item, its category (Chemical, Machinery, PPE, or General), who requested it and when, whether an SDS is on file, whether a compliance certificate is on file, and a status: <code>pending</code>, <code>approved</code>, or <code>rejected</code>.</p>\n","text":"Each request records the item, its category (Chemical, Machinery, PPE, or General), who requested it and when, whether an SDS is on file, whether a compliance certificate is on file, and a status: pending, approved, or rejected."},{"heading":"This screen","kind":"contextual","html":"<p>The list page shows every request with its category and status, and the SDS/compliance-certificate flags as columns, filterable and sortable by status or request date. The detail page shows the full request, including both compliance flags as badges; create and edit forms share the same fields.</p>\n","text":"The list page shows every request with its category and status, and the SDS/compliance-certificate flags as columns, filterable and sortable by status or request date. The detail page shows the full request, including both compliance flags as badges; create and edit forms share the same fields."},{"heading":"Fields","kind":"field-reference","html":"<ul>\n<li><strong>Item</strong> — required. What's being requested.</li>\n<li><strong>Category</strong> — required. One of Chemical, Machinery, PPE, General.</li>\n<li><strong>Requested by</strong> — required.</li>\n<li><strong>Date requested</strong> — required.</li>\n<li><strong>SDS on file</strong> — a checkbox. Whether a Safety Data Sheet is already available for this item.</li>\n<li><strong>Compliance certificate on file</strong> — a checkbox. Whether a compliance certificate is already available for this item.</li>\n<li><strong>Status</strong> — one of <code>pending</code>, <code>approved</code>, <code>rejected</code>.</li>\n</ul>\n","text":"Item — required. What's being requested. Category — required. One of Chemical, Machinery, PPE, General. Requested by — required. Date requested — required. SDS on file — a checkbox. Whether a Safety Data Sheet is already available for this item. Compliance certificate on file — a checkbox. Whether a compliance certificate is already available for this item. Status — one of pending, approved, rejected."},{"heading":"Actions","kind":"contextual","html":"<p>Creating or editing a request validates item/category/requester/date as required; the two on-file checkboxes and the status field have no further validation. Moving a request to <code>approved</code> or <code>rejected</code> is a direct field edit — the SDS/compliance-certificate flags are informational fields shown alongside the status, not a check the application enforces before a request can be approved.</p>\n","text":"Creating or editing a request validates item/category/requester/date as required; the two on-file checkboxes and the status field have no further validation. Moving a request to approved or rejected is a direct field edit — the SDS/compliance-certificate flags are informational fields shown alongside the status, not a check the application enforces before a request can be approved."},{"heading":"What happens next","kind":"workflow","html":"<p>Approving a request with both compliance flags unticked is possible in the current version of the product — the fields are there to inform that decision, not to block it. There's no automated link from an approved Chemical request into the <a href=\"/modules/chemicals-sds/\">Chemicals &amp; SDS</a> register; if the purchase is approved and the item is a chemical, add it to that register as a separate step once it's on site.</p>\n","text":"Approving a request with both compliance flags unticked is possible in the current version of the product — the fields are there to inform that decision, not to block it. There's no automated link from an approved Chemical request into the Chemicals & SDS register; if the purchase is approved and the item is a chemical, add it to that register as a separate step once it's on site."},{"heading":"FAQ","kind":"reference","html":"<p><strong>Does setting &quot;SDS on file&quot; to true require an actual SDS to be attached?</strong> No — it's a plain yes/no field with no attached document; it records that someone has confirmed the SDS exists, not the file itself.</p>\n","text":"Does setting \"SDS on file\" to true require an actual SDS to be attached? No — it's a plain yes/no field with no attached document; it records that someone has confirmed the SDS exists, not the file itself."}]},{"id":"settings","type":"module","title":"Settings","description":"Organisation profile, branding and user administration — planned, not yet available as a screen, though the roles and permissions it will manage already exist and are enforced.","status":"published","version":2,"locale":"en","translationKey":"settings","module":"settings","audience":["user","administrator","evaluator"],"url":"https://docs.sheqcontrolplane.com/modules/settings/","context":{"helpKeys":["settings"],"screens":["settings"],"applicationRoutes":["/settings"]},"search":{"keywords":["settings","administration","roles","permissions","users","viewer","contributor","manager","admin"]},"related":[],"parentId":null,"prerequisites":[],"nextSteps":[],"deprecated":null,"lastUpdated":"2026-09-06T11:16:14+01:00","sections":[{"heading":"Overview","kind":"overview","html":"<p>Settings is where organisation profile, branding and user administration will live. The <strong>screen itself is planned, not yet built</strong> — the application currently shows a placeholder here. This does not mean the product has no roles or permissions: it already has both, enforced today, with just no in-app screen yet to administer them.</p>\n","text":"Settings is where organisation profile, branding and user administration will live. The screen itself is planned, not yet built — the application currently shows a placeholder here. This does not mean the product has no roles or permissions: it already has both, enforced today, with just no in-app screen yet to administer them."},{"heading":"Why it matters","kind":"overview","html":"<p>Every user signs in as one of four roles — Viewer, Contributor, Manager, or Admin — each carrying a defined set of permissions (e.g. <code>hazards:write</code>, <code>safe_work_procedures:delete</code>) that the real API enforces server-side; the frontend uses the same permissions to hide or disable actions a user almost certainly can't perform, as a UX nicety, not as the actual security boundary. A Viewer, for example, sees every register but no &quot;Delete&quot; button. There is no dedicated <em>approval</em> permission distinct from general write access, though — moving a Safe Work Procedure to <code>approved</code> or a Permit to Work to <code>issued</code> only requires the same write permission as any other edit to that register (see <a href=\"/concepts/record-lifecycles-and-status/\">Record lifecycles and status</a>).</p>\n","text":"Every user signs in as one of four roles — Viewer, Contributor, Manager, or Admin — each carrying a defined set of permissions (e.g. hazards:write, safe_work_procedures:delete) that the real API enforces server-side; the frontend uses the same permissions to hide or disable actions a user almost certainly can't perform, as a UX nicety, not as the actual security boundary. A Viewer, for example, sees every register but no \"Delete\" button. There is no dedicated approval permission distinct from general write access, though — moving a Safe Work Procedure to approved or a Permit to Work to issued only requires the same write permission as any other edit to that register (see Record lifecycles and status)."},{"heading":"How it works","kind":"workflow","html":"<p>Roles come from Cognito user-pool groups, mapped to permission sets the same way on both the frontend and the API. What's missing is a way to actually assign a user to a role, invite new users, or edit organisation profile/branding from within the application — that administration currently has to happen outside the product.</p>\n","text":"Roles come from Cognito user-pool groups, mapped to permission sets the same way on both the frontend and the API. What's missing is a way to actually assign a user to a role, invite new users, or edit organisation profile/branding from within the application — that administration currently has to happen outside the product."},{"heading":"What happens next","kind":"workflow","html":"<p>When this screen ships, it will let an Admin manage organisation profile, branding, and which role each user holds. Until then, role assignment is handled outside the application, and every signed-in user already operates under whichever role they were given.</p>\n","text":"When this screen ships, it will let an Admin manage organisation profile, branding, and which role each user holds. Until then, role assignment is handled outside the application, and every signed-in user already operates under whichever role they were given."},{"heading":"FAQ","kind":"reference","html":"<p><strong>If Settings isn't built, how does anyone get assigned a role today?</strong> Outside the application — there's no self-service or in-app way to do it yet.</p>\n<p><strong>Can a Viewer bypass a hidden action by navigating directly to a form URL?</strong> Against the real API, no — the server rejects it with a 403 regardless of what the frontend shows. (The one exception is the application's own mock-data developer mode, which doesn't enforce permissions locally — not a concern for real usage.)</p>\n","text":"If Settings isn't built, how does anyone get assigned a role today? Outside the application — there's no self-service or in-app way to do it yet. Can a Viewer bypass a hidden action by navigating directly to a form URL? Against the real API, no — the server rejects it with a 403 regardless of what the frontend shows. (The one exception is the application's own mock-data developer mode, which doesn't enforce permissions locally — not a concern for real usage.)"}]},{"id":"suggestions","type":"module","title":"Suggestions","description":"Continuous-improvement suggestions from the workforce, tracked from submission through review to implementation.","status":"published","version":1,"locale":"en","translationKey":"suggestions","module":"suggestions","audience":["user"],"url":"https://docs.sheqcontrolplane.com/modules/suggestions/","context":{"helpKeys":["suggestions","suggestion.create","suggestion.edit","suggestions.create","suggestions.edit"],"screens":["suggestions.list","suggestions.detail","suggestions.create","suggestions.edit"],"applicationRoutes":["/management/suggestions","/management/suggestions/new","/management/suggestions/:id","/management/suggestions/:id/edit"]},"search":{"keywords":["suggestions","continuous improvement","employee feedback"]},"related":[],"parentId":null,"prerequisites":[],"nextSteps":[],"deprecated":null,"lastUpdated":"2026-09-06T11:18:58+01:00","sections":[{"heading":"Overview","kind":"overview","html":"<p>Suggestions is a log of continuous-improvement ideas submitted by the workforce — safety, process, cost-saving, environmental or quality suggestions — tracked from submission through to a decision and, where accepted, implementation.</p>\n","text":"Suggestions is a log of continuous-improvement ideas submitted by the workforce — safety, process, cost-saving, environmental or quality suggestions — tracked from submission through to a decision and, where accepted, implementation."},{"heading":"Why it matters","kind":"overview","html":"<p>People doing the work day to day often notice smaller, practical improvements that never surface through formal audits or incident investigations. A simple, tracked register gives those suggestions somewhere to go and a visible status, rather than depending on them being remembered and acted on informally.</p>\n","text":"People doing the work day to day often notice smaller, practical improvements that never surface through formal audits or incident investigations. A simple, tracked register gives those suggestions somewhere to go and a visible status, rather than depending on them being remembered and acted on informally."},{"heading":"How it works","kind":"workflow","html":"<p>A suggestion is submitted with a category and description, then moves through <code>submitted</code> → <code>under-review</code> → <code>approved</code> (or <code>rejected</code>) → <code>implemented</code>. An implemented date and an impact note can be recorded once a suggestion has actually been put into practice.</p>\n","text":"A suggestion is submitted with a category and description, then moves through submitted → under-review → approved (or rejected) → implemented. An implemented date and an impact note can be recorded once a suggestion has actually been put into practice."},{"heading":"This screen","kind":"contextual","html":"<p>The list page shows every suggestion with its category, status and submission date, filterable and sortable by any of those. The detail page shows the full record; create and edit forms share the same fields.</p>\n","text":"The list page shows every suggestion with its category, status and submission date, filterable and sortable by any of those. The detail page shows the full record; create and edit forms share the same fields."},{"heading":"Fields","kind":"field-reference","html":"<ul>\n<li><strong>Title</strong> — required.</li>\n<li><strong>Submitted by</strong> — required. Who made the suggestion.</li>\n<li><strong>Date submitted</strong> — required.</li>\n<li><strong>Category</strong> — required. One of Safety, Process, Cost Saving, Environment, Quality, Other.</li>\n<li><strong>Description</strong> — required. What the suggestion actually proposes.</li>\n<li><strong>Status</strong> — one of <code>submitted</code>, <code>under-review</code>, <code>approved</code>, <code>implemented</code>, <code>rejected</code>. Defaults to <code>submitted</code>.</li>\n<li><strong>Implemented date</strong> — optional. When the suggestion was actually put into practice.</li>\n<li><strong>Impact</strong> — optional free text describing the result once implemented.</li>\n</ul>\n","text":"Title — required. Submitted by — required. Who made the suggestion. Date submitted — required. Category — required. One of Safety, Process, Cost Saving, Environment, Quality, Other. Description — required. What the suggestion actually proposes. Status — one of submitted, under-review, approved, implemented, rejected. Defaults to submitted. Implemented date — optional. When the suggestion was actually put into practice. Impact — optional free text describing the result once implemented."},{"heading":"What happens next","kind":"workflow","html":"<p>Moving a suggestion through its statuses is a direct field edit, available to anyone with edit access to this register — there's no separate reviewer role or notification triggered when a suggestion's status changes in the current version of the product.</p>\n","text":"Moving a suggestion through its statuses is a direct field edit, available to anyone with edit access to this register — there's no separate reviewer role or notification triggered when a suggestion's status changes in the current version of the product."}]},{"id":"approved-suppliers","type":"module","title":"Approved Suppliers","description":"Supplier approval status and evaluation history — which suppliers are approved to use, and how their performance is tracked over time.","status":"published","version":1,"locale":"en","translationKey":"approved-suppliers","module":"suppliers","audience":["user","administrator"],"url":"https://docs.sheqcontrolplane.com/modules/approved-suppliers/","context":{"helpKeys":["suppliers","supplier.create","supplier.edit","suppliers.create","suppliers.edit"],"screens":["suppliers.list","suppliers.detail","suppliers.create","suppliers.edit"],"applicationRoutes":["/management/suppliers","/management/suppliers/new","/management/suppliers/:id","/management/suppliers/:id/edit"]},"search":{"keywords":["suppliers","supplier approval","vendor management","approved supplier list"]},"related":[],"parentId":null,"prerequisites":[],"nextSteps":[],"deprecated":null,"lastUpdated":"2026-09-06T11:18:58+01:00","sections":[{"heading":"Overview","kind":"overview","html":"<p>Approved Suppliers is a register of suppliers — materials, equipment, contractor services, laboratory, or other — with an approval status and a performance rating that's reviewed on a schedule.</p>\n","text":"Approved Suppliers is a register of suppliers — materials, equipment, contractor services, laboratory, or other — with an approval status and a performance rating that's reviewed on a schedule."},{"heading":"Why it matters","kind":"overview","html":"<p>Buying from an unapproved or under-performing supplier can undo compliance work done elsewhere — a material without proper certification, or a contractor service that repeatedly underdelivers. Keeping approval status and evaluation dates as first-class fields, rather than tribal knowledge, makes &quot;can we buy from this supplier right now&quot; a question the register can answer directly.</p>\n","text":"Buying from an unapproved or under-performing supplier can undo compliance work done elsewhere — a material without proper certification, or a contractor service that repeatedly underdelivers. Keeping approval status and evaluation dates as first-class fields, rather than tribal knowledge, makes \"can we buy from this supplier right now\" a question the register can answer directly."},{"heading":"How it works","kind":"workflow","html":"<p>Each supplier record has a category, an approval status (<code>approved</code>, <code>conditional</code>, <code>not-approved</code>), a performance rating (<code>Excellent</code>, <code>Good</code>, <code>Fair</code>, <code>Poor</code>), and the dates of its last and next evaluation. Moving a supplier between approval statuses is a direct field edit — there's no separate approval workflow layered on top.</p>\n","text":"Each supplier record has a category, an approval status (approved, conditional, not-approved), a performance rating (Excellent, Good, Fair, Poor), and the dates of its last and next evaluation. Moving a supplier between approval statuses is a direct field edit — there's no separate approval workflow layered on top."},{"heading":"This screen","kind":"contextual","html":"<p>The list page shows every supplier with its category, approval status, performance rating and next evaluation date, filterable and sortable by any of those. The detail page shows the full record; create and edit forms share the same fields.</p>\n","text":"The list page shows every supplier with its category, approval status, performance rating and next evaluation date, filterable and sortable by any of those. The detail page shows the full record; create and edit forms share the same fields."},{"heading":"Fields","kind":"field-reference","html":"<ul>\n<li><strong>Supplier name</strong> — required.</li>\n<li><strong>Category</strong> — required. One of Materials, Equipment, Contractor Services, Laboratory, Other.</li>\n<li><strong>Approval status</strong> — required. One of <code>approved</code>, <code>conditional</code>, <code>not-approved</code>. Defaults to <code>conditional</code> for a new supplier.</li>\n<li><strong>Last evaluation date</strong> / <strong>Next evaluation date</strong> — both required. Define the evaluation cycle for this supplier.</li>\n<li><strong>Performance rating</strong> — required. One of Excellent, Good, Fair, Poor.</li>\n</ul>\n","text":"Supplier name — required. Category — required. One of Materials, Equipment, Contractor Services, Laboratory, Other. Approval status — required. One of approved, conditional, not-approved. Defaults to conditional for a new supplier. Last evaluation date / Next evaluation date — both required. Define the evaluation cycle for this supplier. Performance rating — required. One of Excellent, Good, Fair, Poor."},{"heading":"What happens next","kind":"workflow","html":"<p>Nothing elsewhere in the product reads a supplier's approval status automatically — the Procurement module's own compliance-document gating checks certificates/SDS on file, not this register's approval status, so keeping a supplier's status current here is a manual discipline, not an enforced gate on purchasing from them.</p>\n","text":"Nothing elsewhere in the product reads a supplier's approval status automatically — the Procurement module's own compliance-document gating checks certificates/SDS on file, not this register's approval status, so keeping a supplier's status current here is a manual discipline, not an enforced gate on purchasing from them."},{"heading":"FAQ","kind":"reference","html":"<p><strong>Does an evaluation past its &quot;next evaluation date&quot; change the supplier's status automatically?</strong> No — the dates are fields to filter and sort by; nothing recalculates approval status or performance rating automatically.</p>\n","text":"Does an evaluation past its \"next evaluation date\" change the supplier's status automatically? No — the dates are fields to filter and sort by; nothing recalculates approval status or performance rating automatically."}]},{"id":"safe-work-procedures","type":"module","title":"Safe Work Procedures","description":"Versioned procedures that move through draft, review, approved and superseded stages, and that Permits to Work link to directly.","status":"published","version":1,"locale":"en","translationKey":"safe-work-procedures","module":"swps","audience":["user","administrator"],"url":"https://docs.sheqcontrolplane.com/modules/safe-work-procedures/","context":{"helpKeys":["swps","safe-work-procedure.create","safe-work-procedure.edit","swps.create","swps.edit"],"screens":["swps.list","swps.detail","swps.create","swps.edit"],"applicationRoutes":["/procedures","/procedures/new","/procedures/:id","/procedures/:id/edit"]},"search":{"keywords":["swp","safe work procedure","procedure","risk control","method statement"]},"related":["permits-to-work","hazards-risk-register"],"parentId":null,"prerequisites":[],"nextSteps":["permits-to-work"],"deprecated":null,"lastUpdated":"2026-09-06T11:18:58+01:00","sections":[{"heading":"Overview","kind":"overview","html":"<p>A Safe Work Procedure (SWP) is a written, versioned method for carrying out a specific task safely — how to work at heights on a particular roof, how to isolate a machine before maintenance, how to enter a confined space. SHEQ Control Plane's Safe Work Procedures register holds every procedure your organisation has written, each with its own owner, version number, and review date, and moves each one through an explicit lifecycle rather than letting a document be edited in place indefinitely.</p>\n","text":"A Safe Work Procedure (SWP) is a written, versioned method for carrying out a specific task safely — how to work at heights on a particular roof, how to isolate a machine before maintenance, how to enter a confined space. SHEQ Control Plane's Safe Work Procedures register holds every procedure your organisation has written, each with its own owner, version number, and review date, and moves each one through an explicit lifecycle rather than letting a document be edited in place indefinitely."},{"heading":"Why it matters","kind":"overview","html":"<p>A procedure that's silently out of date is worse than no procedure at all — it gives a false sense that the risk is controlled. Versioning and an explicit status (draft → review → approved → superseded) mean anyone looking at a procedure can tell, at a glance, whether it's the current, approved way of doing the work or a superseded one being kept for record purposes. Because <a href=\"/modules/permits-to-work/\">Permits to Work</a> link directly to a specific procedure record, a permit can only be issued against a procedure that actually exists in the register — not a paper copy someone printed six months ago.</p>\n","text":"A procedure that's silently out of date is worse than no procedure at all — it gives a false sense that the risk is controlled. Versioning and an explicit status (draft → review → approved → superseded) mean anyone looking at a procedure can tell, at a glance, whether it's the current, approved way of doing the work or a superseded one being kept for record purposes. Because Permits to Work link directly to a specific procedure record, a permit can only be issued against a procedure that actually exists in the register — not a paper copy someone printed six months ago."},{"heading":"How it works","kind":"workflow","html":"<p>Procedures are created as <code>draft</code>, moved to <code>review</code> while the responsible owner or a reviewer checks them, and marked <code>approved</code> once they're ready to be worked to. When a procedure needs to change, the usual pattern is to create a new version rather than editing the approved one in place, and mark the old version <code>superseded</code> — so the register keeps a full history of what the approved method was at any point in time, which matters if an incident investigation later needs to establish what procedure was actually in force on a given date.</p>\n","text":"Procedures are created as draft, moved to review while the responsible owner or a reviewer checks them, and marked approved once they're ready to be worked to. When a procedure needs to change, the usual pattern is to create a new version rather than editing the approved one in place, and mark the old version superseded — so the register keeps a full history of what the approved method was at any point in time, which matters if an incident investigation later needs to establish what procedure was actually in force on a given date."},{"heading":"This screen","kind":"contextual","html":"<p>The list page shows every procedure with its status, version, owner and next review date, and can be filtered and sorted by any of those. The detail page shows the full record; the create and edit forms use the same fields.</p>\n","text":"The list page shows every procedure with its status, version, owner and next review date, and can be filtered and sorted by any of those. The detail page shows the full record; the create and edit forms use the same fields."},{"heading":"Fields","kind":"field-reference","html":"<ul>\n<li><strong>Title</strong> — required. What the procedure covers, e.g. &quot;Working at Heights — Roof Access&quot;. Keep it specific enough that two different procedures never need the same title.</li>\n<li><strong>Version</strong> — required, free-text (e.g. <code>1.0</code>, <code>2.1</code>). Bump this whenever the procedure's content changes materially, not on typo fixes.</li>\n<li><strong>Status</strong> — one of <code>draft</code>, <code>review</code>, <code>approved</code>, <code>superseded</code>. New procedures default to <code>draft</code>.</li>\n<li><strong>Owner</strong> — required. Who maintains this procedure and is responsible for keeping it current.</li>\n<li><strong>Next review date</strong> — required. When this procedure is next due to be checked, independent of its status.</li>\n</ul>\n","text":"Title — required. What the procedure covers, e.g. \"Working at Heights — Roof Access\". Keep it specific enough that two different procedures never need the same title. Version — required, free-text (e.g. 1.0, 2.1). Bump this whenever the procedure's content changes materially, not on typo fixes. Status — one of draft, review, approved, superseded. New procedures default to draft. Owner — required. Who maintains this procedure and is responsible for keeping it current. Next review date — required. When this procedure is next due to be checked, independent of its status."},{"heading":"Actions","kind":"contextual","html":"<p>Creating or editing a procedure validates every required field before it can be saved, and confirms before discarding unsaved changes if you navigate away from the form. There is no separate &quot;approve&quot; button distinct from editing the Status field directly — moving a procedure to <code>approved</code> is done the same way as any other field edit, gated by the same write permission as any other change to this register, not a separate, more restrictive approval permission (see <a href=\"/modules/settings/\">Settings</a>).</p>\n","text":"Creating or editing a procedure validates every required field before it can be saved, and confirms before discarding unsaved changes if you navigate away from the form. There is no separate \"approve\" button distinct from editing the Status field directly — moving a procedure to approved is done the same way as any other field edit, gated by the same write permission as any other change to this register, not a separate, more restrictive approval permission (see Settings)."},{"heading":"What happens next","kind":"workflow","html":"<p>An approved procedure becomes available to reference from a new <a href=\"/modules/permits-to-work/\">Permit to Work</a> — the permit's relational picker resolves live procedure records, so only procedures that actually exist in this register (in any status) can be linked. There is no automatic notification when a procedure's review date passes or when it's superseded in the current version of the product; review dates are a field to filter/sort on, not yet a triggered reminder.</p>\n","text":"An approved procedure becomes available to reference from a new Permit to Work — the permit's relational picker resolves live procedure records, so only procedures that actually exist in this register (in any status) can be linked. There is no automatic notification when a procedure's review date passes or when it's superseded in the current version of the product; review dates are a field to filter/sort on, not yet a triggered reminder."},{"heading":"FAQ","kind":"reference","html":"<p><strong>Can I delete a procedure instead of superseding it?</strong> The register supports deleting a record, but superseding preserves the history — prefer it for any procedure that was ever actually approved and used, and reserve deletion for records created by mistake.</p>\n<p><strong>Does changing a procedure's status affect permits already linked to it?</strong> No. A Permit to Work's link to a procedure is a reference to that specific record; it doesn't re-validate against the procedure's current status after the permit is issued.</p>\n","text":"Can I delete a procedure instead of superseding it? The register supports deleting a record, but superseding preserves the history — prefer it for any procedure that was ever actually approved and used, and reserve deletion for records created by mistake. Does changing a procedure's status affect permits already linked to it? No. A Permit to Work's link to a procedure is a reference to that specific record; it doesn't re-validate against the procedure's current status after the permit is issued."}]},{"id":"toolbox-talks","type":"module","title":"Toolbox Talks","description":"Log toolbox talks, who attended, and whether proof of delivery was captured.","status":"published","version":1,"locale":"en","translationKey":"toolbox-talks","module":"toolbox","audience":["user","administrator"],"url":"https://docs.sheqcontrolplane.com/modules/toolbox-talks/","context":{"helpKeys":["toolbox","toolbox-talk.create","toolbox-talk.edit","toolbox.create","toolbox.edit"],"screens":["toolbox.list","toolbox.detail","toolbox.create","toolbox.edit"],"applicationRoutes":["/toolbox-talks","/toolbox-talks/new","/toolbox-talks/:id","/toolbox-talks/:id/edit"]},"search":{"keywords":["toolbox talk","safety talk","attendance","proof of delivery"]},"related":["safe-work-procedures"],"parentId":null,"prerequisites":[],"nextSteps":[],"deprecated":null,"lastUpdated":"2026-09-06T11:18:58+01:00","sections":[{"heading":"Overview","kind":"overview","html":"<p>The Toolbox Talks register logs short, regular safety briefings — topic, date, presenter, how many people attended, and whether proof the talk actually happened was captured.</p>\n","text":"The Toolbox Talks register logs short, regular safety briefings — topic, date, presenter, how many people attended, and whether proof the talk actually happened was captured."},{"heading":"Why it matters","kind":"overview","html":"<p>Toolbox talks are one of the most common — and most commonly under-documented — safety activities on a site. A register that records attendance count and a proof-captured flag turns &quot;we do toolbox talks&quot; into something that can actually be shown during an audit.</p>\n","text":"Toolbox talks are one of the most common — and most commonly under-documented — safety activities on a site. A register that records attendance count and a proof-captured flag turns \"we do toolbox talks\" into something that can actually be shown during an audit."},{"heading":"How it works","kind":"workflow","html":"<p>Each talk is a single record: topic, date, presenter, a numeric attendee count, and a proof-captured checkbox. There's no attendee-by-name list in the current version — attendance is a headcount, not individual records.</p>\n","text":"Each talk is a single record: topic, date, presenter, a numeric attendee count, and a proof-captured checkbox. There's no attendee-by-name list in the current version — attendance is a headcount, not individual records."},{"heading":"This screen","kind":"contextual","html":"<p>The list page shows every talk with its date, presenter and attendee count, filterable and sortable by talk date or when the record was created/updated.</p>\n","text":"The list page shows every talk with its date, presenter and attendee count, filterable and sortable by talk date or when the record was created/updated."},{"heading":"Fields","kind":"field-reference","html":"<ul>\n<li><strong>Topic</strong> — required. What the talk covered.</li>\n<li><strong>Talk date</strong> — required.</li>\n<li><strong>Presenter</strong> — required. Who delivered the talk.</li>\n<li><strong>Attendees</strong> — required, a non-negative integer headcount.</li>\n<li><strong>Proof captured</strong> — a checkbox indicating whether evidence of the talk (a sign-in sheet, photo, or similar) was captured. The register only stores the flag, not the evidence itself — there's no file attachment on this record in the current version.</li>\n</ul>\n","text":"Topic — required. What the talk covered. Talk date — required. Presenter — required. Who delivered the talk. Attendees — required, a non-negative integer headcount. Proof captured — a checkbox indicating whether evidence of the talk (a sign-in sheet, photo, or similar) was captured. The register only stores the flag, not the evidence itself — there's no file attachment on this record in the current version."},{"heading":"Actions","kind":"contextual","html":"<p>Saving validates that topic, date and presenter are present and that attendees is a non-negative number.</p>\n","text":"Saving validates that topic, date and presenter are present and that attendees is a non-negative number."},{"heading":"What happens next","kind":"workflow","html":"<p>Nothing else in the product reacts to a toolbox talk record automatically — it's a standalone log. If a talk covers material from a specific <a href=\"/modules/safe-work-procedures/\">Safe Work Procedure</a>, note that in the topic; the two registers aren't linked by a shared field.</p>\n","text":"Nothing else in the product reacts to a toolbox talk record automatically — it's a standalone log. If a talk covers material from a specific Safe Work Procedure, note that in the topic; the two registers aren't linked by a shared field."},{"heading":"FAQ","kind":"reference","html":"<p><strong>Where do I attach the sign-in sheet or photo evidence?</strong> There's no file attachment on a toolbox talk record in the current version — Proof captured is a yes/no flag only.</p>\n","text":"Where do I attach the sign-in sheet or photo evidence? There's no file attachment on a toolbox talk record in the current version — Proof captured is a yes/no flag only."}]},{"id":"training-certificates","type":"module","title":"Training & Certificates","description":"Track who holds which certification, and when each one expires.","status":"published","version":1,"locale":"en","translationKey":"training-certificates","module":"training","audience":["user","administrator"],"url":"https://docs.sheqcontrolplane.com/modules/training-certificates/","context":{"helpKeys":["training","training-record.create","training-record.edit","training.create","training.edit"],"screens":["training.list","training.detail","training.create","training.edit"],"applicationRoutes":["/training","/training/new","/training/:id","/training/:id/edit"]},"search":{"keywords":["training","certificate","certification","expiry","competency"]},"related":["ohs-appointments","ppe-register"],"parentId":null,"prerequisites":[],"nextSteps":[],"deprecated":null,"lastUpdated":"2026-09-06T11:18:58+01:00","sections":[{"heading":"Overview","kind":"overview","html":"<p>The Training &amp; Certificates register tracks who holds which certification, in what role, and when it expires — one record per person-per-certificate.</p>\n","text":"The Training & Certificates register tracks who holds which certification, in what role, and when it expires — one record per person-per-certificate."},{"heading":"Why it matters","kind":"overview","html":"<p>A certification that's expired without anyone noticing is a compliance gap that usually only surfaces during an audit or, worse, after an incident. Tracking expiry explicitly, with a visible due-soon warning, turns a date buried in a filing cabinet into something the register itself surfaces before it becomes a problem.</p>\n","text":"A certification that's expired without anyone noticing is a compliance gap that usually only surfaces during an audit or, worse, after an incident. Tracking expiry explicitly, with a visible due-soon warning, turns a date buried in a filing cabinet into something the register itself surfaces before it becomes a problem."},{"heading":"How it works","kind":"workflow","html":"<p>Each record is a single person holding a single certificate in a given role, with an expiry date. There's no separate &quot;renew&quot; workflow — a renewal is recorded by creating a new record (or editing the expiry date on the existing one) rather than the system tracking renewal history automatically.</p>\n","text":"Each record is a single person holding a single certificate in a given role, with an expiry date. There's no separate \"renew\" workflow — a renewal is recorded by creating a new record (or editing the expiry date on the existing one) rather than the system tracking renewal history automatically."},{"heading":"This screen","kind":"contextual","html":"<p>The list page shows every training record with an overdue/due-soon/on-track badge computed from its expiry date (the same pattern used for date-driven deadlines across the product, e.g. calibration due dates), filterable and sortable by person, expiry date, or when the record was created/updated.</p>\n","text":"The list page shows every training record with an overdue/due-soon/on-track badge computed from its expiry date (the same pattern used for date-driven deadlines across the product, e.g. calibration due dates), filterable and sortable by person, expiry date, or when the record was created/updated."},{"heading":"Fields","kind":"field-reference","html":"<ul>\n<li><strong>Person</strong> — required. Who holds the certification.</li>\n<li><strong>Role</strong> — required. The role this certification is held for.</li>\n<li><strong>Certificate</strong> — required. The name of the certification or training course.</li>\n<li><strong>Expiry date</strong> — required. When this certification lapses.</li>\n</ul>\n","text":"Person — required. Who holds the certification. Role — required. The role this certification is held for. Certificate — required. The name of the certification or training course. Expiry date — required. When this certification lapses."},{"heading":"Actions","kind":"contextual","html":"<p>Saving validates that all four fields are present before submitting.</p>\n","text":"Saving validates that all four fields are present before submitting."},{"heading":"What happens next","kind":"workflow","html":"<p>There's no automatic notification when a certificate approaches or passes its expiry date in the current version of the product — the due-soon/overdue badge on the list page is the mechanism for surfacing it, which means someone needs to actually look at the register periodically. Training records aren't linked to <a href=\"/modules/ohs-appointments/\">OHS Appointments</a> or other people-related registers by a shared field, even where the same person appears in both.</p>\n","text":"There's no automatic notification when a certificate approaches or passes its expiry date in the current version of the product — the due-soon/overdue badge on the list page is the mechanism for surfacing it, which means someone needs to actually look at the register periodically. Training records aren't linked to OHS Appointments or other people-related registers by a shared field, even where the same person appears in both."},{"heading":"FAQ","kind":"reference","html":"<p><strong>Does a training record affect anything else in the product automatically?</strong> No — it's a standalone record. Statutory competency requirements tied to a specific appointment are tracked separately in <a href=\"/modules/ohs-appointments/\">OHS Appointments</a>.</p>\n","text":"Does a training record affect anything else in the product automatically? No — it's a standalone record. Statutory competency requirements tied to a specific appointment are tracked separately in OHS Appointments."}]},{"id":"hazard-to-permit-to-work","type":"workflow","title":"From hazard assessment to an issued permit","description":"How a Hazard, a Safe Work Procedure and a Permit to Work connect into one authorised piece of high-risk work.","status":"published","version":1,"locale":"en","translationKey":"hazard-to-permit-to-work","audience":["user","administrator"],"url":"https://docs.sheqcontrolplane.com/workflows/hazard-to-permit-to-work/","context":{"helpKeys":["permits.workflow"]},"search":{"keywords":["permit to work","hazard","procedure","workflow","relational linking"]},"related":["hazards-risk-register","safe-work-procedures","permits-to-work"],"parentId":null,"prerequisites":["hazards-risk-register","safe-work-procedures"],"nextSteps":["permits-to-work"],"deprecated":null,"lastUpdated":"2026-09-06T06:46:29+01:00","sections":[{"heading":"Overview","kind":"overview","html":"<p>Three registers work together to authorise a single piece of high-risk work: a <a href=\"/modules/hazards-risk-register/\">Hazard &amp; Risk Register</a> entry identifies and scores the risk, a <a href=\"/modules/safe-work-procedures/\">Safe Work Procedure</a> defines the approved method for doing the work safely, and a <a href=\"/modules/permits-to-work/\">Permit to Work</a> authorises a specific instance of that work at a specific place and time — linking directly to the exact hazard and procedure records it relies on.</p>\n","text":"Three registers work together to authorise a single piece of high-risk work: a Hazard & Risk Register entry identifies and scores the risk, a Safe Work Procedure defines the approved method for doing the work safely, and a Permit to Work authorises a specific instance of that work at a specific place and time — linking directly to the exact hazard and procedure records it relies on."},{"heading":"Why it matters","kind":"overview","html":"<p>Each of these three registers is useful on its own, but the real safety value comes from the permit being forced to point at real, existing hazard and procedure records rather than a text description of them. A permit issuer opening an issued permit can always open the exact hazard assessment and the exact approved procedure it was issued against — not whatever version of either happened to be current when someone last remembered to check.</p>\n","text":"Each of these three registers is useful on its own, but the real safety value comes from the permit being forced to point at real, existing hazard and procedure records rather than a text description of them. A permit issuer opening an issued permit can always open the exact hazard assessment and the exact approved procedure it was issued against — not whatever version of either happened to be current when someone last remembered to check."},{"heading":"How it works","kind":"workflow","html":"<p>The usual order is: a hazard is identified and scored first (likelihood × severity, producing a risk band); a Safe Work Procedure is written and approved for the task the hazard relates to; and only then is a Permit to Work created, using its relational pickers to link the specific hazard and procedure records. Nothing in the product enforces this order — a permit's hazard and procedure links are both optional, and can be added, changed, or cleared on the permit at any time, independent of the hazard's or procedure's own status.</p>\n","text":"The usual order is: a hazard is identified and scored first (likelihood × severity, producing a risk band); a Safe Work Procedure is written and approved for the task the hazard relates to; and only then is a Permit to Work created, using its relational pickers to link the specific hazard and procedure records. Nothing in the product enforces this order — a permit's hazard and procedure links are both optional, and can be added, changed, or cleared on the permit at any time, independent of the hazard's or procedure's own status."},{"heading":"What happens next","kind":"workflow","html":"<p>Once a permit is issued and later closed, the hazard and procedure it referenced are unaffected — their own statuses and content don't change as a result of a permit's lifecycle, and a hazard or procedure can be linked from any number of permits over time. If the hazard's risk score or the procedure's approved version changes after a permit was issued, the previously issued permit still shows the record as it was linked (a reference to the record's identity, not a snapshot of its content at issue time) — reviewing whether an already-issued permit needs to be reconsidered after such a change is a manual judgement call, not something the system flags.</p>\n","text":"Once a permit is issued and later closed, the hazard and procedure it referenced are unaffected — their own statuses and content don't change as a result of a permit's lifecycle, and a hazard or procedure can be linked from any number of permits over time. If the hazard's risk score or the procedure's approved version changes after a permit was issued, the previously issued permit still shows the record as it was linked (a reference to the record's identity, not a snapshot of its content at issue time) — reviewing whether an already-issued permit needs to be reconsidered after such a change is a manual judgement call, not something the system flags."},{"heading":"FAQ","kind":"reference","html":"<p><strong>Do I have to create records in this order?</strong> No — the pickers on a Permit to Work simply resolve against whatever hazard and procedure records currently exist; nothing blocks creating them in a different order or leaving either link empty.</p>\n","text":"Do I have to create records in this order? No — the pickers on a Permit to Work simply resolve against whatever hazard and procedure records currently exist; nothing blocks creating them in a different order or leaving either link empty."}]}],"indexes":{"byId":{"record-lifecycles-and-status":0,"navigating-the-application":1,"what-is-sheq-control-plane":2,"ohs-appointments":3,"audit-inspection-schedule":4,"calibration-register":5,"chemicals-sds":6,"client-feedback":7,"hs-committee":8,"concessions":9,"contractors":10,"dashboard":11,"document-control":12,"emergency-preparedness":13,"environmental-compliance-register":14,"environmental-metrics-log":15,"equipment-inspections":16,"hazards-risk-register":17,"hr-action-log":18,"incidents-near-misses":19,"internal-feedback":20,"inspection-test-plans":21,"legal-register":22,"management-review":23,"material-certification":24,"medical-surveillance":25,"non-conformance-reports":26,"objectives-targets":27,"permits-to-work":28,"ppe-register":29,"procurement":30,"settings":31,"suggestions":32,"approved-suppliers":33,"safe-work-procedures":34,"toolbox-talks":35,"training-certificates":36,"hazard-to-permit-to-work":37},"byModule":{"appointments":["ohs-appointments"],"audits":["audit-inspection-schedule"],"calibration":["calibration-register"],"chemicals":["chemicals-sds"],"client-feedback":["client-feedback"],"committee":["hs-committee"],"concessions":["concessions"],"contractors":["contractors"],"dashboard":["dashboard"],"doc-control":["document-control"],"emergency":["emergency-preparedness"],"env-compliance":["environmental-compliance-register"],"env-metrics":["environmental-metrics-log"],"equipment":["equipment-inspections"],"hazards":["hazards-risk-register"],"hractions":["hr-action-log"],"incidents":["incidents-near-misses"],"internal-feedback":["internal-feedback"],"itps":["inspection-test-plans"],"legal-register":["legal-register"],"management-review":["management-review"],"material-certs":["material-certification"],"medical":["medical-surveillance"],"ncrs":["non-conformance-reports"],"objectives":["objectives-targets"],"permits":["permits-to-work"],"ppe":["ppe-register"],"procurement":["procurement"],"settings":["settings"],"suggestions":["suggestions"],"suppliers":["approved-suppliers"],"swps":["safe-work-procedures"],"toolbox":["toolbox-talks"],"training":["training-certificates"]},"byHelpKey":{"appointments":["ohs-appointments"],"ohs-appointment.create":["ohs-appointments"],"ohs-appointment.edit":["ohs-appointments"],"appointments.create":["ohs-appointments"],"appointments.edit":["ohs-appointments"],"audits":["audit-inspection-schedule"],"audit.create":["audit-inspection-schedule"],"audit.edit":["audit-inspection-schedule"],"audits.create":["audit-inspection-schedule"],"audits.edit":["audit-inspection-schedule"],"calibration":["calibration-register"],"calibration-register-entry.create":["calibration-register"],"calibration-register-entry.edit":["calibration-register"],"calibration.create":["calibration-register"],"calibration.edit":["calibration-register"],"chemicals":["chemicals-sds"],"chemical.create":["chemicals-sds"],"chemical.edit":["chemicals-sds"],"chemicals.create":["chemicals-sds"],"chemicals.edit":["chemicals-sds"],"client-feedback":["client-feedback"],"client-feedback.create":["client-feedback"],"client-feedback.edit":["client-feedback"],"committee":["hs-committee"],"hs-committee-meeting.create":["hs-committee"],"hs-committee-meeting.edit":["hs-committee"],"committee.create":["hs-committee"],"committee.edit":["hs-committee"],"concessions":["concessions"],"concession.create":["concessions"],"concession.edit":["concessions"],"concessions.create":["concessions"],"concessions.edit":["concessions"],"contractors":["contractors"],"contractor.create":["contractors"],"contractor.edit":["contractors"],"contractors.create":["contractors"],"contractors.edit":["contractors"],"dashboard":["dashboard"],"doc-control":["document-control"],"controlled-document.create":["document-control"],"controlled-document.edit":["document-control"],"doc-control.create":["document-control"],"doc-control.edit":["document-control"],"emergency":["emergency-preparedness"],"emergency-preparedness.create":["emergency-preparedness"],"emergency-preparedness.edit":["emergency-preparedness"],"emergency.create":["emergency-preparedness"],"emergency.edit":["emergency-preparedness"],"env-compliance":["environmental-compliance-register"],"environmental-compliance.create":["environmental-compliance-register"],"environmental-compliance.edit":["environmental-compliance-register"],"env-compliance.create":["environmental-compliance-register"],"env-compliance.edit":["environmental-compliance-register"],"env-metrics":["environmental-metrics-log"],"environmental-metric.create":["environmental-metrics-log"],"environmental-metric.edit":["environmental-metrics-log"],"env-metrics.create":["environmental-metrics-log"],"env-metrics.edit":["environmental-metrics-log"],"equipment":["equipment-inspections"],"equipment-check.create":["equipment-inspections"],"equipment-check.edit":["equipment-inspections"],"equipment.create":["equipment-inspections"],"equipment.edit":["equipment-inspections"],"hazards":["hazards-risk-register"],"hazard.create":["hazards-risk-register"],"hazard.edit":["hazards-risk-register"],"hazards.create":["hazards-risk-register"],"hazards.edit":["hazards-risk-register"],"hractions":["hr-action-log"],"hr-action.create":["hr-action-log"],"hr-action.edit":["hr-action-log"],"hractions.create":["hr-action-log"],"hractions.edit":["hr-action-log"],"incidents":["incidents-near-misses"],"incident.create":["incidents-near-misses"],"incident.edit":["incidents-near-misses"],"incidents.create":["incidents-near-misses"],"incidents.edit":["incidents-near-misses"],"internal-feedback":["internal-feedback"],"internal-feedback.create":["internal-feedback"],"internal-feedback.edit":["internal-feedback"],"itps":["inspection-test-plans"],"inspection-test-plan.create":["inspection-test-plans"],"inspection-test-plan.edit":["inspection-test-plans"],"itps.create":["inspection-test-plans"],"itps.edit":["inspection-test-plans"],"legal-register":["legal-register"],"legal-register.create":["legal-register"],"legal-register.edit":["legal-register"],"management-review":["management-review"],"management-review.create":["management-review"],"management-review.edit":["management-review"],"material-certs":["material-certification"],"material-certificate.create":["material-certification"],"material-certificate.edit":["material-certification"],"material-certs.create":["material-certification"],"material-certs.edit":["material-certification"],"medical":["medical-surveillance"],"medical-examination.create":["medical-surveillance"],"medical-examination.edit":["medical-surveillance"],"medical.create":["medical-surveillance"],"medical.edit":["medical-surveillance"],"ncrs":["non-conformance-reports"],"non-conformance-report.create":["non-conformance-reports"],"non-conformance-report.edit":["non-conformance-reports"],"ncrs.create":["non-conformance-reports"],"ncrs.edit":["non-conformance-reports"],"objectives":["objectives-targets"],"sheq-objective.create":["objectives-targets"],"sheq-objective.edit":["objectives-targets"],"objectives.create":["objectives-targets"],"objectives.edit":["objectives-targets"],"permits":["permits-to-work"],"permit-to-work.create":["permits-to-work"],"permit-to-work.edit":["permits-to-work"],"permits.create":["permits-to-work"],"permits.edit":["permits-to-work"],"ppe":["ppe-register"],"ppe-issue.create":["ppe-register"],"ppe-issue.edit":["ppe-register"],"ppe.create":["ppe-register"],"ppe.edit":["ppe-register"],"procurement":["procurement"],"procurement-request.create":["procurement"],"procurement-request.edit":["procurement"],"procurement.create":["procurement"],"procurement.edit":["procurement"],"settings":["settings"],"suggestions":["suggestions"],"suggestion.create":["suggestions"],"suggestion.edit":["suggestions"],"suggestions.create":["suggestions"],"suggestions.edit":["suggestions"],"suppliers":["approved-suppliers"],"supplier.create":["approved-suppliers"],"supplier.edit":["approved-suppliers"],"suppliers.create":["approved-suppliers"],"suppliers.edit":["approved-suppliers"],"swps":["safe-work-procedures"],"safe-work-procedure.create":["safe-work-procedures"],"safe-work-procedure.edit":["safe-work-procedures"],"swps.create":["safe-work-procedures"],"swps.edit":["safe-work-procedures"],"toolbox":["toolbox-talks"],"toolbox-talk.create":["toolbox-talks"],"toolbox-talk.edit":["toolbox-talks"],"toolbox.create":["toolbox-talks"],"toolbox.edit":["toolbox-talks"],"training":["training-certificates"],"training-record.create":["training-certificates"],"training-record.edit":["training-certificates"],"training.create":["training-certificates"],"training.edit":["training-certificates"],"permits.workflow":["hazard-to-permit-to-work"]},"byScreen":{"appointments.list":["ohs-appointments"],"appointments.detail":["ohs-appointments"],"appointments.create":["ohs-appointments"],"appointments.edit":["ohs-appointments"],"audits.list":["audit-inspection-schedule"],"audits.detail":["audit-inspection-schedule"],"audits.create":["audit-inspection-schedule"],"audits.edit":["audit-inspection-schedule"],"calibration.list":["calibration-register"],"calibration.detail":["calibration-register"],"calibration.create":["calibration-register"],"calibration.edit":["calibration-register"],"chemicals.list":["chemicals-sds"],"chemicals.detail":["chemicals-sds"],"chemicals.create":["chemicals-sds"],"chemicals.edit":["chemicals-sds"],"client-feedback.list":["client-feedback"],"client-feedback.detail":["client-feedback"],"client-feedback.create":["client-feedback"],"client-feedback.edit":["client-feedback"],"committee.list":["hs-committee"],"committee.detail":["hs-committee"],"committee.create":["hs-committee"],"committee.edit":["hs-committee"],"concessions.list":["concessions"],"concessions.detail":["concessions"],"concessions.create":["concessions"],"concessions.edit":["concessions"],"contractors.list":["contractors"],"contractors.detail":["contractors"],"contractors.create":["contractors"],"contractors.edit":["contractors"],"dashboard":["dashboard"],"doc-control.list":["document-control"],"doc-control.detail":["document-control"],"doc-control.create":["document-control"],"doc-control.edit":["document-control"],"emergency.list":["emergency-preparedness"],"emergency.detail":["emergency-preparedness"],"emergency.create":["emergency-preparedness"],"emergency.edit":["emergency-preparedness"],"env-compliance.list":["environmental-compliance-register"],"env-compliance.detail":["environmental-compliance-register"],"env-compliance.create":["environmental-compliance-register"],"env-compliance.edit":["environmental-compliance-register"],"env-metrics.list":["environmental-metrics-log"],"env-metrics.detail":["environmental-metrics-log"],"env-metrics.create":["environmental-metrics-log"],"env-metrics.edit":["environmental-metrics-log"],"equipment.list":["equipment-inspections"],"equipment.detail":["equipment-inspections"],"equipment.create":["equipment-inspections"],"equipment.edit":["equipment-inspections"],"hazards.list":["hazards-risk-register"],"hazards.detail":["hazards-risk-register"],"hazards.create":["hazards-risk-register"],"hazards.edit":["hazards-risk-register"],"hractions.list":["hr-action-log"],"hractions.detail":["hr-action-log"],"hractions.create":["hr-action-log"],"hractions.edit":["hr-action-log"],"incidents.list":["incidents-near-misses"],"incidents.detail":["incidents-near-misses"],"incidents.create":["incidents-near-misses"],"incidents.edit":["incidents-near-misses"],"internal-feedback.list":["internal-feedback"],"internal-feedback.detail":["internal-feedback"],"internal-feedback.create":["internal-feedback"],"internal-feedback.edit":["internal-feedback"],"itps.list":["inspection-test-plans"],"itps.detail":["inspection-test-plans"],"itps.create":["inspection-test-plans"],"itps.edit":["inspection-test-plans"],"legal-register.list":["legal-register"],"legal-register.detail":["legal-register"],"legal-register.create":["legal-register"],"legal-register.edit":["legal-register"],"management-review.list":["management-review"],"management-review.detail":["management-review"],"management-review.create":["management-review"],"management-review.edit":["management-review"],"material-certs.list":["material-certification"],"material-certs.detail":["material-certification"],"material-certs.create":["material-certification"],"material-certs.edit":["material-certification"],"medical.list":["medical-surveillance"],"medical.detail":["medical-surveillance"],"medical.create":["medical-surveillance"],"medical.edit":["medical-surveillance"],"ncrs.list":["non-conformance-reports"],"ncrs.detail":["non-conformance-reports"],"ncrs.create":["non-conformance-reports"],"ncrs.edit":["non-conformance-reports"],"objectives.list":["objectives-targets"],"objectives.detail":["objectives-targets"],"objectives.create":["objectives-targets"],"objectives.edit":["objectives-targets"],"permits.list":["permits-to-work"],"permits.detail":["permits-to-work"],"permits.create":["permits-to-work"],"permits.edit":["permits-to-work"],"ppe.list":["ppe-register"],"ppe.detail":["ppe-register"],"ppe.create":["ppe-register"],"ppe.edit":["ppe-register"],"procurement.list":["procurement"],"procurement.detail":["procurement"],"procurement.create":["procurement"],"procurement.edit":["procurement"],"settings":["settings"],"suggestions.list":["suggestions"],"suggestions.detail":["suggestions"],"suggestions.create":["suggestions"],"suggestions.edit":["suggestions"],"suppliers.list":["approved-suppliers"],"suppliers.detail":["approved-suppliers"],"suppliers.create":["approved-suppliers"],"suppliers.edit":["approved-suppliers"],"swps.list":["safe-work-procedures"],"swps.detail":["safe-work-procedures"],"swps.create":["safe-work-procedures"],"swps.edit":["safe-work-procedures"],"toolbox.list":["toolbox-talks"],"toolbox.detail":["toolbox-talks"],"toolbox.create":["toolbox-talks"],"toolbox.edit":["toolbox-talks"],"training.list":["training-certificates"],"training.detail":["training-certificates"],"training.create":["training-certificates"],"training.edit":["training-certificates"]}}}
