CivicLoop by Ta-Tech Solutions Purpose: Define every kind of user, what each can see and do, and the access-control model that keeps residents, County staff, and County leadership in their correct lanes.
CivicLoop has two populations of users with a hard wall between them:
Access control is role-based, tenant-scoped, and least-privilege: a user sees the minimum needed to do their job, and never crosses the County (tenant) boundary. This model is inherited from the Ta-Tech engine, the same RBAC + row-level isolation that runs the healthcare and workforce platforms.
The member of the public. Can act with no account at all - a phone number is enough to file and be notified. An optional lightweight account adds a personal request history and saved locations.
A resident can:
A resident cannot:
Frontline County worker in a department - the person who resolves requests. The most-used staff role.
An agent can:
An agent cannot:
Leads a team of agents within a department.
A supervisor has everything an agent has, plus:
A supervisor cannot:
Accountable for a whole department's service performance.
A department head has everything a supervisor has, plus:
Leads the Office of Community Relations / the 311 function. The cross-department view.
A 311 Director can:
A 311 Director is the primary audience for the system's intelligence - the person who manages the system rather than the queue.
The top staff role. The configuration owner. Held by very few people.
A County Admin can do everything a 311 Director can, plus:
A County Admin cannot quietly do harm without a trace: every configuration change writes an immutable Audit Log entry.
New 2026-05-18 capabilities on the County Admin surface (/admin):
off, route, full. Writes counties.autopilot_level. Every
flip is audit-logged. The dial governs how much the AI does on
its own at intake (Document 07, Component J).@first-name heads-up in the department channel, and
notifies the resident. Idempotent (6-hour cooldown per request)./admin/locations lets the County
admin generate a printable poster with a QR code for any council
district, kiosk, or known problem area. The QR encodes
/report?address=&lat=&lng= so a scan auto-fills the report
flow. The poster is a branded PDF (Document 08).| Surface | Owned by | Notes |
|---|---|---|
/admin autopilot dial + self-heal Run now + location posters |
County Admin | Audit-logged. Self-heal is also reachable as the cron endpoint /api/cron/self-heal (Document 08), gated by the optional SELFHEAL_CRON_TOKEN env. |
/dashboard forecast panel "Run forecast now" |
311 Director (and County Admin, who inherits the Director surface) | Director-triggered. Writes one row per (category, council_district) into predicted_issues. |
/dashboard equity panel |
311 Director | Read-only view; the data comes from service_areas.council_district and locations.council_district. |
/dashboard upcoming visits panel |
311 Director and the department's Supervisor / Department Head (scoped) | Reads scheduled_visits for the staffer's scope. |
/console/[requestNumber] schedule visit + visits list |
Agent and above | Creating a visit fires SMS + email with a .ics attachment to the resident. Cancel + complete write Request Events. |
/channels and /channels/[slug] |
Any staff member (department channel visible to its department, #311-all to everyone) |
Slash commands (/help, /open, /breaches, /summary CP-...) are deterministic - no AI call. @loop triggers the AI persona (Document 07). |
/council/[district] |
A council member or their staff, plus 311 Director and County Admin | The view is scoped to one of PG County's 9 districts. Shows totals, open, resolved, SLA breaches, top categories, recent requests, and the district's slice of the forecast. Council-member sign-in is a future seam; for the pilot, the County Admin grants the access. |
/survey/[token] |
Resident (the original requester only; token is single-use) | No auth, no PII, no account. The token IS the credential. |
/public |
Anyone, anywhere, no account | NOT locale-scoped; one URL. Shows aggregated last-7-day numbers and an anonymized SVG scatter map. CSV at /api/public/weekly.csv. |
The AI components and background jobs act under a system identity. Every action they take - classify, route, predict, notify - writes an AI Decision and/or Audit Log row attributed to "ai" or "system," never to a person. This keeps the human audit trail clean and the AI accountable.
R = Resident, A = Agent, S = Supervisor, DH = Department Head, D = 311 Director, CA = County Admin.
| Capability | R | A | S | DH | D | CA |
|---|---|---|---|---|---|---|
| File a service request | Y | Y | Y | Y | Y | Y |
| Track own requests | Y | Y | Y | Y | Y | Y |
| See public map | Y | Y | Y | Y | Y | Y |
| See own department's queue | - | Y | Y | Y | Y | Y |
| Claim / work a request | - | Y | Y | Y | Y | Y |
| Move workflow to RESOLVED | - | Y | Y | Y | Y | Y |
| Override AI routing (with reason) | - | Y | Y | Y | Y | Y |
| Comment to resident | - | Y | Y | Y | Y | Y |
| Close (confirm) a request | - | - | Y | Y | Y | Y |
| Reassign across agents | - | - | Y | Y | Y | Y |
| Handle escalations | - | - | Y | Y | Y | Y |
| See whole-department analytics | - | - | Y | Y | Y | Y |
| Manage department staff | - | - | partial | Y | - | Y |
| Set department hours / SLA proposals | - | - | - | Y | Y | Y |
| See ALL departments' requests | - | - | - | - | Y | Y |
| Director Dashboard (county-wide) | - | - | - | - | Y | Y |
| Export reports / open-data | - | - | - | - | Y | Y |
| Manage categories / routing rules | - | - | - | - | - | Y |
| Manage SLA policy library | - | - | - | - | - | Y |
| Manage departments & all staff | - | - | - | - | - | Y |
| Configure integrations | - | - | - | - | - | Y |
| Time-limited permission grants | - | - | - | - | - | Y |
| See full audit log | - | - | - | - | partial | Y |
| Schedule a visit on a request | - | Y | Y | Y | Y | Y |
Upload progress photo (in assigned or in_progress) |
- | Y | Y | Y | Y | Y |
| Post in department channels | - | Y | Y | Y | Y | Y |
@loop the AI persona in a channel |
- | Y | Y | Y | Y | Y |
Open /council/[district] scoped view |
- | - | - | - | Y | Y |
Open /public transparency portal |
Y | Y | Y | Y | Y | Y |
| Receive auto-survey + answer it | Y | - | - | - | - | - |
| Set the Autopilot dial (off/route/full) | - | - | - | - | - | Y |
| Run self-heal "Run now" (admin) | - | - | - | - | - | Y |
| Run "Run forecast now" (director) | - | - | - | - | Y | Y |
| Build location-poster QR | - | - | - | - | - | Y |
"partial" = scoped: a Supervisor manages only their own agents; a 311 Director sees audit entries for requests, not for county configuration.
| Population | How they sign in |
|---|---|
| Residents | Phone number + one-time SMS code, or email + one-time code. Optional: set a PIN for faster re-entry. No password to forget - this directly fixes the documented "password loop" failure mode. Anonymous filing needs no sign-in at all. |
| County staff | County email + password + two-factor (TOTP). Two-factor is mandatory for all staff roles - this is government data. Trusted-device option remembers a browser for 30 days. SSO against the County's identity provider is supported as a configuration option (Document 05). |
Next: 05 - System Architecture.