arlowe is an AI-first job planning and dispatch system for contractors, built for TMQ Holdings. A contractor prices each job line by line with cost and margin, assigns skilled crew or vetted subcontractors (by hand or through a blind reverse auction), and runs the job from estimate to invoice, with an AI agent that can do the same work from a chat. Its first users are three contractors: JCI, Ward and Liquid Liner.
A review of the arlowe code and planning documents in github.com/arloweai/arlowe, written so a new development team can pick it up from here. It covers what was promised, what exists, how good the code is, and what to do first.
arlowe is an AI-first job planning and dispatch system for contractors. The signed SOW with oBuilds, in three phases, promised a working web app for at least one production client, covering:
| Phase | Scope | Backend built | Front end built |
|---|---|---|---|
| 1 | Core data model (companies, workers, service types, jobs, line items with price, cost and margin) and the job lifecycle (estimate, approval, change orders, unknowns, calendar and capacity) | 50% | 50% |
| 2 | Dispatch and subcontractors (inviting subs, manual dispatch with filters, reverse blind auction, sub performance) and integrations (PDF invoices for QuickBooks, generic CRM hooks) | 35% | 35% |
| 3 | AI foundation: an agent that reads and changes jobs from chat, completion photos and video with metadata, floor plan attachments | 20% | 20% |
Backend is the server, database and agent tools; front end is the screens people use. Each figure starts from per-feature estimates in the line-by-line review in section 02 (complete features count fully, partial ones by how much works) and is set 10 points lower as a conservative allowance. Phase 2 excludes QuickBooks and CRM, which TMQ took on itself.
TMQ has since widened the goal well beyond the SOW. By Nov 1, three design partners (JCI, Ward and Liquid Liner) are meant to run real work on every screen of the arlowe App v2 design, plus push-to-talk voice, a phone and text agent, a supplier portal, QuickBooks Online push, sales and P&L reporting, and leads. None of those additions exist in code yet.
Based on the Oct 8 gap review in docs/gaps.md, with key findings re-checked in the code on Oct 20.
| # | Feature | Status | What exists / what is missing |
|---|---|---|---|
| Phase 1 · Core data and job workflow | |||
| 1 | Companies and sub companies | Complete | Each company has its own workers. Only admins can create companies. |
| 2 | Worker catalog | Complete | Name, optional login, status, skills. |
| 3 | Service types (skills) | Partial | Skill list exists but ships empty; global only, admin-created. |
| 4 | Skill assignment rule | Partial | Missing skills are flagged but not blocked. Workers attach to whole jobs, not line items. |
| 5 | Line items with margin | Complete | Quantity, unit price and cost, extended values, margin, job totals. |
| 6 | Catalog defaults | Complete | Items carry default price and cost. |
| 7 | Estimate and approval | Partial | Estimate snapshot and customer e-signature link work. Jobs have no status; estimates can't be edited or sent from the app. |
| 8 | B2B jobs through subs | Partial | A sub can be put on a job at a price. The sub can't put its own workers on it. |
| 9 | Unknowns (e.g. surface prep) | Not started | No unknown flag, severity or assumed hours. |
| 10 | Change orders | Not started | No change order record. Bug: deleting a job line also deletes it from signed estimates and invoices. |
| 11 | Calendar and capacity | Partial | Month calendar and week timeline. No capacity per worker or team. |
| 12 | Reassign and reschedule | Partial | Works at job level; assignments have no dates or hours. |
| Phase 2 · Dispatch and subcontractors | |||
| 13 | Inviting subcontractors | Partial | Only subs who already have an arlowe login can be invited. |
| 14 | Sub self-management | Partial | Subs manage workers and catalog, but not their own service types. |
| 15 | Manual dispatch with filters | Partial | Manual assignment works. No skill, availability or distance filters; jobs have no address. |
| 16 | Reverse blind auction | Partial | Time-boxed, price steps down, tested working. Set in dollars, not margin; claimable before start. |
| 17 | Auction blindness and vetting | Partial | Subs can't see each other or the floor. No "approved" flag, and the server does not check the claimer is a connected sub. |
| 18 | Sub performance data | Not started | No outcome or feedback fields. |
| Phase 3 · AI foundation | |||
| 19 | Agent-ready data model | Partial | Core entities exist. Schedules are only job dates; chat is text only. |
| 20 | AI agent in chat | Partial | Chat on Grok 4 with 93 tools. No tools for subs, auctions, estimates or skills. Field test found it fails on partial names and multi-step requests. |
| 21 | Completion photos and video | Partial | One generic file per job note. No video handling or capture metadata. |
| 22 | Floor plans | Partial | Generic note attachment only. |
| 23 | Room for vision AI | Not started | Not demonstrated. |
| Deliverables and integrations | |||
| D1 | Functional specification | Missing | Per-screen notes exist in web/docs/views/; no actual specification. |
| D2 | QuickBooks (PDF invoices) | Missing | Browser print view only. TMQ took this on itself. |
| D3 | CRM integration | Dropped | No CRM for Nov 1 (decided Oct 17). Leads to be entered in arlowe or imported from a spreadsheet. |
Checked by reading the code and running it locally on Oct 20 (Python 3.13, Postgres, Node 24).
How each part of the system holds up today, from what users touch down to the accounts it runs on.
Vue 3, all 120 files in TypeScript, builds cleanly. No tests, no type check, one 500 kB+ bundle.
Grok 4 on the previous vendor's key. Loses context between turns; fails on partial names.
One area per business function; endpoints 88–100% tested. Needs security settings fixed and a Django upgrade.
Standard Redis queue that runs chat replies. A failed run leaves the chat waiting forever.
93 tools load and work. One 2,279-line file with no tests (0% coverage).
Matches the SOW's core entities; 59 migrations line up exactly. One cascade bug on signed estimates.
The previous vendor's private 20,400-line framework; arlowe uses ~6,000 lines. Single-person knowledge.
Server, Postgres, Redis, file storage, email, AI key and DNS all sit in the previous vendor's accounts.
Fourteen practices a production codebase is expected to follow. The dot shows where arlowe is today; the status compares it with the level expected before real customers use it.
About 12,700 of arlowe's own 52,600 lines, in 22 files, need cleanup: the agent tool server and chat agent, the security settings, the two estimate and invoice models with the cascade bug, the auction claim check, and the 11 screens over 600 lines. The remaining 76% stays as it is.
Separately, the previous vendor's framework (20,400 lines, about 6,000 of them used by arlowe) should be absorbed into arlowe's own code and later replaced with standard tools. New work such as tests, automatic checks and error alerts is added alongside the code, not counted as cleanup.
| Check | Result | Detail |
|---|---|---|
| API automated tests | 145 / 145 pass | All backend tests pass on a fresh Postgres database. |
| API built (vs SOW) | ~40% | Across the three phases (50%, 35% and 20%, see section 01). |
| API test coverage | 82% | Endpoints 88–100%; the agent's tool server 0% and chat agent 63%. |
| Framework support | Expired | Django 5.0 stopped receiving security fixes in April 2025. Upgrade to 5.2 LTS. |
| Lint check (ruff) | Minor | No linter configured. A default run finds 15 unused imports, 61 unsorted import blocks and no likely bugs. |
| Database migrations | Consistent | 59 migrations match the models; a fresh database builds fully. |
| Web app build | Builds | Vue 3 + Vite builds cleanly. One bundle over 500 kB (no code splitting). |
| Web app built (vs SOW) | ~40% | Across the three phases (50%, 35% and 20%, see section 01). Of the 49 design screens, 7 are fully backed by code and 26 partly. |
| Web app test coverage | 0% | No unit, component or end-to-end tests; no type checking or linting set up. |
| Continuous integration | None | No automated checks on pull requests yet (planned in step 1). |
| Security basics | 6 issues | See below. All are known and planned for step 1, none fixed yet. |
| Data integrity | 1 bug | Deleting a job line silently changes signed estimates and invoices (a $44,330 signed estimate became $43,980 in testing). |
web/docs/views/, and coding conventions are documented.| Issue | Where | Risk |
|---|---|---|
| Django secret key hardcoded in source | api/config/settings_base.py:23 | Anyone with the code can forge sessions |
| Debug on and any host accepted by default | settings_base.py:26-28 | Leaks internals if not overridden in production |
| Any website can call the API | api/config/settings.py:11 | Cross-site requests |
| Uploaded files are public | api/config/settings.py:21 | Job photos and plans readable by anyone with the link |
| Auction claims not checked on the server | api/v1/job/views.py:841 | Any company manager could claim another contractor's auction |
| Email sent from the old vendor's domain | api/config/settings.py:26 | Login codes depend on oBuilds' email account |
The 17-step plan, all decisions and a CLAUDE.md for AI-assisted development are written, but sit on an unmerged branch. Building was meant to run around the clock from Oct 17.
Steps 5 to 12 are each estimated at a few days of focused work. With 12 days left and staging not yet running, the full Nov 1 scope is not realistic.
| Risk | Status | Why it matters |
|---|---|---|
| Production runs on the previous vendor's accounts | Open | Hosting, database, Redis, file storage, email, AI key and DNS are all outside TMQ's control. |
| No copy of the production database | Open | Partner data entered since August is on oBuilds' server. Without a dump, partners re-enter their jobs. |
| Code ownership of Phase 3 | Open | Under the MSA, ownership transfers on payment. Phase 3 (the AI agent work) is unpaid. Legal sign-off is needed before production cutover. |
| Nov 1 scope versus time | High | 16 of 17 steps not started; the first milestone has slipped. |
| Data model changes on live data | Planned | Moving assignments to line items and fixing the estimate-cascade bug both reshape stored data. Back up first; fix the cascade bug before any more deletes. |
| Outside approvals | Planned | Text messaging registration (5 to 10 days) and Intuit's QuickBooks review have no fixed turnaround. |
| Missing pieces from handover | Known | Git history before Aug 17, production settings and keys, and the vendor's AI build skills were not handed over. |
claude/zealous-cori-fwxiai are the team's working brief and should be the single source of truth.The access a team needs to work on the live app, and everything required to run it on a developer's machine.
The live system is up and answering, on a server the previous vendor controls. The marketing site is separate and not part of this code.
| Address | What it is | Status on Oct 20 | Who controls it |
|---|---|---|---|
| app.arlowe.ai | The web app people sign in to | Live | Previous vendor's server |
| api.arlowe.ai | The API behind the app | Live | Previous vendor's server |
| mcp.arlowe.ai | Tool server the AI agent uses | Live | Previous vendor's server |
| arlowe.ai | Marketing website | Live | Separate host; not in this repository |
| Access | Why it's needed | Held by today | Status |
|---|---|---|---|
GitHub: arloweai/arlowe | The code, history and planning documents | TMQ | Available |
| Production server | Deploys, logs and restarts for the app, API, worker and agent tool server | Previous vendor | Needed |
| Production database (Postgres) | A full backup before any change, and the partners' data since August | Previous vendor | Needed |
| Redis | Background job queue for chat replies | Previous vendor | Needed |
| File storage (S3 bucket) | Photos, plans and files attached to jobs | Previous vendor | Needed |
| Email sending account | Login codes and invites, sent today from no-reply@obuilds.com | Previous vendor | Replace |
| AI key (xAI, Grok 4) | The in-app chat agent; currently the vendor's personal account | Previous vendor | Replace |
| DNS for arlowe.ai | Points app, api and mcp addresses at the server | To confirm | Confirm |
| Admin login on the live app | Checking real data and behaviour | Previous vendor | Needed |
| New TMQ accounts (Render, Claude API, Deepgram, Cloudflare R2, Resend, Twilio, Sentry) | Hosting, AI, voice, storage, email, texting and error alerts on TMQ's own accounts | TMQ | Planned |
After every account moves to TMQ, change every key and password, and generate a new Django secret key.
api/, run pip install -r requirements.txt, then ./manage.py migrate.PYTHONPATH at the kbde/ folder instead../manage.py runserver), the worker (./manage.py rqworker) and the agent tool server (./scripts/run_mcp_server_dev.bash), or all at once with honcho start -f Procfile-dev.web/, run npm install, then ENDPOINT_URL=http://localhost:8001 npm run dev../manage.py test in api/ runs all 145 backend tests in about 30 seconds.Example values are for a local machine. Production values sit with the previous vendor and must never be committed to the repository.
| Variable | What it sets | Local example | Needed |
|---|---|---|---|
| Backend (API, worker, agent tool server) | |||
| DJANGO_SETTINGS_MODULE | Which settings file Django loads | config.settings | Always |
| PYTHONPATH | Lets the API import kbde when it isn't installed as a package | path to kbde/ | If kbde not installed |
| APP_NAME | App name used in emails and pages | arlowe | Always |
| APP_HOST, AR_API_HOST | Public address of the API; the agent tool server calls it | http://localhost:8001 | Always |
| UI_HOST | Address of the web app, for links and allowed origins | http://localhost:5173 | Always |
| APP_DEV_PORT | Port for the local API server | 8001 | Local only |
| MCP_SERVER_PORT | Port for the agent tool server | 8002 | Always |
| DATABASE_URL | Postgres connection | postgres://localhost:5432/arlowe | Always |
| REDIS_URL | Redis connection for the queue and cache | redis://localhost:6379/0 | Always |
| DEBUG, DEBUG_EMAIL | Debug mode; DEBUG requires an email to receive outgoing mail | 1, your email | Local only |
| DEBUG_PHONE_NUMBER | Receives outgoing texts in debug mode | your number | Optional |
| XAI_API_KEY | Key for the in-app chat agent (Grok 4) | your key | For chat |
| EMAIL_HOST, EMAIL_PORT, EMAIL_USERNAME, EMAIL_PASSWORD | Outgoing email server | provider values | For email |
| AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_STORAGE_BUCKET_NAME, AWS_S3_ENDPOINT_URL | File storage for uploads (S3 or a compatible store such as R2) | provider values | For uploads |
| RQ_SYNC | Runs background jobs immediately instead of queueing them | 1 | Optional |
| DJANGO_LOG_LEVEL, APP_LOG_LEVEL | How much the server logs | INFO | Optional |
| Web app | |||
| ENDPOINT_URL | Address of the API the web app calls; required to run or build | http://localhost:8001 | Always |
| UI_DEV_PORT | Port for the local web app | 5173 | Optional |
| Area | Technology | Size |
|---|---|---|
api/ | Django 5.0, Postgres, Redis + RQ worker, FastMCP server, LangChain Deep Agents (Grok 4) | ~9,400 lines + 3,300 test lines |
web/ | Vue 3, Vite, TypeScript, Bootstrap 5 | 112 view files |
kbde/ | Previous vendor's base library (MITMIT licence is a permissive open-source licence. Anyone may use, copy, change and sell the code, including inside a commercial product, as long as the original copyright and licence notice are kept with it. It comes with no warranty. For arlowe, it means TMQ can keep using and changing kbde whatever happens with the previous vendor., kBuilds LLC) | ~20,400 lines |
docs/ | SOW, gap list, duplex acceptance test, decisions, handover record, design file | — |
| Document | Use it for |
|---|---|
README.md | Local setup: four processes (API, worker, MCP server, web) and environment variables |
docs/sow.md | The contract baseline |
docs/gaps.md | Line-by-line to-do list, plus five field-test bugs (F1–F5) with file and line references |
docs/duplex-test.md | 27-step acceptance test; run after every change |
docs/handover.md | What oBuilds handed over, commit hashes and accounts to transfer |
docs/build-plan.md* | Steps 1 to 17 with the gaps each closes, and data-migration risks |
docs/decisions.md* | All 29 product decisions (statuses, roles, auctions, change orders, voice) |
docs/in-house-plan.md*, CLAUDE.md* | Launch plan, accounts, costs, and rules for AI-assisted development |
* On branch claude/zealous-cori-fwxiai, not yet merged into main.