The master list — every page, every action, every task the owner asked for (2026-09-16)
RE-COUNTED 2026-09-20 — after three builds landed
Three builds landed in
portal/on 2026-09-20 and are recorded as verified by their own suites (verify_day59,verify_job76,verify_notify83, withverify_fieldops,verify_mapand_qa/gating_assert195 still passing):portal/app-day.js(the field day and payroll) ·portal/app-job.js(job setup and closeout) ·portal/app-notify.js(notifications, the digest and the safety log), each with its ownops-*.jsmock-data file.Between them they claim 28 rows of Part 2. All 28 were re-read against the code, not against the builders' own header comments. 24 are now Built. Four are not and stay Part built with the gap named in the row: V29 (the change-order notice is broken —
[object Object], and only the first status move fires), V74 (a question template can be answered, not authored), V86 (the men on the timesheet are still the login's own crew, not the board's), V99 (the notice fires, but to the owner and the lead, not to the man who owns the corrective action).
Part 2 Before (2026-09-17) After (2026-09-20) Built 32 56 Part built 58 43 Not built 44 35 Deliberately out 2 2 Not app tasks 5 5 Total 141 141 Part 4 was re-done by counting the 141 rows of the Part 2 tables, not by arithmetic on the old numbers. Part 3a's holes table went from 30 holes / 45 tasks to 25 open holes / 35 tasks; the eight rows closed today are struck through and marked CLOSED there, so nothing on this page contradicts the table. Nothing in
portal/was touched to write this, and nothing was sent anywhere.
Written on Omar's order: "Did you list EVERYthing that is gonna be on the website/app — like every page and everything that you can do. And then bring up everything the owner asked for in the video I sent you, I need EVERY task. Make sure it's every task."
What this file is. Part 1 is the app read page by page and button by button out of the portal's own source code, not out of memory or an earlier list. Part 2 is every task the owner saw or asked for in the Fieldflo video, one row each, traceable to a line in the notes. Part 3 is the gaps both ways. Part 4 is the count.
Sources — only these.
- Code:
portal/roles.js,portal/app.js,portal/app-ops.js,portal/app-ops2.js,portal/app-map.js,portal/ops.js,portal/ops2.js,portal/certs.js,portal/data.js,portal/geo.js,portal/index.html,portal/qr.js,portal/app.css. - Video:
profile/Fieldflo_Video_Workflows_2026-09-15.md(247 lines, read in full) andprofile/Fieldflo_Competitor_Call_2026-09-08.md(87 lines). - The old list, for Part 3c only:
profile/Screen_Inventory_2026-09-16.md.
Two standing facts. Every figure, name, ticket, permit and date in the app is demo data — the app carries a DEMO band on every screen and says so. Nothing in the app sends anything to anyone: where Fieldflo texts, the portal shows the message on screen and states that it was not sent.
Load order matters. index.html loads app.js → app-ops.js → app-ops2.js → app-map.js. Later files overwrite earlier ones. Three pages are overwritten: Start Day, Project Book and Crew's My Schedule. The rows below describe the live version, and say which file wins.
Part 1 has NOT been re-read since 2026-09-20.
index.htmlnow also loadsapp-day.js,app-job.jsandapp-notify.jsafterapp-map.js, and those three wrap Start Day, the crew's Today, the Project Book's job modal, the closeout, Payroll Approval, the Safety page and the owner's and lead's dashboards. The page and action rows below are therefore incomplete for those screens — they are not wrong about what was there, they simply do not yet list what 2026-09-20 added. Part 2 is the current record; Part 1 is as at 2026-09-17 (except A4, which was corrected because it flatly contradicted V29). The 42 pages figure is unchanged — the three builds added panels to existing pages and no new tab.
PART 1 — EVERY PAGE AND EVERY ACTION IN THE APP
1A. The pages
There are five logins (roles.js ROLES): Owner (ali/owner), Bookkeeper (priya/books), Estimator (ray/quotes), Site lead (sam/site — the old sam/pm still works), Crew (dale/crew). The Owner's 15 tabs are shown as 7 groups (roles.js GROUPS.owner); the other four logins have a flat tab bar and no groups (navGroups() returns null for them).
Order below is the app's own: login screen first, then each login's nav in its own order, then the two pages that need no login at all.
| # | Login(s) | Group | Page — nav label / page heading | What you can DO on it | Built? |
|---|---|---|---|---|---|
| 1 | everyone (before sign-in) | — | Sign in to your dashboard (index.html, buildLogin in app.js) |
Click any of 5 role cards to auto-fill its credentials · type username + password · press Enter or Sign in → · sign in as an owner-created team member with email + password · Install app button (opens the install sheet) · read the ✓/✕ "what this login sees" list on each card · read the DEMO · SAMPLE DATA note | Built |
Owner — 15 tabs in 7 groups (GROUPS.owner, app.js, app-ops.js, app-ops2.js, app-map.js)
| # | Login(s) | Group | Page — nav label / page heading | What you can DO on it | Built? |
|---|---|---|---|---|---|
| 2 | Owner | Dashboard | Dashboard / "Owner / Company Overview" (app.js:662) |
Read 4 hero cards (Revenue, Jobs, Outstanding, Profit) each with a sparkline and a click-through to another tab · Job sites map (app-map.js): hover or focus a pin for address, status and contract value, click a pin to open that job, click a status chip to hide/show those pins, read the by-area counts, see the downtown inset · Who's on site today per crew (started time, site, men, talk done, confirmations) · Bid vs actual — open jobs table, hottest first, click a row to open the job · Overtime flag (32+ / 40+) with a Payroll → button · Bid vs actual by cost code summary card, clicks through to the Project Book · Change orders card (approved / awaiting customer) with clickable rows · Revenue vs Profit trend: change the period from a dropdown (re-buckets live), hover the chart for a date + $ tooltip, read the stat strip · Where the money goes cost bars · Payment status donut · Recent Jobs table with live search + Status / Type / Client filters, click a row to open the job P&L |
Built |
| 3 | Owner | Jobs | Pipeline / "Sales Pipeline" (app.js:744) |
Read 4 KPIs (quotes sent, quote value, win rate, won value) · quote value by year bars · win rate by year bars · Recent quotes table with live search and an Outcome filter | Built |
| 4 | Owner | Jobs | Proposals / "Proposals" (app-ops.js:641) |
Quotes table with live search + Outcome / Work filters · click a row or its Proposal → button to open the proposal document · in the proposal: read prepared-for / site / date / valid-until / work / estimator, scope of work, Included and Not included lists, price + GST + total, terms, signature blocks · Print / Save as PDF (the browser's own) · close | Built — marked DRAFT; the owner sends it, nothing is emailed |
| 5 | Owner | Jobs | Jobs & P&L / "Jobs & P&L" (app.js:736) |
Every won job with demo date, project, invoice, PM, contract, cost, profit, margin, status · live search + Year / Month / Status / PM filters · click any row to open the job modal (see A20–A24 below) | Built |
| 6 | Owner | Jobs | Project Book / "Project Book" (app-ops.js:294, extended by app-ops2.js:333) |
4 KPIs (permits expiring, permits expired, no permit on file, men blocked) · open-jobs table: job, site, client, crew, permit pills, extra tickets the job needs, crew ready/blocked, status — with live search + Status / Crew filters · click a row to open the job modal (scope, permits, waste, P&L, cost codes, change orders, photos, documents, closeout) · Bid vs actual by cost code full table across all open jobs (budget, spent, used bar, variance) | Built |
| 7 | Owner | Schedule | Schedule Board / "Schedule Board" (app-ops.js:351, drag added app-ops2.js:383) |
Crews × 6 days grid · ← Previous week / This week / Next week → · click any cell to open the slot picker (choose a site or "No work / off", Save or Cancel) · drag a crew's day onto another day or another crew (tap-and-hold on a phone); dropping on an occupied cell swaps the two · a drop that would put a crew on a job it lacks the ticket for is refused and opens a block modal naming each man and each missing ticket · Text the week to the crew (in-app demo) shows the exact message every man would get, and states nothing was sent | Built |
| 8 | Owner | Schedule | Timeline / "Timeline" (app-ops2.js:472) |
Read-only Gantt: open jobs as bars grouped by crew, week headers, a Today line, colours for Open / Partial / Not started, a hatched "estimated span", a "No crew set" group, hover a bar for project + dates + note · click a bar to open that job | Built |
| 9 | Owner | Money | Collections / "Collections & AR" (app.js:770) |
4 KPIs (total outstanding, holdbacks, in court, to invoice) · open receivables table — project, invoice, status, owed incl GST, GST, demo date, age — oldest first, with a total row, live search and a Status filter | Built |
| 10 | Owner | Money | Payroll / "Payroll Approval" (app-ops.js:597) |
← Previous week / This week / Next week → · Export CSV (downloads a file headed "DEMO DATA", owner export includes rate and pay) · Approve this week (records who approved and when; afterwards the button is replaced by an "Approved by … " stamp) · 4 KPIs (hours, over 32 h, labour cost, status) · hours-per-man table by day with totals, a 32+/40+ flag, rate and pay columns, live search and a Crew filter · hours-per-job table with men, hours and labour cost | Built |
| 11 | Owner | Money | QuickBooks / "QuickBooks Online" (app-ops.js:548) |
Read the "Not connected" status panel · Connect QuickBooks Online button — it only explains that it needs the owner's QuickBooks login; nothing connects · read the what-would-sync table (Customers, Jobs/projects, Invoices, Payments, Employees — each with direction and what it does), every row marked Waiting · read the CSV fallback line and "Last sync: never" | Part built — a settings page, no integration |
| 12 | Owner | People | Team & Access / "Team & Access" (app.js:797 + app-ops.js:54) |
Add a team member: full name, work/Gmail email, role dropdown, temporary password (pre-generated) → Add member; validates the email and refuses a duplicate · Team table (5 demo accounts + everyone added) showing person, role badge, what that role sees, sign-in credentials — with live search and a Role filter · Edit a member (name, role, password — email locked) · Remove a member (their login stops working) · Who sees what: one on/off switch per page per person, flipped live; the owner's own login cannot be switched off; a switched-off tab disappears from that person's menu and render() refuses to open it by link · Reset all switches |
Built — owner-only, refuses to render for any other login |
| 13 | Owner | People | Tickets & Certs / "Tickets & Certificates" (app.js:1395 → certsPage) |
4 KPIs (men on the books, tickets in date, expiring, expired) · Needs attention table (man, ticket, expires, days left, status) with search and a Ticket filter, click a row to open the man · Put a man on a crew: pick the man, the crew and optionally the job → Add to crew; it lists what the crew needs plus what the job needs, then either allows him or refuses him and names every missing or lapsed ticket · The men table (man, crew, ticket chips, worst status, hat code) with search and Crew / Status filters · Show archive / Hide archive — every expired or renewed ticket, kept and never deleted, searchable · click a man for his file: hat code, phone, start date, day rate, his QR code, Open the scan view, tickets held, tickets replaced by a renewal | Built |
| 14 | Owner | Safety | Safety / "Safety & Incidents" (app-ops.js:525 + app-ops2.js:490) |
4 KPIs (open actions, incidents, inspections, closed actions) · Corrective actions list — Close or Reopen any one; overdue goes red; closed ones stay on file · Report an incident: type (near miss / stop work / injury), date, site, what happened, immediate action taken, plus an optional corrective action (the fix, its owner, its due date) → File it · Incidents table with search and a Type filter · Inspections table · Log an inspection: site, kind, result (pass / deficiencies), notes → Log it · Safety documents library — JHA, SWP, toolbox talks, SDS with rev, updated date, pages and which jobs require them, searchable and filterable by type, Open any one to read its placeholder page | Built — the 11 documents are placeholders |
| 15 | Owner | Gear | Equipment / "Equipment & Rentals" (app-ops.js:426) |
4 KPIs (assets, on rent, rentals overdue, inspections) · Reminders list (rentals to call off, inspections due) — click any to open the asset · Asset list (code, asset, owned/rental, where, next inspection, return by, value or day rate, status) with search and Kind / Status filters · click an asset for its record and its QR code, then See the scan page for the read-only view an operator gets | Built — the equipment list is invented; the owner has not given us his |
| 16 | Owner | Gear | Inventory / "Inventory" (app.js:794 → invPage) |
Stock-on-hand table (item, on hand, unit price, OK / Low stock) with search and a Status filter | Built |
Bookkeeper — 5 tabs, flat nav (TABS.book)
| # | Login(s) | Group | Page — nav label / page heading | What you can DO on it | Built? |
|---|---|---|---|---|---|
| 17 | Bookkeeper | — (flat) | Dashboard / "Accounting Overview" (app.js:986) |
4 hero cards (total outstanding, to invoice, in court, holdbacks) · the job-site map, pins limited to her own view · Invoiced vs Collected trend with a working period dropdown and a hover tooltip · outstanding-by-type bars · invoice-status donut · Oldest Outstanding table with search and Status / Type / Client filters, click a row to open the invoice view of a job | Built — costs and profit are not on the objects this login receives |
| 18 | Bookkeeper | — (flat) | Outstanding / "Outstanding Receivables" (app.js:1030) |
Money-owed table (project, invoice #, PO #, status, owed incl GST, GST, demo date, age), oldest first, with a total row, live search and a Status filter | Built |
| 19 | Bookkeeper | — (flat) | To Invoice / "To Invoice" (app.js:1047) |
Finished-but-unbilled jobs (project, PO #, demo date, age, invoice value, + GST 5%) with a total row and live search | Built |
| 20 | Bookkeeper | — (flat) | Payments / "Payments" (app.js:1061) |
3 KPIs (paid/settled, still owed, total invoices) · invoice-status donut | Built |
| 21 | Bookkeeper | — (flat) | Payroll hours / "Payroll hours" (app-ops.js:598) |
Same page as the owner's Payroll minus every rate and every dollar · week back / this week / forward · Export CSV (hours only) · hours per man and hours per job · no Approve button | Built — switched OFF by default (TABS.book, the only tab in the app that ships off); the owner switches it on for her on Team & Access |
Estimator — 5 tabs, flat nav (TABS.est)
| # | Login(s) | Group | Page — nav label / page heading | What you can DO on it | Built? |
|---|---|---|---|---|---|
| 22 | Estimator | — (flat) | Dashboard / "Estimating Overview" (app.js:1093) |
4 hero cards (quotes out, win rate, won value, average quote) · Quoted vs Won trend bucketed by quote date, with a period dropdown and a hover tooltip · recent-quotes table with search and Outcome / Year filters · no map — this login holds no jobs, so HOOKS.siteMap returns nothing |
Built |
| 23 | Estimator | — (flat) | My Quotes / "My Quotes" (app.js:1124) |
Every quote he wrote (quote date, site, quoted, won / open-lost, year) with search and Outcome / Year filters | Built |
| 24 | Estimator | — (flat) | Win Rate / "My Win Rate" (app.js:1134) |
4 KPIs · win rate by year bars · quoted value by year bars · a year-by-year table | Built |
| 25 | Estimator | — (flat) | Proposals / "Proposals" (app-ops.js:642) |
The same proposal builder as row 4, limited to his own quotes and with no estimator column, no sell price, no profit | Built |
| 26 | Estimator | — (flat) | Bid vs Actual / "Bid vs Actual" (app-ops2.js:359) |
4 KPIs (jobs, budget, spent so far, codes over budget) · one panel per open job he bid, each with its cost-code table (code, name, budget, spent, used bar, %) and a "% of budget spent" pill · no variance column, no sell price, no profit | Built |
Site lead (foreman) — 10 tabs, flat nav (TABS.lead)
| # | Login(s) | Group | Page — nav label / page heading | What you can DO on it | Built? |
|---|---|---|---|---|---|
| 27 | Site lead | — (flat) | Dashboard / "My Overview" (app.js:907) |
4 hero cards (my jobs, active now, contract value, upcoming demos) · the job-site map, his jobs only · Contract vs Cost trend with a period dropdown · a line stating company profit and margin are not in this role · my-cost-mix bars · my-jobs-by-status donut · Recent Jobs table with search and filters, click a row to open the job | Built |
| 28 | Site lead | — (flat) | Start Day / "Start Day" (app-ops.js:104, overwritten by app-ops2.js:108 which adds the photo panel) |
Before starting: pick the site from a dropdown (pre-selected from the board if the board has him somewhere today) → Start Day. After starting: 4 KPIs (on site, hours today, safety talk, confirmed) · a blocked-men panel naming every man who lacks a ticket this crew or this job needs · Timesheet — change any man's hours (number input, saved as you type), see his tickets OK / Blocked, his week-so-far with a 32+ flag, and his end-of-day answer · Pre-job safety talk — pick the topic from 6, tick all 6 checklist items, then Talk done — crew briefed (disabled until every item is ticked; locks the list once closed) · Site notes — type, or Talk into it using the browser's own speech recognition in 6 languages (English, Español, Filipino, ਪੰਜਾਬੀ, Français, العربية), then Add note; every note is stamped and marked spoken or typed · Send end-of-day check to the crew (in-app) — disabled until the talk is closed; afterwards it shows the exact message each man sees and states nothing was texted · Reset today's daily (demo) · Site photos — pick a stage (Before / During / After / Closeout), write a caption, Take / choose photo (opens the phone camera), the picture is resized to 960 px and kept on the device; click any photo to open it full size | Built — in-app only; texting is not switched on |
| 29 | Site lead | — (flat) | My Jobs / "My Jobs" (app.js:963) |
Assigned jobs with demo date, project, status, contract, actual cost and a cost-vs-contract bar; search and a Status filter; click a row for the job modal (his version: no profit, no margin) | Built |
| 30 | Site lead | — (flat) | Schedule / "My Schedule" (app.js:970) |
Upcoming demos table and Completed table, each with search and a Status filter, each row clickable into the job | Built |
| 31 | Site lead | — (flat) | Crew Board / "Crew Board" (app-ops.js:352) |
The same board as row 7 limited to his own crew — week navigation, click a cell to move the crew, drag-and-drop with the same ticket refusal, and the in-app text preview for his crew only | Built |
| 32 | Site lead | — (flat) | Timeline / "Timeline" (app-ops2.js:473) |
The same Gantt as row 8, his crew's jobs only | Built |
| 33 | Site lead | — (flat) | My Crew / "My Crew" (app.js:1400 → certsPage) |
The same ticket page as row 13 limited to his crew, including Put a man on a crew (his crew only), the attention list, the archive and each man's file — but with no course-cost column and no day rate | Built |
| 34 | Site lead | — (flat) | Safety / "Safety & Incidents" (app-ops.js:526 + app-ops2.js:490) |
The same safety page as row 14, his jobs only, including reporting an incident, logging an inspection, closing a corrective action and the document library | Built |
| 35 | Site lead | — (flat) | Equipment / "Equipment & Rentals" (app-ops.js:427) |
The same equipment page as row 15 with no value and no day-rate column | Built |
| 36 | Site lead | — (flat) | Materials / "Materials" (app.js:983 → invPage) |
Shared disposal stock — the same table as row 16 with a "shared across crews" note | Built |
Crew (labourer) — 4 tabs, flat nav (TABS.crew)
| # | Login(s) | Group | Page — nav label / page heading | What you can DO on it | Built? |
|---|---|---|---|---|---|
| 37 | Crew | — (flat) | Today / "Today" (app.js:1176) |
His site card: address, task, demo date, crew, status, and a PPE reminder · the job-site map, tap a pin for the address and status — no drill-in for this login · a warning panel if any of his own tickets is expiring or expired, with a See all my tickets → button · a Next up / last sites table · not one dollar figure is on the objects this role receives | Built |
| 38 | Crew | — (flat) | End of Day / "End of Day" (app-ops.js:211) |
If the foreman has not started the day, it says so. Otherwise: read his hours for the day and the safety-talk topic, then Yes, I attended or No, I did not, and tick My hours are wrong — flag it for the foreman. His answer is stamped, shown back to him, changeable, and appears on the foreman's Start Day and the owner's dashboard | Built — in-app; this is the question Fieldflo sends by text |
| 39 | Crew | — (flat) | My Schedule / "My Schedule" (app.js:1212, overwritten by app-ops.js:385 which adds the week strip) |
A six-day week strip showing where he is each day (today marked) · a full table of his crew's sites (demo date, site, task, status, age) with search and Status / Task filters | Built |
| 40 | Crew | — (flat) | My Tickets / "My Tickets" (app.js:1224) |
The code on your hard hat — his QR drawn on the device, his name, trade, crew and hat code, and See what the inspector sees · what he holds (expired ones included) · tickets replaced by a renewal | Built |
Pages that need no login at all
| # | Login(s) | Group | Page — heading | What you can DO on it | Built? |
|---|---|---|---|---|---|
| 41 | No login — reached by scanning a hard hat (?hat=MK-xx, inspectorView in app.js:1412) |
— | Read-only ticket check | See the man's name, trade, crew and hat code · a verdict banner: "N EXPIRED tickets — do not let him start" / "All in date · N expiring soon" / "All tickets in date" · every ticket held with number, issuer, expiry and status · the archive of renewed ones · Back to the portal · the page states it shows tickets only — no pay, no phone number, no job costs, because they are not on the object it is given | Built — works offline, the code is drawn on the device |
| 42 | No login — reached by scanning an asset (?asset=xx, assetScanView in app-ops.js:462) |
— | Read-only equipment check | See the asset name, make, owned/rental, code and serial · a verdict banner (in service / due back / inspection overdue) · where it should be, last inspected, next inspection, and for a rental who to return it to and by when · Back to the portal | Built — read-only; you cannot log an inspection from it |
Every page name above is the label the code itself uses. Nothing is generated dynamically except: the sub-heading lines, which are built from live counts (e.g. "N jobs with a book"); the crew names on the board and the Gantt, which come from certs.js crews; and the week labels on the board, Gantt and payroll, which are computed from OPS.WEEK.start.
Count for Part 1A
42 pages in all. 39 of them are login × tab pairs, 1 is the sign-in screen, 2 need no login. Split by login: Owner 15 · Bookkeeper 5 (one off by default) · Estimator 5 · Site lead 10 · Crew 4 · no login 2 · pre-login 1. Distinct page implementations are fewer than 39, because seven are one function serving two logins with different projections: the board, the Gantt, Equipment, Safety, Payroll, Proposals and the tickets page.
1B. The actions that are not pages
| # | Login(s) | Where it lives | Action — exactly as the code labels it | Built? |
|---|---|---|---|---|
| A1 | everyone | Login screen | Click a role card → fills that role's username and password | Built |
| A2 | everyone | Login screen + top bar | Install app → a sheet with the app icon, an Install app button, and per-platform steps for iPhone, Android and desktop; hides itself once installed | Built |
| A3 | everyone | Top bar | Search box — mirrors what you type into the current page's table filter; goes grey and disabled on a page with no table | Built |
| A4 | everyone | Top bar | Notifications bell → a popup with Mark all read; carries counts and dates only, never a dollar figure | Built — rebuilt 2026-09-20 for the owner and the site lead: the bell is now a live bus (window.MAKKI_NOTIFY.fire in portal/app-notify.js) fed off the real incident register, change orders and the foreman's site notes, with an unread count and a link back to the record. The bookkeeper, estimator and crew logins still get the three hard-coded mock lines |
| A5 | everyone | Top bar | Sign out | Built |
| A6 | Owner | Left rail | Open / close a nav group (accordion); a group with one tab acts as that tab | Built |
| A7 | Owner | Any page in a multi-tab group | The sub-tab row on a phone (the bottom bar only has room for the 7 groups) | Built |
| A8 | everyone | Every table | Live search + per-column dropdown filters, a live row count, and a "No matching rows" message; options are derived from the table's own cells | Built |
| A9 | Owner, Bookkeeper, Estimator, Site lead | Every trend panel | Period dropdown — re-buckets the same rows over a different trailing window and redraws the chart and the stat strip live | Built |
| A10 | everyone with a chart | Every trend chart | Hover or drag for a date + value tooltip, on mouse and on touch | Built |
| A11 | everyone | Every table on a phone | Rows become label:value cards automatically | Built |
| A12 | Owner | Team & Access | Per-person, per-tab on/off switch — flip it, sign in as them, the tab is gone from their menu and will not open by link | Built |
| A13 | Owner | Team & Access | Reset all switches back to the role defaults | Built |
| A14 | Owner | Team & Access | Add member form → a working login saved on the device | Built |
| A15 | Owner | Team & Access | Edit team member modal (name, role, password; email locked) | Built |
| A16 | Owner | Team & Access | Remove a member — their login stops working | Built |
| A17 | Owner, Site lead | Tickets & Certs / My Crew | Put a man on a crew → allowed, or Blocked with every missing ticket named and why ("never filed" or "expired") | Built |
| A18 | Owner, Site lead | Tickets & Certs / My Crew | Show archive / Hide archive toggle | Built |
| A19 | Owner, Site lead, Crew | Ticket pages | See what the inspector sees → the scan page in a sheet, plus Open it as its own page ↗ | Built |
| A20 | Owner, Site lead, Bookkeeper | Any job row, any map pin, any Gantt bar | Job modal — invoice #, PO #, quote date, demo date, then the money block gated per role (Owner: sell, total w/GST, cost, profit, margin, GST + a cost breakdown · Site lead: contract, actual cost, cost-vs-contract, assignee + his cost breakdown · Bookkeeper: invoice value, owed, GST, to-invoice). Crew and Estimator cannot open it at all (openJob returns early) |
Built |
| A21 | Owner, Site lead, Bookkeeper | Job modal | Job switcher — a dropdown of every job this login may see, ◀ / ▶ arrows, and an "n / N" counter; jumping re-projects, so it can never reach a job or a field the role is not allowed | Built |
| A22 | Owner, Site lead | Job modal | Project book section — scope, permits table with expiry pills, the tickets this job needs on top of its crew's, crew readiness (click a man for his file), waste and hauling | Built |
| A23 | Owner, Site lead | Job modal | Job book tabs — Cost codes · Change orders · Photos · Documents · Closeout | Built |
| A24 | Owner, Site lead | Job modal → Cost codes | Budget, spent, a used bar, % and (owner only) variance, per code and in total | Built |
| A25 | Owner, Site lead | Job modal → Change orders | New change order (what changed, fixed price or T&M, amount) → Save as draft | Built |
| A26 | Owner | Job modal → Change orders | Mark sent to customer · Approve · Decline · Back to draft. Approving raises the revised contract on the owner's view. The code says it plainly: "Sent to customer is a status, not a send" | Built — nothing leaves the device |
| A27 | Owner, Site lead | Job modal → Change orders | T&M day form — date, men, hours each, materials at cost (owner only), materials used, equipment, note → Save day; rolls into the order's man-hours and, for the owner, its value | Built |
| A28 | Owner, Site lead | Job modal → Photos, and Start Day | Take / choose photo — stage, caption, camera or file picker; resized to 960 px, kept on the device, capped at 24 added photos | Built |
| A29 | Owner, Site lead | Anywhere a photo appears | Open a photo full size, with ← Back to job | Built |
| A30 | Owner, Site lead | Job modal → Documents, Safety page | Open a document — a placeholder page watermarked DEMO, with which jobs require it, and ← Back to job | Built — placeholders only |
| A31 | Owner, Site lead | Job modal → Closeout | Open the closeout report — scope, permits, tickets the job needed, waste and landfill tickets, hours on the job, change orders, cost codes (owner only), safety, documents, photos, three signature lines. Owner copy carries prices; the site copy is headed "no prices" | Built |
| A32 | Owner, Site lead | Closeout report | Print / Save as PDF (the browser's own) · ← Back to job | Built |
| A33 | Owner, Estimator | Proposals | Open a proposal → Print / Save as PDF; banded DRAFT PROPOSAL — DEMO DATA | Built |
| A34 | Owner, Site lead | Schedule Board / Crew Board | Click a cell → pick a site or "No work / off" → Save | Built |
| A35 | Owner, Site lead | Schedule Board / Crew Board | Drag a day to another day or crew; swap when the target is occupied; tap-and-hold on a phone | Built |
| A36 | Owner, Site lead | Schedule Board / Crew Board | A drag that would break a ticket requirement is refused, and a modal shows the same block the crew page shows, one panel per man | Built |
| A37 | Owner, Site lead | Schedule Board / Crew Board | ← Previous week · This week · Next week → | Built |
| A38 | Owner, Site lead | Schedule Board / Crew Board | Text the week to the crew (in-app demo) — shows every man's message, sends nothing | Built as a preview only |
| A39 | Site lead | Start Day | Start Day — one button that opens the timesheet, the safety talk and the notes | Built |
| A40 | Site lead | Start Day | Change a man's hours (saved as you type, clamped 0–16) | Built |
| A41 | Site lead | Start Day | Safety-talk checklist — pick the topic from 6, tick all 6 items, Talk done — crew briefed (disabled until every item is ticked) | Built |
| A42 | Site lead | Start Day | Talk — browser speech-to-text in 6 languages, interim results into the box, then Add note | Built — the browser's own recogniser; nothing is uploaded |
| A43 | Site lead | Start Day | Send end-of-day check to the crew (in-app) — disabled until the talk is closed | Built — appears on each man's End of Day tab; nothing is texted |
| A44 | Site lead | Start Day | Reset today's daily (demo) | Built |
| A45 | Crew | End of Day | Yes, I attended / No, I did not + My hours are wrong | Built |
| A46 | Owner, Site lead | Safety | File it — report an incident, with an optional corrective action, owner and due date | Built |
| A47 | Owner, Site lead | Safety | Log it — log an inspection (site, kind, pass or deficiencies, notes) | Built |
| A48 | Owner, Site lead | Safety | Close / Reopen a corrective action; it stays on file either way | Built |
| A49 | Owner, Site lead | Equipment | Open an asset → its record and its QR code → See the scan page | Built |
| A50 | Owner, Bookkeeper | Payroll | Export CSV — a file headed "DEMO DATA"; the owner's carries rates and pay, the bookkeeper's carries hours only | Built |
| A51 | Owner | Payroll | Approve this week — records who and when, then shows the stamp instead of the button | Built — one approver, no chain |
| A52 | Owner, Bookkeeper | Payroll | ← Previous week · This week · Next week → | Built |
| A53 | Owner | QuickBooks | Connect QuickBooks Online — explains what it needs; connects nothing | Not built (the button is a note) |
| A54 | Owner, Bookkeeper, Site lead, Crew | Dashboard map | Click a status chip to hide or show those pins; the count updates | Built |
| A55 | Owner, Bookkeeper, Site lead | Dashboard map | Click a pin to open that job. The Crew map is deliberately drill-free | Built |
| A56 | No login | A hard hat | Scan the QR → page 41. Drawn on the device, so it works with no signal | Built |
| A57 | No login | A machine | Scan the QR → page 42 | Built |
| A58 | everyone | Every screen | The DEMO band under the header — it cannot scroll away or be dismissed, and render() never wipes it |
Built |
| A59 | everyone | The whole app | Install as an app (PWA) — full screen, works offline, updates itself; a service worker reloads once when a new build takes over | Built |
Not in the app — the text line
These are Omar's and the owner's four working seats in tools/, not portal screens. They read the portal's own data files and print exact figures. Listed because they are things you can do, by text, today.
| # | Who | Command | What it does | Built? |
|---|---|---|---|---|
| A60 | Owner | node tools/ask.cjs <command> — outstanding, jobs [status], job <address-or-id>, quotes [won|lost] [by <estimator>], crew <A|B|C>, tickets [man], inventory; --as book/est/lead/crew for a role view |
Ask it a number by text, get the answer off the data | Built |
| A61 | Owner | node tools/collector.cjs |
Nightly: what is not invoiced, what is overdue by age, holdbacks. Writes invoice drafts to outbox/invoices/ under a DRAFT header. The owner sends invoices, not the app |
Built |
| A62 | Site lead → Owner | node tools/daily.cjs --text "…" --from "…" |
Turns a foreman's end-of-day words (typed or transcribed) into a filed daily and a 5-line confirmation | Built |
| A63 | Owner | node tools/tickets.cjs |
Weekly: expiring tickets, expiries, and who cannot be booked on a crew | Built |
Count for Part 1B
63 actions. 59 inside the app, 4 on the text line. Of the 59 in-app: 58 built, 1 (Connect QuickBooks Online) is a button that only explains itself. Split by login — actions available to Owner 48 · Bookkeeper 17 · Estimator 12 · Site lead 40 · Crew 12 · no login 2. (A login is counted once per action it can reach; most chrome actions are available to all five.)
PART 2 — EVERY TASK ALI ASKED FOR OR SAW IN THE VIDEO
Every row traces to a line in profile/Fieldflo_Video_Workflows_2026-09-15.md. Timestamps are that file's timestamps. The "Whose ask" column is the important one: The owner asked means he said it himself, unprompted; The owner liked it means he reacted to a demo; Fieldflo showed means it was demoed and the owner said nothing; The owner pushed back means he was cool on it.
Flow 1 — Log in, branding, who sees what
| # | The task | Source | Whose ask | Lands on page(s) | Built? |
|---|---|---|---|---|---|
| V1 | Log in to one platform that holds the business | @2:37 | Fieldflo showed | 1 | Built |
| V2 | Your own logo and branding on it — "wherever you see Fieldflo, just imagine your logo" | @2:37 | Fieldflo showed | every page | Built — black + gold, Makki's logo |
| V3 | Everything built on role and permission; access restricted to every part of the platform | @2:37, @3:40 | Fieldflo showed | 1, 12, and the projections behind all 42 | Built — a forbidden field is not on the object the role receives |
| V4 | Daily labourers verify time and safety but never log into the platform | @2:37 | Fieldflo showed | — | Not built — our labourer has a login (page 37–40); text-only is planned, not built |
| V5 | Open a person, tick the tabs they may see — the accountant given payroll only | @8:30 | The owner liked it: "Okay. Wow." @8:52 | 12 | Built |
| V6 | A foreman limited to view projects, add forms, take pictures | @8:54; Owner: "That's pretty much it." @9:24 | The owner confirmed | 27–36 | Built — he has 10 tabs, no profit, no margin, no other crew |
| V7 | Each employee sent his own approval by text: his time and hours for the day and the week, "Were you injured? Does everything look good?" | @9:40 | Fieldflo showed | 38 (in-app) | Part built — the question is on his End of Day tab; it is not texted, and the weekly total is not in it |
Flow 2 — The dashboard tour
| # | The task | Source | Whose ask | Lands on page(s) | Built? |
|---|---|---|---|---|---|
| V8 | Today's active projects, coming to life as the foreman clocks his crew in | @3:40 | The owner liked the dashboards: "Very, very user friendly" @10:37 | 2 | Built — "Who's on site today" |
| V9 | Click into a project and audit all their paperwork from the dashboard | @3:40 | Fieldflo showed | 2 → A20–A23 | Built |
| V10 | Projects over 50% on bid vs actual: cost codes, labour types, bid / actual / remaining | @5:00 | Fieldflo showed | 2, 6, 26 | Built — by job and by cost code; "labour types" is a cost code here, not a separate axis |
| V11 | Certs flagged several ways as they get close to expiring | @5:00 | Fieldflo showed — The owner's only words here were "Okay." @5:28, not a reaction (raw-transcript pass, 2026-09-16) | 2, 13, 33, 40 | Built — 60-day and 30-day warnings |
| V12 | Employees nearing overtime, live at 32 hours | @5:31 | Fieldflo showed | 2, 10, 28 | Built — 32+ and 40+ |
| V13 | New projects on the dashboard | @5:31 | Fieldflo showed | 2 | Built — Recent Jobs |
| V14 | Time and materials and change orders on the dashboard | @5:31 | Fieldflo showed | 2, A23, A25–A27 | Built |
| V15 | Audit all forms in one place — "all the safety meetings across all our branches in the last month" | @5:31 | Fieldflo showed | — | Built — 2026-09-20 — Safety log — every talk and form filed on the Safety page (owner and site lead): the last 30 days of talks, seeded plus every live daily, searchable and filterable, with a forms modal listing inspections, incidents and corrective actions; safetyLogPanel / talkMonth in portal/app-notify.js |
| V16 | Deploy one message to the whole crew by text or email (PPE week, holiday party) | @5:31 | Fieldflo showed | — | Not built |
| V17 | A map of where the projects are | @5:31 | Fieldflo showed | 2, 17, 27, 37 | Built — a pin per active site, with a downtown inset |
| V18 | A map of where employees clock in from | @5:31 | Fieldflo showed | — | Not built — no GPS clock-in anywhere |
| V19 | The last injury form on the dashboard | @5:31 | Fieldflo showed | 14, 34 | Built — 2026-09-20 — a Last incident panel on the dashboard (owner and site lead): the latest incident with days-since-injury, days-since-any-incident and open actions; lastIncidentPanel in portal/app-notify.js, scoped through R.visibleSafety |
| V20 | Counts of employees, clients and users | @5:31 | Fieldflo showed | 12, 13 | Built — 2026-09-20 — three count tiles on the owner's dashboard — Employees (with the crew split), Clients (and how many have work on now) and Logins — each clicking through to Tickets & Certs / Jobs / Team & Access; countsPanel in portal/app-notify.js. Owner only |
| V21 | A safety dashboard: incidents, near miss, stop work | @5:31 | Fieldflo showed | 14, 34 | Built |
| V22 | An incident reporting system that walks a claim through — property damage or injury | @5:31 | Fieldflo showed | 14, 34 | Part built — you can file an incident; there is no claim walkthrough |
| V23 | Inspection management — your own or ready-made inspections | @5:31 | Fieldflo showed | 14, 34 | Part built — you can log an inspection with a result; there is no question-set builder and no ready-made library |
| V24 | A failed item assigned as a corrective action to a person; "they'll remain on this board until they fix it" | @5:31, @27:47 | Fieldflo showed | 14, 34, A48 | Built — overdue goes red, closed ones stay on file |
| V25 | Reports and stats for OSHA | @5:31 | Fieldflo showed | — | Not built — and Fieldflo is US-built; nothing on the call covered Alberta OHS |
| V26 | An equipment dashboard: maintenance, corrective actions on assets, inspections due, rentals to call off, what is assigned where | @5:31 | Fieldflo showed — The owner said nothing at @5:31. The "That's great." @21:20 this row used to carry belongs to V64 (raw-transcript pass, 2026-09-16) | 15, 35 | Part built — reminders, inspections due, rentals, and where each asset is; no maintenance history and no corrective action on an asset |
| V27 | A CRM: reach-outs, job walks, proposals sent, won / lost | @5:31 | The owner cut into this pitch to ask for QuickBooks @8:00 | 3, 23, 24 | Part built — proposals sent and won/lost are there; no contacts, no reach-outs, no job walks |
| V28 | A notification digest daily, twice a day if there are night shifts | @10:42 | Fieldflo showed | — (text line A61, A63) | Built — 2026-09-20 — Today's digest on the owner's and the lead's dashboard, with two editions (05:30 night hand-over + 17:00 end of day) on a day that has a night shift on the board and one on a day that does not; editions / nightShifts / digestPanel in portal/app-notify.js. The times are labels — nothing is scheduled and nothing sends |
| V29 | Instant notifications: property damage, injury, change order, no access | @10:42 | Fieldflo showed | A4 | Part built — 2026-09-20 — the bell is now a live bus (window.MAKKI_NOTIFY.fire, store makki_demo_notices_v1, scan() re-run after every click) and injury, property damage and no-access fire off the real records — the Safety incident form and the foreman's Start Day notes. portal/app-notify.js. The fourth kind is broken: app-ops2.js stores a change order's status as an object, app-notify.js:163 reads it as a string, so a CO notice renders [object Object] and only the first status move on each CO ever fires. Also: every audience is ["owner","lead"], so a crew login still sees the old hard-coded bell lines |
| V30 | What the digest carries: certs near expiry with a link, permits near expiry, who is not doing paperwork correctly, warehouse orders pending, low inventory, scheduling conflicts | @10:42 | Fieldflo showed | 13, 6, 16 | Built — 2026-09-20 — all six sections are in the digest and each has real rows and its own link: tickets near expiry (link to Tickets & Certs / My Crew), permits near expiry, paperwork not done (five derived gap types), warehouse orders pending with a late flag, low stock, and scheduling conflicts (five derived clash types over the next 14 days); digest() in portal/app-notify.js |
| V31 | Send each employee his own schedule to his cell or email | @10:42, @34:47, @36:37 | Fieldflo showed | 39, A38 | Part built — his week is on his own login; the board previews the message and sends nothing |
Flow 3 — QuickBooks and setting up an employee
| # | The task | Source | Whose ask | Lands on page(s) | Built? |
|---|---|---|---|---|---|
| V32 | Connect to QuickBooks — Online | @8:00, @8:09, @12:47 | The owner asked — his first unprompted words to Dan | 11 | Not built — page 11 is the settings page the link will live on |
| V33 | The integration brings the employees across, so there is no duplicate entry | @12:48 | The owner asked (same ask) | 11 | Not built |
| V34 | Then click each employee to update their information | @12:48 | Fieldflo showed | 12, 13 | Part built — you can add and edit a team login and open a man's file; you cannot edit a man's record |
| V35 | CSV import where there is no integration | @12:48 | Fieldflo showed | 11 | Not built — the fallback is named on the page; the import does not exist |
| V36 | Every page works the same way: a big button adds, three dots customise — "painting by number" | @12:48 | Fieldflo showed | — | Part built — every add-form is consistent, but there is no three-dots admin customisation anywhere |
| V37 | A unique QR code created for a person the moment they are created | @12:48 | The owner liked it | 13, 40 | Built — generated on the device from the hat code |
| V38 | An inspector scans the hard hat and sees that man's active certificates | @12:48 | The owner reacted: "Oh that's great." @14:00. The "I haven't seen anybody else incorporate that." @18:54 this row used to carry belongs to V54 (raw-transcript pass, 2026-09-16) | 41, A56 | Built — no login, works offline |
| V39 | The inspector sees only active certs; the employee sees the same page including missing and expired, "so it's on them and the company" | @14:06 | Fieldflo showed | 40, 41 | Part built — our scan page deliberately shows expired ones to the inspector too, because that is the point of the scan. The man's own page matches. "Missing" (never held) is not shown on either |
Flow 4 — Employee profile, skills, training
| # | The task | Source | Whose ask | Lands on page(s) | Built? |
|---|---|---|---|---|---|
| V40 | Emergency details on the profile | @14:06 | Fieldflo showed | — | Not built |
| V41 | Training pushed to the whole company or a division, onto each phone, entered with a secret PIN, taken in his own language | @14:06 | Owner: "Perfect." @15:24 | — | Not built |
| V42 | 600+ Got Safety training videos with a quiz, at $4 per employee per month | @15:31 | Fieldflo upsold it | — | Not built — and it is a third party's library, not ours to resell |
| V43 | A passed training produces a branded certificate tracked like any other cert, with the same expiry warning | @15:31; the owner finished Dan's sentence: "And let you know that's been close to expiring and all that fun stuff." @15:45 | The owner asked, by finishing the sentence | 13 | Part built — the cert tracking and the expiry warnings are built; nothing produces a certificate from a training |
| V44 | Profile fields: employee number, name, cell, temp labour, default cost code / position, office or division | @15:51 | Fieldflo showed | 12, 13 | Part built — name, trade, crew, phone, start date, day rate and hat code are held; no employee number, no temp-labour flag, no default cost code, no office/division |
| V45 | Skills on the profile; dispatchers filter by skill; a skill icon on the project | @15:51; Owner: "Yeah. So they have a nice little picture, certs." @16:35 | The owner liked it | — | Not built — we have tickets, not skills |
| V46 | A training matrix: who has what certs and whether they have the right ones | @16:40 | Fieldflo showed | 13, 33 | Part built — "The men" table is exactly this for tickets; it is not a matrix and it does not cover trainings |
| V47 | Write-ups, permissions, trainings, documents and emergency contact on the person | @16:40 | Fieldflo showed | 12 | Part built — permissions are built (A12); write-ups, trainings, per-person documents and emergency contact are not |
Flow 5 — Certificates: add, renew, archive
| # | The task | Source | Whose ask | Lands on page(s) | Built? |
|---|---|---|---|---|---|
| V48 | Define the list of cert types (three dots → Cert names) | @17:30 | Fieldflo showed | — | Not built — the types are seeded in certs.js; there is no screen to edit them |
| V49 | Add a certificate: pick the type, valid from, expiry, which employee, take a picture of it, upload | @17:30 | Owner: "It's pretty, pretty straightforward." @18:46 | 13, 33 | Built 2026-09-17 — owner files for any man, site lead for his own crew; type / issuer / number / issued / expires / photo of the ticket, and the course cost owner-only. Refuses a bad date or an expiry before the issue date, warns instead of duplicating, and the man it unblocks is unblocked through the same check that refused him |
| V50 | Certs listed alphabetically | @17:30 | Fieldflo showed | 13 | Part built — ours sort by urgency (expired first), which is the more useful order, and every table is searchable |
| V51 | A renewals list — "all the ones that need to be renewed" | @17:30 | Fieldflo showed | 13, 33 | Built — the Needs attention panel is exactly this |
| V52 | Renew a cert: new valid-from and expiry; the new one becomes active, the old one is archived forever | @17:30 | The owner liked it (no separate quote of his own — @18:46 covers add / renew / archive as one) | 13, 33 | Built 2026-09-17 — Renew on the panel and on each ticket in a man's file; the new one goes live, the old one moves to the archive and is never deleted |
| V53 | Export a PDF pack of certs to send to anyone | @17:30 | Fieldflo showed | — | Not built |
| V54 | The archive is visible forever | @18:52, @19:01 | Owner: "I haven't seen anybody else incorporate that into their program." @18:54 — said straight after Dan's "And you can see all the archives" (L246). Moved here from V38 (raw-transcript pass, 2026-09-16) | 13, 33, 40, 41 | Built — "kept, never deleted, so you can always show what was valid on the day" |
Flow 6 — Inventory and equipment, yard to site and back
| # | The task | Source | Whose ask | Lands on page(s) | Built? |
|---|---|---|---|---|---|
| V55 | An Inventory page with Add item (excavator, skid steer, sprayers) | @19:01 | Fieldflo showed — The owner said nothing at @19:01. The "That's great." @21:20 this row used to carry belongs to V64 (raw-transcript pass, 2026-09-16) | 15, 16, 35, 36 | Part built — the lists exist and are searchable; there is no Add item form in either |
| V56 | A QR code on every asset; an operator scans it and inspects it without logging into the platform | @19:01 | Fieldflo showed — The owner said nothing (raw-transcript pass, 2026-09-16) | 42, A49, A57 | Part built — the scan page exists and needs no login, but it is read-only — you cannot log the inspection from it |
| V57 | Read the SDS on a chemical from the same scan | @19:01 | Fieldflo showed | 14 (SDS placeholders) | Not built — SDS documents are in the library, not on the scan |
| V58 | The item record: number, warehouse location, name, inspections, quantity, office, cost codes and rates (T&M rates brought in) | @19:01 | Fieldflo showed | 15, A49 | Part built — code, name, make, serial, where, inspections, value / day rate; no quantity, no office, no cost code on the asset |
| V59 | Inspections per item; a failed one notifies the warehouse manager | @19:01 | Fieldflo showed | 14, 34 | Part built — "Equipment inspection" is one of the three kinds you can log on the Safety page; nobody is notified |
| V60 | Build your own inspection question sets | @19:01 | Fieldflo showed | — | Not built |
| V61 | Maintenance and repair history per item | @19:01 | Fieldflo showed | — | Not built |
| V62 | A loadout list: the PM lists what a project needs, the warehouse manager is notified with the address and delivery notes, and fulfils it | @19:01 | Fieldflo showed — The owner said nothing (raw-transcript pass, 2026-09-16) | — | Not built |
| V63 | Stock moves out of inventory onto the project, cost-coded, estimates versus actuals | @19:01 | Fieldflo showed — The owner said nothing (raw-transcript pass, 2026-09-16) | 6, 26 (cost codes exist) | Not built — inventory does not move onto a job |
| V64 | Reporting Center → Project Inventory Report: everything ordered, returned or consumed on a project, in real time | @19:01 | Owner: "That's great." @21:20 — said straight after Dan finished the Project Inventory Report (L263). Moved here from V26 and V55 (raw-transcript pass, 2026-09-16) | — | Not built |
Flow 7 — Setting up a job: project book, proposal, closeout
| # | The task | Source | Whose ask | Lands on page(s) | Built? |
|---|---|---|---|---|---|
| V65 | Projects come over from QuickBooks, or you press the big button | @21:26 | The owner asked for the QuickBooks half @8:00 | 5, 6 | Part built — jobs exist; nothing comes from QuickBooks and there is no "new job" button |
| V66 | Project details = the project book: name, number, night shift, crew list, loss type, projected work days, scope of work, address | @21:26 | This is the screen the owner called a perfect fit: "there's nothing I could think of that we would need added." @24:07 | 6, A22 | Built — 2026-09-20 — Job setup → Details adds the night-shift switch, a shift window and a loss type, shown as chips on the job and as a night/split panel on the Timeline; detailsPane in portal/app-job.js, gated by R.jobDetails |
| V67 | Permits and notifications in the book, with expiry warnings, visible to the field | @21:26 | Fieldflo showed — The owner said nothing (raw-transcript pass, 2026-09-16) | 6, A22, 27 | Part built — permits, their numbers, issuers, expiries and 30/60-day warning states are there and the site lead sees them; the permit document itself is not held |
| V68 | Per diem on the project | @21:26 | Fieldflo showed | — | Built — 2026-09-20 — a Per diem tab on the job: applies switch, rate, unit, men, days and the job total; perDiemPane in portal/app-job.js, owner and site lead only |
| V69 | What certs and trainings are mandatory for this project — set once, then checked when you schedule people and when they go on the timesheet | @21:26, @25:57 | Fieldflo showed — The owner said nothing. The refusal is ours, not his ask (raw-transcript pass, 2026-09-16) | 6, 7, 13, 28, 31, 33, A17, A36 | Built — and ours refuses rather than warning. Trainings are not covered, only tickets |
| V70 | Cost codes for the job, mirroring your own naming | @21:26 | Fieldflo showed | 6, 26, A24 | Built — 7 codes, budget vs spent per code |
| V71 | Building and owner information on the project | @21:26 | Fieldflo showed | 5, 6 | Built — 2026-09-20 — a Building & owner tab: the building (use, storeys, year, area, construction, occupancy, access, parking, keys, site contact) and a building-owner record held separately from the client; buildingPane in portal/app-job.js |
| V72 | Waste reporting: haulers, material types, truck types, landfills | @21:26 | Fieldflo showed — The owner said nothing (raw-transcript pass, 2026-09-16) | 6, A22, A31 | Built — 2026-09-20 — a Waste loads tab: by-material and by-truck breakdowns and one row per load (date, material, truck, hauler, landfill, tonnes, manifest, logged by) with an add-a-load form; wastePane in portal/app-job.js, vocabularies in portal/ops-job.js. Added loads live on the device only and do not rewrite the old static hauler line |
| V73 | Custom tabs on the project | @21:26 | Fieldflo showed | — | Built — 2026-09-20 — custom tabs in the job's tab strip, plus a + Tab pane to name a tab, list its fields and choose who may open it; customPane / addTabPane in portal/app-job.js, and R.customTabsFor drops a tab a role is not on, so a custom tab cannot widen gating. Four text fields per tab, audience owner-only or owner + site lead |
| V74 | Templates — "for these projects, I want you to answer these questions" | @21:26 | Fieldflo showed | — | Part built — 2026-09-20 — the Questions tab lets you attach a template to a job, see the ones suggested for its work type, answer them and save; questionsPane in portal/app-job.js. There is still no builder — the three templates are hard-coded in portal/ops-job.js and nothing in the app creates, renames or edits a question |
| V75 | Insurance on the project | @21:26 | Fieldflo showed | — | Built — 2026-09-20 — an Insurance tab: carrier, policy, claim, expiry with an in-force / expiring / expired pill, certificate holder, WCB account and the adjuster; deductible and limit are dropped from the object entirely for anyone but the owner. insurancePane in portal/app-job.js |
| V76 | Emergency contact filled in once, landing on the daily safety meeting every day automatically | @21:26 | Fieldflo showed | — | Built — 2026-09-20 — filled once on the job's Emergency tab (contact, muster point, first aider, cross street, hospital, second call), then printed above the pre-job safety talk on the lead's Start Day and on the crew's Today, every day, with no re-typing; emergencyPane + the PAGES.lead.startday wrap in portal/app-job.js. It is a panel beside the talk, not a line inside the talk's checklist |
| V77 | Job costing estimates on the project | @21:26 | Fieldflo showed | 5, 6, 26, A24 | Built |
| V78 | Proposal builder: send the proposal with bid items to the client; if it is awarded, they drop in | @21:26 | Fieldflo showed — The owner said nothing (raw-transcript pass, 2026-09-16) | 4, 25, A33 | Part built — the proposal is built and printable; it is not sent from the app, and there are no bid-item lines, only a single price |
| V79 | Add bid items by hand or from an Excel sheet | @21:26 | Fieldflo showed | — | Not built |
| V80 | Every project has its own document system | @21:26 | Fieldflo showed | A23, A30 | Part built — each job links the documents it needs; all 11 are placeholders and nothing can be uploaded |
| V81 | A closeout report with the dailies, certs and documents in it | @21:26, @36:37 | Fieldflo showed — The owner said nothing (raw-transcript pass, 2026-09-16) | A31, A32 | Built — 2026-09-20 — the closeout now prints Daily reports (date, crew, men, hours, shift window, safety talk, what happened, totals) and Crew tickets on this job (every man × every required ticket, number, expiry, status) above the sign-off; dailiesSection / certsSection / injectCloseout in portal/app-job.js, fed by R.jobDailies and R.jobCrewCerts |
| V82 | Branches tied into an HQ dashboard | @24:23 | Fieldflo showed | — | Deliberately out — Omar closed it 2026-09-15: Makki Demolition only, one company |
Flow 8 — The field day, on the foreman's phone
| # | The task | Source | Whose ask | Lands on page(s) | Built? |
|---|---|---|---|---|---|
| V83 | The foreman opens the app and sees only projects, in any language | @24:23 | Fieldflo showed | 27–36 | Part built — he sees 10 focused tabs; the app is English only (only the speech-to-text takes 6 languages) |
| V84 | Press Start day and the day's paperwork appears — "a timesheet, a JHA, an inspection, and a daily" | @24:23; the owner confirmed: "Yeah." @25:39 and @4:26 | The owner confirmed this is what his crews fill out | 28 | Built — 2026-09-20 — Start Day now carries the inspection too: a Site inspection block (kind, result, notes) on the Start Day page, inspPanel in portal/app-day.js, filed into the same safety store the Safety page reads |
| V85 | Timesheet head start: three dots → Same as previous day | @25:57 | Fieldflo showed | — | Built — 2026-09-20 — Start Day — same as prevDay / #sdStartPrev / #tsPrev in portal/app-day.js. The 8 h head start is still there as the second button |
| V86 | Timesheet head start: Pull from scheduling | @25:57 | Fieldflo showed | 28 | Part built — the Start Day screen now reads the board through R.visibleSchedule and names the crew the board has on the chosen site, re-reading it when the site changes (boardCrewFor in portal/app-day.js); the men themselves are still the login's own crew — startPanel is called with cur().crew and begin() saves under it, so a different crew on the board does not change the tick-box list |
| V87 | Add or delete men on the timesheet based on who really showed up | @25:57 | Fieldflo showed | 28 | Built — 2026-09-20 — add a man from a dropdown at any hours, and a bin icon takes a man off the sheet entirely (#tsAdd / data-tsdel in portal/app-day.js); an added man who lacks the site's tickets is flagged through the same R.checkAssign that refuses him on the board. The pick list is his own crew plus unassigned spares |
| V88 | A man added without the right certs: the supervisor is warned, and if he is added anyway an email goes to the office | @25:57 | Fieldflo showed — The owner said nothing. Blocking instead of warning is ours, not his ask (raw-transcript pass, 2026-09-16) | 28, A17, A36 | Part built — ours blocks instead of warning, which is stronger; the office email is written on screen as a demo note and nothing is sent |
| V89 | A cost code per man on the timesheet, mirroring the company codes, defaultable | @25:57 | Fieldflo showed | — | Built — 2026-09-20 — a cost-code select on every man's line of the Start Day timesheet, the same codes the job budgets use, defaulted from his trade and rolled up per code above the table; pickCode / codeSelect in portal/app-day.js, defaults in portal/ops-day.js |
| V90 | Pick who is starting → Start; the supervisor controls the timesheet, each labourer verifies | @25:57 | Fieldflo showed | 28, 38 | Part built — the foreman controls it and each man verifies, but in his own login, not by text |
| V91 | The labourer gets a text within seconds asking for his location (optional) | @25:57 | Fieldflo showed | — | Not built — no texting, no location |
| V92 | The office dashboard shows the project started to the second | @25:57, @27:47 | Fieldflo showed | 2 | Built — "Who's on site today" carries the start time, the men, whether the talk is closed and how many have confirmed |
| V93 | The JHA / pre-job safety meeting, with Same as previous day then edit | @27:47 | The owner confirmed his crews do a safety meeting @4:26, @25:39 | 28 | Part built — a 6-item checklist and a 6-topic picker; no "same as yesterday", no free editing |
| V94 | The supervisor enters his PIN to sign the JHA | @27:47 | Fieldflo showed | 28 | Built — 2026-09-20 — the JHA / safety talk — supervisor signature panel: closing the talk now reads "Not signed" until the supervisor enters his PIN, which is checked against OPSD.SUP_PINS and refused if wrong; jhaPanel in portal/app-day.js. The demo PINs are plaintext in portal/ops-day.js and printed on screen — demo-grade, not a live secret |
| V95 | JHA contents: nearest hospital, PPE requirements, personal limitations, hazards, evacuation plan (pulled from the project details), task steps, hazards and controls | @27:47 | Fieldflo showed | 28 | Part built — our 6 items cover hazards, PPE, permits and containment, muster point and first-aider, questions, and the right to stop work. No nearest hospital, no personal limitations, no task steps, and nothing is pulled from the project book |
| V96 | A task library — "hit add tasks and they'll select what they're doing, it will automatically fill out the paperwork for them" | @27:47 | Fieldflo showed | — | Not built |
| V97 | New-day questions must be answered fresh each day | @27:47 | Fieldflo showed | 28 | Built — each day starts a new daily; the checklist starts empty |
| V98 | Everybody on the timesheet verifies he understood the safety meeting — the whole meeting goes to his phone by text, translatable, signed on his own phone | @27:47, @36:37 | Fieldflo showed — The owner said nothing when it was demoed. What he did say about it is @36:24, that his own test link never opened (V136–V138) (raw-transcript pass, 2026-09-16) | 38 | Part built — he answers Yes / No in his Crew login. No text, no translation, and he sees the topic, not the whole meeting. The owner's own test texts failed on the call (@36:24) |
| V99 | Inspections during the day; a "no" or "broken" assigned as a corrective action, the person notified | @27:47 | Fieldflo showed | 14, 34, A47, A48 | Part built — 2026-09-20 — a failed inspection now fires a notice naming who owns the corrective action, or saying plainly that none has been raised (scan() step 2 in portal/app-notify.js). It still does not go to that person: the audience is ["owner","lead"] and feed() filters on role plus job scope only — The owner's name is text inside the notice, and fire()'s person field is never set or read. Raising the action off a failed item is still done by hand |
| V100 | Dailies ready-made for the industry | @27:47 | Owner: "I love how it's tailored to demolition and abatement." @33:05 | 28 | Part built — a free-text note, not a structured industry daily |
| V101 | Talk into the daily in any language — "What'd you do today?" | @27:47 | Fieldflo showed — The owner said nothing (raw-transcript pass, 2026-09-16) | 28, A42, A62 | Built — browser speech-to-text in 6 languages on Start Day, and tools/daily.cjs turns a foreman's words into a filed daily on the text line |
| V102 | An incident / near miss / stop work on the daily notifies the office at once | @27:47 | Fieldflo showed | 14, 34, A46 | Built — 2026-09-20 — an incident, a near miss or a stop-work reaches the owner's and the site lead's bell at once, marked urgent, from both the seeded register and a newly filed one (scan() step 1 in portal/app-notify.js). The bookkeeper login is not on the audience list |
| V103 | Goals for tomorrow and the week, and a meeting log, on the daily | @27:47 | Fieldflo showed | — | Built — 2026-09-20 — a Goals & meeting log panel on the daily: goal for tomorrow, goal for the week, and a logged meeting (time · kind · who · what was said); goalsPanel in portal/app-day.js |
| V104 | "Any more asbestos that are mold detected, any abatement procedures" on the daily | @27:47 | The owner flagged this himself: "Some stuff for abatements is a little more detailed and job specific." @4:26 | — | Not built — the biggest hole on the owner's own words |
| V105 | Pictures on every daily | @27:47 | Fieldflo showed | 28, A28 | Built — stage, caption, straight from the phone camera |
| V106 | The containment log: names already there, respirator used, task, time in, time out, signature | @27:47 | The owner's abatement work needs it (@4:26) | — | Not built — needs the owner's own form |
| V107 | Unanswered containment fields stay red until they are filled | @27:47 | Fieldflo showed | — | Not built (there is no containment log to redden) |
| V108 | End of day: back into the timesheet — who is leaving, what breaks they took | @27:47 | Fieldflo showed | 28, 38 | Built — 2026-09-20 — an End of day table on Start Day: on site / left / break per man, worked hours computed to the quarter hour with the break taken off, a "differs" flag against the sheet, and one button that writes the clock's hours back into the timesheet; eodPanel in portal/app-day.js |
| V109 | Everyone verifies by text at the end of the day: time correct, meals, injured, "everything looks good" | @27:47, @9:40 | Fieldflo showed | 38, A43, A45 | Part built — he confirms hours and the safety talk in-app and can dispute his hours; no text, no meals question, no injury question |
Flow 9 — Takeoff and estimating (skimmed)
| # | The task | Source | Whose ask | Lands on page(s) | Built? |
|---|---|---|---|---|---|
| V110 | A takeoff and estimating system built for the abatement world | @33:12 | The owner pushed back: "I know our estimators aren't fans." @34:36 | — | Not built |
| V111 | Pick the work type — demolition or abatement; residential, commercial or industrial | @34:47 | The owner pushed back | 4, 25 (work type is a field on a proposal) | Part built — work type exists as a label; it drives nothing |
| V112 | Bring in the drawings and "Fieldflo will start cooking for you" | @34:47 | The owner pushed back | — | Not built |
| V113 | The output drops automatically into the proposal with bid items and tasks, sent to the client | @34:47 | The owner pushed back | 4, 25 | Not built — our proposal carries one price, no bid items, and is not sent |
Flow 10 — Scheduling and dispatch
| # | The task | Source | Whose ask | Lands on page(s) | Built? |
|---|---|---|---|---|---|
| V114 | A dispatching system that sends each employee his own schedule | @34:47 | Fieldflo showed | 39, A38 | Part built — in his login, not sent |
| V115 | The projects in the chosen time frame are listed; pick the ones you want to schedule | @34:47 | Fieldflo showed | 7, 31, A34, A35 | Built — a board of crews × days, click or drag |
| V116 | Each employee gets his assignments on his cell phone | @36:37 | Fieldflo showed | 39 | Part built — in-app; the text version is not built |
| V117 | A Gantt chart of everything coming up, to see people coming off a project and where more work is needed | @36:37 | Fieldflo showed | 8, 32 | Part built — the timeline is built and read-only; it shows jobs by crew and a Today line, but it does not surface where more work is needed |
Flow 11 — Closeout and weekly payroll approval
| # | The task | Source | Whose ask | Lands on page(s) | Built? |
|---|---|---|---|---|---|
| V118 | A closeout report of everything done on the project | @36:37 | Fieldflo showed — The owner said nothing (raw-transcript pass, 2026-09-16) | A31, A32 | Built — 2026-09-20 — see V81: the closeout report gained the dailies and the crew's tickets (portal/app-job.js) |
| V119 | Weekly payroll approval: everybody's total time, then per employee, per project, per cost code | @36:37 | The owner's own access question was about payroll @8:14 | 10, 21 | Built — 2026-09-20 — Approve the week by cost code on Payroll Approval: men, jobs, hours and an Approve per code plus "approve the rest"; codePanel → R.payrollByCode in portal/app-day.js. The bookkeeper gets the same table with hours and no dollar and no buttons |
| V120 | Make fixes inside payroll approval | @36:37 | Fieldflo showed | 28 | Built — 2026-09-20 — Fix the week here, an editable man × day grid inside Payroll Approval (owner only): every change asks why, is logged with who and when, can be undone, and flows back through to Start Day and the dashboard; a missed man can be added. fixPanel in portal/app-day.js |
| V121 | Dan: "A nice spreadsheet right for your in-house accountant" — "in-house" is Dan's word, not the owner's. Owner: "We do have an accountant doing payroll." @8:14. Omar confirmed 2026-09-16: outside firm. | @36:37 | The owner asked: give the accountant access to just payroll @8:14 | 10, 21, A50 | Built — Export CSV, and the bookkeeper's copy carries hours with no rate and no dollar |
| V122 | An approval chain: named PMs approve their own projects, with a trailing history; the payroll administrator cannot run it until they have all signed | @36:37 | Fieldflo showed | 10 | Part built — one approver, recorded with name and time; no chain, no trail, nothing is blocked |
Flow 12 — Price and next steps
| # | The task | Source | Whose ask | Lands on page(s) | Built? |
|---|---|---|---|---|---|
| V123 | Priced in tiers, counted on supervisors, foremen and above — daily labour is not billed | @39:16, @39:36–@40:27 | Fieldflo's model (≈$15,000/yr, under 15 users) | — | Not an app task — a commercial fact for the deck |
| V124 | A demo or trial login to click through before signing | The owner asked @41:06; Dan refused @41:24 | The owner asked, and was told no | 1 and all 42 | Built — The owner's own portal is live for him today, on demo data. This is the one thing Fieldflo refused him |
The owner's own words — his asks, his pushbacks, his context
| # | The task | Source | Whose ask | Lands on page(s) | Built? |
|---|---|---|---|---|---|
| V125 | A program his workers and managers find easy to use on site — the last ones were "hard for our workers and our managers to use" | @2:01 | The owner asked — his reason for taking the call | all 42 | Part built — five purpose-built logins, a phone layout, big buttons; never tested by a Makki crew |
| V126 | One system everybody actually uses — today "some people were using it, some people weren't, everything was out of whack" | @2:01 | The owner asked | 12 and the gating behind all 42 | Part built — one login per person, each seeing only their own slice; nothing forces use |
| V127 | Roll it out across five companies | @2:01 | The owner asked | — | Deliberately out — Omar closed it 2026-09-15: Makki Demolition only |
| V128 | Connect to QuickBooks. Online. | @8:00, @8:09 | The owner asked — unprompted, cutting into the CRM pitch | 11 | Not built — the settings page exists, the link does not |
| V129 | Let the accountant see payroll and nothing else | @8:14 | The owner asked — his only unprompted access question | 12, 21 | Built — and gated at the field level: her Payroll page has hours and no rate. The tab ships off; the owner switches it on |
| V130 | An orientation video for the program, to share with managers | @32:09 | The owner asked — and Fieldflo had none to show him | — | Not built — nobody has offered him one since |
| V131 | Job-specific abatement forms — "some stuff for abatements is a little more detailed and job specific" | @4:26 | The owner asked | — | Not built — this is V104, V106 and V107 in one line, and it is his own words |
| V132 | What his crews actually fill out: a timesheet, a safety meeting, some dailies (@4:26) — and, agreed again, a timesheet, a JHA, an inspection, and a daily (@25:39) | @4:26, @25:39 | The owner confirmed twice | 28, 14, 34 | Part built — timesheet, safety talk and daily notes are inside Start Day; the inspection is on a separate page |
| V133 | 80 employees doing "meetings and time" in it | @40:00 | The owner said it | 37–40 | Part built — the crew login does exactly meetings and time; 80 men each needing a login is the thing V4 was meant to avoid |
| V134 | Pitch it to the VP; budget is already approved | @40:46, @42:35 | The owner's next step | — | Not an app task — a sales fact |
| V135 | A second full demo with the whole team | @41:24, @42:47 | Dan offered; nothing was booked | — | Not an app task |
| V136 | A link we text a man must open in the phone's plain browser — no app to install. the owner tapped Fieldflo's texts live on the call: "I have, but when I'm clicking on them, they're not going anywhere because it I'm not connected to the... Fieldflo app" | @35:48 (raw L375) | The owner said it — the only thing he tested with his own hands, and it failed in front of him | — | Not built — a design constraint on the labourer-by-text plan, not a screen. Fieldflo's own demo broke on exactly this |
| V137 | That same link must open with no account and no login — "kept saying that I'm not connected to the app" | @36:24 (raw L393) | The owner said it | — | Not built — needs a page that renders with no session; our labourer has a login today (V4) |
| V138 | And it must still be valid when he taps it — "and the link is not valid"; asked "Did you see the JHA?" he answered "No." | @36:24, @36:19 (raw L393, L387) | The owner said it — he never saw the safety meeting at all | — | Not built — needs a signed, expiring link per man per day, long-lived enough to survive a shift |
| V139 | Ten project-manager seats — "we'd have 10 project managers on there" | @39:47 (raw L418) | The owner said it | 12 | Not built — needs a project-manager role between Owner and Site lead; the app has one owner and five demo logins, not a roster of ten |
| V140 | Makki's team meeting is on Friday — "know Fridays, usually we have our team meetings" | @42:49 (raw L488) | The owner said it | — | Not an app task — a fact about how the company runs; the natural weekly slot for the Ticket Keeper and any weekly rollup |
| V141 | Fieldflo cold-called Makki — "when you guys contacted us, I figured, hey, we might as well give you guys a shot" | @2:01 (raw L32) | The owner said it | — | Not an app task — a sales fact: the competitor got in front of the owner by outbound, and he took the call |
Where V136–V141 came from. They are the six items the raw-transcript second pass found on 2026-09-16 (profile/Video_Recheck_2026-09-16.md section (c) MISSED) — things the owner said out loud in the call that had no row here. Every quote above is off profile/Fieldflo_Call_Transcript_2026-09-08.txt, with the raw line number given. V1–V135 are unchanged.
Count for Part 2
141 tasks, counted off the tables above:
| Whose ask | Count |
|---|---|
| The owner asked for it himself, or confirmed it in his own words | 28 |
| The owner reacted well to it in the demo | 11 |
| The owner pushed back on it or was cool about it (V110–V113, takeoff and estimating) | 4 |
| Fieldflo showed it and the owner said nothing — of which 3 are commercial facts, not app tasks (V123, V134, V135) | 98 |
| Total | 141 |
The 28 the owner asked for himself: V6, V32, V33, V38, V43, V65, V84, V93, V104, V106, V119, V121, V124, V125, V126, V127, V128, V129, V130, V131, V132, V133, V136, V137, V138, V139, V140, V141.
The 11 he reacted to, each with a quote you can point at: V5, V8, V37, V38, V41, V45, V49, V52, V54, V64, V66, V100 — corrected 2026-09-17, see the note at the foot of this file. This column used to read 25. It does not now, and no task was added or removed to change it: fifteen rows moved from "the owner liked it" to "Fieldflo showed" because the raw transcript has him silent, and one row (V64) moved the other way because it is where his "That's great." actually falls. 25 − 15 + 1 = 11, and 84 + 15 − 1 = 98.
PART 3 — THE GAPS, BOTH DIRECTIONS
3a. Video tasks with NO page and no action in Part 1 — the real holes
Re-counted 2026-09-20. These are the 35 tasks still marked "Not built" in Part 2 — the ones with no page and no action anywhere in the app today. Several are the same hole under different numbers (the abatement paperwork is four; the yard flow is three; the texted link is three). The table below has 34 rows; 9 of them are now marked CLOSED — V49 and V52 by the ticket-write build of 2026-09-17, and V15, V68, V73, V75, V76, V85, V89 and V103 by the three builds of 2026-09-20 — which leaves 25 open holes. One row (V73, V74) is only half closed and stays, reduced to V74.
| Video # | The hole | What it would take |
|---|---|---|
| V4 | Labourers who never log in | A texting number (Twilio or the ported office line), the crew's phone numbers, and the owner's OK on the two wordings. Planned in Labourer_By_Text_Plan_2026-09-15.md; costs money; nothing sends today |
CLOSED 2026-09-20. Built — the Safety log on the Safety page lists the last 30 days of talks plus a forms modal; portal/app-notify.js |
||
| V16 | One message pushed to the whole crew | The same texting line as V4 |
| V18 | Where each man clocked in from | GPS on clock-in. Needs the labourer app or the text line first, and the owner's call on tracking his men |
| V25 | An OHS / regulator report at one button | The owner's own OHS documents and the Alberta forms he actually files. Fieldflo's is a US OSHA report and does not fit |
| V40 | Emergency details on a person | A person-record editor. There is no edit form for a man anywhere — see V34 and V44 |
| V41, V42 | Training pushed to a phone; the video library | A training module and a PIN sign-off. The $4-a-man library is a third party's and not ours to resell |
| V45 | Skills, and picking a crew by skill | A skills list per man on top of the ticket list, and a filter on the board |
| V48 | Editing the list of cert types | A small admin screen over certs.js types |
| CLOSED 2026-09-17. Built. The form, the validation, the scan of the ticket and the crew-block flip are live; see the note at the foot of this file | ||
| CLOSED 2026-09-17. Built. The old ticket is flagged, not deleted, and stays in the archive | ||
| V53 | A PDF pack of certificates | Print styling over the existing cert tables. Small |
| V57 | SDS from an asset scan | Link a document to an asset and put it on the scan page |
| V60 | Building your own inspection question sets | An inspection-template builder |
| V61 | Maintenance and repair history per machine | A history list on the asset record |
| V62, V63, V64 | Loadout lists; stock moving onto a job cost-coded; the project inventory report | The whole yard-to-site-and-back flow. This is the block the owner said "That's great" to, and none of it exists. Needs the owner's real equipment list first |
CLOSED 2026-09-20. Built — the Per diem tab on the job, owner and site lead only; portal/app-job.js |
||
V73 CLOSED 2026-09-20 — custom tabs with a + Tab pane; portal/app-job.js. V74 still open: you can attach a template to a job and answer it, but nothing in the app creates or edits one. Still needs a template builder |
||
CLOSED 2026-09-20. Built — the Insurance tab; deductible and limit owner-only; portal/app-job.js |
||
CLOSED 2026-09-20. Built — the job's Emergency tab, printed above the pre-job safety talk on Start Day and on the crew's Today every day; portal/app-job.js |
||
| V79 | Bid items, by hand or from Excel | Line items on the proposal instead of one price. Waits on the owner's past quotes |
CLOSED 2026-09-20. Built — Start Day — same as portal/app-day.js |
||
CLOSED 2026-09-20. Built — a cost-code select on every man's line, defaulted from his trade; portal/app-day.js |
||
| V91 | A text asking the labourer for his location | The texting line, plus the owner's call on tracking |
| V96 | A task library that fills the JHA in | The owner's own task and hazard wording, then a picker on the safety talk |
CLOSED 2026-09-20. Built — the Goals & meeting log panel on the daily; portal/app-day.js |
||
| V104, V106, V107, V131 | The abatement paperwork: asbestos/mold lines on the daily, the containment log, and fields that stay red until filled | The owner's own words, flagged at @4:26 before Dan showed anything. Needs the owner's real containment form. Planned in Solutions_Plan_2026-09-15.md §4 |
| V110, V112, V113 | Takeoff and estimating, and bid items dropping into a proposal | The Estimator seat. Waits on a handful of the owner's past quotes — and the owner pushed back on this one, so it is the lowest priority of the lot |
| V128, V32, V33 | QuickBooks Online connected for real | The owner's first unprompted words on the call. 15 minutes with the owner authorising it on the QuickBooks side. Read-only first |
| V35 | CSV import | A parser for customers, invoices and payments. The fallback if V128 stalls |
| V130 | An orientation video for managers | The owner asked for this out loud and nobody has offered him one. A screen recording of the portal with a voiceover. Cheapest item on this list |
| V79 / V49 / V55 | No "add" form anywhere for a cert, an asset or an inventory line | Three small forms. Every list in the app can be read, searched and filtered; almost none of them can be added to |
| V136, V137, V138 | A texted link that opens with no app, no account and no login — and still works when he taps it hours later | The same texting line as V4, plus a signed, expiring web link per man per day and a page that renders with no session. Fieldflo's demo broke on exactly this in front of the owner. A constraint on Labourer_By_Text_Plan_2026-09-15.md, not a screen |
| V139 | Ten project-manager seats | A project-manager role between Owner and Site lead — his own jobs, his own crews, budget but not company profit. Turns Team & Access from five demo logins into a roster |
25 open holes, 35 tasks — re-counted 2026-09-20 (was 30 holes / 45 tasks when this file was written). The four that mattered most were V49/V52 (add and renew a ticket — the page he loved, closed 2026-09-17), V128/V32/V33 (QuickBooks — his first words, still open), V104/V106/V131 (the abatement paperwork — his own flag, still open), V62–V64 (the yard flow — his "that's great", still open). With the ticket page closed, the top three open holes are now QuickBooks, the abatement paperwork and the yard flow, in that order.
3b. Built, but nothing in the video and nothing the owner asked for
Work that exists in the app today that no Fieldflo flow and no the owner request called for.
| Part 1 # | What it is | Where it came from |
|---|---|---|
| 2, 17, 27, 37, A54, A55 | The job-site map with a downtown inset, hoverable pins, status toggles and click-through | Fieldflo showed a map (V17), but ours is a built basemap with a Calgary inset, quadrant counts and an area breakdown that go well past what was demoed. Built 2026-09-15 |
| 9, 18 | Collections & AR and Outstanding — money owed, aged, with holdbacks and in-court buckets | Fieldflo showed no invoicing, no payments, no holdbacks and nothing about money owed in 43 minutes. This is entirely ours |
| 19 | To Invoice — finished jobs not yet billed | Ours. Feeds tools/collector.cjs |
| 20 | Payments | Ours |
| 5 | Jobs & P&L with profit and margin per job | Ours — Fieldflo showed job costing (V77) but never a P&L |
| A61 | The Collector — nightly invoice drafts into outbox/invoices/ under a DRAFT header |
Ours. This is the axis Fieldflo has nothing on |
| A60 | Ask it a number by text | Ours |
| A63 | The Ticket Keeper — weekly expiry summary by text | Partly V11, but the text delivery is ours |
| 6 (owner rail) | Seven groups instead of fifteen tabs | Omar's order, 2026-09-15 20:59. Not from the owner, not from the video |
| A59, A2 | Install as an app (PWA), offline, self-updating | Ours. Fieldflo has a native app; nobody asked for this shape |
| 41 verdict banner | The scan page's "do not let him start" verdict line | Ours. Fieldflo showed the certs; the plain-English verdict is an addition |
| A17, A36, A88 | Refusing a man rather than warning about him | Fieldflo warns and emails (@25:57). We block. A deliberate difference, not a request |
| 26 | Bid vs Actual for the estimator, with no sell price and no profit | Ours — Fieldflo's cost codes were an owner view |
| A58 | The permanent DEMO band | Ours, and it should stay until the owner picks the day it comes off |
Nothing here is wasted — but four of them (Collections, To Invoice, Payments, the Collector) are the answer to a question Fieldflo never asked, and that is worth saying out loud to the owner rather than burying.
3c. Where the old 100-item list was wrong, padded or short
Checked row by row against Parts 1 and 2.
It was short. The old list has 100 rows against 141 video tasks and 42 pages + 63 actions. Thirty-odd things Dan demoed have no row in it at all, including: the "three dots / big button" pattern (V36), per diem (V68), insurance on the project (V75), custom tabs and templates (V73, V74), building and owner information (V71), the night-shift flag and loss type on the project book (V66), the supervisor's PIN on the JHA (V94), the JHA's own contents — nearest hospital, evacuation plan, task steps (V95), new-day questions answered fresh (V97), goals and the meeting log on the daily (V103), reading an SDS from a scan (V57), building your own inspection sets (V60), stock moving onto a job cost-coded (V63), bid items by hand or from Excel (V79), adding or deleting men on the timesheet (V87), the location text (V91), fixing hours inside payroll approval (V120), the cert-names admin screen (V48), alphabetical cert listing (V50), and the profile fields Dan listed one by one (V44).
Three rows are wrong or too generous.
- Row 56 calls add/renew a certificate "PARTLY" built. It is not built. The archive existing is not the same as being able to add or renew, and this is the page the owner reacted hardest to. In Part 2 it is V49 and V52, both Not built.
- Row 30 says change orders are Built and "approving raises the revised contract". True — but the row does not say that "sent to customer" sends nothing, which is the part that matters when the owner is standing in front of it.
- Row 87 puts "a foreman's voice note turned into a filed daily report" in the app's "foreman's day" section. It is not a portal screen — it is
tools/daily.cjson the text line. The row says so in its last four words, but it is counted among the app's screens.
Two rows are padding. Row 4 ("a number a login may not see never reaches that login") and row 2 ("five logins") are the same fact counted twice — the field-level projection is how the five logins work, not a separate thing to see. Row 95 ("a DEMO header") is a property of every screen, not a screen.
One row is right and worth repeating. Row 51 — the bookkeeper's Payroll-hours tab is off by default. It is the only tab in the entire app that ships off, and if the owner is shown the app without it being switched on, his own @8:14 question looks unanswered.
Nothing in the old list is invented. Every one of its 100 rows traces to something real. The problem is coverage and a handful of statuses, not honesty.
3d. The verdict
No — the 100-item inventory is not complete, and 100 is not the true number.
It is a good grouped summary of themes. It is not a page-by-page, action-by-action list of the app, and it is not every task from the video.
The true numbers are:
- 42 pages and 63 actions in the app — 105 distinct things you can open or do, not 100 things to "see".
- 141 tasks in the video, not 85.
The old list's "100" sits between the two and is neither. Use the numbers in Part 4 from here on.
PART 4 — THE COUNT
The app, read out of the code
- 42 pages — 39 login × tab, 1 sign-in screen, 2 that need no login.
- Split by login: Owner 15 · Bookkeeper 5 (one of them off by default) · Estimator 5 · Site lead 10 · Crew 4 · no login 2 · pre-login 1.
- 63 actions — 59 in the app, 4 on the text line.
- 105 distinct things you can open or do.
The video, read line by line
- 141 tasks — the 135 read off the video notes, plus 6 added 2026-09-16 from a second pass on the raw call recording (V136–V141).
- 28 the owner asked for himself · 11 he reacted well to · 4 he pushed back on · 98 Fieldflo showed and he said nothing, 3 of those being commercial facts rather than app tasks. (Corrected 2026-09-17 — the middle two numbers were 25 and 84; see the note at the foot of this file. The 141 did not move.)
Where those 141 tasks stand today — re-counted 2026-09-20 by counting the rows of the Part 2 tables, not by arithmetic on the old numbers.
| Count | Was, 2026-09-17 | |
|---|---|---|
| Built | 56 | 32 |
| Part built | 43 | 58 |
| Not built | 35 | 44 |
| Deliberately out (V82 branches, V127 five companies — both closed by Omar 2026-09-15) | 2 | 2 |
| Not app tasks (V123 price, V134 the VP, V135 a second demo, V140 Friday meetings, V141 the cold call) | 5 | 5 |
| Total | 141 | 141 |
What moved, and why. The three builds of 2026-09-20 — portal/app-day.js (the field day and payroll),
portal/app-job.js (job setup and closeout) and portal/app-notify.js (notifications, the digest and the safety
log) — were checked row by row against the code. 24 of the 28 rows they claim moved to Built: eight out of
Not built (V15, V68, V73, V75, V76, V85, V89, V103) and sixteen out of Part built (V19, V20, V28, V30, V66,
V71, V72, V81, V84, V87, V94, V102, V108, V118, V119, V120). Four did not clear, and each says why in its own
row: V29 (the change-order notice reads [object Object] and only fires once — app-ops2.js writes a status
object, app-notify.js:163 reads it as a string), V74 (a template can be answered, not authored), V86
(the board supplies the site and the crew's name; the men are still the login's own crew), V99 (the notice
fires but goes to the owner and the lead, not to the man who owns the corrective action). V74 moved the other way
— Not built → Part built. 32 + 8 + 16 = 56; 58 − 16 + 1 = 43; 44 − 9 = 35.
How many of the video's tasks have a home in the app today
- Strip out the 5 that are not app tasks and the 2 Omar closed: 134 tasks are in scope.
- 99 of 134 (74%) land on at least one page or action in Part 1 — 56 fully, 43 partly. (Was 90 of 134, 67%.)
- 35 have no home at all. Part 3a's table has 34 rows, of which 9 are now marked CLOSED — V49 and V52 by the ticket-write build of 2026-09-17, and V15, V68, V73, V75, V76, V85, V89 and V103 by the three builds of 2026-09-20 — which leaves 25 open holes. The 35 map onto the 25 because several rows carry more than one number (the abatement paperwork is four, the yard flow is three, the texted link is three, QuickBooks is three, takeoff is three) and one row (V79 / V49 / V55, "no add form anywhere") is a cross-cut that repeats numbers already listed.
- The single worst of them is V4: Fieldflo's labourer never logs in, and our app answers that by giving him a login — the opposite of what was demoed.
What I could not verify
- I did not run the app. Everything in Part 1 is read out of the source, and so is the 2026-09-20 re-count in Part 2 — every one of the 28 rows was confirmed by reading
portal/app-day.js,app-job.js,app-notify.js,ops-day.js,ops-job.js,ops-notify.js,roles.js,app-ops.jsandapp-ops2.js, not by trusting the builders' own header comments. The builders report their own suites passing on 2026-09-20 (verify_day59,verify_job76,verify_notify83, plusverify_fieldops,verify_mapand_qa/gating_assert195); this seat did not re-run them and takes that on report, not on proof. If Omar wants them proved on screen rather than in code, say so and I will run them. portal/data.jsis one 621 KB line — I read the shape of a job throughroles.jsand the pages that consume it, not by reading the 621 KB. No job count, client name or dollar figure from it appears in this file.- The action counts split by login in Part 1B are counted by hand off the table, not by a tool. The 42 pages and 63 actions are exact; the per-login action split is ±2.
- "Deliberately out" for V82 and V127 comes from
profile/Screen_Inventory_2026-09-16.mdrow 19 recording Omar's decision of 2026-09-15, not from the video. If that decision has moved, those two rows move with it. - V123's $15,000 is Fieldflo's price from the transcript, in a currency the call never stated.
- Found on the 2026-09-20 re-count and fixed: Part 3a's QuickBooks row named V128 and V33 but not V32, which is also Not built and is the same hole. The row now reads V128, V32, V33. No task was added — V32 has always been in Part 2.
- Part 1 was not re-read on 2026-09-20. See the note under 1A. The pages and actions it lists are still there; what 2026-09-20 added to Start Day, the crew's Today, the job modal, the closeout, Payroll Approval, the Safety page and the two dashboards is not written into Part 1. Only A4 (the bell) was corrected, because it contradicted V29 outright. If Omar wants Part 1 brought level with Part 2, that is a separate pass.
- I did not re-run the three new verifiers.
verify_day59,verify_job76 andverify_notify83 are reported passing by the seats that wrote them. This file takes that on report. What it does not take on report is the build status of the 28 rows — every one of those was read in the source, and four of them did not survive the reading.
Everything in this file is demo data or a statement about demo data. Nothing in the app sends anything to anyone, and nothing was changed to write this file.
CORRECTION — 2026-09-17
Two things changed in this file today. Nothing was deleted, and the 141 did not move.
1. Eighteen rows re-sourced, so the "Whose ask" column is honest
The second pass on the raw recording (profile/Video_Recheck_2026-09-16.md, sections (d) and (e)) found that this
file's "Whose ask" column — the column this file itself calls "the important one" — put words in the owner's mouth.
It is fixed. Every row is still here; only who said what has changed.
Three rows carried a real the owner quote filed against the wrong item. The quote has been moved to where the transcript actually puts it:
| Row | What it used to claim | Where the quote really belongs |
|---|---|---|
| V38 (hard-hat scan) | "Oh that's great." @14:00 and "I haven't seen anybody else incorporate that." @18:54 | @18:54 comes four minutes later, straight after Dan's "And you can see all the archives" (L246). It has moved to V54. V38 keeps its own real reaction, @14:00 |
| V26 (equipment dashboard, @5:31) | "That's great." @21:20 | @21:20 is sixteen minutes later, straight after the Project Inventory Report (L263). It has moved to V64 |
| V55 (Inventory page / Add item, @19:01) | the same "That's great." @21:20 | Same quote, same problem. Also moved to V64 |
Thirteen rows said "the owner liked it" where the transcript has him silent. They now read "Fieldflo showed — The owner said nothing": V11, V56, V62, V63, V67, V69, V72, V78, V81, V88, V98, V101, V118. Two are worth calling out because the row itself is ours, not his: V69 and V88 describe refusing a man rather than warning about him, which is our design decision, and he never asked for it. V11 is not quite silence — his words at @5:28 were "Okay.", which is an acknowledgement, not a reaction, and the row now says so.
What that does to the counts. Fifteen rows left the "reacted well" bucket and one (V64) joined it, so
25 → 11 and 84 → 98. 28 + 11 + 4 + 98 = 141, the same 141 as before. No task was added, removed,
merged or re-scoped. The "28 the owner asked for it himself" list is untouched — the second pass could put a quote
against every one of them.
Still open, not fixed here, because it needs a decision rather than a correction. Video_Recheck §(d)1 says
V45 (skills and dispatcher filters) uses the owner's @16:35 "they have a nice little picture, certs" as its
evidence, and that is not what he was talking about — he said picture and certs. V45 keeps its quote for now.
The honest fix is either to move it to a new photo-on-the-record row or to strike the quote, and that is Omar's
call, not this file's. §(e) also notes V17 is written as "A map of where the projects are" when Dan never
said map, and V132 / V84 read as though the owner volunteered a sentence that was Dan's with the owner's "Yeah" on the
end. Both are left as they are and are listed here so they are not lost.
2. V49 and V52 are built
The write side of Tickets & Certs shipped on 2026-09-17 — file a new ticket, renew one, with the scan of the ticket held on the device. V49 was "Not built — the biggest single hole"; V52 was "Part built". Both now read Built, and their two rows in the Part 3a holes table are marked CLOSED rather than removed. Part 4 moves with them: Built 30 → 32, Part built 59 → 58, Not built 45 → 44, and 89 of 134 → 90 of 134 (67%). Again, the 141 does not move.
Who may write is gated the same way every read in this app is gated: the owner files for any man, the site lead
for his own crew only, and the bookkeeper, estimator and crew get no form object at all from roles.js — the
crew login stays read-only on his own tickets. The course cost is on the owner's form and on nobody else's, in
either direction: a cost posted by a site lead is not stored.
One other file is now out of date and has not been rewritten: profile/Not_Built_Why_2026-09-16.md §56 still
describes add / renew as unbuilt. A dated line has been added at the top of that section pointing here; the rest
of that file is left as it was written on 2026-09-16.
Nothing in this correction touched a Makki figure — no job, quote, invoice, dollar amount, margin or date from the business. Only the "Whose ask" column of 18 rows, the "Built?" cell of 2, and the arithmetic that follows from them.