The Checker — fieldflo-video-gap
Task: Omar, 2026-09-26 20:09 UTC — "get the checker to watch the video of the demo of the other company and make sure that everything they can do we can do as well." One grade. No worker, no rounds.
The recording: media/competitor/fieldflo_demo_43min_2026-09-20.mp4 — 43:24.97,
1280×720, h264, 30 fps (measured: ffmpeg-full -i … -f null -). Fieldflo's Dan Szigeti
screen-sharing portal.fieldflo.com/demo-sales/ to the owner/the owner and Mark Chambers,
2026-09-08. Transcript profile/Fieldflo_Call_Transcript_2026-09-08.txt (512 lines) read
in full before Part 1 was written.
How it was watched. The ffmpeg at ~/.local/bin/ffmpeg is the Playwright build
(--disable-everything, no mp4 demuxer, no h264 decoder) and cannot open this file
— it errors Invalid data found when processing input. There is no ffprobe on the box.
A static ffmpeg 7.0.2 already sat in hive/checks/2026-09-26_fieldflo-video-gap_venv/bin/ ffmpeg-full; that is what cut the frames.
178 frames were cut into hive/checks/2026-09-26_fieldflo-video-gap_frames/, named
f_MMSS.jpg: a 20-second grid across the whole 43 minutes (131 frames, 0 s → 2600 s) plus
70 extra cuts at seconds where the transcript says a new screen opened (the timestamp
list is _frames/_times.txt; 178 unique after the grid/extras overlap). All 178 were
opened and read with my own eyes — no sampling. 166 of the 178 are distinct images; the
12 repeats are genuinely static screens (the dashboard sat unchanged for stretches), which
I confirmed by re-cutting 20 s / 80 s / 140 s independently and getting the same md5.
hive/checks/2026-09-26_fieldflo-video-gap_venv/bin/ffmpeg-full \
-hide_banner -loglevel error -ss <s> -i media/competitor/fieldflo_demo_43min_2026-09-20.mp4 \
-frames:v 1 -q:v 3 -y hive/checks/2026-09-26_fieldflo-video-gap_frames/f_MMSS.jpg
$ ls hive/checks/2026-09-26_fieldflo-video-gap_frames/*.jpg | wc -l
178
$ md5sum hive/checks/2026-09-26_fieldflo-video-gap_frames/*.jpg | awk '{print $1}' | sort -u | wc -l
166
Parts 1, 2 and 3 of this file were written before profile/Fieldflo_Call_Gap_Analysis_ 2026-09-20.md, profile/Fieldflo_Video_Frames_2026-09-20.md or profile/Master_List_ 2026-09-16.md were opened. I did not read them, and I did not read any earlier
hive/checks/ file, while grading Parts 1–3. Part 4 is the only place they appear.
Everything below is demo data on both sides. Fieldflo's screen is its own sales demo
(/demo-sales/); Makki's portal carries a DEMO DATA band on every page and says so.
Part 2 evidence — how the Makki portal was measured
Three things, all read-only, all re-runnable from
(workspace root):
(A) The grep target is the live app, not a stale copy. Every portal JS file on disk is
byte-identical to what https://makki-home.pages.dev/app/ serves, so a grep of
portal/*.js is a measurement of the live site. .bak_* files are excluded from every
grep in this report.
$ bash hive/checks/2026-09-26_fieldflo-video-gap_bytes.sh
SAME app.js 71a2de55cd2c87de0a44a5247fc7f057
SAME roles.js 441582b11c7450144f0cbe1381a2af46
SAME forms.js 4504c8f6a1e6acfc50e8c2055fd912fc
SAME certs.js 5cfd97e0b08665532263ea0e1efd5c74
SAME app-ops.js · app-ops2.js · app-day.js · app-job.js · app-people.js
SAME app-yard.js · app-forms.js · app-map.js · app-notify.js · app-import.js
SAME index.html (served at /app/) 5cf235ae41b8fc753746ce2f7141bc3c
(B) The five demo logins were driven on the live site (Playwright, the
skills/visual-qa/.venv runtime), every tab opened, the page's own text read back.
52 PNGs in hive/checks/2026-09-26_fieldflo-video-gap_shots/.
$ skills/visual-qa/.venv/bin/python hive/checks/2026-09-26_fieldflo-video-gap_live.py
== ali == tabs(16): overview·pipeline·proposals·jobs·projects·board·gantt·collections·
payroll·quickbooks·team·tickets·safety·forms·equipment·inventory
== priya == tabs(4): overview·outstanding·toinvoice·payments
== ray == tabs(5): overview·quotes·winrate·proposals·bidactual
== sam == tabs(11): overview·startday·myjobs·schedule·board·gantt·crewcerts·safety·
forms·equipment·materials
== dale == tabs(5): today·endofday·myschedule·mytickets·forms
== scan MK-W07 (no login) == Ivy Salcedo | Abatement Tech · Crew C | MK-W07 |
All tickets in date | TICKETS HELD | Asbestos Worker … | Respirator Fit Test …
$ skills/visual-qa/.venv/bin/python hive/checks/2026-09-26_fieldflo-video-gap_owner.py
ali/overview: Owner / Company Overview / What is running today · then the money
ali/pipeline: Sales Pipeline / Quotes sent vs won · fiscal 2026
ali/proposals: Proposals / 603 quotes this year
ali/jobs: Jobs & P&L / Every won job with full cost breakdown
ali/projects: Project Book / 17 jobs with a book · permits, required tickets, crew readiness
ali/board: Schedule Board / Week of Mon 17 Aug · click a day to move a crew
ali/gantt: Timeline / 16 open jobs · read-only
ali/collections: Collections & AR / Money owed to the company · oldest first
ali/payroll: Payroll Approval / Week of Mon 17 Aug · 12 men · 404 h
ali/quickbooks: QuickBooks Online / the owner's accounting system · not connected
ali/team: Team & Access / 5 people · add someone by email and pick their role
ali/tickets: Tickets & Certificates / 14 men · 54 tickets on file · warned before they lapse
ali/safety: Safety & Incidents / 3 incidents · 3 corrective actions open
ali/forms: Forms / Build the forms the crews fill on site, and read what comes back
ali/equipment: Equipment & Rentals / 12 assets · 3 on rent · a code on every one
ali/inventory: Inventory / Disposal consumables on hand (bags, coveralls)
(C) A per-capability grep of the current portal source.
$ bash hive/checks/2026-09-26_fieldflo-video-gap_probe.sh
In Part 2, probe N means row N of that script, live means (B), and a bare
grep … is a one-off run quoted inline.
The owner's rails, named where they apply. Two standing rules make some Fieldflo behaviour out of scope rather than missing:
- RULE #1 (nothing sends). Nothing in the hive sends, publishes or contacts anyone without Omar's explicit OK — no email, SMS, call or post to customers, suppliers, inspectors or employees. Drafts are produced; the owner sends.
- Mock-data rule (#7). Every figure is demo until Omar says the real data is connected, so live third-party integrations (QuickBooks, an SMS gateway, a weather API) are settings pages, not connections.
A row marked Out on rail is something the portal deliberately does not do because of one of those two. It is not a gap, but it is a difference the owner will notice, so each one names its rail.
Part 1 — everything Fieldflo showed on screen or said it does
| # | mm:ss | Capability | Seen on screen or said | Frame file |
|---|---|---|---|---|
| 1 | 00:00 | Left nav: Dashboard | Seen | f_0000.jpg |
| 2 | 00:00 | Left nav: CRM | Seen | f_0000.jpg |
| 3 | 00:00 | Left nav: Projects | Seen | f_0000.jpg |
| 4 | 00:00 | Left nav: Admin (Email Templates · Email Groups · Email Log · Form Builder · Export Builder · Imports · Form Sequencer · Portal Admin · Timesheet Adjuster · Reporting Center · Weekly Timesheet) | Seen | f_2100.jpg |
| 5 | 00:00 | Left nav: Payroll (Payroll Approval · Payroll Exports) | Seen | f_3800.jpg |
| 6 | 00:00 | Left nav: Company | Seen | f_0000.jpg |
| 7 | 00:00 | Left nav: Employees | Seen | f_0000.jpg |
| 8 | 00:00 | Left nav: Messages | Seen | f_0000.jpg |
| 9 | 00:00 | Left nav: Certification (Certificates · Trainings · Bulk Deployment) | Seen | f_1720.jpg |
| 10 | 00:00 | Left nav: Inventory | Seen | f_0000.jpg |
| 11 | 00:00 | Left nav: Warehouse | Seen | f_0000.jpg |
| 12 | 00:00 | Left nav: Scheduling (Settings · Week · Reports · Gantt Chart · 4 Week Look Ahead) | Seen | f_3700.jpg |
| 13 | 33:40 | Left nav: "Submit a Feature idea & Learn what's New!" | Seen | f_3420.jpg |
| 14 | 00:00 | Dashboard split into four tabs: CRM · Projects · Safety · Equipment | Seen | f_0000.jpg |
| 15 | 03:45 | Widget — Today's Active Projects, with each crew's faces and a Roll Call link | Seen | f_0000.jpg |
| 16 | 05:00 | Widget — Nearing Bid Hours, a ring per job (67% / 70% / 131%) | Seen | f_0000.jpg |
| 17 | 05:20 | Widget — Certificates Expiring Soon, days left per man | Seen | f_0000.jpg |
| 18 | 05:31 | Widget — Employees Nearing Over Time, "comes to life at 32 hours" | Seen + said | f_0000.jpg |
| 19 | 05:31 | Widget — New Projects, with start / end date | Seen | f_0000.jpg |
| 20 | 05:31 | Widget — T&M · Change Orders Needed | Seen | f_0000.jpg |
| 21 | 06:10 | Widget — Messages (a company broadcast on the dashboard) | Seen | f_0531.jpg |
| 22 | 05:50 | Widget — Forms audit: Available forms · Intervals · Form Status · Project Status, across every job at once | Seen + said | f_0550.jpg |
| 23 | 06:30 | Widget — Job Sites map with pins and "See my projects" | Seen | f_0540.jpg |
| 24 | 06:45 | Stat tiles — $17,724,733.33 contracts in progress · 34 days without injury · 875 active employees · 254 clients · 108 users | Seen | f_0620.jpg |
| 25 | 02:37 | Any language: the whole UI translated (Panel / Proyectos / Empleados …) via a Google Translate widget | Seen | f_0306.jpg |
| 26 | 25:20 | A globe (translate) control on a form row and in a form header | Seen | f_0434.jpg |
| 27 | 02:37 | White-label: "wherever you see Fieldflo, imagine your logo and branding" | Said | f_0237.jpg |
| 28 | 03:25 | Roles & permissions per person — ~120 switches in 14 groups (Projects, Job Costing, Estimates, CRM, Certificates, Admin, Timesheet, Payroll Approval, Warehouse, OSHA, Inventory, Reporting Center, Scheduling, Document System) | Seen | f_0852.jpg, f_0920.jpg |
| 29 | 08:30 | Role Profiles — saved permission presets | Seen | f_0920.jpg |
| 30 | 03:25 | Daily labour verify their time and safety without ever logging in | Said | f_0325.jpg |
| 31 | 03:45 | Real time — a project appears on the dashboard the moment the foreman clocks his crew in (Todays Crew Size 0 → 2 → 0) | Seen + said | f_2745.jpg, f_3220.jpg |
| 32 | 04:34 | Job templates — "for this job type these dailies are mandatory" | Said | f_0434.jpg |
| 33 | 04:57 | Form builder — Fieldflo digitises and hard-codes your own forms | Said | f_2100.jpg |
| 34 | 05:00 | Bid vs actual + remaining per cost code / labour type, in real time | Said | f_0500.jpg |
| 35 | 05:20 | Certs tracked, with several different ways of warning before expiry | Said | f_0520.jpg |
| 36 | 05:31 | Time & materials and change orders on a job | Said | f_0531.jpg |
| 37 | 05:50 | Audit every safety meeting / form across every branch for a month in one sweep | Said | f_0550.jpg |
| 38 | 06:10 | Messages — deploy a message to the whole crew or whole company, by text or email | Said | f_0610.jpg |
| 39 | 07:00 | Safety dashboard — Monthly Incidents line chart (Incidents / Near Misses / Stop Works, 12 months) | Seen | f_0630.jpg |
| 40 | 07:00 | Safety tiles — Incidents 0/7, Near Miss 0/1, Stop Work 0/1, Injuries 0, each 30 days vs 12 months | Seen | f_0630.jpg |
| 41 | 07:00 | Injuries by Body Part diagram | Seen | f_0630.jpg |
| 42 | 07:00 | Safety dashboard filters: All Projects · Project Type · All Offices · Last 30 Days | Seen | f_0630.jpg |
| 43 | 07:10 | Incident reporting system that walks the whole claim — 11 steps, % complete (General Information, Injured Employee, Damaged Property, Damaged Equipment, Describe What Happened, Employee Statement, Witnesses, Third Party, Injury & Investigation Report, Insurance & OSHA, Report Review) | Seen | f_0640.jpg |
| 44 | 07:10 | Incident Reports Need Reviewed queue — percent complete and days since assigned | Seen | f_0645.jpg |
| 45 | 07:35 | Corrective Actions Assigned — per employee, days since assigned, stays until fixed | Seen + said | f_0645.jpg |
| 46 | 07:45 | OSHA Reporting — 300 Log / 300A Hours & Summary / 301 Incidents, filtered by year, period, establishment, projects | Seen | f_0710.jpg |
| 47 | 07:45 | OSHA downloads — "Download 300 / 301 csv", "Download 300 Log xlsx" | Seen | f_0710.jpg |
| 48 | 07:45 | OSHA classification per case (Death · Days away from work · Job transfer or restriction · Other recordable) and illness type (Skin Disorder · Respiratory · Poisoning · Hearing Loss · All Other) | Seen | f_0710.jpg |
| 49 | 07:20 | Inspection management — build your own inspections or use Fieldflo's | Said | f_0720.jpg |
| 50 | 07:50 | Equipment dashboard — Open Orders count | Seen | f_0720.jpg |
| 51 | 07:50 | Equipment Nearing Maintenance — type of maintenance, trigger miles/km/hrs, how overdue | Seen | f_0720.jpg |
| 52 | 07:50 | Equipment Corrective Actions — assigned to, days since assigned | Seen | f_0720.jpg |
| 53 | 07:50 | Equipment Inspections Log and Next Inspections Due | Seen | f_0720.jpg |
| 54 | 07:50 | Rentals — days left till renewal, renewal date, days on a job site | Seen | f_0735.jpg |
| 55 | 07:50 | Top 10 Project Inventory Costs, filtered by supervisor | Seen | f_0735.jpg |
| 56 | 07:50 | "Where are your vehicles, equipment and heavy equipment" — a live map with Rentals / Heavy Equipment toggles, search, Map/Satellite, clustered pins and per-asset popups | Seen | f_0735.jpg, f_0740.jpg |
| 57 | 07:55 | CRM dashboard — Reach Outs 10, Job Walks 25, Proposals Due 101 | Seen | f_0745.jpg |
| 58 | 07:55 | CRM — Leads by Salesperson, active-lead count each | Seen | f_0745.jpg |
| 59 | 07:55 | CRM value tiles — 89 open pending, 62 awarded, 4 loss, 67 proposals sent, 156 active leads, $1.21M pending, $1.32M awarded, $10,005 loss, $2.54M total lead value, $3.61M estimated contract value | Seen | f_0745.jpg |
| 60 | 08:20 | CRM leads list — 158 leads · $4.2m active pipeline, status pills, value, due/created, board / list / grid views, search, + New lead | Seen | f_3440.jpg |
| 61 | 08:20 | CRM tabs — Leads · Clients · Calendar | Seen | f_0800.jpg |
| 62 | 08:00 | Connect to QuickBooks — Owner: "Connect to QuickBooks." Dan: "Yes sir." | Said | f_0745.jpg |
| 63 | 12:38 | QuickBooks integration pulls employees across so there is no duplicate entry | Said | f_1238.jpg |
| 64 | 13:00 | CSV / file imports when there is no integration | Said | f_1300.jpg |
| 65 | 13:20 | Every page has the same two controls: three dots (admin customisation) and one big button (add) | Said + seen | f_1240.jpg |
| 66 | 08:14 | Give the accountant access to payroll and nothing else — Owner: "Okay. Wow." | Said | f_0852.jpg |
| 67 | 09:40 | Each employee gets their own approval by text: here is your time for the day and the week, were you injured, does it look right | Said | f_1000.jpg |
| 68 | 10:37 | Notifications — a Daily digest with ~28 switchable data points | Seen | f_1100.jpg |
| 69 | 10:55 | Daily digest twice a day when there is a night shift | Said | f_1100.jpg |
| 70 | 11:00 | Notifications — Instant (incidents, warehouse requests, disciplinary actions, overtime exceeded) | Seen | f_1130.jpg |
| 71 | 11:10 | The notification email carries your logo and only the data points you signed up for | Said | f_1200.jpg |
| 72 | 11:30 | Notification — cert close to expiry, with a link straight to that cert to put the new one in | Seen + said | f_1200.jpg |
| 73 | 11:30 | Notification — permit close to expiry | Said | f_1130.jpg |
| 74 | 11:30 | Notification — who is not doing the paperwork correctly | Said | f_1130.jpg |
| 75 | 12:00 | Notification — warehouse items pending order, anything low in inventory | Said | f_1130.jpg |
| 76 | 12:00 | Notification — scheduling conflict | Seen | f_1130.jpg |
| 77 | 11:40 | Certs archived and kept for 30 years | Said | f_1200.jpg |
| 78 | 13:00 | Employees list — Office filter, PIN column, Status, FloTime, search by name/ID/city/phone/union, + Add Employee | Seen | f_1240.jpg |
| 79 | 13:20 | Employees ⋯ menu — Skills · Positions · Union Skill Levels · Role Profiles · Incidents · Prevailing Wage / CP Classification · Export Employees (CSV) · Download QR Codes | Seen | f_1320.jpg |
| 80 | 13:40 | A unique QR code created for every employee the second they exist, with Download PDF | Seen | f_1340.jpg |
| 81 | 14:00 | The mic-drop: an inspector scans the hard hat and sees that man's live certificates — no login. Owner: "Oh that's great." | Seen + said | f_1420.jpg |
| 82 | 14:00 | The public scan page shows Need vs Have %, total active count, and per cert: status, taken on, expiration, days left | Seen | f_1420.jpg |
| 83 | 14:00 | Missing / expired certs are visible to the employee but can be hidden from the inspector by permission | Said | f_1420.jpg |
| 84 | 13:50 | Each cert name on the scan page opens the scanned certificate itself | Seen | f_1400.jpg |
| 85 | 14:30 | Employee emergency details | Said | f_1500.jpg |
| 86 | 14:30 | Training system — deploy trainings to the whole company, to divisions, at chosen times | Said | f_1500.jpg |
| 87 | 15:00 | Training lands on the employee's phone; they open it with a secret PIN; available in different languages | Said | f_1520.jpg |
| 88 | 15:00 | Trainings Needed page — training name, deploy status (Deployed–Email / Deployed–SMS / Enrolled), quiz status, "Go to training" link | Seen | f_1500.jpg |
| 89 | 15:10 | The training itself — video player plus the written course, per language | Seen | f_1520.jpg, f_1531.jpg |
| 90 | 15:31 | ~600 GotSafety videos droppable in at about $4 per employee per month | Said | f_1531.jpg |
| 91 | 15:40 | Quiz after the training — multiple choice, Back to Training / DONE | Seen | f_1540.jpg |
| 92 | 15:40 | Pass the quiz → a certificate with your logo, tracked and warned on like any other cert | Said | f_1545.jpg |
| 93 | 15:51 | Employee module — employee number, name, cell, temp-labour flag, typical cost code / position, office / division | Seen + said | f_1600.jpg |
| 94 | 16:20 | Skills on each employee (~60 incl. per-county and union skills) so dispatch filters instead of phoning round | Seen + said | f_1620.jpg |
| 95 | 16:40 | Training matrix — who has what certs and whether they have the right ones | Said | f_1640.jpg |
| 96 | 17:00 | Write-ups / disciplinary on an employee | Said | f_1700.jpg |
| 97 | 17:00 | Documents uploaded against an employee | Said | f_1700.jpg |
| 98 | 08:40 | Employee record — PIN #, "Cannot Pin for Others", "Timesheet SMS PIN Only" | Seen | f_0840.jpg |
| 99 | 08:40 | Employee record — Union Name, Union Code/ID, Company Employee ID, Employee ID | Seen | f_0840.jpg |
| 100 | 16:00 | Employee record — Pay Rate (masked), Social Security Number (masked), Payroll Group, Union Skill Level | Seen | f_1600.jpg |
| 101 | 08:40 | Employee record — Active / Super Admin / Can Login / Sales Person / Estimator / NoTime Access flags | Seen | f_0840.jpg |
| 102 | 08:40 | Employee drawer sections — Details · Certs · Incidents · Roles · Training Needed · Documents · Form Tagging · Emergency Details · Linked Assets | Seen | f_0840.jpg |
| 103 | 17:30 | Certificates page — + Add Certificate, cert names list, valid from, expiration, employee, photo of the cert uploaded | Seen + said | f_1720.jpg |
| 104 | 18:00 | Cert status filter — All Statuses / Active / Renew / Archived | Seen | f_1800.jpg |
| 105 | 18:20 | Renew a cert: the new one becomes active, the old one archived forever | Said | f_1820.jpg |
| 106 | 18:34 | Create a PDF pack of certificates to send to anybody | Seen + said | f_1834.jpg, f_1840.jpg |
| 107 | 17:30 | Certificates filter panel — first/last name, SS last 4, union code, cert name, labor type, status | Seen | f_1854.jpg |
| 108 | 19:01 | Inventory — item no/name, current location, category, inspected on, next inspection due, min/max, on hand/qty, photo per item | Seen | f_1920.jpg |
| 109 | 19:30 | A QR code on each asset — the operator scans it and does an inspection without logging into Fieldflo | Seen + said | f_1940.jpg |
| 110 | 19:30 | The asset scan can also show an SDS on a chemical, or anything else you choose | Said | f_1940.jpg |
| 111 | 19:30 | Item record — Asset Tag, Category, Asset Class, Yard/Aisle location, Add To Employee, Allow Quick Transfer, Re-Order Restricted | Seen | f_1940.jpg |
| 112 | 19:40 | Item Cost / Rates — cost code, item cost, T&M cost, hourly / sitting / daily / weekly / monthly rate, rate-evolution logic | Seen | f_2000.jpg |
| 113 | 20:00 | Inspections on a piece of equipment; red = failed; the warehouse manager is notified | Seen + said | f_2020.jpg |
| 114 | 20:00 | The inspection questions change with the type of equipment, and you can build your own | Said | f_3400.jpg |
| 115 | 20:00 | Equipment inspection form — odometer, equipment hours, Powered Off / Powered On checks, OK / NO / N/A per line with a note | Seen | f_3400.jpg, f_2020.jpg |
| 116 | 20:00 | Track every maintenance and repair, and every time an item was ordered to a project | Said | f_1940.jpg |
| 117 | 20:30 | Loadout list — everything a project needs, out of the yard | Said | f_2040.jpg |
| 118 | 20:30 | Warehouse request form — request type, requested-by with a green VERIFIED stamp, PM, superintendent, job address, warehouse approval, delivery notes, returning items with approved qty | Seen | f_2040.jpg, f_2100.jpg |
| 119 | 20:30 | "+ ITEM or by RAPID QR" — add items to a warehouse request by scanning | Seen | f_2040.jpg |
| 120 | 20:45 | Fulfilled stock comes out of inventory, onto the project, and starts cost-coding estimate vs actual | Said | f_2100.jpg |
| 121 | 21:00 | Reporting Center → Project Inventory Report: ordered / returned / total in use / cost per item per project, Download Report | Seen | f_2126.jpg, f_2120.jpg |
| 122 | 09:00 | Reporting Center — 18 named reports (Asset, Job Costing, Expense, Per Diem, T&M, Change Order, Waste, CWI Construction Activity, Warehouse, Project Inventory, CRM, Incident, Injury, Inspection, Custom Form Excel Export, Employee Sharing, Equipment Log, Form) | Seen | f_0900.jpg |
| 123 | 21:26 | Projects — bring them from QuickBooks or press the big button | Said | f_2140.jpg |
| 124 | 21:26 | Project header — site address, site contact, supervisor, project manager, client, scope of work, photo | Seen | f_2140.jpg |
| 125 | 21:30 | Project gauges — Project Schedule % / days left, Labor Mandays bid vs actual, Waste Loads bid vs actual | Seen | f_2140.jpg, f_0434.jpg |
| 126 | 21:30 | Project Stats panel — today's crew size, injuries, disciplinary actions, work delays, reportable incidents, T&M change orders needed, change orders | Seen | f_2140.jpg |
| 127 | 21:30 | Production Tracking — budgeted / actual / projected hours | Seen | f_2140.jpg |
| 128 | 22:00 | Project Book — 23 sections (General Info, Project Details, Settings, Project Site, Permits/Notifications, Per Diem, Certificate/Licenses, Timesheet/Positions, Timesheet/Prevailing Wage, Building Information, Owner Information, Waste Management, Procedures, Billing Details, Lien Information, Project Designer, Consultant, Air Monitoring Specialist, Insurance Certificate Information, Payroll Information, Emergency Info, Assigned Personnel, Other) | Seen | f_2200.jpg |
| 129 | 22:00 | Project settings — GEO Fencing and GEO Tagging on or off per job | Seen | f_2200.jpg |
| 130 | 22:00 | Project settings — allow multiple timesheets, allow multiple PSI/JHA, phases, daily overtime notification trigger (8.00 h), project-level form settings, project timezone | Seen | f_2200.jpg |
| 131 | 22:00 | Permits / notifications on the project, warned before they expire, visible in the field | Said | f_2200.jpg |
| 132 | 22:00 | Per diem on a project | Seen | f_2200.jpg |
| 133 | 22:20 | Certs and trainings made mandatory for a project — checked when scheduling and when adding to a timesheet | Seen + said | f_2220.jpg |
| 134 | 22:30 | Cost codes chosen per project, mirroring your own naming | Seen + said | f_2230.jpg |
| 135 | 23:00 | Prevailing wage selected per project to filter the timesheet | Seen | f_2240.jpg |
| 136 | 22:00 | Building information and owner information on the project | Said | f_2200.jpg |
| 137 | 23:00 | Waste reporting — haulers, material types, truck types, landfills | Said | f_2200.jpg |
| 138 | 23:00 | Custom tabs and project templates: "for these projects, answer these questions" | Said | f_2200.jpg |
| 139 | 23:30 | Insurance certificate information, lien information, billing details | Seen | f_2200.jpg |
| 140 | 23:00 | Emergency contact and nearest hospital, filled once, landing on the daily safety meeting automatically | Seen + said | f_2300.jpg |
| 141 | 24:00 | Job cost estimates — contract value, change orders with type/cost/date, project % complete with a change log | Seen | f_2340.jpg |
| 142 | 24:00 | Labor estimates by cost code / position / labor type, hours and cost | Seen | f_2330.jpg |
| 143 | 24:00 | Inventory estimates — consumables, materials, tools, equipment, heavy equipment, per diem | Seen | f_2330.jpg |
| 144 | 24:00 | Proposal builder — send proposals from Fieldflo to the client with your bid items; awarded work drops into the project | Said | f_3510.jpg |
| 145 | 24:00 | Bring an estimate in from an Excel spreadsheet | Said | f_2330.jpg |
| 146 | 24:00 | Per-project document system — folders (Air Monitoring, Containment Entry Logs, Contract Documents, Manifests, Permits, Plans and Specs…), roles per folder, shared/gallery/offline, add folder / add files | Seen | f_2400.jpg |
| 147 | 24:00 | Closeout report for a project including dailies, certs and documents | Said | f_2400.jpg |
| 148 | 24:23 | Tie every branch into one HQ dashboard | Said | f_2423.jpg |
| 149 | 25:00 | The field sees only Projects on a phone or tablet | Said | f_2500.jpg |
| 150 | 25:20 | One "Start Day" button auto-creates the dailies that job requires | Seen + said | f_2520.jpg |
| 151 | 25:57 | Timesheet — same as previous day, or pull from scheduling | Said | f_2557.jpg |
| 152 | 26:30 | Adding a man without the right certs warns the supervisor, and emails the office if he is added anyway | Said | f_2630.jpg |
| 153 | 26:30 | Cost code per man on the timesheet, defaultable so nobody picks | Said | f_2630.jpg |
| 154 | 27:20 | An SMS to each labourer within ~10 seconds asking for their location | Said | f_2720.jpg |
| 155 | 27:45 | Timesheet timed to the second; the office watches it live | Said | f_2745.jpg |
| 156 | 28:00 | JHA / pre-job safety meeting, with "same as previous day" | Seen + said | f_2820.jpg |
| 157 | 28:30 | Supervisor signs the safety meeting with a PIN; up to 10 auditors also sign with a PIN | Seen | f_2830.jpg |
| 158 | 29:00 | Nearest hospital section on the JHA | Seen | f_2820.jpg |
| 159 | 29:00 | JHA Review — ~40 hazards in 5 groups (Environmental, Ergonomics/Material Handling, Work at Height, Activity, Access/Egress) | Seen | f_2840.jpg |
| 160 | 29:30 | Evacuation plan section on the JHA, coming from the project details | Seen | f_2820.jpg |
| 161 | 30:00 | Task Steps / Hazard / Control / Risk Rating — your own internal library; the supervisor picks the task and the paperwork fills itself | Seen + said | f_2900.jpg |
| 162 | 29:20 | Live weather and forecast on the JHA (temp, wind, cloud, humidity) with "have you reviewed it with the crew" | Seen | f_2920.jpg |
| 163 | 29:20 | OSHA Heat Index, current and forecast, with a review question | Seen | f_2920.jpg |
| 164 | 30:20 | Everyone on the timesheet must verify they understood the safety meeting, by SMS, translatable into any language | Seen + said | f_2930.jpg |
| 165 | 30:20 | The signature block carries the acknowledgement wording, Add Visitor / Add Employee, and an SMS-resend control | Seen | f_2930.jpg |
| 166 | 30:40 | Site inspections walked question by question, with Upload Photo(s) per line and OK/NO/N/A | Seen | f_3000.jpg |
| 167 | 30:40 | Anything marked no or broken becomes a corrective action assigned to an employee, who is notified | Said | f_3000.jpg |
| 168 | 31:00 | Dailies already built for the abatement industry | Said | f_3020.jpg |
| 169 | 31:00 | The crew talks into the daily, in any language | Said | f_3020.jpg |
| 170 | 31:00 | Daily field report — work completed today, what went right, what can be improved, goals for tomorrow / the week, meeting log | Seen | f_3020.jpg |
| 171 | 31:20 | Incident / near miss / stop work raised on the daily notifies the office right away | Said | f_3020.jpg |
| 172 | 31:00 | Abatement procedures on the daily — install criticals, negative pressure, construct decon, pre clean, cover fixed objects, containment, removal, bag out, final clean, clearance, tear down, demob | Seen | f_3040.jpg |
| 173 | 31:00 | Cleaning verification, work area locations, cleaning cloths used, asbestos / mould detected | Seen | f_3040.jpg |
| 174 | 31:00 | Attach pictures to any daily | Seen + said | f_3040.jpg |
| 175 | 31:40 | Containment log — names pre-filled, respirator used, task before, time in / time out, typed signature | Said | f_3100.jpg |
| 176 | 31:40 | Forms stay red until answered correctly, white when right | Seen + said | f_2520.jpg |
| 177 | 32:00 | End of day — who left, what breaks they took; "Stop clock for all" with meal and 2nd-meal start/end and a PIN | Seen | f_3140.jpg |
| 178 | 32:00 | The employee verifies their own working day: time and positions correct, breaks taken per local/state/federal rules, were you injured, then PIN | Seen | f_3200.jpg |
| 179 | 25:20 | Forms bulk actions — Translate to English, Download Forms .pdf, Download Forms .zip, Send Forms, Close Forms, Delete Forms | Seen | f_2520.jpg |
| 180 | 25:20 | Active Forms / Closed Forms / Deleted Forms tabs, and a Report Incident button on the job | Seen | f_2520.jpg, f_0434.jpg |
| 181 | 33:40 | Submit a feature idea, and learn what's new | Seen | f_3420.jpg |
| 182 | 34:00 | Takeoff & estimating — upload the drawings, "FLO" auto-detects tasks and scope of work | Seen + said | f_3500.jpg |
| 183 | 34:00 | Estimate templates with scope groups, work-type setting (Residential / Commercial / Industrial / School / Healthcare / Water utility / Government …) | Seen | f_3500.jpg |
| 184 | 34:00 | Job conditions — occupied during work, prevailing wage, phased, multi-site, federally funded, RACS present, building vintage pre-1980 | Seen | f_3500.jpg |
| 185 | 34:30 | The takeoff flows straight into a proposal with bid items and tasks | Said | f_3510.jpg |
| 186 | 35:10 | Proposal editor — line items with qty, unit cost, markup %, line total; drag-in Text / Divider / Image / PDF / Signature blocks; Web and PDF views; expiration | Seen | f_3520.jpg |
| 187 | 35:10 | Proposal totals — bid total, margin %, profit; and a Send button | Seen | f_3520.jpg |
| 188 | 35:10 | Proposals list grouped by client, with draft status and value | Seen | f_3510.jpg |
| 189 | 35:20 | Weekly Scheduling / dispatch — week picker, Project / All Projects / Crew views, crew projected vs crew scheduled per day, drag people onto days with hours | Seen | f_3600.jpg |
| 190 | 35:20 | Projects panel colour-coded by whether the crew is filled, with start/end dates and project type | Seen | f_3600.jpg |
| 191 | 35:20 | Crew / Groups panel — days scheduled and scheduled hours per man | Seen | f_3600.jpg |
| 192 | 35:20 | Send each employee their own schedule to their cell phone or email | Said | f_3600.jpg |
| 193 | 37:20 | Gantt chart across four weeks, each bar a project with crew size and named crew | Seen | f_3730.jpg |
| 194 | 37:20 | 4 Week Look Ahead | Seen | f_3700.jpg |
| 195 | 38:00 | Closeout report at the end of a project | Said | f_3740.jpg |
| 196 | 38:20 | Payroll approval — total time for the week per employee, then broken down per employee per project and cost code | Seen | f_3840.jpg |
| 197 | 38:20 | Payroll approval filters — date range, verify status, projects assigned to, project type, offices, employee, approval status, project | Seen | f_3800.jpg |
| 198 | 38:20 | "Send Verify SMS" from payroll, with SMS sent / verified date-time / verify status per man | Seen | f_3840.jpg |
| 199 | 38:40 | Approve all (10) · Mark week approved & notify · PRINT · "Already Approved By: Dan Szigeti 09/08/2026 11:39 AM" | Seen | f_3840.jpg |
| 200 | 38:40 | PM-by-PM approval chain with a trailing history, so payroll cannot run until named people have approved | Said | f_3840.jpg |
| 201 | 38:40 | Payroll Exports — a spreadsheet for the in-house accountant | Seen | f_3800.jpg |
| 202 | 00:00 | Multiple offices / divisions — an Office filter on every list | Seen | f_1240.jpg |
| 203 | 15:51 | Temp labour tracked as such | Said | f_1600.jpg |
| 204 | 03:45 | Roll Call | Seen | f_0000.jpg |
| 205 | 13:20 | Export Employees (CSV) | Seen | f_1320.jpg |
| 206 | 13:20 | Download QR Codes in bulk for all employees | Seen | f_1320.jpg |
| 207 | 34:00 | Fieldflo's own marketing site — webinars, guides, client logos, "Schedule Your Demo" | Seen | f_3300.jpg, f_3320.jpg |
207 capabilities.
Part 2 — does the Makki portal do it?
| # | Capability | Makki state | Command | Output seen |
|---|---|---|---|---|
| 1 | Nav: Dashboard | Built | live | ali/overview: Owner / Company Overview |
| 2 | Nav: CRM | Part built | live | Owner gets pipeline (Sales Pipeline) + proposals; no CRM section with clients/calendar. ali/pipeline: Sales Pipeline / Quotes sent vs won · fiscal 2026 |
| 3 | Nav: Projects | Built | live | ali/jobs: Jobs & P&L, ali/projects: Project Book / 17 jobs with a book |
| 4 | Nav: Admin (11 tools) | Not built | grep -cE 'Form Sequencer|Export Builder|Email Templates|Email Groups|Email Log|Portal Admin|Timesheet Adjuster|Reporting Cent' portal/*.js |
0 — no admin section of any kind |
| 5 | Nav: Payroll | Built | live | ali/payroll: Payroll Approval / Week of Mon 17 Aug · 12 men · 404 h |
| 6 | Nav: Company | Not built | probe 6 | hits=0 |
| 7 | Nav: Employees | Built | live | ali/team: Team & Access / 5 people; ali/tickets: … 14 men · 54 tickets on file |
| 8 | Nav: Messages | Not built | probe 8 → grep -cE 'broadcast|announcement' |
0. The word "Messages" appears only in prose |
| 9 | Nav: Certification | Built | live | ali/tickets: Tickets & Certificates / 14 men · 54 tickets on file · warned before they lapse |
| 10 | Nav: Inventory | Built | live | ali/inventory: Inventory / Disposal consumables on hand (bags, coveralls) |
| 11 | Nav: Warehouse | Part built | live | Materials page exists for the site lead (sam/materials: Materials / Shared disposal stock); no warehouse seat, no request/fulfil loop |
| 12 | Nav: Scheduling | Part built | live | ali/board: Schedule Board, ali/gantt: Timeline … read-only; no Scheduling settings/reports section |
| 13 | Nav: Submit a feature idea / what's new | Not built | probe 143 | hits=0 |
| 14 | Dashboard split CRM / Projects / Safety / Equipment | Part built | live | Makki splits by group in the left nav (Dashboard, Jobs, Schedule, Money, People, Safety, Gear — screenshot ali_01_overview.png), not by tabs across one dashboard |
| 15 | Today's Active Projects + crew faces + Roll Call | Part built | live, full_overview.png |
Today's active projects / Sat 22 Aug · 5 jobs inside their date span · who is on each one, each card with crew initials, "day 27 of 33", "5 men on the crew". No Roll Call (probe 157 hits=0) |
| 16 | Nearing Bid Hours rings | Built | live, full_overview.png |
Nearing bid hours / 5 of 16 open jobs have cost against them · hottest 5 · 1 past three-quarters of the bid with rings 79% 432 1st Ave SW · $1,444 of $1,840 bid, 72%, 61%, 54%, 50% |
| 17 | Certificates Expiring Soon, days left | Built | live, full_overview.png |
Certificates expiring soon / 7 tickets inside 60 days · 2 already run out — Otis Brandt · Asbestos Worker · EXPIRED 2026-06-12, Mika Duarte · 11 DAYS, Dale Ferris · 17 DAYS … |
| 18 | Employees Nearing Over Time (32 h) | Built | grep -n 'Over 32 h' portal/app-ops.js |
kpi("Over 32 h",String(wk.men.filter(m=>m.over32).length),…over 40…) — on Payroll, not the dashboard |
| 19 | New Projects widget | Part built | grep -n 'Recent Jobs' portal/app*.js |
<h3>Recent Jobs</h3> exists; it is recent, not forward-looking start/end dates |
| 20 | T&M · Change Orders Needed widget | Part built | grep -n 'Change orders' portal/app-ops2.js |
<h3>${icon("edit")} Change orders</h3> on the job drill-in; no dashboard "needed" queue |
| 21 | Messages widget (company broadcast) | Not built | probe 21 → grep -cE 'broadcast|announcement' |
0 |
| 22 | Forms audit across every job at once | Built | live | ali/forms: Forms / Build the forms the crews fill on site, and read what comes back; the page has Templates / Submitted 5 tabs (full_forms.png) |
| 23 | Job Sites map | Built | grep -n 'Job sites' portal/app-map.js |
<h3>${icon("pin")} Job sites</h3>; grep -c 'tile|Satellite' portal/app-map.js → real map tiles + satellite toggle |
| 24 | Stat tiles: contracts in progress · days without injury · employees · clients · users | Part built | live, full_overview.png |
REVENUE $9.37M / $39.2K avg contract / job, JOBS 239 / 76 active right now. No days-without-injury, no client count, no user count (probe 24 hits=0) |
| 25 | Any language — whole UI translated | Not built | probe 25 grep -ciE 'Google ?Translate|translate\.google|goog-te' |
hits=0. The portal is English only |
| 26 | Per-form translate control | Not built | probe 26 | hits=1 — the word "globe" in a comment, no translate control |
| 27 | White-label (your logo and branding) | Built | live, every screenshot | Makki wordmark top-left and in the sidebar; Company Portal / by Makki Demolition; the scan page carries it too |
| 28 | Per-person permission switches | Built | live, full_team.png |
Who sees what — switch a tab on or off per person … Flip a switch, then sign in as that person: the tab is gone from their menu and will not open by link. PN Priya Nair BOOKKEEPER 4 of 5 tabs. Field-level gating is stronger than Fieldflo's: roles.js:240 /* book: outstanding & to-invoice ONLY. No cost/profit/margin fields exist here. */ |
| 29 | Role Profiles (saved presets) | Part built | live, full_team.png |
Five fixed roles with fixed descriptions; no user-made preset |
| 30 | Daily labour verify without logging in | Part built | live | The public scan (?hat=…) needs no login and is read-only. There is no no-login verify action — see 164/178 |
| 31 | Project appears live when the foreman clocks in | Built | live, full_overview.png |
"On site" means that crew's foreman hit Start Day on this job; cards read Not started until Start Day |
| 32 | Job templates — mandatory questions per job type | Built | grep -n 'V74. TEMPLATES' -A8 portal/app-job.js |
V74. TEMPLATES — "for these projects, answer these questions" · R.templateFor(jobId,role,who(),jx()) · This job's work type is <b>${t.workType}</b> with suggested templates |
| 33 | Form builder | Built | live, full_forms.png |
Form templates / 3 on file · 3 ship with the app · build your own below, New template, Add a field, Save template; field types Text, Yes/No, Number, Choice list, Photo, Signature |
| 34 | Bid vs actual per cost code, real time | Built | live | ray/bidactual: Bid vs Actual / 13 open jobs you bid · budget by cost code vs what has been spent; <h3>Cost codes — budget vs spent</h3> |
| 35 | Certs with several expiry warnings | Built | live, full_tickets.png |
Tickets in date 45 · Expiring 5 (3 inside 30 days) · Expired 2 (stop these men); rows show Expires within 30 days · 11 days, Expires in 60 days · 44 days |
| 36 | T&M and change orders on a job | Part built | grep -c 'change ?order' portal/*.js |
41 — change orders are on the job drill-in; there is no T&M day/rate mechanism |
| 37 | Audit every safety form across all jobs for a month | Built | grep -n 'Safety log — every talk and form filed' portal/app-notify.js |
<h3>${icon("file")} Safety log — every talk and form filed</h3> and Every safety form filed |
| 38 | Deploy a message to the whole crew by text or email | Out on the owner's rail (RULE #1 — nothing sends) + not built | probe 38 | hits=0. Nothing in the portal sends; a broadcast tool would have to be a draft-only tool and does not exist |
| 39 | Monthly incidents chart, 12 months | Not built | grep -ciE 'chart|sparkline|monthly incident' portal/app-ops.js |
No incident chart; the Safety page is tiles + tables (ali_13_safety.png) |
| 40 | Safety tiles 30 days vs 12 months | Part built | live, ali_13_safety.png |
Open actions 3 (0 overdue) · Incidents 3 (1 injuries) · Inspections 3 (1 with deficiencies) · Closed actions 2 — counts, but no 30-day/12-month split |
| 41 | Injuries by body part | Not built | probe 40 | hits=0 |
| 42 | Safety filters by project / type / office / period | Part built | grep -c withTools portal/app*.js |
34 — every table has search + filters, but the Safety page has no office or period filter |
| 43 | Incident wizard, 11 steps, % complete | Part built | live, ali_13_safety.png |
One form: Report an incident / Near miss, stop-work or injury. Add the fix as a corrective action. with Type, Date, Site, What happened, Immediate action taken, Fix, Owner, Due. Types: near-miss, stop-work, injury, property-damage, no-access. No multi-step claim, no % complete |
| 44 | Incident reports needing review queue | Not built | probe 42 | hits=0 |
| 45 | Corrective actions assigned, days since assigned | Built | live, ali_13_safety.png |
Corrective actions / Stays here until someone closes it. Overdue goes red. — ACT-02 · from INC-01 · owner Sam Reyes · due 2026-08-28 · 6 d left [Close], plus a Closed list with Reopen |
| 46 | OSHA Reporting 300 / 300A / 301 | Not built | probe 43 grep -ciE 'OSHA' |
hits=0. (Makki is Alberta — the equivalent is OHS / WCB, and neither exists either) |
| 47 | OSHA csv / xlsx downloads | Not built | as 46 | hits=0 |
| 48 | OSHA case classification and illness type | Not built | as 46 | hits=0 |
| 49 | Build your own inspections | Part built | live, full_forms.png |
The form builder can build an inspection form (Daily Site Inspection ships with the app · 8 fields), and Safety logs an inspection with kind + result; there is no inspection engine with OK/NO/N/A per line and a photo per line |
| 50 | Equipment dashboard — open orders | Not built | probe 46 | hits=0 |
| 51 | Equipment nearing maintenance, trigger miles/hrs | Not built | grep -ciE 'nearing maintenance|trigger (miles|hours)|odometer' portal/*.js |
0 |
| 52 | Equipment corrective actions | Not built | grep -c 'corrective' portal/app-yard.js |
0 — corrective actions exist only on Safety, not on assets |
| 53 | Equipment inspections log + next inspections due | Part built | grep -n 'Inspections and repair history' portal/app-yard.js |
<h3>${icon("cert")} Inspections and repair history</h3> — a history, no "next due" schedule |
| 54 | Rentals — days to renewal, days on site | Part built | live | ali/equipment: Equipment & Rentals / 12 assets · 3 on rent · a code on every one; kpi("Rentals overdue") exists; no renewal-date countdown |
| 55 | Top 10 project inventory costs | Not built | probe 48 | hits=0 |
| 56 | Map of where your vehicles and equipment are | Not built | probe 49 | hits=0. The map shows job sites and crew movement, not assets |
| 57 | CRM — reach outs, job walks, proposals due | Not built | grep -ciE 'reach ?out' portal/*.js → 0; grep -ciE 'job ?walk' portal/*.js → 2 (prose only) |
0 / prose only |
| 58 | Leads by salesperson | Not built | grep -ciE 'by salesperson|leads by' portal/*.js |
0 |
| 59 | CRM value tiles (pending / awarded / loss / lead value) | Part built | live | ali/pipeline: Sales Pipeline / Quotes sent vs won · fiscal 2026; ray/winrate: My Win Rate / 261 won of 698 quotes · 37.4% all time; ray/quotes: 698 quotes you wrote · $35.29M quoted. Quote-shaped, not lead-shaped |
| 60 | Leads list with status pills and pipeline value | Part built | live | Pipeline is quotes by stage, not a lead record with due dates, sources and reach-outs |
| 61 | CRM Leads / Clients / Calendar tabs | Not built | probe 52 grep -ciE 'clients|calendar' |
Hits are the word "client" in job rows; no Clients page, no CRM calendar |
| 62 | Connect to QuickBooks (the owner asked for it by name) | Part built | live, ali_10_quickbooks.png |
ali/quickbooks: QuickBooks Online / the owner's accounting system · not connected; the page states Not connected — needs the owner's QuickBooks access … Until then every money figure in the portal is demo data, lists What would sync per entity with Waiting, and Nothing here calls QuickBooks — this is the settings page. Blocked on the owner's login, i.e. the mock-data rail (#7) |
| 63 | QuickBooks pulls employees across | Not built | as 62 | Last sync: never |
| 64 | CSV / file imports | Built | grep -c 'Import|parseCsv' portal/app-import.js |
16; app-import.js (23 KB) appends an import panel to PAGES.owner.quickbooks and PAGES.book.payments |
| 65 | Three dots + one big button on every page | Part built | live | Every table has a consistent search/filter toolbar (withTools, 34 uses) and add panels; no ⋯ admin-customisation menu per page |
| 66 | Accountant given payroll only | Built | live, full_team.png |
Bookkeeper seat exists with Payroll hours as a switchable tab, currently off — PN Priya Nair BOOKKEEPER 4 of 5 tabs; and Hours only — rates and pay are never sent to this login |
| 67 | Each employee approves their own time by text | Out on the owner's rail (RULE #1) | probe 55 + grep -ciE 'SMS' portal/*.js |
Approval exists (Approved by … · date, Status Approved/Waiting) but nothing is sent: SMS → 2, both prose. The office approves; the man is not texted |
| 68 | Daily notification digest, ~28 data points | Built | grep -noE 'h3>\$\{icon\("[a-z]+"\)\} [A-Za-z][^<]{3,45}' portal/app-notify.js |
Digest · <date>, Today's digest, When it runs, Notices, Last incident, Every safety form filed, People, clients and logins; the digest covers certs, permits, stock, forms not closed, no daily filed, failed inspections, corrective actions due, attendance, change orders, low stock, no-access |
| 69 | Digest twice a day on a night shift | Built | grep -n 'When it runs' -A6 portal/app-notify.js |
Twice on a day with a night shift on the board, once otherwise. |
| 70 | Instant notices | Built | grep -n 'Notices' portal/app-notify.js |
Incident / near miss / failed inspection / no access / inventory rows render as notices |
| 71 | Notification email with your logo, chosen data points | Out on the owner's rail (RULE #1) | probe 58 | hits=0. The digest renders in the app; no email is composed or sent |
| 72 | Cert-expiry notice linking to the cert | Built | live, full_overview.png + full_tickets.png |
The digest and the dashboard both carry the expiring list, each row opening that man |
| 73 | Permit-expiry notice | Built | live | kpi("Permits expiring"), kpi("Permits expired"), kpi("No permit on file") on Project Book |
| 74 | "Who is not doing the paperwork correctly" | Built | grep -n 'No daily filed for|Not closed|Forms filed' portal/app-notify.js |
"No daily filed for ", "Not closed", "Forms filed" |
| 75 | Low stock / pending order notice | Built | grep -n 'Low stock' portal/app-notify.js |
"Low stock", "Inventory", "Materials" |
| 76 | Scheduling-conflict notice | Built | grep -n 'Booked' portal/app-notify.js |
"Booked on a job that is not open", "Booked outside the job's planned dates", "Booked on a site whose permit has lapsed", "Booked on a site with no permit on file" |
| 77 | Certs archived and kept | Built | live, full_tickets.png |
A renewal keeps the old ticket on file — nothing is ever deleted. and an Archive panel Replaced by a renewal, or deleted |
| 78 | Employees list with filters and add | Built | live, full_team.png + full_tickets.png |
Team / 5 people / Role: All …; Tickets page lists 14 men with a ticket filter |
| 79 | Employees ⋯ menu (8 tools) | Part built | live | Skills exist (<h3>Record a skill on a man</h3>, <h3>Sites that demand a skill</h3>); Positions/Union skill levels/Prevailing wage/Role profiles/bulk QR do not |
| 80 | A unique QR per employee, Download PDF | Built | grep -n 'The code on .* hard hat' portal/app.js |
<h3>${icon("hat")} The code on ${own?"your":"the"} hard hat</h3>; qr.js is an in-house offline QR encoder (byte mode, ECC M, v1–10) — no external service |
| 81 | Hard-hat scan → live certs, no login | Built | live (no login) | GET /app/?hat=MK-W07 returned Ivy Salcedo | Abatement Tech · Crew C | MK-W07 | All tickets in date | TICKETS HELD | Asbestos Worker … exp 2028-04-03 Valid | Confined Space Entry … | Respirator Fit Test … | WHMIS 2015 … — screenshot scan_MK-W07.png |
| 82 | Scan page shows status / expiry / days left / verdict | Built | same | Verdict line is computed: bad ? "N EXPIRED tickets — do not let him start" : soon ? "All in date · N expiring soon" : "All tickets in date" |
| 83 | Inspector cannot see what he shouldn't | Built | live | This page shows tickets only. No pay, no phone number, no job costs — the scan cannot reach them. (R.visiblePeople("inspector",…) projection) |
| 84 | Cert name opens the certificate file itself | Not built | grep -ciE 'open-certificate|certUrl|cert file' portal/*.js |
0 — the portal holds ticket numbers and issuers, not scans of the paper |
| 85 | Employee emergency details | Built | grep -oE 'line\("[^"]+"' portal/app-*.js |
"Hospital", "Hospital address", "Hospital phone", "Muster point", "First aider on site", "Site contact", "Nearest cross street", "Call", "Second call"; plus <h3>${esc(e.name)} — who do we call</h3> |
| 86 | Training system — deploy to company / divisions | Not built | probe 72 | hits=0 |
| 87 | Training to the phone with a PIN, any language | Not built | probe 73 | hits=0 |
| 88 | Trainings Needed page with deploy + quiz status | Not built | probe 76 | hits=0 |
| 89 | The training itself (video + course) | Not built | as 86 | hits=0 |
| 90 | ~600 GotSafety videos at ~$4/employee/month | Not built | probe 74 | hits=0 |
| 91 | Quiz | Not built | probe 75 grep -ciE 'quiz|exam' |
0 |
| 92 | Pass → certificate with your logo, tracked | Not built | as 86 | hits=0. The portal has a Certificate pack (<h3>Certificate pack · …</h3>), which is a pack of tickets held, not an issued training certificate |
| 93 | Employee module — number, cell, cost code, office | Part built | grep -oE '\["(name|trade|crew|phone|start)","[^"]+"\]' portal/roles.js |
["name","Name"] ["trade","Trade"] ["crew","Crew"] ["phone","Phone"] ["start","Start date"]. No employee number, no office/division, no default cost code |
| 94 | Skills per man, and filter a site by skill | Built | grep -n 'Sites that demand' portal/app-people.js |
<h3>${icon("pin")} Sites that demand a skill</h3>, <h3>${icon("shield")} Sites that demand an orientation</h3>, <h3>${icon("plus")} Record a skill on a man</h3>, kpi("Skills held") |
| 95 | Training matrix — who has what | Built | live, full_tickets.png |
<h3>What the crew must hold</h3>, <h3>Tickets this job needed</h3>, <h3>Crew tickets on this job</h3>, <h3>What you hold</h3> |
| 96 | Write-ups / disciplinary | Not built | probe 80 | hits=2, both the word "discipline" in prose |
| 97 | Documents against an employee | Part built | grep -n 'Documents on file' portal/app*.js |
<h3>Documents on file</h3> exists on the job, not on the man |
| 98 | Employee PIN flags | Not built | grep -nE '[^a-z]PIN[^a-zA-Z]' portal/app*.js |
The only PINs are the supervisor's JHA signature (row 157); no per-employee PIN record, no "cannot pin for others", no SMS PIN |
| 99 | Union name / code, company employee ID | Not built | grep -ciE 'union' portal/*.js |
0 |
| 100 | Pay rate / SSN / payroll group on the record | Part built | grep -n 'Rate/h' portal/app-ops.js |
Rates exist and are owner-only (Rate/h, Pay columns appear only when owner); no SIN/SSN, no payroll group. Withholding pay data from other seats is the owner's rule #4, not a gap |
| 101 | Super Admin / Can Login / Sales Person flags | Part built | live, full_team.png |
Role per person (Owner/Bookkeeper/Estimator/Site lead/Crew) plus per-tab switches; no independent capability flags |
| 102 | Employee drawer with 9 sections | Part built | live | Opening a man gives his tickets, crew, skills and emergency contacts; not incidents, roles, training, documents, form tagging, linked assets |
| 103 | Add a certificate with a photo of the cert | Part built | live, full_tickets.png |
File a ticket / Add a new ticket / Renew one he holds with MAN, TICKET, ISSUED BY, number and dates. No photo upload of the paper cert |
| 104 | Cert status filter All / Active / Renew / Archived | Built | live, full_tickets.png |
Ticket: All / Asbestos Worker / Confined Space Entry / … and an Archive panel; states are Valid / Expiring 30 / Expiring 60 / Expired / archived |
| 105 | Renew — new active, old archived forever | Built | live, full_tickets.png |
Renew one he holds … A renewal keeps the old ticket on file — nothing is ever deleted.; <h3>Archive</h3> Replaced by a renewal, or deleted |
| 106 | PDF pack of certificates | Built | grep -n 'Certificate pack' portal/app-people.js |
<h3>Certificate pack · ${esc(pk.title)}</h3>, with kpi("Men in the pack"), kpi("Included"), kpi("Not included") |
| 107 | Certificates filter panel (6 fields) | Part built | live | Ticket-type filter and a man search; no SS-last-4, union code or labor-type filter |
| 108 | Inventory list with location, category, min/max, on hand | Part built | live | ali/inventory: Inventory / Disposal consumables on hand (bags, coveralls), <h3>Stock on hand</h3>, <h3>Asset list</h3>. No min/max reorder levels (grep -ciE 'min.?max|reorder' portal/*.js → 0), no next-inspection-due column |
| 109 | Asset QR → inspect without logging in | Part built | live | ali/equipment: … a code on every one — every asset has a code; the code does not open a no-login inspection form |
| 110 | Asset scan shows an SDS | Not built | grep -n 'SDS' portal/app-ops2.js |
<h3>${icon("file")} Safety documents — JHA, SWP, toolbox talks, SDS</h3> … <b>Placeholders.</b> The titles are typical demolition / abatement documents — titles only, no files |
| 111 | Item record — asset tag, class, yard/aisle, quick transfer | Part built | live | Assets carry a code, a status and a location on a job; no yard/aisle/bin, no asset tag, no quick transfer |
| 112 | Item cost / rates incl. T&M and rate evolution | Not built | grep -ciE 'hourly rate|daily rate|weekly rate|T&M cost' portal/*.js |
0 |
| 113 | Equipment inspections, red = fail, warehouse manager notified | Part built | grep -n 'Inspections and repair history' portal/app-yard.js + Safety insKind |
Equipment inspection is one of the three inspection kinds on Safety; failures show as Deficiencies; nobody is notified by message (RULE #1) |
| 114 | Build your own equipment inspections | Part built | live, full_forms.png |
Equipment Pre-Use Check ships with the app, and the builder can make more; the questions are not driven by equipment type |
| 115 | Inspection form with odometer, hours, OK/NO/N/A per line | Not built | grep -ciE 'odometer|equipment hours|OK / NO / N/A' portal/*.js |
0 |
| 116 | Maintenance and repair history; every time ordered to a project | Built | grep -n 'Inspections and repair history|Out of the yard, on jobs' portal/app-yard.js |
<h3>${icon("cert")} Inspections and repair history</h3>, <h3>${icon("box")} Out of the yard, on jobs</h3>, with kpi("Ordered"), kpi("Out to site"), kpi("Came back"), kpi("Consumed") |
| 117 | Loadout list | Built | grep -n 'A LOADOUT LIST' portal/app-yard.js |
A LOADOUT LIST — what a job needs, out of the yard and back (66 references) |
| 118 | Warehouse request form with approval and returns | Part built | live | Ordered / out to site / came back / consumed are tracked; there is no request → approve → fulfil form with a verified signature |
| 119 | RAPID QR to add items to a request | Not built | probe 95 | hits=0 |
| 120 | Fulfilled stock cost-coded to the project | Built | live, sam/materials + kpi("Consumed") |
Materials / Shared disposal stock — bags & coveralls used on site; consumption lands against the job |
| 121 | Project Inventory Report | Part built | live | The yard page shows ordered/returned/consumed per job; there is no exportable report |
| 122 | Reporting Center, 18 reports | Not built | probe 97 grep -ciE 'report(s)? cent' |
0. Makki exports CSV from Payroll only |
| 123 | Create a project from QuickBooks or a button | Part built | live | Jobs exist and can be opened; app-import.js can bring rows in; there is no "new project" button on the owner seat |
| 124 | Project header — address, contact, supervisor, PM, client, scope | Built | live, full_projects.png |
Project Book / 17 jobs with a book · permits, required tickets, crew readiness; <h3>Scope of work</h3>, <h3>Site contact</h3>-family fields |
| 125 | Project gauges — schedule, mandays, waste loads | Part built | live, full_overview.png |
Bid-vs-spent rings per job (79% / 72% / …) and kpi("Loads"), kpi("Tonnes"), kpi("Recycled loads"), kpi("Hazmat loads"). No manday gauge, no days-left gauge |
| 126 | Project Stats panel (7 counters) | Part built | live | kpi("Men on site"), kpi("Incidents"), kpi("Change orders"), kpi("Forms filed"), kpi("Photos"); no disciplinary actions, no work delays, no reportable-incidents split |
| 127 | Production tracking — budgeted / actual / projected hours | Part built | live | kpi("Hours"), kpi("Hours today"), kpi("Budget"), kpi("Spent so far"), kpi("Variance") — dollars and hours, no projected-hours forecast |
| 128 | Project Book with 23 sections | Part built | live, full_projects.png |
Makki's book carries scope, permits, required tickets, crew readiness, documents, photos, waste, per diem, emergency info, cost codes, closeout — roughly 11 of Fieldflo's 23. No lien, designer, consultant, air-monitoring specialist, insurance-certificate, payroll-information or building-information sections |
| 129 | GEO fencing / GEO tagging per job | Not built | probe 100 grep -ciE 'geo.?fenc|geo.?tag' |
0 |
| 130 | Project settings (multiple timesheets, phases, OT trigger, timezone) | Not built | probe 101 + grep -ciE 'timezone|time zone' portal/*.js |
Phases/multiple-timesheet/OT-trigger/timezone settings: 0 |
| 131 | Permits with expiry warnings, visible in the field | Built | live, full_projects.png |
<h3>Permits</h3>, kpi("Permits expiring"), kpi("Permits expired"), kpi("No permit on file"); the notifier warns on them |
| 132 | Per diem | Built | grep -oE '"Per diem[^"]*"' portal/app*.js |
"Per diem", "Per diem applies on this job", kpi("Per diem") |
| 133 | Mandatory certs per project, checked at scheduling and timesheet | Built | live, full_projects.png |
Project Book / 17 jobs with a book · permits, required tickets, crew readiness; <h3>Tickets this job needed</h3>, <h3>What the crew must hold</h3>, kpi("Men blocked"), and the board runs the same check |
| 134 | Cost codes per project in your own naming | Built | live | <h3>Cost codes — budget vs spent</h3>, kpi("Codes over budget"); 109 cost-code references |
| 135 | Prevailing wage | Not built | probe 106 | hits=0 |
| 136 | Building information / owner information | Not built | probe 107 | hits=1 (prose) |
| 137 | Waste reporting — haulers, materials, trucks, landfills | Part built | grep -n 'Waste & landfill tickets|Add a load' portal/app-job.js |
<h3>Waste & landfill tickets</h3>, Add a load, kpi("Waste tickets"), kpi("Tip fees"), kpi("Tonnes"), kpi("Loads"), kpi("Recycled loads"), kpi("Hazmat loads"). Loads and tickets yes; no hauler / truck-type / landfill registers |
| 138 | Custom tabs and project templates | Part built | grep -n 'V74. TEMPLATES' portal/app-job.js |
Templates yes (row 32); no custom tabs |
| 139 | Insurance, lien, billing details | Not built | probe 110 → grep -ciE 'lien|insurance certificate' |
0 |
| 140 | Emergency contact + nearest hospital onto the daily automatically | Built | grep -oE 'line\("[^"]+"' portal/app*.js + grep -n 'If something happens today' portal/app-job.js |
<h3>${icon("alert")} If something happens today</h3> with Hospital, Hospital address, Hospital phone, Muster point, First aider on site, Call, Second call |
| 141 | Job cost estimates — contract value, change orders, % complete | Part built | live | ali/jobs: Jobs & P&L / Every won job with full cost breakdown; <h3>Cost breakdown</h3>, <h3>Change orders</h3>, kpi("Job total"), kpi("Spent"), kpi("Variance"). No % complete with a change log |
| 142 | Labor estimates by cost code and position | Built | live | <h3>Cost codes — budget vs spent</h3>, <h3>Hours per man</h3>, <h3>Hours per job</h3>, kpi("Labour cost") |
| 143 | Inventory estimates by category | Not built | grep -ciE 'consumables estimate|inventory estimate' portal/*.js |
0 |
| 144 | Proposal builder | Built | live, ali_03_proposals.png |
ali/proposals: Proposals / 603 quotes this year · open a quote to build its proposal; <h3>Proposal ${esc(p.ref)}</h3>, <h3>Scope</h3>, <h3>Price</h3>, <h3>Terms</h3>, <h3>Included</h3>, <h3>Not included</h3> |
| 145 | Import an estimate from Excel | Part built | wc -c portal/app-import.js |
23021 — CSV import exists; not an estimate sheet |
| 146 | Per-project document system with folders and roles | Part built | live | <h3>Documents on file</h3> and the safety-document library; no folders, no per-folder role, no upload |
| 147 | Closeout report | Built | grep -n 'Closeout report' portal/app-ops2.js |
<h3>Closeout report · ${esc(j._jobId)}</h3>, kpi("Closed off"), 51 references |
| 148 | HQ dashboard across branches | Not built | probe 117 | hits=0 — Makki is one office |
| 149 | Field sees only Projects on a phone | Built | live | dale/today: Today / Dale Ferris · Abatement Labourer — Crew A; the crew seat has 5 tabs and no money at all |
| 150 | One Start Day button creates the day's dailies | Built | live, sam_11_startday.png |
sam/startday: Start Day / One button. The day's paperwork appears, filled in as far as the office already knows. — it opens the timesheet with a cost code per man, the pre-job safety talk, the site inspection |
| 151 | Same as previous day / pull from scheduling | Part built | live + probe 120 | Start Day pre-fills from what the office knows (the schedule); there is no explicit "same as previous day" |
| 152 | Cert warning when adding a man; office emailed if overridden | Part built + rail | live | kpi("Men blocked") and An expired ticket blocks that man from a crew that needs it — the same check the schedule board runs. The block is there; the email is out on RULE #1 |
| 153 | Default cost code per man | Built | live | the crew's timesheet with a cost code per man |
| 154 | SMS asking each labourer for their location | Out on the owner's rail (RULE #1) + geo not built | probe 123, 129 | Nothing sends; no geo capture either |
| 155 | Timesheet timed to the second, watched live | Part built | live | Hours per man per day, and the dashboard flips a job to "On site" on Start Day; not second-by-second |
| 156 | JHA / pre-job safety meeting | Built | grep -noE 'h3>[A-Z][^<]{3,50}' portal/app-day.js |
JHA / safety talk — supervisor signature, Site inspection — …, Goals & meeting log, Timesheet, End of day — who left when, and the breaks |
| 157 | Supervisor signs with a PIN; auditors too | Part built | grep -n 'V94' portal/app-day.js |
V94 The supervisor signs the JHA / safety talk with a PIN (was: a bare timestamp) · PIN verified · ${d.sign.date} · ${d.sign.men} men briefed · Supervisor signature · PIN ending ${d.sign.last} · <input id="jhaPin" class="pinbox" type="password" …>. Supervisor yes; no auditors (grep -ci auditor → 0) |
| 158 | Nearest hospital on the JHA | Built | as 140 | Hospital, Hospital address, Hospital phone on the day's paperwork |
| 159 | ~40 hazards in 5 groups on the JHA | Not built | grep -ci 'hazard' portal/app-day.js |
The safety talk carries a topic and a briefing count, not a hazard checklist |
| 160 | Evacuation plan | Not built | probe 128 | hits=0 |
| 161 | Task steps / hazard / control / risk-rating library | Not built | probe 129 grep -ciE 'task step|risk rating' |
0 |
| 162 | Live weather on the JHA | Not built | probe 130 | hits=1 — { id:"f1", label:"Weather and ground conditions", type:"text" }, a free-text field in a shipped form, not live weather |
| 163 | OSHA heat index | Not built | grep -ci 'heat index' portal/*.js |
0 |
| 164 | Every man verifies the safety meeting by SMS | Out on the owner's rail (RULE #1) | grep -ci 'SMS' portal/*.js |
2, prose only. The supervisor's PIN records that N men were briefed; the men are not texted |
| 165 | Acknowledgement wording, add visitor, resend SMS | Part built + rail | as 157 | PIN verified · … · N men briefed; no visitor, no resend |
| 166 | Inspections walked line by line with a photo per line | Part built | live, full_forms.png |
Daily Site Inspection ships with the app · 8 fields including a Photo field and a Signature field; photos are per form, not per line |
| 167 | A "no" becomes a corrective action, assigned and notified | Part built + rail | live, ali_13_safety.png |
Corrective actions are assigned with an owner and a due date and go red when overdue; they are raised by hand from the incident form, not automatically from a failed line, and nobody is notified by message |
| 168 | Dailies pre-built for abatement | Built | live, full_forms.png + forms.js |
Daily Site Inspection, Toolbox Talk, Equipment Pre-Use Check ship with the app |
| 169 | Talk into the daily, in any language | Not built | grep -ciE 'voice|dictate|speech' portal/*.js (excluding "invoice") |
0. The earlier 71 hits were the substring in invoice |
| 170 | Daily field report — work done, what went right, goals | Built | grep -noE 'h3>[A-Z][^<]{3,50}' portal/app-day.js + grep -n 'Daily reports' |
Goals & meeting log, <h3>Daily reports</h3>, and a notes field e.g. Containment up on floor 2, waiting on the bin swap, neighbour asked… |
| 171 | Incident on a daily notifies the office instantly | Part built + rail | grep -n 'Notices' portal/app-notify.js |
Every incident filed becomes a notice in the app the same moment (app-notify.js turns every row filed here into a notice); nothing leaves the device |
| 172 | Abatement procedures checklist on the daily | Not built | grep -ciE 'criticals|negative pressure|bag out|decon' portal/*.js |
0 |
| 173 | Cleaning verification, work areas, cloths used | Not built | grep -ciE 'cleaning verification|cleaning cloth' portal/*.js |
0 |
| 174 | Attach pictures to a daily | Built | live, full_forms.png |
kpi("Photos"), <h3>Photos (${c.photos.length})</h3>, <h3>${icon("eye")} Site photos — …</h3>, and a Photo field type in the builder (Take / choose photo, Retake / choose another) |
| 175 | Containment log — respirator, time in/out, signature | Part built | grep -n 'Containment' portal/app-ops.js |
Containment inspection is a selectable inspection kind, and containment appears in notes; there is no containment entry log with respirator and time in/out |
| 176 | Red until answered correctly | Part built | live | Overdue corrective actions go red; expired tickets go red; forms are not colour-gated on completeness |
| 177 | End of day — who left, breaks, stop clock for all | Built | live, dale_01_endofday.png |
dale/endofday: End of Day / Dale Ferris · Sat 22 Aug; End of day — who left when, and the breaks |
| 178 | The man verifies his own day (time, breaks, were you injured) | Part built | live | End of Day is the man's own screen on his own login; kpi("Told us something medical") is on the day. Fieldflo's version reaches a labourer who never logs in — Makki's needs his login |
| 179 | Forms bulk actions (translate / pdf / zip / send / close / delete) | Part built + rail | probe 142 | hits=0 for the bulk menu. Individual forms can be filed and read; Send is out on RULE #1 |
| 180 | Active / Closed / Deleted forms + Report Incident on the job | Part built | live, full_forms.png |
Templates / Submitted 5 tabs, and Safety carries Report an incident. No closed/deleted split |
| 181 | Submit a feature idea / what's new | Not built | probe 143 | hits=0 |
| 182 | Takeoff & estimating from drawings | Not built | probe 144 grep -ciE 'takeoff|auto.?detect' |
0 |
| 183 | Estimate templates and work-type settings | Not built | probe 145 | hits=0 |
| 184 | Job conditions (prevailing wage, phased, pre-1980 …) | Not built | probe 145 + 106 | 0 |
| 185 | Takeoff flows into a proposal | Not built | as 182 | 0 |
| 186 | Proposal editor — line items, markup, blocks, Web/PDF | Part built | live | Makki's proposal is a generated document (Scope / Price / Terms / Included / Not included) from a quote, not a block editor with markup per line |
| 187 | Proposal totals incl. margin and profit, and Send | Part built + rail | live | Margin and profit exist across the owner seat (Jobs & P&L, owner-only); the proposal itself is a draft — The owner sends (11. PROPOSALS — from a quote to a printable proposal. Draft — The owner sends.). Send is out on RULE #1 |
| 188 | Proposals grouped by client with status and value | Part built | live | ali/proposals: 603 quotes this year; grouped by quote, not by client |
| 189 | Weekly scheduling board, crew projected vs scheduled | Part built | live, ali_06_board.png |
ali/board: Schedule Board / Week of Mon 17 Aug · click a day to move a crew; sam/board: Crew Board / … click a day to move your crew. Crews move by day; there is no projected-vs-scheduled headcount per day |
| 190 | Projects panel colour-coded by staffing | Not built | live | The board shows crews on days, not a project list coloured by fill |
| 191 | Days scheduled / scheduled hours per man | Part built | live | Payroll gives hours per man per day; the board does not show a per-man weekly total |
| 192 | Send each employee their own schedule | Out on the owner's rail (RULE #1) | probe 148 | Each man has a schedule page (dale/myschedule: My Schedule / Crew A · 198 sites, sam/schedule: My Schedule); nothing is sent to him |
| 193 | Gantt chart over four weeks | Built | live, ali_07_gantt.png |
ali/gantt: Timeline / 16 open jobs · Mon 22 Jun → Sat 26 Sep · read-only |
| 194 | 4-week look ahead | Part built | live | The Timeline spans ~14 weeks read-only; there is no 4-week look-ahead view |
| 195 | Closeout report at the end of a project | Built | as 147 | <h3>Closeout report · ${esc(j._jobId)}</h3> |
| 196 | Payroll approval — hours per man, per job, cost coded | Built | live, ali_09_payroll.png |
ali/payroll: Payroll Approval / Week of Mon 17 Aug · 12 men · 404 h; <h3>Hours per man</h3>, <h3>Hours per job</h3>, <h3>Approve the week by cost code</h3>, kpi("Hours"), kpi("Over 32 h"), kpi("Labour cost") |
| 197 | Payroll filters (8) | Part built | live | Week stepper (Previous / This week / Next) and a crew filter; no office, project-type, verify-status or approval-status filter |
| 198 | Send Verify SMS, verify status per man | Out on the owner's rail (RULE #1) | probe 152 | hits=0 |
| 199 | Approve all · Mark week approved · approved-by stamp | Built | live | kpi("Status", appr?"Approved":"Waiting") and <b>Approved</b> by ${appr.by} · ${appr.at} |
| 200 | PM-by-PM approval chain with trailing history | Not built | probe 153 grep -ciE 'approval chain' |
0 — one approval by the owner, not a chain |
| 201 | Payroll export for the accountant | Built | live + grep -n 'pCsv' portal/app-ops.js |
Export CSV button; the file is written makki-payroll-<date>-DEMO.csv with DEMO DATA - Makki Demolition payroll week of …, and Rates and pay included (owner export) vs Hours only — no rates in this login |
| 202 | Multiple offices / divisions | Not built | probe 155 → no office concept in roles.js |
Makki is one office; nothing to gate |
| 203 | Temp labour flag | Not built | probe 156 grep -ciE 'temp labo' |
0 |
| 204 | Roll Call | Not built | probe 157 grep -ciE 'roll ?call' |
0 |
| 205 | Export employees to CSV | Not built | grep -ciE 'export employees' portal/*.js |
0 — CSV export exists on Payroll only |
| 206 | Bulk download of all QR codes | Not built | probe 67 | hits=0 — one code at a time |
| 207 | A public marketing site with webinars and client logos | NOT MEASURED | curl -s -o /dev/null -w '%{http_code}' https://makki-home.pages.dev/ |
200 — Makki has a home page; comparing marketing sites is not this grade |
Part 3 — the gaps, ranked by how much of the demo they took up
Each line is a task, ready to paste into GO_LIVE.md. Ranked by minutes on screen and by
how hard the owner reacted. Rows marked (rail) are the owner's and Omar's rule, not a missing
feature — they are listed last, separately, because GO_LIVE has to decide them, not build
them.
Not built — ranked
- Training system end to end — deploy a training to the company or a division, it lands on the man's phone in his language behind a PIN, he watches, takes a quiz, and passing issues a certificate with Makki's logo that is then tracked and warned on like any other ticket. ~2 minutes of the demo (14:30–16:00), the owner: "Perfect." — Fieldflo rows 86–92.
- Any language — a translate control that flips the whole portal, and a per-form globe, so a bilingual crew reads its own paperwork. Dan opened with it at 02:37 and showed the entire UI in Spanish; he came back to it four more times (15:00 training, 25:20 field view, 30:20 safety verification, 31:00 dailies). Nothing in the portal is translatable — Fieldflo rows 25, 26.
- Takeoff & estimating — upload the drawings, have them auto-read into tasks and scope, pick a work type and job conditions from a template, and push the result into a proposal. 34:00–35:20; the owner: "I'll check it out… it'd be cool to see." — Fieldflo rows 182–185.
- OSHA / OHS statutory reporting — the 300 log, the 300A summary, the 301 incident records, case classification and illness type, filtered by year and establishment, downloadable as csv and xlsx. 07:45. For Makki this is Alberta OHS and WCB, not OSHA — Fieldflo rows 46–48.
- The full incident claim — an 11-step wizard (injured employee, damaged property, damaged equipment, what happened, employee statement, witnesses, third party, investigation report, insurance) with a % complete and a "needs review" queue that ages. Makki files an incident in one form. 07:10 — Fieldflo rows 43, 44.
- Equipment maintenance and inspection engine — nearing-maintenance by trigger miles/km/hours, next inspections due, equipment corrective actions, an inspection form driven by equipment type with odometer, hours and OK/NO/N/A per line. 07:50 + 20:00 + 34:00, three separate visits — Fieldflo rows 51, 52, 53, 112, 115.
- A real CRM front end — reach-outs, job walks, proposals due, leads by salesperson, a lead record with source and due date, a Clients tab and a CRM calendar. 07:55–08:20, and the leads list alone showed 158 leads / $4.2m pipeline. Makki has a quote pipeline, not a lead pipeline — Fieldflo rows 57, 58, 60, 61.
- Task steps / hazard / control / risk rating library — the supervisor picks the task and the JHA fills its own hazards and controls; ~40 hazards in 5 groups on the review page. 29:00–30:00, and Dan called it "This is cool" — Fieldflo rows 159, 161.
- GEO fencing and GEO tagging per job — on or off per project, with a "Geo Location Data Missing" notice. Shown as a live badge on the timesheet header. 22:00 + 26:30 — Fieldflo row 129.
- Voice into the daily — the crew talks into the daily report instead of typing, in any language. Dan sold this as the reason the field adopts it at all ("they don't want to change… you just open it up, talk, take pictures, boom"). 31:00 — Fieldflo row 169.
- Live weather and heat index on the JHA — current and forecast temperature, wind, humidity, OSHA heat index, each with a "have you reviewed this with the crew" question. 29:20 — Fieldflo rows 162, 163.
- Warehouse request / fulfil loop — a request form with a verified requester, warehouse approval, delivery notes, returning items with approved quantities, and RAPID QR to add items by scanning. 20:30 — Fieldflo rows 118, 119.
- Reporting Center — 18 named exportable reports (asset, job costing, expense, per diem, T&M, change order, waste, warehouse, project inventory, CRM, incident, injury, inspection, equipment log, form). 09:00 + 21:00 — Fieldflo rows 121, 122.
- Admin section — form sequencer, export builder, email templates and groups, email log, imports, timesheet adjuster, portal admin. 21:00 — Fieldflo row 4.
- Asset QR that opens a no-login inspection or an SDS — the operator scans the machine and does the check without ever logging in. Makki puts a code on every asset but the code opens nothing. 19:30 — Fieldflo rows 109, 110.
- Equipment location map — where every vehicle, rental and piece of heavy equipment is, with rentals/heavy-equipment toggles and per-asset popups. Makki's map shows job sites, not assets. 07:50 — Fieldflo row 56.
- Injuries-by-body-part and the 12-month incident chart — a trend line and a body diagram over 30 days vs 12 months. 07:00 — Fieldflo rows 39, 41.
- Abatement procedure checklist on the daily — install criticals, negative pressure, construct decon, pre clean, cover fixed objects, containment, removal, bag out, final clean, clearance, tear down, demob; plus cleaning verification and cloths used. This is the most abatement-specific thing in the whole demo. 31:00 — Fieldflo rows 172, 173.
- Containment entry log — names pre-filled, respirator used, task before, time in / time out, typed signature. 31:40 — Fieldflo row 175.
- Employee record depth — employee number, office/division, default cost code, union name and code, payroll group, temp-labour flag, write-ups, documents on the man, linked assets, per-employee PIN flags. 08:40 + 15:51 + 17:00 — Fieldflo rows 93, 96–99, 102.
- Cert photo on file — upload a picture of the actual ticket so the cert name on the scan opens the paper. Makki holds numbers and issuers only. 17:30 + 13:50 — Fieldflo rows 84, 103.
- Roll Call — one click from the dashboard to who is on site right now. 03:45 — Fieldflo row 204.
- Project Book depth — lien information, project designer, consultant, air monitoring specialist, insurance certificate, payroll information, building and owner information, custom tabs; plus prevailing wage and project phases. 22:00–23:30 — Fieldflo rows 128, 135, 136, 139.
- Waste registers — haulers, material types, truck types, landfills as maintained lists behind the load entry. Makki records loads and tip fees but not the registers. 23:00 — Fieldflo row 137.
- Project document folders — named folders with a role per folder, shared/gallery/offline flags, add folder and upload. Makki lists documents; it does not hold them. 24:00 — Fieldflo row 146.
- Min/max reorder levels on inventory and the low-stock reorder trigger they drive. 19:01 — Fieldflo row 108.
- PM-by-PM payroll approval chain with a trailing history, so payroll cannot run until named people have signed. 38:40 — Fieldflo row 200.
- Dashboard stat tiles the owner will look for — days without injury, client count, user count, contracts-in-progress value. 06:45 — Fieldflo row 24.
- Auditors on the JHA — up to 10 extra people signing the safety meeting with their own PIN. 28:30 — Fieldflo row 157.
- Submit a feature idea / what's new — the in-product channel Dan used to prove they listen. 33:40 — Fieldflo row 181.
- Evacuation plan section on the JHA, pulled from the project details. 29:30 — Fieldflo row 160.
- HQ dashboard across branches / multiple offices — only matters when Makki runs more than one office; the owner said "we'll incorporate it across five companies that we have." 24:23 — Fieldflo rows 148, 202.
- Export employees to CSV and bulk download of all QR codes. 13:20 — Fieldflo rows 205, 206.
- Company page, Messages page, and the three-dots admin customisation on every list. 00:00 + 13:20 — Fieldflo rows 6, 8, 65.
Part built — ranked
- QuickBooks — The owner asked for it by name, unprompted, at 08:00: "Connect to QuickBooks." The portal has the settings page and the sync map; it has never called QuickBooks. This is the single loudest thing in the recording and it is blocked only on the owner's QuickBooks Online login. 08:00–12:38 — Fieldflo rows 62, 63.
- Dashboard tabs and widget set — Makki has Today's active projects, Nearing bid hours and Certificates expiring soon; it is missing the CRM / Safety / Equipment dashboard tabs, the New Projects widget, the T&M-change-orders queue and the Messages widget. 00:00–06:45 — Fieldflo rows 14, 19, 20, 21.
- Scheduling board — Makki moves crews by day; Fieldflo shows crew projected vs crew scheduled per day per project, colour-codes projects by whether they are filled, and totals scheduled hours per man. 35:20 — Fieldflo rows 189, 190, 191.
- Inspection engine — Makki can build an inspection form and log a result; Fieldflo walks it line by line with a photo per line and turns a "no" into an assigned corrective action automatically. 20:00 + 30:40 — Fieldflo rows 49, 114, 166, 167.
- Project gauges and stats — Makki has bid-vs-spent rings; Fieldflo adds mandays and waste-loads gauges, days-left, and a stats panel with disciplinary actions, work delays and reportable incidents. 21:30 — Fieldflo rows 125, 126, 127.
- Project-level settings — allow multiple timesheets, allow multiple PSI/JHA, phases, daily overtime trigger, per-project timezone, project-level form settings. 22:00 — Fieldflo row 130.
- Job cost estimate page — Makki has cost breakdown and change orders; Fieldflo adds contract value, a % complete with a change log, labour estimate rows and inventory estimates by category. 24:00 — Fieldflo rows 141, 143.
- Proposal editor — Makki generates a proposal document from a quote; Fieldflo edits line items with markup %, drags in text/image/PDF/signature blocks, toggles Web and PDF, sets an expiration and shows bid total / margin / profit live. 35:10 — Fieldflo rows 186, 187, 188.
- Certificates page depth — cert photo upload, a six-field filter panel (SS last 4, union code, labor type), and the cert-name link to the scanned paper. 17:30 — Fieldflo rows 103, 107.
- Forms lifecycle — Active / Closed / Deleted tabs, download .pdf and .zip, and the red-until-right rule on every form. 25:20 — Fieldflo rows 176, 179, 180.
- End of day for a man who never logs in — Makki's End of Day is a login; Fieldflo's reaches the labourer on his phone with no account at all. 32:00 — Fieldflo rows 30, 178.
- Timesheet head starts — "same as previous day" and "pull from scheduling" as explicit buttons. 25:57 — Fieldflo row 151.
- Inventory depth — next-inspection-due column, yard/aisle location, asset tag, asset class, quick transfer, item rates (hourly/daily/weekly/monthly) and T&M cost. 19:30–20:00 — Fieldflo rows 108, 111, 112.
- 4-week look ahead as its own view alongside the Timeline. 37:20 — Fieldflo row 194.
- Payroll filters — office, project type, verify status, approval status. 38:20 — Fieldflo row 197.
- Role Profiles as saved, reusable permission presets rather than five fixed roles. 08:30 — Fieldflo row 29.
- Project Inventory Report as an exportable report rather than an on-screen panel. 21:00 — Fieldflo row 121.
Out on the owner's rail — decide, do not build
These are the only things Fieldflo does that Makki deliberately does not. Every one is RULE #1: nothing sends, publishes or contacts anyone without Omar's explicit OK, except row 62 which is the mock-data rail (#7).
- A1 (rail: RULE #1) — SMS to each labourer to verify his time and hours, and "were you injured" (Fieldflo 67, 178). 09:40, 32:00.
- A2 (rail: RULE #1) — SMS to every man on the timesheet to verify he understood the safety meeting (Fieldflo 164, 165). 30:20.
- A3 (rail: RULE #1) — SMS asking each labourer for his location at clock-in (Fieldflo 154). 27:20.
- A4 (rail: RULE #1) — "Send Verify SMS" and "Mark week approved & notify" from payroll (Fieldflo 198). 38:20.
- A5 (rail: RULE #1) — deploy a message to the whole crew or company by text or email (Fieldflo 38). 06:10.
- A6 (rail: RULE #1) — the notification digest sent as an email with Makki's logo, rather than read in the app (Fieldflo 71). 11:10.
- A7 (rail: RULE #1) — emailing the office automatically when a man without the right certs is added anyway (Fieldflo 152). 26:30.
- A8 (rail: RULE #1) — Send on a proposal, straight to the client (Fieldflo 144, 187). The portal builds the proposal and stops: "Draft — The owner sends." 24:00, 35:10.
- A9 (rail: RULE #1) — sending each employee his own schedule to his phone or email (Fieldflo 192). 35:20.
- A10 (rail: RULE #1) — "Send Forms" in the forms bulk menu (Fieldflo 179). 25:20.
- A11 (rail: RULE #1) — notifying the assignee of a corrective action, and notifying the warehouse manager of a failed equipment inspection (Fieldflo 113, 167). 20:00, 30:40.
- A12 (rail: mock-data #7) — a live QuickBooks Online connection (Fieldflo 62, 63). The page, the entity map and the fallback are built; the call is not made because the owner's login has not been given. 08:00.
The thing to say to Omar about the rail: eleven of these twelve are the same decision, not eleven decisions. Fieldflo's product is an outbound messaging machine — SMS to verify time, SMS to verify the safety meeting, SMS for the schedule, email for the digest, email for the cert warning, Send on the proposal. The owner will feel that absence before he feels any of the 34 unbuilt features, because it is what makes Fieldflo work without anyone logging in. If Omar wants parity, the question is one question: does the Makki hive get an outbound channel, and who approves each send?
Part 4 — what the three earlier analyses missed, got wrong, and what has closed since
Opened only after Parts 1–3 were written and saved:
profile/Fieldflo_Call_Gap_Analysis_2026-09-20.md (169 lines),
profile/Fieldflo_Video_Frames_2026-09-20.md (165 lines),
profile/Master_List_2026-09-16.md Part 2 (141 tasks).
Nothing in Parts 1–3 was changed after reading them.
4a. Fieldflo_Video_Frames_2026-09-20.md — 49 frames
It is accurate. I read 178 frames against its 49 and found nothing it describes that my frames contradict. Its three headline judgements are right and I reached each of them independently before opening it: the multi-language claim is a Google Translate widget, not a Fieldflo language pack; the product is written to US rules (AHERA, OSHA, Maryland and Pennsylvania county skills — nothing Alberta anywhere); and there is no phone in the whole 43 minutes, only desktop Chrome plus outbound SMS. Its closing observation — no invoice, no payment, no AR, no holdback and no QuickBooks screen in 43 minutes — is the single most useful line in any of the three files, and my 178 frames agree with it.
What its 49 frames did not reach. One frame every ~53 s, chosen by contact sheet, is a sampling method; a 20-second grid plus transcript-driven cuts reaches ten screens it missed:
- The training quiz itself —
/safety-exam-quiz/2172(f_1540), five multiple-choice asbestos questions with Back to Training / DONE. Its §B row asserts "an embedded video and a quiz" on Dan's word at @15:31; the quiz is not in any of its 49 frames. The claim turns out true — it was just unevidenced when written. - The Trainings Needed page —
/public/employee/trainings-needed/1563(f_1500): thirteen trainings with Deploy Status (Deployed–Email / Deployed–SMS / Enrolled), Quiz Status and a "Go to training" link. This is Fieldflo's third no-login public page and the frames doc records only one (1410). - The scanned certificate opening from the scan page —
/company-employee/open-certificate/employee_1563_roni-lead-cert…pdf(f_1400), a photographed Weecycle Environmental lead certificate. The doc stops at the cert list. - Live weather and the OSHA heat index on the JHA (
f_2920) — Current 85F / 6.91mph SW / 56% humidity, Forecast 63–90F, Heat Index 88 current and 98 forecast, each with a "have you reviewed this with the crew" question. Its2815row lists "Weather Questions" as a section name and never opens it. This is a real Fieldflo capability that no earlier file records. - The employee's own "VERIFY YOUR WORKING DAY" modal (
f_3200) — time and positions correct, the break attestation "according to local, state and federal regulations", "Were you injured?" with "Once you hit submit you cannot reverse an injury", then a PIN. And the supervisor's "STOP CLOCK FOR ALL" modal (f_3140) with meal and 2nd-meal start/end. - The notification email as delivered (
f_1200) — the actual Gmail digest, ~60 rows of employee / cert name / expiry / View Cert. The doc has the settings page (1050) but never the message. - The equipment location map (
f_0735,f_0740) — "Where are your vehicles, equipment and heavy equipment", Rentals and Heavy Equipment toggles, Map/Satellite, clustered pins, per-asset popups ("Falcons Demolition / 1 AMD Drive Northwest / Skid Steer", "Oakland Coliseum Demolition / Dump Truck / Equipment Trailer"). Its0727row lists the equipment widgets but not this map. - The CRM leads list populated (
f_3440) — 158 leads · $4.2m active pipeline, ten named leads with client, status pill and value. Its0745is the CRM dashboard only. - Project Document Management (
f_2400) — the folder tree itself: Air Monitoring, Company Documents, Containment Entry Logs, Contract Documents, Form Images, Inspection Checks, Manifests, Permit & Modification, Permits/Notifications, Pictures, Plans and Specs, with a Role column per folder. - The JHA signature block wording (
f_2930) — the acknowledgement paragraph (including the COVID clause), "Add Visitor | Add Employee", an SMS-resend control and per-worker SMS SENT chips.
Two small corrections. Its 2600 row calls the per-form icons "translate, email, print and delete"; the bulk ⋯ menu I read at f_2520 is Translate to English · Download Forms .pdf · Download Forms .zip · Send Forms · Close Forms · Delete Forms — "print" is a PDF download. And it says the Reporting Center has 19 reports while the permission sheet at f_0900 names 18; both are right, from different screens (the Reporting Center tiles add Employee Timesheets, Production Tracking and Project Billing and drop Employee Sharing). Neither changes anything.
4b. Fieldflo_Call_Gap_Analysis_2026-09-20.md — six claims that are wrong today
Its rule was "every 'not built' claim was confirmed by searching the portal source". Measured against the portal as it stands today, six rows do not hold:
| Its claim | Measured today |
|---|---|
| "Form builder — Zero code in any portal file. No form designer, no section list, no field palette." | Wrong — closed. Built 2026-09-23, published 09-24 (vault/DONE.md). Live now on three seats: ali/forms, sam/forms, dale/forms. Form templates / 3 on file · 3 ship with the app · build your own below, with New template, Add a field, Save template and field types Text / Yes-No / Number / Choice list / Photo / Signature |
| "Skills matrix / filter-by-skill dispatch — People records have trade and crew. No skills checklist." | Wrong. app-people.js: <h3>Record a skill on a man</h3>, <h3>Sites that demand a skill</h3>, <h3>Sites that demand an orientation</h3>, kpi("Skills held") |
| "Per-diem tracking — Not in the portal." | Wrong on the day it was written. "Per diem", "Per diem applies on this job", kpi("Per diem"). The Master List's own V68 was marked CLOSED 2026-09-20 — the same date. The two 09-20 files contradict each other |
| "Waste manifest / waste reporting — no waste-load form, no load-out tally, no manifest in any portal file." | Wrong. <h3>Waste & landfill tickets</h3>, Add a load, kpi("Waste tickets"), kpi("Tip fees"), kpi("Tonnes"), kpi("Loads"), kpi("Recycled loads"), kpi("Hazmat loads"). The hauler / truck-type / landfill registers are still missing, so this is Part built, not Not built |
"GPS clock-in … app-ops.js shows Geo Fencing and Geo Tagging UI fields on the timesheet but their values are decorative demo flags." |
Wrong, and the worst error in the three files. grep -ciE 'geo.?fenc|geo.?tag' portal/*.js → 0. There is no Geo Fencing or Geo Tagging field anywhere in the Makki portal. Those two status dots are on Fieldflo's timesheet header (my f_2630). A competitor's UI was written into our source description |
| "Equipment with QR per asset, scan-to-inspect without login" listed under Built | Overstated. Every asset carries a code (a code on every one), but no code opens a no-login inspection. The only no-login page in the portal is ?hat= for a person, which I proved live. Part built |
Two smaller ones: it files the hard-hat scan under app-people.js / certs.js — it is
app.js:1589, function inspectorView(code) (right conclusion, wrong file). And its §4-C
says the owner's SMS failure "was present across the whole second half of the call, not just in
scheduling", citing @27:47. At @27:47 Dan only says a text is coming; the owner's complaint
lands at @35:48 and @36:24. The pervasiveness is an inference, not something the owner said —
and the competitive point stands without it.
What it got right that still matters. the owner is in procurement, not research ("they have approved to spend money"). The real pain is adoption, not features ("some people were using it, some people weren't, everything was out of whack"). Their SMS broke live in front of him and that is the clearest opening in 43 minutes. The hard-hat QR was the "wow" and Makki already has it — I confirmed it live today on a no-login URL. And @32:09, the owner asked out loud for an orientation video for his managers and nobody has offered him one. That ask is not a portal capability, so it does not appear in my Part 3; it should not be lost.
4c. Master_List_2026-09-16.md Part 2 — 141 tasks vs 207
It under-counts the video by about a third. It reads 141 tasks; I read 207 off 178 frames plus the full transcript. The 66-row difference is almost entirely detail a transcript cannot carry, because Dan narrated in generalities while the screen showed specifics: the OSHA 300/301 tabs with their csv and xlsx downloads and case classifications; the equipment nearing-maintenance trigger columns; the equipment and rental location map; the CRM lead record and its nine money tiles; the live weather and heat index; the notification email as delivered; the Trainings Needed page; the quiz; the JHA's five hazard groups; the proposal's margin / profit / Send; the payroll SMS-sent and verified columns. A transcript-led list systematically under-counts a screen-share.
Its page count is now one short in three places. Part 4 reads "42 pages — Owner 15 · Bookkeeper 5 · Estimator 5 · Site lead 10 · Crew 4". Driven live today the portal gives Owner 16 · Bookkeeper 5 (4 on by default) · Estimator 5 · Site lead 11 · Crew 5, because Forms was added to the owner, the site lead and the crew on 2026-09-23. The total is still 42 only because the split moved.
Five of its open holes have closed since, verified live by me today rather than taken on any file's word:
- V49 / V52 — add and renew a ticket. Live:
Add a new ticket / Renew one he holds, andA renewal keeps the old ticket on file — nothing is ever deleted.Its own 09-17 correction already recorded this. - V53 — a PDF pack of certificates. Live:
<h3>Certificate pack · …</h3>withkpi("Men in the pack"),kpi("Included"),kpi("Not included"). - V61 — maintenance and repair history per machine. Live:
<h3>Inspections and repair history</h3>inapp-yard.js. - V45 — skills and picking a crew by skill. Live, as in 4b.
- V62 (part of V62–V64) — loadout lists. Live:
A LOADOUT LIST — what a job needs, out of the yard and back, andkpi("Ordered"),kpi("Out to site"),kpi("Came back"),kpi("Consumed"). V63 is part closed (consumption lands against the job) and V64 is still open — there is no exportable project inventory report.
And two more that no earlier file records, both since 09-20:
the Form Builder (09-23, published 09-24) and tickets Edit / Delete (published
09-26, cache v25-ticketedit) — live today as To correct or delete one, open the man and use Edit or Delete on the ticket.
Still open, exactly as it says: V128/V32/V33 QuickBooks — The owner's first unprompted words on the call and still only a settings page. V104/V106/V131 the abatement paperwork — the containment log and the asbestos lines on the daily, which the owner flagged himself at @4:26 before Dan showed anything. V96 the JHA task library. V4/V136–V138 the labourer who never logs in. V130 the manager orientation video.
Its §3b is the best thing in the three files and I confirm it independently. Fieldflo
showed no invoice, no payment, no accounts receivable and no holdback in 43 minutes. Makki
has Collections & AR, Outstanding, To Invoice, Payments and a nightly Collector that
drafts invoices. Measured live today: priya/outstanding: Outstanding Receivables / 75 invoices awaiting payment · $1.43M owed and priya/toinvoice: To Invoice / 18 finished jobs not yet billed · $561.8K. That is a whole axis Fieldflo does not have, and it
should be said to the owner out loud rather than left in a file.
4d. One thing all three missed
None of the three names the shape of the difference, which 178 frames make obvious: Fieldflo is an outbound messaging machine wearing a portal. SMS to verify time, SMS to verify the safety meeting, SMS for the schedule, SMS for the location, email for the digest, email for the cert warning, email when a man is added without a ticket, Send on the proposal. Eleven of the twelve rail rows in Part 3 are that same one decision. Makki's portal is the opposite shape: everyone logs in, everything is gated at the field level, and nothing leaves the device. That is the owner's and Omar's rule, and it is defensible — but it is one decision, not eleven, and it is the first thing the owner will feel.
Fieldflo capabilities 207 — Built 68 / Part built 66 / Not built 65 / Out on rail 7 / NOT MEASURED 1 — 2026-09-26T21:37:26Z