← Review Hub / Service Window & DMV

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

Basic ID (1st FREE) Phone & email auto-set DOJ account passcode DMV written test DMV road test Clerk issues Driver License Licensed services

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 Services ox_lib context menu
📖 City Guide & Legal Help fa-solid fa-book-open

Opens a sub-menu of four read-only info pages (each an lib.alertDialog).

City Guide & Legal Help
🚩New in CrestWood — first stepsfa-solid fa-flag
New in CrestWood
1. Get your Basic ID here at any City Services desk — your FIRST one is FREE (§5.2).
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
Your DOJ Account
How to create your DOJ account passcode and use the read-only public website (§4.1 / §4.2). (alert body summarized from code.)
🪪IDs & licensesfa-solid fa-id-card-clip
IDs & Licenses (Title V)
Lists Basic ID, Driver's, Weapons, Hunting, Fishing, Business and their requirements (§5.2–§5.6): Weapons needs a background check + 3-day wait; Hunting requires an active Weapons license + 2-day wait; etc. (alert body summarized from code.)
⚖️Legal helpfa-solid fa-scale-balanced
Legal Help (§2.3, §12)
Describes the three paths — self-represent, Public Defender, or private attorney — plus foreclosure/eviction stay & cure. (alert body summarized from code.)
📄 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."

Submit a Form categories — mock
📁Civil Filings3 form(s)
Civil Filings
📝Small Claims Complaint$150 fee
lib.inputDialog — fields are data-driven from the template's fields_json
Small Claims Complaint

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
Template with no fields → a confirm alert instead of a form
Name Change Petition
File this form?

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
lib.inputDialog — "Request a Certified Copy"
Request a Certified Copy
The registry number of the record you need a certified copy of
e.g. Marriage Certificate, Court Verdict, Deed
Why you need this certified copy

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.

Request Identification or License
🆔Basic IDNot yet issued1st FREE
Basic ID
ℹ️Info: requirements & fee
Basic ID
Fee: $250
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)
Request a Basic ID
Request your Basic ID card? Your first one is issued instantly and free of charge.

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
Driver's License
ℹ️Info: requirements & fee
Driver's License
Fee: $250
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
Apply for a Driver's License
This application is never instant. File it at any DOJ terminal or in the phone DOJ app under Licensing. (guidance alert — no in-window issuance.)
🔫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
Documents & Invoices
📦My Documents — PickupCollect credentials & certified copies waiting for youfa-solid fa-box-open
My Documents — Pickup
📦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
Register for Examination
⚖️Bar ExaminationLegal practice licensing exam$5,000
Bar Examination
Register as a bar candidate? An examination code will be emailed to you and an invoice issued — pay it here at the window, then begin at any DOJ terminal.

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.

Business Owner
Register for the Business Owner professional examination? An examination code will be emailed to you and an invoice issued — pay it here at the window, then begin at any DOJ terminal.
🎓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
lib.inputDialog — "IT Work Ticket"
IT Work Ticket
Pre-filled from your equipped LB Phone number

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
lib.inputDialog — "Contact DOJ Officials"
Contact DOJ Officials
Who should receive this — issues, problems, or suggestions are all welcome
Describe the issue, problem, or suggestion

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.

ServiceCategoryPriceNotes
Basic ID CardCredentials$250first card free
Driver's License (issue)Credentials$250DMV pass required
Driver's License ReinstatementCredentials$2,500after a points suspension
Weapons LicenseCredentials$750
Hunting LicenseCredentials$300
Fishing LicenseCredentials$150
Business License CardCredentials$500credential card only
Credential ReplacementCredentials$300any card
Name Change PetitionVital Records$25,000
Marriage Certificate FilingVital Records$25,000
Civil Case FilingCourt$10,000 flat+5% of asking award; 50% refund on dismissal not yet collected
Petition for ExpungementCourt$20,000 base+$5,000/charge not yet collected
Certified ReprintCourt$500any retained document
Business License — Tier 1Business Licenses$10,000sole proprietor / street vendor
Business License — Tier 2Business Licenses$25,000storefront / small business
Business License — Tier 3Business Licenses$50,000corporation / nightclub / dealer
Business License — Tier 4Business Licenses$100,000franchise / enterprise group
Bar ExaminationExaminations$5,000
Bar Dues — MonthlyExaminations$2,500 / moprivate-practice roles, 7-day grace
Professional ExaminationExaminations$1,000any field
DMV Written Knowledge TestExaminations$250
DMV Practical (Road) TestExaminations$250charged 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.

CrestWood DMV ox_lib context menu
📘Take the Written Knowledge TestRegister a code + fee invoice for a classfa-solid fa-book
Which class?
🚗Class C — Passenger Vehicle
Success — lib.alertDialog "Written Test Registered — Class C"
Written Test Registered — Class C — Passenger Vehicle
Your examination code is K7P2M9Q4.
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.)

Which class?
🚗Class C — Passenger Vehicle

cw_dmv:road:request gates, in order:

  1. Basic ID in pockets — else "You must carry your Basic ID in your pockets to take a test."
  2. Written test passed for this class — else "You must pass the written knowledge test for this class first."
  3. Not already passed — else "You have already passed the road test for this class."
  4. Retake wait (24h) cleared
  5. 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
My DMV Status
Class C — Passenger Vehicle
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 labelSlugTest vehicle
Class C — Passenger Vehiclecarasea
Class M — Motorcyclemotorcyclefaggio2
Class CDL — Commercialcdlmule

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)
Driver License · No. 8U51K657B
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.