MMAKKIDEMOLITION Master list — every page, every action, every task ←Makki DemolitionHome

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_day 59, verify_job 76, verify_notify 83, with verify_fieldops, verify_map and _qa/gating_assert 195 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 own ops-*.js mock-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.

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.html now also loads app-day.js, app-job.js and app-notify.js after app-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 on the Start Day screen and on the open timesheet, copying that day's hours and cost codes per man; 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
V15 One place that lists every safety meeting done 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
V49 Adding a certificate 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
V52 Renewing a certificate 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
V68 Per diem CLOSED 2026-09-20. Built — the Per diem tab on the job, owner and site lead only; portal/app-job.js
V73, V74 Custom tabs and question templates per project 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
V75 Insurance on the project CLOSED 2026-09-20. Built — the Insurance tab; deductible and limit owner-only; portal/app-job.js
V76 Emergency contact filled once, landing on every daily 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
V85 "Same as previous day" on the timesheet CLOSED 2026-09-20. Built — Start Day — same as , copying hours and cost codes; portal/app-day.js
V89 A cost code per man on the timesheet 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
V103 Goals for tomorrow and the week, and a meeting log 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.

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:

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

The video, read line by line

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


What I could not verify

  1. 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.js and app-ops2.js, not by trusting the builders' own header comments. The builders report their own suites passing on 2026-09-20 (verify_day 59, verify_job 76, verify_notify 83, plus verify_fieldops, verify_map and _qa/gating_assert 195); 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.
  2. portal/data.js is one 621 KB line — I read the shape of a job through roles.js and 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.
  3. 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.
  4. "Deliberately out" for V82 and V127 comes from profile/Screen_Inventory_2026-09-16.md row 19 recording Omar's decision of 2026-09-15, not from the video. If that decision has moved, those two rows move with it.
  5. V123's $15,000 is Fieldflo's price from the transcript, in a currency the call never stated.
  6. 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.
  7. 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.
  8. I did not re-run the three new verifiers. verify_day 59, verify_job 76 and verify_notify 83 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.