Chapter 1 · Purpose, scope and standards
From paper to a governed record
A paper form is a sheet. A governed digital record is a sheet that also knows who filled it in, when, on which version of the form, with what evidence, and what happened next. This chapter says what Paper to Glass builds, what it leaves to other modules, and which standards it is measured against.
20 min9 data-integrity attributes11 capabilities3 tiers: MVP, STD, BIC
By the end of this chapter you can
- Say what a governed digital record is and which paper documents Paper to Glass replaces.
- Place a form in one of the nine categories and say which neighbouring module owns what this one leaves out.
- Name the five standards the module is built against and the nine ALCOA+ attributes, and say where in the module each is met.
What Paper to Glass does
Paper to Glass converts any paper form, checklist, round or inspection into a governed digital record. The record can be filled in on the floor with no signal, scored, signed, trended, and turned into follow-up work: a work request, a nonconformance report or an observation. It replaces the mobile forms and inspection tools a business usually pays for, such as SafetyCulture (iAuditor) [7] and GoFormz [6]. The module specification also names Fulcrum, GoCanvas, ProntoForms, Jotform, Operations1 and Microsoft Forms with Power Apps as tools it replaces.
It is also the first spoke on the platform's hub, and the engine that later modules reuse for their own data capture. A form built here is not a special case: the same designer, versions, offline queue and typed answers carry the work of the modules that come after.
The nine categories
Every template carries one category. Choosing it is the first act of the first lab, and it decides who acts on the form.
| Category | What it is | A typical example |
|---|---|---|
| inspection | A look at a thing against a standard, with pass or fail | Pre-start check of a machine |
| checklist | Steps or items to tick off in order | Shift start-up list |
| round | The same points visited on a route, on a rhythm | Reading eight gauges every shift |
| audit | A scored review of a process or area | A 5S walk of a cell |
| permit | Permission to do risky work, with conditions and sign-off | Hot-work permit |
| log | A running record of events, one entry at a time | Visitor or delivery log |
| survey | Questions to people, not checks of things | Operator feedback after a trial |
| record | A single event written down once | A calibration record |
| other | Anything that fits none of the above | A one-off site walk |
What is in, and what is not
The module is wide enough to replace the tools above and narrow enough to leave documents, step-enforced production and statistical charts to the modules built for them.
- In: form designer with versioning and a template library; AI-assisted ingestion of scanned and PDF paper forms with human review; scheduled and ad-hoc execution; offline-first mobile capture with photo, signature, GPS and barcode evidence; scoring, failed-item actions, routing and approvals; field-to-table mapping so a submission can create records in other modules.
- Out: controlled SOP authoring and approval (M06 Document Control); step-enforced production execution with material verification (M04 MES); SPC charting of numeric results (M09 consumes form results).
Eleven capabilities in three tiers
The capability map lists what the module does, and each capability carries a tier. MVP must exist for a small or mid-size plant to cancel the incumbent subscription with confidence. STD is parity with mainstream tools, what a buyer expects in a demo. BIC marks best-in-class differences, such as those made possible by AI and by the shared spine. MVP and STD are required for the course; BIC is advanced work.
| Capability | What it does | Tier |
|---|---|---|
| Form designer | Fields: text, number with unit and limits, choices, date and time, photo with markup, signature, barcode or QR, GPS, file, table, calculated; sections, repeating groups, scoring weights | MVP |
| Conditional logic | Show, hide or require by answer; follow-up questions on a fail; totals; cross-field validation | MVP |
| Versioning and library | Draft, published, retired; published versions immutable; submissions pinned to the version used; JSON import and export | MVP |
| Offline-first execution | Local queue, auto-save, conflict-free sync, device ID and capture times kept | MVP |
| Evidence and signatures | Photos per question, annotation, GPS stamp, e-signature with meaning | MVP |
| Assignment and scheduling | To a role, person, equipment or location; RRULE recurrence; due windows, grace, escalation; QR on the asset | STD |
| Failed-item actions | A failed or out-of-limit answer creates an action item, work request, NCR or observation, with a back-link | STD |
| Review and approval | Supervisor queue, reject with comment, multi-step approval | STD |
| Records and reporting | Immutable submission, branded PDF, completion and overdue dashboards, failure hot-spots, score trends | STD |
| Paper ingestion (AI) | Upload a PDF or photo; AI proposes fields; a reviewer accepts or edits each one; provenance kept | BIC |
| Integration mapping | Map form fields to other modules' tables; webhooks and an event outbox on submit | BIC |
The standards, and what each one is used for
| Standard | Used in this module for |
|---|---|
| 21 CFR Part 11 / EU GMP Annex 11 [2] | Electronic records and signatures, when a form is a regulated (GxP) record |
| ALCOA+ data integrity (FDA 2018 guidance; MHRA GXP Data Integrity 2018) [3][4] | Nine attributes a record must show; the test for every design choice in this course |
| ISO 9001:2015 clause 7.5 [1] | Control of documented information: a template version is documented information |
| RFC 5545 (iCalendar RRULE) | Recurrence rules for scheduled rounds and inspections (chapter 3) |
| W3C WCAG 2.2 AA [5] | Accessibility of the capture screen: gloves, glare, large targets |
ALCOA stands for Attributable, Legible, Contemporaneous, Original and Accurate. The plus adds Complete, Consistent, Enduring and Available. They are easy to recite and hard to meet with paper, because a sheet cannot show who changed a number or when. Each one becomes a design decision in a digital record.
| Attribute | In plain words | Where the module meets it |
|---|---|---|
| Attributable | Who did it, and when | created_by, submitted_by, signature with meaning |
| Legible | Readable and permanent | Typed fields, branded PDF render |
| Contemporaneous | Recorded at the time | Capture timestamps on each answer |
| Original | The first capture, or a certified true copy | Immutable submission; original photos kept |
| Accurate | Correct and free of error | Validation rules, limits, out_of_limit flag |
| Complete | Nothing missing | Required fields; skipped items only through logic |
| Consistent | Same order, same clock | Submission pinned to a version; server clock |
| Enduring | Lasts as long as it is needed | archived_at, never delete |
| Available | Can be found and read when needed | Search, dashboards, PDF |
Knowledge check
A hot-work form needs a supervisor's signature before the work can start. Which category fits best?
Knowledge check
Which of these does Paper to Glass leave to another module?
References
- ISO 9001:2015 Quality management systems: requirements (clause 7.5, documented information). https://www.iso.org/standard/62085.html
- 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
- MHRA: Guidance on GxP data integrity (2018). https://www.gov.uk/government/publications/guidance-on-gxp-data-integrity
- W3C: Web Content Accessibility Guidelines (WCAG) 2.2. https://www.w3.org/TR/WCAG22/
- GoFormz: mobile inspection management. https://goformz.com/use-cases/inspections
- Microsoft Store: SafetyCulture (iAuditor) feature list. https://apps.microsoft.com/detail/9nblggh5flq2
Chapter 2 · The data model
Templates, versions and typed answers
How a form is stored decides what you can ever do with it. Eight tables hold the design, the schedule, the answers and the follow-up. Three rules keep the record honest: a published version never changes, every answer is a typed row, and the record time is the server's.
25 min8 tables3 statuses of a template3 pitfalls
By the end of this chapter you can
- Name the eight frm_ tables and say what each one holds.
- Explain why a published version is immutable and how a submission stays pinned to it.
- Say why answers are typed rows and not one JSON blob, and why the server's clock is the record time.
Eight 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 has no people table, site list or file store of its own: it points at core_person, core_site, core_job_role, core_uom, core_data_tag, core_attachment and core_e_signature. Its own tables share the prefix frm_.
The table below is the full definition: every column the module adds to the standard ones, with its type and whether it is required (marked req). Types are written as in the specification: text, int, num (a decimal number), bool, ts (a timestamp with time zone), uuid and json (jsonb in Postgres); an arrow means a foreign key to that table. It is what your agent builds from in Session 2.
| Table | Holds | Columns: type, req = required |
|---|---|---|
| frm_template | The form's header | code text req, unique per tenant; name text req; category text req, one of the nine in chapter 1; owner_id → core_person; site_id → core_site; current_version_id uuid; status text req: draft, published or retired |
| frm_template_version | One version of the form: field schema, logic and scoring as JSON. A draft while published_at is empty; read-only once it is set | template_id → frm_template req; version_no int req; schema json req; logic json; scoring json; published_at ts; published_by → core_person; change_note text; source_ingestion_id uuid |
| frm_field | A normalised copy of each field, for analytics, SPC links and limits | template_version_id → frm_template_version req; field_key text req; label text req; field_type text req, one of the fourteen types below; required bool req; uom_id → core_uom; lsl num; usl num; options json; sort_order int; data_tag_id → core_data_tag |
| frm_assignment | A recurring or one-off assignment of a template to a target | template_id → frm_template req; target_type text req: equipment, location, area, person, role or site; target_id uuid; assignee_person_id → core_person; assignee_role_id → core_job_role; rrule text; due_window_min int; grace_min int; active bool req; next_due_at ts |
| frm_submission | One execution of a template version | submission_no text req, unique per tenant; template_version_id → frm_template_version req; assignment_id → frm_assignment; subject_type text; subject_id uuid; status text req, one of the six below; started_at ts req; submitted_at ts; submitted_by → core_person; score num; max_score num; geo json; device_id text; captured_offline bool; signature_id → core_e_signature |
| frm_response | One answer, typed into value columns | submission_id → frm_submission req; field_key text req; value_text text; value_num num; value_bool bool; value_ts ts; value_json json; out_of_limit bool; failed bool; answered_at ts; attachment_id → core_attachment |
| frm_triggered_action | A downstream record created from a failed or flagged answer | submission_id → frm_submission req; field_key text; action_type text req: action_item, work_request, ncr, observation, notification or webhook; target_module text; target_record_id uuid; status text req: pending, created or failed |
| frm_ingestion_job | Paper-to-digital AI ingestion with human review | source_attachment_id → core_attachment req; status text req: queued, extracting, in_review, approved, rejected or failed; extracted json; mean_confidence num; reviewer_id → core_person; reviewed_at ts; resulting_version_id → frm_template_version |
subject_type and subject_id on a submission name the thing the form was filled in about (a machine, a room, a vehicle), which is what lets the failure Pareto group by asset. geo holds the GPS stamp when one is taken, and sort_order keeps a version's fields in the order they are asked.
Look at the allowed values before you design anything. A template's category is one of the nine in chapter 1 and its status is draft, published or retired. A field's type is one of text, number, choice, multi_choice, date, datetime, photo, signature, barcode, gps, file, table, calculated or section. A target is an equipment, location, area, person, role or site. A submission moves through in_progress, submitted, in_review, approved, rejected or void.
Versions: a published form never changes
Two things carry a status here, and they are easy to mix up. The template header, frm_template, has the status draft, published or retired: whether the form as a whole is still being built, in use, or no longer used. Each version is a row in frm_template_version, with the schema, logic and scoring stored as JSON [3], and its state is read from published_at.
A draft version is a row whose published_at is empty. Anyone with the right role can edit it, and its frm_field rows point at it while the form is being built. Publishing sets published_at and published_by, and from then on that row and its fields are read-only. A change to a published form is a new version row (version_no plus one, a draft again) with a change note, and frm_template.current_version_id moves to it when it is published. Old published versions stay exactly as they were, never edited or deleted.
Every submission records the version it was filled in on. A month later, when someone asks what question 7 said on the day of a failed inspection, the answer is in the pinned version, not in whatever the form looks like now. ISO 9001 asks for exactly this control of documented information: a template version is documented information, and a record shows which version was in use [1].
Answers: one typed row each
When a form is submitted, each answer becomes a row in frm_response with the field key and a value in the column that matches its type: value_num for a pressure, value_bool for a yes or no, value_ts for a date and time, value_text for words, and value_json for the rest (a table, a multi-choice). Two flags are set as the answer arrives: out_of_limit, when a number falls outside the field's limits (lsl and usl on frm_field), and failed, when a scored or pass-fail item fails.
Time: the server is the record clock
A phone's clock can be wrong, set by hand, or changed after the fact. The record time therefore comes from the server's clock when the submission is received, and the device's capture times are kept separately beside it, together with device_id and the captured_offline flag. Both are needed: the server time says when the record became part of the system, and the device time says when the person actually answered. That is the contemporaneous attribute of ALCOA+ [4]. Timestamps should be written in a standard, unambiguous form such as RFC 3339 [5].
You need: One filled-in paper form from your business, the standard columns list from this chapter, and your AI coding agent
Use the form you chose in Session 1. Work on paper or in a text file first; the agent comes in at step 5.
Outcome: A one-page field list for a real form, with types, limits and evidence marked, and a sample set of typed rows your agent generated and you checked.
Knowledge check
Why does every submission store the version of the template it was filled in on?
Knowledge check
A form was completed offline at 06:00 and synced at 09:30. What should the record keep?
References
- ISO 9001:2015 Quality management systems: requirements (clause 7.5, documented information). https://www.iso.org/standard/62085.html
- eCFR: Title 21, Part 11, Electronic records; electronic signatures. https://www.ecfr.gov/current/title-21/chapter-I/subchapter-A/part-11
- IETF RFC 8259: The JavaScript Object Notation (JSON) Data Interchange Format. https://www.rfc-editor.org/rfc/rfc8259
- MHRA: Guidance on GxP data integrity (2018). https://www.gov.uk/government/publications/guidance-on-gxp-data-integrity
- IETF RFC 3339: Date and Time on the Internet: Timestamps. https://www.rfc-editor.org/rfc/rfc3339
Chapter 3 · On the floor
Capture, assign and act
A form earns its place on the floor: with gloves on, in glare, with no signal. This chapter follows a submission from its schedule to a phone, through the offline queue, and out the other side as a signed record and a piece of follow-up work.
30 min6 submission statuses6 action types50 queued submissions to test
By the end of this chapter you can
- Describe how an assignment, a recurrence rule, a due window and a grace period decide what is due and overdue.
- Explain how an offline submission is queued, synced without loss and kept from duplicating.
- Trace a failed answer to a linked record in another module and a submission through review to approval.
Assigning a form to a target
An assignment links a template to a target: an equipment, location, area, person, role or site. It has an assignee (a person or a job role), a recurrence rule, a due window and a grace period, and the next time it is due. A QR code on the asset opens the right form for that asset in one scan, which is how a round of the same eight gauges stays a round and not a search through a folder.
The recurrence rule is a line of text in the iCalendar standard, RFC 5545 [1]. Two examples: FREQ=DAILY is every day, and FREQ=WEEKLY;BYDAY=MO,WE,FR is every Monday, Wednesday and Friday. The rule is read with a start date and time to give the series of due times; the module stores the next one in next_due_at.
Offline-first capture
A plant has dead spots, and a form that needs a signal fails exactly where it matters. Offline-first means the phone holds everything it needs to run the form (the published version, the lists, the limits), saves each answer as it is entered, and puts a finished submission in a local queue. When a connection returns, the queue is sent.
- Auto-save so a locked screen or a dead battery loses nothing already entered.
- A local queue that survives the app being closed, and shows the person how many submissions are waiting.
- Conflict-free sync: each submission is created on the phone with its own id, so 50 queued submissions are 50 separate records and none can overwrite another. Sending the same submission twice must not create two.
- Device ID and capture times preserved, with
captured_offlineset, and the server's clock as the record time (chapter 2).
Evidence and signatures
Each question can carry evidence: a photo with markup, a GPS stamp, a scanned barcode, a file. The signature is an e-signature stored through core_e_signature and linked from the submission, and it carries a meaning: the reason the person is signing, such as "performed" or "approved". A regulated record needs the meaning, the person and the time to be part of the signed record [3][4].
A failed answer starts work
A failed or out-of-limit answer is not the end of a record. It can create a record in another module and link back to it. Each such record is a row in frm_triggered_action with an action type, the target module and the new record's id, and a status of pending, created or failed.
| action_type | What it creates | Owning module |
|---|---|---|
| action_item | A task with an owner and a due date | Core (core_action_item) |
| work_request | A request for maintenance | M05 |
| ncr | A nonconformance report | M08 |
| observation | A recorded observation, such as a safety observation | M11 |
| notification | A message to a person or role | No owner named |
| webhook | A call to an outside system | No owner named |
The six action types and the modules M05, M08 and M11 come from the module specification. The one-line meanings are this course's plain wording, and the specification names no owner for notification or webhook, so none is claimed here.
The status matters: pending is waiting to be made, created means the target record exists and its id is stored, failed means it could not be made and a person must be told. Never let a failed action pass silently; an unrouted failed answer is the same as a form nobody read.
Review and approval
After submission, a supervisor sees the form in a review queue. They can approve it or reject it with a comment, and a form can have more than one approval step. The submission's status says where it is: submitted, in_review, approved, rejected, or void. Review is a design choice: a daily pre-start check might need none, a permit must have it.
Events the module sends and receives
The module publishes frm.submission.submitted, frm.submission.approved, frm.response.failed and frm.assignment.overdue. It consumes mes.operation_run.started (so launching a production run can open the line checks) and cmms.work_order.completed (so finishing a repair can open a post-maintenance inspection). Field-to-table mapping, webhooks and the event outbox make these links without code in the form itself. In this course's sessions only frm.assignment.overdue is built as required work (Session 4); the other three events, the field-to-table mapping and the webhooks belong to integration mapping, a BIC capability, and are an optional extension step in Session 4.
You need: A phone with your built form open, a second device or the database, and a way to put the phone in airplane mode
Use the form you modelled in chapter 2 and the build from Session 3 or 4. Use synthetic data only; do not use a real person's name or real equipment tags.
Outcome: Three offline submissions arrive once each with both clocks kept; the failed answer has a linked record; one submission is approved and one rejected with a comment.
Knowledge check
A phone sends the same queued submission twice because the first confirmation was lost. What must happen?
Knowledge check
An item is due at 06:00 with a 60-minute due window and a 15-minute grace period. When does the grace period run out?
References
- IETF RFC 5545: Internet Calendaring and Scheduling Core Object Specification (iCalendar). https://www.rfc-editor.org/rfc/rfc5545
- W3C: Web Content Accessibility Guidelines (WCAG) 2.2. https://www.w3.org/TR/WCAG22/
- eCFR: Title 21, Part 11, Electronic records; electronic signatures. https://www.ecfr.gov/current/title-21/chapter-I/subchapter-A/part-11
- European Commission: EudraLex Volume 4, EU GMP guidelines (includes Annex 11, computerised systems). https://health.ec.europa.eu/medicinal-products/eudralex/eudralex-volume-4_en
- GoFormz: mobile inspection management. https://goformz.com/use-cases/inspections
Chapter 4 · From the old sheet to the new record
Ingest, measure and cut over
Most forms already exist on paper or in an old tool. This chapter covers reading a paper form with AI under human review, measuring whether the module is working, moving history across, and the four tests that say the module is done.
25 minAI proposes, a person decides5 KPIs4 definition-of-done tests
By the end of this chapter you can
- Describe paper ingestion as a job with a human review step, and say what is stored as provenance.
- Define the five KPIs and check a dashboard against a hand count.
- Plan a migration from an incumbent tool and state the four tests that mean the module is done.
Paper ingestion with a person in the loop
Typing a hundred paper forms into a designer is slow work. Paper ingestion lets a person upload a PDF or a photo of a paper form; AI proposes the fields, their types, limits and layout; and a reviewer accepts or edits each field one by one. Nothing the AI proposes becomes a live form until a person has reviewed it.
| Job status | Meaning |
|---|---|
| queued | Uploaded and waiting |
| extracting | The AI is reading the file and proposing fields |
| in_review | A reviewer is accepting or editing each proposed field |
| approved | Reviewed; a version was created from it |
| rejected | A reviewer decided the proposal was not usable |
| failed | The job itself could not be completed |
The job stores the file it came from (source_attachment_id), the proposal (extracted, as JSON), an average confidence (mean_confidence), who reviewed it and when, and the version it produced. The version also records source_ingestion_id. This is the provenance: anyone can later see which fields came from the machine, which a person changed, and who approved them, which is the attributable attribute again [5]. The proposal itself is also recorded as an AI suggestion in core_ai_suggestion.
Measuring whether it works
Five KPIs come with the module. Each has a definition that can be counted from the tables in chapter 2, so a dashboard can be checked against a hand count.
| KPI | Definition | Counted from |
|---|---|---|
| Completion rate | Submitted on time ÷ scheduled in the period | frm_assignment, frm_submission |
| Overdue count and ageing | Assignments past their due window, by area and assignee (the specification's definition; this course escalates only after the grace period as well, chapter 3) | frm_assignment, next_due_at |
| First-pass pass rate | Submissions with zero failed items ÷ submissions | frm_submission, frm_response.failed |
| Failure Pareto | Failed answers by question, asset and area | frm_response, subject_id |
| Paper ingestion acceptance | AI-proposed fields accepted without edit ÷ proposed | frm_ingestion_job.extracted |
The lab seeds synthetic submissions on purpose. If the dashboard says 75% and your hand count of the seed says 75%, the dashboard is right for that data; if it differs, the definition in the query is wrong or the rule for "on time" from chapter 3 was not applied the same way. A KPI nobody can reproduce by hand is a number nobody should trust.
Moving off the old tool
Per the module specification, SafetyCulture, GoFormz and Fulcrum all offer CSV or API export of templates and submissions. That is the specification's statement, not something the product pages cited here confirm, so check what your own tool gives you on the vendor's own page before you plan. The migration rule is the same as for versions in chapter 2: templates import as draft versions, for a person to review and publish, and historical submissions import as read-only archived records. They are evidence of what happened, so they must never be editable and never counted as new work.
- Export templates and submissions from the incumbent and keep the files untouched as the original.
- Map each template to a draft frm_template with a version; review and publish the ones still in use.
- Load historical submissions as archived, read-only rows, with the original dates kept and a note of which tool they came from.
- Run both systems side by side for a short, fixed period on a few forms, then move form by form.
- Cancel a subscription only after the export is safe and the replacement has passed its tests. Read the incumbent's contract for the notice period before relying on a date.
Done means testable
The definition of done is four tests an agent can run, and you should run them yourself.
- A form designed in the builder can be executed offline on a phone and syncs with zero data loss across 50 queued submissions.
- A published version cannot be modified, enforced by the database.
- A failed answer creates a linked record in another installed module.
- The completion and overdue dashboards match a hand count on seeded data.
You need: A scan or photo of one blank paper form, your ingestion screen, and the person who fills the form in
Use a blank form with no names, signatures or personal details on it. Check with your supervisor that you may upload it.
Outcome: A draft version created from a paper form after a person reviewed every field, with an acceptance figure from your own count and a published version you could not edit.
Knowledge check
The AI has proposed a number field with no upper limit. What should the reviewer do?
Knowledge check
How should a historical submission from the old tool be imported?
References
- GoFormz: mobile inspection management. https://goformz.com/use-cases/inspections
- Microsoft Store: SafetyCulture (iAuditor) feature list. https://apps.microsoft.com/detail/9nblggh5flq2
- Clappia: GoFormz alternatives. https://www.clappia.com/blog/top-goformz-alternatives
- Guideflow: best digital checklist software. https://www.guideflow.com/blog/digital-checklist-software
- 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
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
Paper to Glass: Digital Forms, Checklists and Inspections as Governed Records
Element M01 complete · Learner
Your LMS records this completion. For the CivOps Foundation certificate, finish the Foundation Course at https://civops.io/learn.