Chapter 1 · Purpose, scope and standards
Why handovers lose things
Every shift change moves the plant from one crew to the next, and whatever the outgoing crew knows but does not pass on is lost. This chapter says what Shift Handover builds to stop that, what it leaves to other modules, and which standards it is measured against.
20 min4 governing standards8 capabilities3 tiers: MVP, STD, BIC
By the end of this chapter you can
- Say what a structured, signed handover is and which tools and records it replaces.
- Name what the module does and what it leaves to M05, M11 and the alarm system in SCADA.
- Name the four governing standards and say what each is used for in the module.
What Shift Handover does
Shift Handover gives every area a structured, searchable operations log and a consistent, signed handover that is filled in from live data, so critical information cannot be lost between crews: open issues, holds, permits, equipment out of service. Its table prefix is shf_.
It replaces electronic shift logs and shift handover software. The module specification names Hexagon j5 Shift Operations Management [1][2], Eschbach Shiftconnector [3], Tervene, Shiftworx, MaintainX (partly) and SharePoint or Excel logs. Comparison pages such as Fabrico's list of shift handover software [4] show what a buyer will expect to see. Your own business may use none of these: a paper logbook, a whiteboard or a chat group is a shift log too, and is just as likely to lose a note.
What the module does, and what it leaves out
The module is wide enough to carry the whole handover and narrow enough to leave permits, repair work and alarms to the systems built for them.
- In: categorised, equipment-linked log entries with carry-forward; a handover report template filled in from MES, CMMS, EHS and QMS state; standing orders with read-and-acknowledge tracking; shift tasks and rounds, and an event manager that turns tag conditions into log entries; outgoing and incoming sign-off.
- Out: permit-to-work issuance (M11); work order execution (M05); the alarm management system of record, which stays in SCADA.
The log can still point at those modules. From a log entry the module can create a work request (M05), an observation (M11), an NCR or hold (M08) or an action item. The log holds the link and the note; the other module owns the work. In this course only the action-item target is built, because it needs no other module; the links to M05, M08 and M11 are named so you know where they go.
Eight capabilities in three tiers
Each capability in the module's map carries a tier. MVP must exist for a plant to cancel the incumbent tool with confidence. STD is parity with mainstream tools. BIC marks a best-in-class difference. All three tiers are taught in this course, and you build all of them; BIC, the event manager, is the advanced part.
| Capability | What it does | Tier |
|---|---|---|
| Operations log | Entries by area and equipment with category, priority, status (open, monitoring, closed), a carry-forward flag, attachments and mentions; full-text search and filters | MVP |
| Handover report | A template per area; an automatic snapshot of production against plan, OEE, downtime, open work orders, holds, active permits, safety events and quality alerts for the ending shift | MVP |
| Sign-off | The outgoing lead signs out, the incoming lead signs in with an e-signature; unsigned handovers escalate | MVP |
| Standing orders | Time-bound instructions per area with a required acknowledgement; acknowledgement tracked per person; expiry | STD |
| Shift tasks and rounds | Recurring tasks per shift definition, carried out with the M01 forms | STD |
| Cross-module actions | From a log entry, create a work request (M05), an observation (M11), an NCR or hold (M08) or an action item | STD |
| Mobile and offline | Field operators read, create and comment offline | STD |
| Event manager | Rules on data tags (threshold, state change, duration) create log entries or tasks; de-duplication and shelving | BIC |
The standards, and what each one is used for
| Standard | Used in this module for |
|---|---|
| UK HSE human factors briefing note on safety-critical communications at shift handover [5] | A structured, two-way handover with written and verbal content |
| API RP 1168, Control Room Management | Shift handover content and fatigue-aware practice for control rooms |
| ANSI/ISA-18.2 (IEC 62682) | Alarm management principles for the event rules that create log entries |
| 21 CFR Part 11 | Signed acknowledgements and handovers, where the log is a regulated record |
Two ideas from the HSE material [5] shape the design most. The handover is two-way: the incoming lead can ask, not only read, so a handover carries comments. And it is written plus verbal: the module keeps the conversation and the record together, and does not replace one with the other.
Knowledge check
A phone call at shift change tells the next crew about a leaking valve. Which part of the HSE approach is missing if it is never written down?
Knowledge check
Which of these does Shift Handover leave to another system?
References
- Hexagon: j5 Shift Operations Management help. https://docs.hexagonppm.com/r/en-US/j5-Shift-Operations-Management-Help/Version-30/1046047
- Hexagon: j5 Shift Operations Management product sheet (PDF). https://bynder.hexagon.com/m/51c130045a97962b/original/Hexagon_PPM_j5_ShiftOperationsManagement_ProductSheet_A4.pdf
- Eschbach: Shiftconnector digital shift book. https://www.eschbach.com/en/shiftlog/
- Fabrico: best shift handover software 2026. https://www.fabrico.io/blog/best-shift-handover-software/
- UK Health and Safety Executive: human factors (find the briefing note on safety-critical communications at shift handover here). https://www.hse.gov.uk/humanfactors/
Chapter 2 · The data model
The log and its nine tables
How a note is stored decides what you can ever do with it. Nine tables hold the log, the handover, the orders, the tasks and the rules. Three rules keep the log useful: every entry has a category and an equipment link, every open item can carry forward, and, in this build, a closed entry stays closed.
25 min9 tables8 categories3 statuses of an entry
By the end of this chapter you can
- Name the nine shf_ tables and say what each one holds.
- Give an entry its category, priority, status, equipment link and carry-forward flag from the allowed values.
- Explain why a free-text-only entry with no equipment link is a problem, and which links are soft.
Nine tables on the shared spine
Every table in the module starts with the standard columns every platform table has: id, tenant_id, created_at, created_by, updated_at, updated_by, row_version, archived_at and ext. The module keeps no list of people, equipment or shifts of its own. It points at the spine: core_shift_instance, core_equipment, core_person, core_shift_definition, core_data_tag and core_e_signature. A shift instance is one real run of a shift definition, such as the afternoon shift of a given date; an area is a piece of core_equipment at the area level of the equipment hierarchy [1]. For a commercial tool's view of a shift log, see the j5 help [4].
The table below is the full definition: every column the module adds to the standard ones, with its type and whether it is required (req). Types are as in the specification: text, int, bool, ts (a timestamp with time zone [2]), uuid and json (jsonb in Postgres [5]). An arrow means a foreign key to that table. Your agent builds from it in Session 2.
| Table | Holds | Columns: type, req = required |
|---|---|---|
| shf_shift_log | The log container for one area and one shift instance | shift_instance_id → core_shift_instance req; area_equipment_id → core_equipment req; status text req: open, handed_over or closed; lead_person_id → core_person |
| shf_log_entry | One operational event or note | shift_log_id → shf_shift_log req; equipment_id → core_equipment; category text req: production, quality, safety, maintenance, environmental, process, logistics or general; priority text req: info, low, medium, high or critical; title text req; body text; status text req: open, monitoring or closed; carry_forward bool req; occurred_at ts req; author_id → core_person req; linked_type text; linked_id uuid; origin text req: manual, event_rule or import |
| shf_handover | The signed handover between the outgoing and incoming leads | shift_log_id → shf_shift_log req; outgoing_lead_id → core_person req; incoming_lead_id → core_person; summary text; auto_snapshot json; signed_out_at ts; signed_in_at ts; outgoing_signature_id → core_e_signature; incoming_signature_id → core_e_signature; status text req: draft, signed_out, accepted or escalated |
| shf_standing_order | A time-bound instruction that needs acknowledging | order_no text req, unique; title text req; body text req; area_equipment_id → core_equipment; issued_by → core_person req; effective_from ts req; effective_to ts; requires_ack bool req; priority text req: normal, high or critical; status text req: draft, active, expired or withdrawn |
| shf_standing_order_ack | One person's acknowledgement of one order | standing_order_id → shf_standing_order req; person_id → core_person req; acknowledged_at ts req; signature_id → core_e_signature |
| shf_task_template | A recurring shift task definition | area_equipment_id → core_equipment req; title text req; shift_definition_id → core_shift_definition; rrule text; form_template_ref → frm_template (a soft link); active bool req |
| shf_shift_task | A task instance for one shift | shift_log_id → shf_shift_log req; task_template_id → shf_task_template; title text req; assignee_id → core_person; due_at ts; done_at ts; result text: done, not_done, not_applicable or issue_found; note text |
| shf_event_rule | A tag-driven rule that creates log entries | name text req; data_tag_id → core_data_tag req; condition json req; category text req; priority text req; dedupe_window_min int; active bool req |
| shf_event_occurrence | One firing of a rule and the entry it made | event_rule_id → shf_event_rule req; triggered_at ts req; value text; log_entry_id → shf_log_entry; suppressed bool |
A few columns need a plain word. auto_snapshot holds the handover's data as JSON, a text format a database can search [3]. rrule is a recurrence rule such as FREQ=DAILY (RFC 5545), used in chapter 4. origin says whether an entry was typed by a person, made by an event rule or imported from the old tool. linked_type and linked_id name the record an entry led to, such as a work request. The lessons build only the action item (core_action_item) as a target; the other modules' records are soft links you can fill in once those modules exist.
An entry people can find again
A log entry is one operational event or note. Choose its fields as you would label a box before filing it. The category is one of production, quality, safety, maintenance, environmental, process, logistics or general. The priority runs info, low, medium, high, critical. The status is open, monitoring or closed. carry_forward says whether the next shift must see it.
Two links are deliberately soft: a uuid with no database foreign key. shf_task_template.form_template_ref points at a form template from M01, and linked_type with linked_id points at whichever record an entry led to. A business may not have those modules installed, so the log must work without them. Every other link keeps its foreign key.
You need: The last two weeks of shift notes you read in Session 1, the allowed values in this chapter, and your AI coding agent
Work on paper or in a text file first; the agent comes in at step 5. Use roles, never the names of people, and leave out anything that describes an injury.
Outcome: Six real notes turned into typed entries with category, priority, equipment link and carry-forward decision, and a query that finds the open carried ones.
Knowledge check
Which entry will your analytics be able to count later?
Knowledge check
Why is shf_task_template.form_template_ref a soft link and not a foreign key?
References
- ISA: ISA-95 series of standards (equipment hierarchy: site, area and below). https://www.isa.org/standards-and-publications/isa-standards/isa-95-standard
- IETF RFC 3339: Date and Time on the Internet: Timestamps. https://www.rfc-editor.org/rfc/rfc3339
- IETF RFC 8259: The JavaScript Object Notation (JSON) Data Interchange Format. https://www.rfc-editor.org/rfc/rfc8259
- Hexagon: j5 Shift Operations Management help. https://docs.hexagonppm.com/r/en-US/j5-Shift-Operations-Management-Help/Version-30/1046047
- PostgreSQL Documentation: JSON Types. https://www.postgresql.org/docs/current/datatype-json.html
Chapter 3 · The record the next crew relies on
The handover: snapshot, signatures and escalation
A handover is a record of what the incoming crew was told, so it must not change after it is signed. This chapter follows one handover from the live state of the plant, through a stored snapshot and two signatures, to the escalation of one that nobody accepts.
25 min4 handover statuses2 e-signatures1 stored snapshot
By the end of this chapter you can
- Say which data goes into the auto-snapshot and where each part comes from.
- Explain why the snapshot is stored at sign-out and never recomputed when the handover is viewed.
- Describe the draft, signed_out, accepted and escalated states, and who signs each side.
The snapshot
The handover report is built from the state of the ending shift. The module consumes five events from other modules: mes.shift_summary.ready, cmms.work_order.status_changed, ehs.permit.activated, qms.hold.placed and ehs.incident.reported. From them it fills the report with production against plan, OEE (overall equipment effectiveness), downtime, open work orders, holds, active permits, safety events and quality alerts. The module's own log adds equipment out of service, open and carried entries and the active standing orders.
For how a commercial digital shift book presents handover content, see [3]. The result is stored as JSON in shf_handover.auto_snapshot. The outgoing lead adds a short summary in words, because a number cannot say what the incoming crew should worry about first.
Stored, not recomputed
The specification names two pitfalls to teach. The second, free text with no equipment link, was chapter 2. The first is recomputing the snapshot whenever the handover is viewed. It looks harmless, because the data is all there. But a week later the work orders have moved on, the holds are released and the permits are closed, so the handover now shows something the incoming crew never saw. The record has drifted. The compliance note says the snapshot must be stored with the handover so the record reflects what the incoming crew actually saw. In data-integrity terms [2], the stored snapshot is the original record, and a recomputed one is a copy of something else.
Two signatures, four states
A handover has an outgoing lead and an incoming lead, which is what makes it two-way, as the HSE human factors material asks [4]. Each signs with an e-signature held in core_e_signature: the outgoing lead's signature is stored as outgoing_signature_id and the incoming lead's as incoming_signature_id. Where the log is a regulated record, 21 CFR Part 11 asks that a signed record show who signed, when, and what the signature means [1]; the module's signature carries the signer, the meaning (authored for the outgoing lead, acknowledged for the incoming lead), the time and a hash of the record.
| Status | What it means | Who moves it on |
|---|---|---|
| draft | The report is being written. If it is still unsigned at the due time it stays a draft and the supervisor is told once; it is not escalated, so the outgoing lead can still sign out | The outgoing lead, who signs out |
| signed_out | The outgoing lead has signed and the snapshot is stored | The incoming lead, who signs in |
| accepted | The incoming lead has signed in; the crew has the information | No one: this is the end state |
| escalated | Signed out, but nobody accepted it in time; the supervisor has been told | The incoming lead can still accept it |
Signing out and signing in are also news for the rest of the platform. The module publishes four events of its own: shf.handover.signed_out, shf.handover.accepted, shf.log_entry.created and shf.standing_order.issued. In this build a database trigger writes each one into core_event_outbox when the row changes, so another module can react without reading the shf_ tables, and no person or route is given a right to write to the outbox.
Two rules guard the pair. Nobody signs both sides of one handover, because the second signature would then check nothing. And an escalation is not a failure to be hidden: it is the way an unsigned handover stops being silent.
When nobody signs
The specification says unsigned handovers escalate, and the first of its KPIs is the on-time sign-off rate: handovers accepted within N minutes of shift end, divided by handovers. The specification leaves N to the business. This course uses 30 minutes for its seed and asks you to take your own number from your Session 1 inventory.
- On time: accepted within N minutes of shift end. In the seed, handover 1.
- Late: accepted, but after N minutes. In the seed, handover 2. It counts against the rate even though it was accepted. Under the scheduler rule below it would have been escalated at minute 30 and then accepted; the seed stores it as accepted.
- Escalated: signed out but not accepted by the due time, and still not accepted. In the seed, handover 3. In this course's build the scheduler marks it once, at the due time, however many times it runs, and tells the shift's supervisor.
- Never signed out: a draft still unsigned at the due time is not set to escalated, so the outgoing lead can still sign out. The supervisor is told once, and in this build that one notification is what counts as the escalation the specification asks for when a handover was never signed out.
On the seed the on-time sign-off rate is 1 ÷ 3, about 33%: one handover of three was accepted within the window.
You need: Your platform from Sessions 2 to 4 with the seed loaded, a test user for each lead, and your AI coding agent
Use the seed's synthetic people and data only. If you have not built the sign-out route yet, do steps 1 and 2 on paper and the rest after Session 4.
Outcome: A handover whose stored snapshot is unchanged after the live data moved, a hash that matches its signature, and two refused attempts to change or double-sign it.
Knowledge check
A handover is opened a week after it was signed and shows a work order that did not exist at sign-out. What went wrong?
Knowledge check
A handover is signed out at the end of a shift and nobody accepts it within N minutes. What should the module do?
References
- eCFR: Title 21, Part 11, Electronic records; electronic signatures. https://www.ecfr.gov/current/title-21/chapter-I/subchapter-A/part-11
- FDA: Data integrity and compliance with drug CGMP: questions and answers (2018). https://www.fda.gov/regulatory-information/search-fda-guidance-documents/data-integrity-and-compliance-drug-cgmp-questions-and-answers
- Eschbach: Shiftconnector digital shift book. https://www.eschbach.com/en/shiftlog/
- UK Health and Safety Executive: human factors. https://www.hse.gov.uk/humanfactors/
Chapter 4 · From the module to the floor
Orders, events, people and cut-over
A handover tells the next crew what happened. Standing orders tell them what to do, event rules write down what the plant says by itself, and the roles decide who may do which. This chapter closes with the three KPIs and the move from the old tool.
25 min5 roles + 2 machine accounts3 KPIs3 definition-of-done tests
By the end of this chapter you can
- Explain how a standing order is acknowledged, tracked per person and expired.
- Explain how an event rule makes exactly one log entry for each condition episode.
- Name the five roles and the screens they use, count the three KPIs on a seed, and describe the cut-over from the old tool.
Standing orders
A standing order is a time-bound instruction for an area: for example a temporary limit on a machine until a repair is done. It has an order number, a title, a body, an issuer, an effective_from and optional effective_to, a priority of normal, high or critical, and a status of draft, active, expired or withdrawn. When requires_ack is true, each person in the area must acknowledge it, and each acknowledgement is a row in shf_standing_order_ack with the person, the time and an e-signature: in this course's build every acknowledgement is signed with a fresh password, and signature_id holds that signature.
The measure that matters is acknowledgement compliance: acknowledged, divided by required, before the order takes effect. It counts people, not clicks, so the module allows one acknowledgement per person per order.
Shift tasks and rounds
A shf_task_template defines a recurring task for an area, on a shift definition, with a recurrence rule such as FREQ=DAILY (the RFC 5545 standard for repeating events [1]). For each shift the scheduler makes a shf_shift_task. An operator finishes it with a result: done, not_done, not_applicable or issue_found. A task can use an M01 form, and an issue_found result raises a log entry linked to the task, so the finding reaches the next crew.
Event rules: one entry for each episode
The event manager watches data tags. A shf_event_rule names a tag and a condition (a threshold, a state change or a duration), and when the condition is met it writes a log entry or a task with origin event_rule. Each firing is recorded in shf_event_occurrence, with the entry it made, or marked suppressed if it fell inside the rule's dedupe_window_min. The specification gives the window in minutes and does not say where it starts; in this build it is counted from the moment the condition clears. The occurrence table has no column for the episode, so this build keeps the start time of each episode in ext, as ext.episode_key on the occurrence row. The rule only writes to the log. The alarm system of record stays in SCADA, and the module follows the alarm management principles of ANSI/ISA-18.2 for event rules; the window keeps one condition from flooding the log with copies.
The third definition-of-done test says it plainly: an event rule creates exactly one entry per condition episode. A rule that wrote an entry every minute while a tank stayed high would bury the log, and the next crew would stop reading it. Shelving a rule, with a reason in a comment, stops it without deleting its history.
Who does what
The module adds five roles to the Role and Exposure Matrix and two machine accounts. Row-level security, the rules the database applies to each row for each person, is generated from that matrix, so a right missing from it is a refusal in the lab. NIST's project page on role-based access control [3] describes the model.
| Role | Scope | What they do |
|---|---|---|
| Operator | Own area | Write entries with photos and comments, finish their shift tasks, acknowledge standing orders, use the phone view offline |
| Outgoing lead | Own area, own shift | Everything an operator does, plus change any entry's status in the area, write the handover and sign out |
| Incoming lead | Own area | Everything an operator does, plus work carried-forward entries, ask questions on the handover and sign in |
| Standing-order issuer | Whole site | Issue, activate and withdraw orders, track acknowledgements, receive escalations |
| Log administrator | Whole site | Set up task templates and event rules, run the import, read everything on the site |
| Machine accounts | Named jobs only | A shift scheduler (opens logs, makes drafts, escalates, expires orders) and an event evaluator (writes rule entries) |
Each scope must point at a record, so the lessons write two build decisions down. Own area: a person's area is ext.area_id on core_person, holding the core_equipment id of the area, compared with the area_equipment_id of the shift log or standing order. Own shift: a shift's lead is core_crew.lead_person_id, reached through core_shift_instance.crew_id; whoever opens a shift log copies it into shf_shift_log.lead_person_id, and the shift is a person's own when that column, or a handover's outgoing_lead_id, is that person.
A right to write is not a right to read. An insert that hands the new row straight back (RETURNING) counts as a read, so row-level security refuses it unless the role may also read that row. The operator who posts a photo on an entry therefore also reads core_attachment on the area's entries and handovers, or the photo could not be shown on the shift log, and reads their own core_e_signature for an acknowledgement. A notification sent to someone else is a row the sender cannot read, so the route makes its uuid itself and does not ask for it back; that holds for a mention, for the issuer's notices and for the scheduler's.
| Screen or route | Who opens it |
|---|---|
| /shift/log, the shift log | Operators and leads |
| /shift/handover, the handover report with sign-out and sign-in | Outgoing and incoming leads |
| /shift/orders, standing orders to acknowledge | Everyone in the area |
| /shift/orders/issue, the issuer's page | The standing-order issuer |
| /shift/admin, task templates, event rules and import | The log administrator |
| /shift/field, the offline phone view | Operators and leads |
The phone view matters most to the people on the floor. It keeps the area's open and carried items on the phone, lets the operator read, write and comment with no signal, and sends what was written when the signal returns, once. Acknowledging a standing order needs a fresh password, so it stays online. Every page must stay usable at 360 and 390 pixels wide, with large touch targets [4].
Three KPIs, counted by hand first
| KPI | Definition |
|---|---|
| Handover on-time sign-off rate | Handovers accepted within N minutes of shift end ÷ handovers |
| Open carry-forward items | Count and age of carried items by area |
| Standing order ack compliance | Acknowledged ÷ required acknowledgements before the effective date |
Count the seed by hand before you trust a dashboard, and make the database views match your count. A view that disagrees with a person who counted slowly is wrong, however good it looks.
Cut over from the old tool
The module specification gives the migration in one line: export the historical logs as CSV and import them as closed entries tagged origin = import. Closed, because history is evidence of what happened; tagged, so reports can tell old from new. Items still open in the old tool and still needed can be loaded as open entries with carry_forward true, so the next crew sees them. Then run old and new side by side for a few shifts, compare handover counts and open carried items, and only then cancel the old subscription, with the saving recorded. Check what your old tool can export on its vendor's own help page, such as j5's [2], and see [5] for the tools a buyer compares. This element states no prices: take the cost from your own invoice, as in Session 1.
The module is done when
- The snapshot stored at sign-out is byte-identical when re-opened a week later.
- An unsigned handover escalates on schedule.
- An event rule creates exactly one entry per condition episode.
You need: Your platform from Sessions 2 to 4, the log administrator's page, and a replay script written by your agent
Use a synthetic tag and made-up values only. Do the prediction before you run anything.
Outcome: A written prediction that matches the counts from a replayed stream, no new rows on a second replay, a shelved rule that makes no entry for a new episode, and one entry for that episode once the rule is un-shelved.
Knowledge check
A standing order requires nine people to acknowledge it. Six did before it took effect, one later and two never. What is the compliance?
Knowledge check
How should historical logs from the old tool be imported?
References
- IETF RFC 5545: Internet Calendaring and Scheduling Core Object Specification (iCalendar). https://www.rfc-editor.org/rfc/rfc5545
- Hexagon: j5 Shift Operations Management help. https://docs.hexagonppm.com/r/en-US/j5-Shift-Operations-Management-Help/Version-30/1046047
- NIST: Role-based access control project. https://csrc.nist.gov/projects/role-based-access-control
- W3C: Web Content Accessibility Guidelines (WCAG) 2.2, 2.5.5 Target Size (Enhanced), the 44 px rule this platform uses. https://www.w3.org/WAI/WCAG22/Understanding/target-size-enhanced.html
- Fabrico: best shift handover software 2026. https://www.fabrico.io/blog/best-shift-handover-software/
Chapter 5 · 12 questions · 80% passes
Final assessment
Twelve questions across the element. Score 80% (10 of 12) to pass. Your LMS records your score and each answer; you can review the chapters and try again.
15 min12 questions≈ 15 minutesRetake allowed
Your result
CivOps AI Academy
Shift Handover: the Operations Log, the Signed Handover and Standing Orders
Element M02 complete · Learner
Your LMS records this completion. For the CivOps Foundation certificate, finish the Foundation Course at https://civops.io/learn.