City Service Window & DMV
A click-through mock of the City Hall desk — the City Services window — and the DMV instructor, rebuilt button-by-button from the live code so you can confirm every option, field and fee. Tap any menu row to open the sub-menu, input form or dialog that sits behind it. Labels are exact; values are mock. fixed = shipped in DOJ v4 and API-verified; known gap = still open, honestly.
🛠️ DOJ v4 changes on this page
The desk-merge and DMV-bypass bugs this page used to flag are now fixed: cw_cityhall
is gutted to an inert stub, there is one City Services desk with one fee source, and a driver license can only be issued
after a verified written + practical DMV pass (blocked while suspended, too). A real road-test route is seeded. All prices
now come from one service_prices table. See the Findings box for what's
code-complete vs. still needing an in-city pass.
What these are
Both desks stand inside City Hall (Del Perro). They are talk-to-ped windows built on ox_lib menus + ox_target — no NUI.
City Services window (resource crestwood_doj) is the main citizen counter: get your ID, request a license, file a form, register for the Bar or a professional exam, pay/collect documents, raise an IT ticket, and message DOJ officials.
DMV instructor (resource cw_dmv) stands a few steps away and runs the driving-license pipeline: written knowledge test → practical road test → issuance back at the City Hall counter.
Where they are
- City Services desk
- -1292.02, -572.11, 30.57 · hd 309.9 cityservices_1
- DMV instructor
- -1300.69, -575.74, 34.37 · hd 43.3 dmv_1
The City Services desk ped is /placer-placed (registry cw_points); every callback is distance-gated to ~3 m or it returns "you are not at a City Services desk". The DMV instructor is also a cw_points collection (dmv_%d). fixed The old second counter (cw_cityhall) that stood at almost the same coordinate is gone — see City Hall counter (merged) below.
The intended citizen flow
Straight from the window's own "New in CrestWood — first steps" guide and the DOJ site's Quick Guide / Driver's Handbook (§5.2–§5.3). Rule: your first Basic ID is free; every other credential is billed by invoice and must be paid before issuance (Title V §5.1). No driver's license may be issued without a verified pass on both DMV tests.
1 · City Services window crestwood_doj
ox_target label "City Services" (fa-solid fa-building-columns, 2.5 m) opens the context menu titled "City Services". Tap a row to drill in.
📖 City Guide & Legal Help fa-solid fa-book-open ▸
Opens a sub-menu of four read-only info pages (each an lib.alertDialog).
🚩New in CrestWood — first stepsfa-solid fa-flag▸
2. Set up your phone; it auto-creates your email and mails you the getting-started guide.
3. Set up your DOJ account passcode at any City Hall DOJ terminal (or the phone DOJ app — §4.1).
4. Want to drive? Visit the DMV instructor: pass the written test, then the road test, then have a Clerk issue your license at City Hall (§5.3). You must carry your Basic ID in your pockets to sit either test.
🔒Your DOJ accountfa-solid fa-user-lock▸
🪪IDs & licensesfa-solid fa-id-card-clip▸
⚖️Legal helpfa-solid fa-scale-balanced▸
📄 Submit a Formfa-solid fa-file-lines ▸
Built live from the DB (document_templates where citizen_submittable=1 AND active=1), grouped by category. Empty state: "No forms are available for public filing right now."
📁Civil Filings3 form(s)▸
📝Small Claims Complaint$150 fee▸
Field types map text→input · textarea→textarea · date→date · select→select. On submit → crestwood_doj:cs:submitForm(tpl.id, payload); a $150 cw_invoices row is raised titled "Small Claims Complaint filing fee". Notify: "A clerk is on duty — your filing was sent to the Clerk's office for review." / "Your filing has been submitted to the Clerk's office."
📝Name Change PetitionNo fee▸
A template with a fee but no fields shows "File this form for a $N fee?" instead.
📁Family & Personal2 form(s)▸
Same pattern — e.g. Marriage Application, Records Correction Request. Each opens its own confirm alert or field dialog built from its fields_json.
📋PermitsBuilding / door & garage move permits for your propertyfa-solid fa-file-contract▸
conditional / dead Only renders if resource crestwood_property is started — but that resource is retired & stopped (housing moved to ps-housing/ps-realtor). So this row, Legal Filings, and Request a Contractor below do not currently appear in-city.
⚖️Legal FilingsFile a stay, or pay to cure a foreclosure/eviction (§12)fa-solid fa-scale-balanced▸
conditional / dead Fires crestwood_property:client:openLegalAid — gated on the retired property resource.
🦺Request a Contractor / Work PermitGet work done on a property you ownfa-solid fa-helmet-safety▸
conditional / dead Opens an lib.inputDialog with one field "Work description" (textarea, required) → crestwood_doj:cs:requestContractor. Gated on the retired property resource.
📑 Request a Certified Copyfa-solid fa-copy Fee $500 ▸
Fee = Config.Documents.reprintFee = $500 → a cw_invoices row "Certified copy — Marriage Certificate" + a queued print_jobs row. Success: "Your certified-copy request has been sent to the Clerk's office for printing." Matches the posted Fee Schedule (Certified Reprint — $500).
🪪 Request Identification or Licensefa-solid fa-id-card ▸
Six credential types. Each row shows "On record — <status>" or "Not yet issued" and opens its own sub-menu.
🆔Basic IDNot yet issued1st FREE▸
ℹ️Info: requirements & fee▸
Your FIRST Basic ID is issued instantly and free of charge (§5.2). Later basics and lost/damaged replacements carry the posted fee.
🆕Request my first Basic ID (FREE)▸
First-ever → free, filed for a clerk to print. If already held, the row instead reads "Request a replacement" ($300). Subsequent (non-first) Basic ID = $250 invoice.
🚗Driver's LicenseNot yet issued$250▸
ℹ️Info: requirements & fee▸
Requires: a completed application form
A first-time application is never instant — file it at a DOJ terminal or the phone DOJ app under Licensing.
fixed api/licensing.php applyLicense now hard-blocks issuance of a drivers license unless both a passed DMV written test AND a passed practical (road) test are on record in dmv_test_passes: "No completed DMV examination is on record…". It also now blocks issue while an existing license is suspended (see license points, below) — a suspended license can't be silently re-issued. Fee is read live from service_prices.license_drivers ($250).
✍️Apply for a new Driver's LicenseNever instant — routes to the licensing pipeline▸
🔫Weapons LicenseNot yet issued$750▸
Info alert: Fee $750 · Background check required · Waiting period: 3 day(s) · requires a completed application form. "Apply for a new Weapons License" routes to the licensing pipeline; if held → "Request a replacement" ($300).
🏹Hunting LicenseNot yet issued$300▸
Info alert: Fee $300 · Prerequisite: an active weapons · Waiting period: 2 day(s). Routes to the licensing pipeline; replacement $300.
🎣Fishing LicenseNot yet issued$150▸
Info alert: Fee $150. Routes to the licensing pipeline; replacement $300.
🏢Business LicenseNot yet issued$500▸
Info alert: Fee $500 · requires a completed application form. Routes to the licensing pipeline; replacement $300.
Non-Basic credentials are never issued at the window — they route to the licensing pipeline (form → background check → wait → Clerk issuance). Fees shown come from license_types (seeded by v2_seed_license_fees.sql). Replacement of any credential = Config.CityServices.replacementFee = $300.
🧾 Check My Documents & Invoicesfa-solid fa-file-invoice-dollar ▸
📦My Documents — PickupCollect credentials & certified copies waiting for youfa-solid fa-box-open▸
📦Basic ID 8U51K657BReady to collect — DOC-26-0912▸
→ crestwood_doj:printer:collectMyPickup(row). Errors surface as "your inventory is full — make room and try again" / "that item is not ready for pickup yet".
Rows are print_jobs a clerk marked ready_pickup. Empty state: "Nothing waiting for pickup".
💵My InvoicesOpen your invoice list (same as /invoices)fa-solid fa-file-invoice-dollar▸
Validates via crestwood_doj:cs:canOpenInvoices then runs ExecuteCommand('invoices') — the same invoice list as the /invoices command. This is the primary pay-invoices channel.
⚖️ Register for Examinationfa-solid fa-scale-balanced ▸
⚖️Bar ExaminationLegal practice licensing exam$5,000▸
→ crestwood_doj:cs:barRegister. Success: "Registered — code F7K2Q9ZB emailed to you. Pay invoice INV-26-000771 ($5,000) here at the window, then use any DOJ terminal." Fee = exam_config.fee for bar (posted Fee Schedule: Bar Examination $5,000).
🎓Business OwnerProfessional licensing exam (live — pass required to register)▸
applied All seven banks are live (27 questions each, 189 total; applied 2026-07-23), and a passing sitting now gates approval of the matching professional registration (audited clerk override available). Same for the other six below. See the Exams page.
🎓IT ProfessionalProfessional licensing exam (live — pass required to register)▸
live prof_it_professional
🎓RealtorProfessional licensing exam (live — pass required to register)▸
live prof_realtor
🎓ContractorProfessional licensing exam (live — pass required to register)▸
live prof_contractor
🎓Event PlannerProfessional licensing exam (live — pass required to register)▸
live prof_event_planner
🎓Insurance BrokerProfessional licensing exam (live — pass required to register)▸
live prof_insurance
🎓ParalegalProfessional licensing exam (live — pass required to register)▸
live prof_paralegal
🛠️ Submit an IT Work Ticketfa-solid fa-screwdriver-wrench ▸
→ crestwood_doj:cs:itTicket. Notifies all it-role DOJ users. Success: "Your IT work ticket has been filed — IT services have been notified."
✉️ Contact DOJ Officialsfa-solid fa-envelope ▸
→ crestwood_doj:cs:contactOfficials. Success: "Your message has been sent to the DOJ Notifications inbox of the selected official(s)." Error if no one holds that office: "no one currently holds that DOJ office — try again later".
🖊️ Property Closingsfa-solid fa-file-signature conditional ▸
conditional / dead Fires crestwood_property:client:openClosings. Only shown while crestwood_property is started — that resource is retired & stopped, so this option is not currently present in-city.
📋 Permit Queuefa-solid fa-file-contract conditional ▸
conditional / dead Fires crestwood_property:client:openPermitQueue — same retired-resource gate.
Every callback re-checks you are within ~3 m of a live City Services point, so these options can't be triggered remotely.
1b · City Hall counter cw_cityhall merged / stub
A second, older ped counter used to sit at essentially the same coordinate as the City Services desk and grant a Driver License with no DMV check, using its own separate slugs and fees.
✅ Fixed — one desk, one fee source
cw_cityhall is now a gutted stub: its ped, target zone, blip, and menu are removed, and its old fee table is gone. It was already stopped in server.cfg, and now there is nothing left inside it to accidentally re-enable. There is one City Services counter (crestwood_doj) and one price source — the service_prices table shared by the desk, the DOJ Library fee schedule, and the website. A citizen can no longer stumble onto a second desk with a cheaper, DMV-bypassing driver license.
The old comparison table (two desks disagreeing on Driver / Weapon / Business / Hunting / Fishing / Crafting pricing) no longer applies — see the live price list below.
1c · The posted price list service_prices new
One authoritative, Cole-scale price table now drives the desk (game), the website fee page, and the DOJ Library fee schedule — instead of the config-scattered, disagreeing fee lists this page used to document. Verified live against the service_prices table.
| Service | Category | Price | Notes |
|---|---|---|---|
| Basic ID Card | Credentials | $250 | first card free |
| Driver's License (issue) | Credentials | $250 | DMV pass required |
| Driver's License Reinstatement | Credentials | $2,500 | after a points suspension |
| Weapons License | Credentials | $750 | |
| Hunting License | Credentials | $300 | |
| Fishing License | Credentials | $150 | |
| Business License Card | Credentials | $500 | credential card only |
| Credential Replacement | Credentials | $300 | any card |
| Name Change Petition | Vital Records | $25,000 | |
| Marriage Certificate Filing | Vital Records | $25,000 | |
| Civil Case Filing | Court | $10,000 flat | +5% of asking award; 50% refund on dismissal not yet collected |
| Petition for Expungement | Court | $20,000 base | +$5,000/charge not yet collected |
| Certified Reprint | Court | $500 | any retained document |
| Business License — Tier 1 | Business Licenses | $10,000 | sole proprietor / street vendor |
| Business License — Tier 2 | Business Licenses | $25,000 | storefront / small business |
| Business License — Tier 3 | Business Licenses | $50,000 | corporation / nightclub / dealer |
| Business License — Tier 4 | Business Licenses | $100,000 | franchise / enterprise group |
| Bar Examination | Examinations | $5,000 | |
| Bar Dues — Monthly | Examinations | $2,500 / mo | private-practice roles, 7-day grace |
| Professional Examination | Examinations | $1,000 | any field |
| DMV Written Knowledge Test | Examinations | $250 | |
| DMV Practical (Road) Test | Examinations | $250 | charged at test start |
This replaces the page's old "two desks, two disagreeing fee tables" finding — every price above is read live from one row, everywhere it's shown.
2 · DMV cw_dmv
ox_target label "Speak with the DMV Instructor" (fa-solid fa-id-card-clip, 2.5 m) opens the menu titled "CrestWood DMV". The ped only registers codes and runs the road test; the written test itself is taken at a DOJ terminal.
📘Take the Written Knowledge TestRegister a code + fee invoice for a classfa-solid fa-book▸
🚗Class C — Passenger Vehicle▸
Invoice INV-26-000820 has been issued for $250.
Once the invoice is paid, take this code to any DOJ terminal in the city and open the Bar & Examinations page to begin.
→ cw_dmv:written:register. Requires your Basic ID in your pockets, else "You must carry your Basic ID in your pockets to take a test." When the invoice is paid, the code flips to active and you're emailed to begin — no code needed at the terminal.
🏍️Class M — Motorcycle▸
Same flow, test vehicle faggio2.
🚚Class CDL — Commercial▸
Same flow, test vehicle mule.
Written test — rules & bank
- Fee
- $250 (charged at registration)
- Pass mark
- 80%
- Time limit
- 30 minutes
- Retake wait
- 1 day
- Per sitting
- 20 questions — 10 road rules, 5 signage, 5 right-of-way
- Question bank
- 70 DMV questions (36 road rules · 17 signage · 17 right-of-way)
Config lives in DB exam_config (exam = dmv); questions in exam_questions. Full answer key is on the Exams page.
🚗Take the Road TestRequires a passed written test + the DMV practical fee charged at startfa-solid fa-car▸
fixed The road test now actually charges the posted DMV Practical — $250 from service_prices at the start of the attempt. (Previously a dead Config.RoadTestFee = 150 was defined and never charged — that config is gone.)
🚗Class C — Passenger Vehicle▸
→ cw_dmv:road:request gates, in order:
- Basic ID in pockets — else "You must carry your Basic ID in your pockets to take a test."
- Written test passed for this class — else "You must pass the written knowledge test for this class first."
- Not already passed — else "You have already passed the road test for this class."
- Retake wait (24h) cleared
- A route exists — fixed a 13-checkpoint "Rockford Hills Loop" Class C route is now seeded (sql/dmv_route_class_c_v1.sql); a pre-existing 2-checkpoint broken stub route was deactivated. known gap the checkpoints were placed at the desk, not driven — they still need an in-city validation drive before this is called fully live.
On start, the test vehicle spawns at checkpoint 1 and you're warped in; for car/CDL the instructor rides shotgun, for motorcycle he narrates over the radio. A GPS route + yellow marker guide you to each checkpoint in order.
🏍️Class M — Motorcycle▸
Same engine; instructor narrates by radio.
🚚Class CDL — Commercial▸
Same engine; instructor rides along.
Grading (server-authoritative)
- Fail above 5 total errors (MaxErrors)
- Score = max(25, 100 − errors×15)
- Speed zones 50 / 80 / 120 km/h, +5 grace; each over-limit = 1 error (10s cooldown)
- Damage: 1 error per 20 damage; instant fail at 250 — "Vehicle damage exceeded the test limit."
- Mandatory stops: within 8 m at ≤2 km/h, else 1 error — "That was a stop sign back there!"
- Route: warn at 120 m, instant fail at 220 m — "You left the test route."
- Checkpoint arrival radius 12 m, reached in order
Result
Pass → writes dmv_test_passes; applicant told "Road test passed — visit City Hall to have your license issued by the Clerk." and every clerk is pinged "<name> has passed the … examination — issuance pending at City Hall." Instructor: "That's a pass. Head back to City Hall and have the Clerk issue your license."
Fail → writes cw_dmv_attempts (24h retake). Instructor: "That's a fail today. You're welcome to try again after the retake wait."
📋My DMV StatusWritten / road test status by classfa-solid fa-clipboard-list▸
Written: 90% | Road: 100% ✅ eligible for issuance
Class M — Motorcycle
Written: 85% | Road: not passed
Class CDL — Commercial
Written: not passed | Road: not passed
→ cw_dmv:status, read from dmv_test_passes.
License classes the DMV tests
| Class label | Slug | Test vehicle |
|---|---|---|
| Class C — Passenger Vehicle | car | asea |
| Class M — Motorcycle | motorcycle | faggio2 |
| Class CDL — Commercial | cdl | mule |
DMV tests only car / motorcycle / CDL — no boat, pilot or firearm class. Weapons/hunting/fishing are separate credentials issued at the counter, not by the DMV.
The issued license (mock)
Granted at City Hall after a verified pass — from the web issuance pipeline (licensing.php)- Holder
- Ava Marston
- Status
- Active
- Issued
- Jul 19, 2026 · by Clerk R. Doss
- Expires
- Does not expire
Issuance mints a stable per-soul number, writes licenses + issuances, and queues a credential print_jobs row to collect at the print desk. The web pipeline blocks issuance while the fee invoice is unpaid and (for drivers) requires a DMV pass on record.
🆕 License points → suspension → desk reinstatement
Traffic offenses now carry license points. Hitting 12 active points auto-suspends the driver license for 7 real days; each event's points decay 30 real days after they're issued. A suspended license cannot be re-issued — the driver-license desk row above now checks this before granting or replacing a license. Once the suspension period passes, City Services can charge the posted Reinstatement fee ($2,500) to restore it. Citizens see their point total and suspension status in the phone app; MDT surfaces the same on a traffic stop. (Points detail lives on the other DOJ pages — this page only covers the desk-facing suspend/reinstate flow.)
Findings & gaps
✅ Fixed — one service desk at one spot
Two desks overlapped at ~-1292, -572 with different license slugs and fees.
cw_cityhall is gutted to a stub; only the crestwood_doj City Services desk remains, reading one shared service_prices table.
✅ Fixed — Driver License is now DMV-gated in-game
The old cw_cityhall:applyLicense('driver') path granted a license with no check against dmv_test_passes.
That path is dead. The surviving api/licensing.php applyLicense path is the only issuance path and requires a passed written and practical test, and now also blocks issue while the license is suspended.
✅ Fixed — a road-test route now exists
cw_dmv_routes was empty, so the road test always errored "No road test route has been placed for this class yet."
A 13-checkpoint "Rockford Hills Loop" Class C route is seeded (sql/dmv_route_class_c_v1.sql); a broken 2-checkpoint stub was deactivated. known gap the checkpoints were desk-placed, not driven — an in-city validation drive is still needed before calling this route fully live.
✅ Fixed — the road-test fee is now real
A dead Config.RoadTestFee = 150 was advertised in the menu text but never charged.
The practical test now charges the posted DMV Practical fee ($250) from service_prices at test start, matching the site's Fee Schedule labeling.
ℹ️ Still to do
- known gap The seeded road-test route needs an in-city validation drive — checkpoints were placed at the desk, not driven end-to-end.
- known gap Civil-filing's 5%-of-award charge/dismissal refund and expungement's per-charge fee are stored as params_json on service_prices but not yet enforced/collected by the case flow.
- known gap Nothing on this page has passed the owner's in-city acceptance pass yet — all of v4's DOJ/DMV work above is code-complete and API-verified only.
🚩 7 professional exams are still registration-only
Business Owner, IT Professional, Realtor, Contractor, Event Planner, Insurance Broker, Paralegal register a code + invoice but have no question bank ("question bank added later"). Unchanged by v4.
ℹ️ Property options are gated on a retired resource
Property Closings, Permit Queue and the three property form entries only render when crestwood_property is started — it's retired/stopped, so they never appear now. Re-point them at ps-housing/ps-realtor or remove them. Unchanged by v4.
Faithful button/field labels from crestwood_doj, cw_cityhall and cw_dmv; all record values are mock. Not the live portal.