Skip to the lesson
CivOps AI Academy · M02Shift Handover: the Operations Log, the Signed Handover and Standing Orders
0%

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.

The edge of shift handoverInside: operations log, handover report, sign-off, standing orders, shift tasks and rounds, and the event manager. Outside, each with its owner: permit-to-work issuance in M11, work order execution in M05, and the alarm system of record, which stays in SCADA. INSIDE SHIFT HANDOVER (M02)Operations logHandover reportSign-offStanding ordersShift tasks and roundsEvent managerOUTSIDE, WITH ITS OWNERPermit-to-work issuanceowned by M11Work order executionowned by M05Alarm system of recordstays in SCADA (ISA-18.2)
The edge of Shift Handover. Inside: operations log, handover report, sign-off, standing orders, shift tasks and rounds, and the event manager. Outside, each with its owner: permit-to-work issuance (M11), work order execution (M05) and the alarm system of record (stays in SCADA, under ISA-18.2).
  • 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.

Eight capabilities by tierThree columns: MVP with three capabilities, STD with four and BIC with one. MVP (3)Operations logHandover reportSign-offSTD (4)Standing ordersShift tasks and roundsCross-module actionsMobile and offlineBIC (1)Event manager
Eight capabilities by tier. MVP (3): operations log, handover report, sign-off. STD (4): standing orders, shift tasks and rounds, cross-module actions, mobile and offline. BIC (1): event manager.
CapabilityWhat it doesTier
Operations logEntries by area and equipment with category, priority, status (open, monitoring, closed), a carry-forward flag, attachments and mentions; full-text search and filtersMVP
Handover reportA 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 shiftMVP
Sign-offThe outgoing lead signs out, the incoming lead signs in with an e-signature; unsigned handovers escalateMVP
Standing ordersTime-bound instructions per area with a required acknowledgement; acknowledgement tracked per person; expirySTD
Shift tasks and roundsRecurring tasks per shift definition, carried out with the M01 formsSTD
Cross-module actionsFrom a log entry, create a work request (M05), an observation (M11), an NCR or hold (M08) or an action itemSTD
Mobile and offlineField operators read, create and comment offlineSTD
Event managerRules on data tags (threshold, state change, duration) create log entries or tasks; de-duplication and shelvingBIC

The standards, and what each one is used for

StandardUsed 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 ManagementShift 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 11Signed 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

  1. Hexagon: j5 Shift Operations Management help. https://docs.hexagonppm.com/r/en-US/j5-Shift-Operations-Management-Help/Version-30/1046047
  2. Hexagon: j5 Shift Operations Management product sheet (PDF). https://bynder.hexagon.com/m/51c130045a97962b/original/Hexagon_PPM_j5_ShiftOperationsManagement_ProductSheet_A4.pdf
  3. Eschbach: Shiftconnector digital shift book. https://www.eschbach.com/en/shiftlog/
  4. Fabrico: best shift handover software 2026. https://www.fabrico.io/blog/best-shift-handover-software/
  5. 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 nine shf_ tablesNine tables. A shift log has many log entries, many shift tasks and one handover. A task template makes shift tasks. An event rule has many occurrences, and an occurrence makes a log entry. A standing order has many acknowledgements. shf_task_templateshf_shift_taskshf_handovershf_event_ruleshf_event_occurrenceshf_shift_logshf_standing_ordershf_standing_order_ackshf_log_entrymakeshas manyhas onehas manyhas manymakeshas many
The nine tables. A shift log has many log entries and many shift tasks, and one handover. A task template makes shift tasks. An event rule has many occurrences, and an occurrence makes a log entry. A standing order has many acknowledgements.

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.

TableHoldsColumns: type, req = required
shf_shift_logThe log container for one area and one shift instanceshift_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_entryOne operational event or noteshift_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_handoverThe signed handover between the outgoing and incoming leadsshift_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_orderA time-bound instruction that needs acknowledgingorder_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_ackOne person's acknowledgement of one orderstanding_order_id → shf_standing_order req; person_id → core_person req; acknowledged_at ts req; signature_id → core_e_signature
shf_task_templateA recurring shift task definitionarea_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_taskA task instance for one shiftshift_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_ruleA tag-driven rule that creates log entriesname 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_occurrenceOne firing of a rule and the entry it madeevent_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.

The life of a log entryA log entry is open, monitoring or closed. An entry that is not closed and has carry_forward true is shown to the next shift. In this build a closed entry cannot change. openneeds actionmonitoringwatching, not yet fixedcloseddone, finalwatch itresolve itor close it straight awaycarry_forward = true, not closedshown to the next shift underCarried from earlier shifts, with its ageClosed is finalin this build a closed entry cannotchange; imported history arrives closed
The life of a log entry. Open, then monitoring, then closed, or closed straight away. An entry that is not closed and has carry_forward true is shown to the next shift with its age. In this build a closed entry cannot change, a rule you choose and write down (the specification does not set it); imported history arrives closed.

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.

Exercise · Turn six real notes into six good entries15 minutes

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

  1. ISA: ISA-95 series of standards (equipment hierarchy: site, area and below). https://www.isa.org/standards-and-publications/isa-standards/isa-95-standard
  2. IETF RFC 3339: Date and Time on the Internet: Timestamps. https://www.rfc-editor.org/rfc/rfc3339
  3. IETF RFC 8259: The JavaScript Object Notation (JSON) Data Interchange Format. https://www.rfc-editor.org/rfc/rfc8259
  4. Hexagon: j5 Shift Operations Management help. https://docs.hexagonppm.com/r/en-US/j5-Shift-Operations-Management-Help/Version-30/1046047
  5. 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.

What goes into the snapshotEvents from MES, CMMS, EHS and QMS, and the module's own log, flow into the sign-out route, which writes the auto-snapshot onto the handover record once. STATE OF THE ENDING SHIFTMESmes.shift_summary.readyCMMScmms.work_order.status_changedEHSehs.permit.activatedehs.incident.reportedQMSqms.hold.placedThis module's own logequipment out of service, open andcarried entries, active standing ordersSign-out routebuilds the snapshotonce, at sign-outshf_handoverauto_snapshot (json)stored with the record
What goes into the snapshot. Events from MES, CMMS, EHS and QMS, and the module's own log, go into the sign-out route, which writes the auto-snapshot onto the handover record once.

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.

Recomputed or storedTwo lanes. When the snapshot is recomputed on view, a handover opened a week later shows today's data. When it is stored at sign-out, it shows the stored snapshot, byte-identical. RECOMPUTED WHEN VIEWED (THE PITFALL)Sign-outsnapshot built, not keptA week latersomeone opens the handoverShows today's datanot what the crew sawSTORED AT SIGN-OUT (THE RULE)Sign-outsnapshot written to the recordA week latersomeone opens the handoverShows the stored snapshotbyte-identical
Recomputed or stored. Top: a snapshot rebuilt when someone opens the handover a week later shows today's data. Bottom: a snapshot written at sign-out shows the same bytes a week later.

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.

The states of a handoverA handover is a draft, then signed_out when the outgoing lead signs, then accepted when the incoming lead signs in. A signed_out handover not accepted in N minutes becomes escalated, and an escalated handover can still be accepted. draftoutgoing lead writessigned_outsnapshot storedacceptedincoming lead signed inescalatedsupervisor notifiedoutgoing signsincoming signs innot accepted in N mincan still be acceptedN is the business's choice; the seed in this course uses 30 minutes.A draft that was never signed out is not escalated: the supervisor is told and it stays a draft.
The states of a handover. Draft, then signed_out when the outgoing lead signs, then accepted when the incoming lead signs in. A signed_out handover not accepted within N minutes becomes escalated, and an escalated handover can still be accepted.
StatusWhat it meansWho moves it on
draftThe 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 outThe outgoing lead, who signs out
signed_outThe outgoing lead has signed and the snapshot is storedThe incoming lead, who signs in
acceptedThe incoming lead has signed in; the crew has the informationNo one: this is the end state
escalatedSigned out, but nobody accepted it in time; the supervisor has been toldThe 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.

Handover acceptance against the due timeA shift ends at minute 0 and a handover is due to be accepted by minute 30. Handover 1 is accepted at 10 minutes. Handover 2 is not accepted by minute 30, so it would have been escalated then, and is accepted at 50 minutes; the seed stores it as accepted. Handover 3 is never accepted and is escalated once, at the 30-minute due time. Drawn to scale. shift ends1030: due5060 minWindow: 30 minutesPast dueHandover 1: accepted at 10 min, on timeHandover 2: past due at 30 min (would be escalated), accepted at 50 min, lateHandover 3: escalated once at 30 min, never acceptedDrawn to scale, 14 px a minute. The three handovers are the synthetic seed from Session 2.
Handover acceptance against the due time, to scale. The shift ends at minute 0 and acceptance is due by minute 30. Handover 1 was accepted at 10 minutes, handover 2 at 50 minutes, and handover 3 was never accepted: it was escalated once, at the 30-minute due time. Handover 2 was not accepted by minute 30 either: it would have been escalated at minute 30 and then accepted; the seed stores it as accepted.
  • 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.

Exercise · Prove a snapshot does not drift20 minutes

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

  1. eCFR: Title 21, Part 11, Electronic records; electronic signatures. https://www.ecfr.gov/current/title-21/chapter-I/subchapter-A/part-11
  2. 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
  3. Eschbach: Shiftconnector digital shift book. https://www.eschbach.com/en/shiftlog/
  4. 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.

Standing order acknowledgementNine people must acknowledge one standing order. Six did before it took effect, one after and two never. Compliance is 6 over 9, 67 percent. Person 1Person 2Person 3Person 4Person 5Person 6Person 7Person 8Person 9Before it took effect: 6After: 1Never: 2ONE STANDING ORDER, NINE PEOPLE REQUIRED TO ACKNOWLEDGEComplianceacknowledged before effective_from ÷ required6 ÷ 9 = 67%Who to chasethe three with no acknowledgement in time:one late, two neverA synthetic seed made up for the lab, not a measurement of any business.
One standing order, nine people. Six acknowledged before it took effect, one after, two never. Compliance is 6 ÷ 9, 67%. The issuer sees the three to chase.

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.

One entry for each condition episodeA tag condition is true from 06:00 to 08:00, from 09:00 to 09:10 and again from 09:25 to 09:35, and from 13:00 to 13:30. With a 30 minute dedupe window the return at 09:25 is suppressed, so there are four occurrences and three log entries. Drawn to scale. 06:0008:0010:0012:0014:00Entry 1Entry 3Entry 2Suppressed: back inside the windowAmber: the dedupe window, 30 minutes from when the condition clears (this build's rule).Four occurrences, one suppressed, three log entries: one entry for each episode.Drawn to scale across eight hours, on a replayed synthetic tag stream.
One entry for each condition episode, to scale. A tag condition is true from 06:00 to 08:00, from 09:00 to 09:10, again from 09:25 to 09:35 and from 13:00 to 13:30. With a 30 minute window the return at 09:25 is suppressed: four occurrences, three log entries.

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.

RoleScopeWhat they do
OperatorOwn areaWrite entries with photos and comments, finish their shift tasks, acknowledge standing orders, use the phone view offline
Outgoing leadOwn area, own shiftEverything an operator does, plus change any entry's status in the area, write the handover and sign out
Incoming leadOwn areaEverything an operator does, plus work carried-forward entries, ask questions on the handover and sign in
Standing-order issuerWhole siteIssue, activate and withdraw orders, track acknowledgements, receive escalations
Log administratorWhole siteSet up task templates and event rules, run the import, read everything on the site
Machine accountsNamed jobs onlyA 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 routeWho opens it
/shift/log, the shift logOperators and leads
/shift/handover, the handover report with sign-out and sign-inOutgoing and incoming leads
/shift/orders, standing orders to acknowledgeEveryone in the area
/shift/orders/issue, the issuer's pageThe standing-order issuer
/shift/admin, task templates, event rules and importThe log administrator
/shift/field, the offline phone viewOperators 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

KPIDefinition
Handover on-time sign-off rateHandovers accepted within N minutes of shift end ÷ handovers
Open carry-forward itemsCount and age of carried items by area
Standing order ack complianceAcknowledged ÷ required acknowledgements before the effective date
A hand count on a synthetic seedFourteen seeded log entries: five open, two monitoring and seven closed. Four are carry-forward items not yet closed, three open and one monitoring. One of three handovers was accepted on time, and six of nine people acknowledged the standing order before it took effect. 1234567891011121314Open: 5Monitoring: 2Closed: 7Carry-forward: 43 open and 1 monitoringwith carry_forward trueOn-time sign-off: 1 of 3accepted within 30 minutes1 ÷ 3 = 33%Acknowledged: 6 of 9before SO-0001 took effect6 ÷ 9 = 67%Fourteen log entries in the synthetic seed, and the three KPIs counted by hand.
A hand count on a synthetic seed. Fourteen log entries (five open, two monitoring, seven closed); four are carry-forward items still not closed, three open and one monitoring. One of three handovers was accepted on time. Six of nine people acknowledged the standing order before it took effect.

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.
Exercise · Predict an episode count, then replay it20 minutes

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

  1. IETF RFC 5545: Internet Calendaring and Scheduling Core Object Specification (iCalendar). https://www.rfc-editor.org/rfc/rfc5545
  2. Hexagon: j5 Shift Operations Management help. https://docs.hexagonppm.com/r/en-US/j5-Shift-Operations-Management-Help/Version-30/1046047
  3. NIST: Role-based access control project. https://csrc.nist.gov/projects/role-based-access-control
  4. 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
  5. 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

Choose one answer for each question, then submit. You will see the right answer and why for every question.

1. What is the main purpose of Shift Handover?
2. Which of these is outside Shift Handover and owned by another module or system?
3. Which standard does the module name for the alarm management principles behind its event rules?
4. Which is a log entry the analytics can count by equipment and category?
5. What are the allowed statuses of a log entry?
6. An entry is open and carry_forward is true when the shift ends. What happens?
7. Why is the auto-snapshot stored at sign-out and not recomputed when the handover is viewed?
8. Who signs a handover, and in what order?
9. A handover is signed out but nobody accepts it within N minutes. What does the module do?
10. Six of nine required people acknowledged a standing order before it took effect. What is the acknowledgement compliance?
11. A rule on a tag fires, clears, and fires again inside its dedupe window. What should the module do?
12. How is history from the old shift log imported?