Ticket Workflow
The authoritative lifecycle, SLA/escalation, proof-of-resolution gate, TRI/MoM, and edge-case specification for every ticket on the Sindh IT Portal — Facilitation Desk (SITP).
| Field | Value |
|---|---|
| Doc ID | 06 |
| Status | Draft |
| Owner | S&ITD / MAAHIR |
| Languages | EN (master) · UR · SD |
| Depends on | /specs/en/05-data-model/, /specs/en/04-roles-permissions/, /specs/en/11-security-compliance/, /specs/en/21-mom-meetings/ |
| Applies to modules | B (TKT), G (NOT), M (MTG) |
1. Scope & Definitions
This document defines how a ticket is born, routed, worked against an SLA, escalated, proven resolved, optionally re-opened or appealed, and finally closed — plus how meetings (TRI) and their Minutes (MoM) attach into the lifecycle. It is the single source of truth for the status field on tickets, the sla_definitions table, the ticket_history / audit_events logs, and all transition guards.
Glossary (short form; see _glossary.md):
| Term | Meaning |
|---|---|
| Ticket | A unit of work filed by a company against a Government of Sindh department, owned end-to-end by S&ITD as facilitator. |
| Tracking ID | Meaningful identifier SITP-YYYY-<DEPT>-<NNNNNN> (e.g. SITP-2026-LBR-000123). Never re-used. |
| FRT | First Response Time — SLA timer from creation to first substantive response from the assigned department. |
| Resolution Time | SLA timer from creation to proof-gated Resolved. |
| SLA clock | The monotonic business-time counter driving both timers. |
| TRI | Tripartite Review In-person/virtual meeting — Company + S&ITD + Department(s). |
| MoM | Minutes of Meeting — uploaded by the department in its own format, AI-enriched. |
| Oversight tier | DG → Secretary → Minister/SACM chain with configurable powers per department. |
| CSAT | Customer Satisfaction rating submitted by the company after resolution. |
| S&ITD | Science & Information Technology Department, Government of Sindh. |
| SACM | Special Assistant to the Chief Minister (Sindh) on S&IT — Mr. Muhammad Ali Rashid. |
All capabilities described here are individually toggleable via the Feature Flag module (Q) and individually configurable via the per-department / per-category configuration tables described in §15.
2. Ticket States
Every ticket has exactly one status at any time. The full enumeration is fixed; entry and exit rules are not negotiable. Transitions are validated server-side and every transition emits an audit_events row (see §13).
2.1 State definitions and matrix
| State | Meaning | Who can enter it | Next possible states |
|---|---|---|---|
New |
Ticket has just been filed and a tracking ID generated. No triage yet. | System, on successful filing by any company rep with Filer role or higher, or any inbound channel (email/SMS/WhatsApp/IVR/walk-in). | Triaged, Cancelled/Withdrawn, On Hold |
Triaged |
S&ITD facilitator has reviewed, set category/priority, and routed to a department/section. No officer assigned yet. | S&ITD Triage Officer / Facilitator. | Assigned, On Hold, Cancelled/Withdrawn, New (return for incomplete intake) |
Assigned |
Routed to a specific officer (or queue) inside the department/section. FRT clock keeps running until first response. | Department Section Head, Auto-router (AI), or S&ITD Facilitator. | In Progress, Awaiting Parties, On Hold, Escalated, Triaged (re-route), Cancelled/Withdrawn |
In Progress |
Officer is actively working. First substantive response has been sent (FRT met). | Assigned Officer. | Awaiting Parties, Resolved (proof-gate), On Hold, Escalated, In Progress (state unchanged on internal progress notes) |
Awaiting Parties |
Blocked on the company or a third party (additional info, document, meeting attendance). SLA clock pauses. | Assigned Officer, or auto on outbound "please respond" message. | In Progress, On Hold, Escalated, Cancelled/Withdrawn |
Resolved |
Proof-of-Resolution gate satisfied: ≥1 evidence attachment + resolution note submitted. CSAT window starts. | Assigned Officer (with proof); subject to sensitive/VIP pre-close approval. | Closed (auto on accept or CSAT expiry), Reopened, Appealed |
Closed |
Terminal. Reached via company acceptance, CSAT window expiry, or force-resolve by an oversight tier with action powers. | System (auto-close), or oversight tier. | Reopened (within window), Appealed (within window). Otherwise terminal. |
Reopened |
Company rejected the resolution within the reopen window; ticket re-enters the work queue at its previous working state. | Company Rep (Primary/Admin) within reopen window. | In Progress, Triaged (if re-triage needed), Awaiting Parties, Closed (if company withdraws reopen) |
Escalated |
SLA near-breach/breach has triggered an escalation tier (DG / Secretary / Minister-SACM). The underlying working state is preserved as an escalation_context field; the ticket resumes the working state when de-escalated. |
System (SLA engine), or oversight tier with action powers. | In Progress, Awaiting Parties, Resolved, On Hold, Closed (force-resolve) |
On Hold |
Manually paused by an authorised actor for an explicit reason (legal stay, dependent external process, scheduled meeting). SLA clock pauses. | Assigned Officer, Section Head, DG, Secretary (with reason + expected resume date). | In Progress, Awaiting Parties, Assigned, Cancelled/Withdrawn |
Cancelled/Withdrawn |
Terminal. Company withdrew, duplicate, out-of-scope, or invalid-after-grace. | Company Rep (Primary/Admin), S&ITD Facilitator, Section Head (with reason). | Reopened (only if withdrawn-in-error, narrow window); otherwise terminal. |
Appealed |
Company filed a CPGRAMS-style second-chance appeal against resolution/closure. Routed to next oversight tier for review. | Company Rep (Primary/Admin) within appeal window; auto-enabled by poor CSAT. | In Progress (upheld → reopen work), Closed (rejected), Escalated, Triaged (re-routed) |
Notes:
Escalatedis an overlay status. The previous "real" working state (Assigned/In Progress/Awaiting Parties) is retained inescalation_contextand is the state the ticket returns to when the escalation clears or is actioned. This avoids losing officer context during an escalation spike.Awaiting PartiesandOn Holdboth pause the SLA clock but differ in actor and intent:Awaiting Partiesis a routine info-request block;On Holdis a deliberate, reason-bound suspension by an officer or oversight role.- A ticket can be
Cancelled/Withdrawnfrom most non-terminal states. The action requires a reason and emits an audit event; onlyPrimary/Adminreps may withdraw on the company side. - Terminal states are
ClosedandCancelled/Withdrawn. The only exits from terminal states are the narrow reopen/appeal windows defined in §8.
2.2 Who can transition (high-level — full RBAC in /specs/en/04-roles-permissions/)
| Actor | Key transition rights |
|---|---|
| Company Rep (Filer+) | File → New; withdraw → Cancelled/Withdrawn; reopen/appeal within windows. |
| Company Rep (Primary/Admin) | All of the above, plus force-withdraw and designate who may reopen. |
| S&ITD Triage Officer | New → Triaged → Assigned; re-route; return to New. |
| S&ITD Facilitator | All triage rights + escalate within S&ITD + request TRI + upload MoM. |
| Department Section Head | Assign/reassign within section; place On Hold; mark ready for resolve. |
| Assigned Officer | In Progress ↔ Awaiting Parties; submit resolution (proof-gated). |
| DG / Secretary / Minister-SACM | Oversight powers per §6 config: notify-only OR action (reassign, override SLA, force-resolve, send directive). |
| System (SLA / Auto-close engine) | Auto-escalate, auto-pause/resume clock, auto-close on accept or CSAT expiry. |
3. State Machine Diagram
The lifecycle below is the canonical state machine. Guards (proof-gate, sensitive approval, reopen window, etc.) are described in the relevant sections and applied on the transitions shown.
Mermaid node names cannot contain spaces, so
Cancelled/Withdrawnis rendered asCancelledWithdrawnandAwaiting PartiesasAwaitingParties. The on-systemstatusenum retains the canonical names with spaces/slashes.
Written flow description. A ticket is born New on filing or inbound channel arrival. S&ITD triages it into Triaged, sets category/priority/SLA, and routes to a department section, moving it to Assigned. The assigned officer's first substantive response flips the ticket to In Progress and stops the FRT clock (the resolution clock keeps running). Work alternates between In Progress and Awaiting Parties whenever the company must supply information; each Awaiting Parties entry pauses the SLA clock and each return resumes it. Either clock breaching its SLA flips the ticket to Escalated, an overlay state that retains the prior working context and notifies the appropriate oversight tier.
When the officer has finished, they pass the proof-of-resolution gate (≥1 evidence attachment + resolution note; sensitive/VIP tickets additionally need Chair/DG approval) and the ticket becomes Resolved. From Resolved, three things can happen: the company explicitly accepts → Closed; the CSAT window (default 7 days) expires with no action → auto-Closed; or the company rejects within the window → Reopened, which re-enters the work queue at its prior working state. From Closed (or directly from Resolved) the company may also file a CPGRAMS-style Appeal within the appeal window; appeals are reviewed at the next oversight tier and either upheld (back to In Progress) or rejected (terminal Closed). On Hold is a deliberate, reason-bound suspension usable from most working states. Cancelled/Withdrawn is terminal except for a narrow withdrawn-in-error path. The only true terminal states are Closed and Cancelled/Withdrawn.
4. Filing & Triage Flow
4.1 Filing
A ticket can originate from any of the channels in module K (Multi-channel Intake): the web portal, the PWA/mobile app, an inbound email, SMS, WhatsApp message, toll-free IVR/voice transcription, or a walk-in/offline entry by an S&ITD facilitator. All channels converge on the same tickets table; the intake_channel field records origin.
Smart filing (AI-assisted):
- Category suggestion. As the company types the complaint, the AI (module E) suggests the most likely category/sub-category and routed department based on semantic similarity to past tickets and the service catalog. The filer can accept or override.
- Similar-ticket deflection. If a similar open or recently-resolved ticket exists, the portal surfaces it before submission: "You may already have an answer — see SITP-2026-LBR-000098." If the company confirms the existing ticket covers their issue, no new ticket is created (deflection tracked as analytics event). If not, filing proceeds.
- Urgency & sentiment hint. AI proposes a priority (Urgent/Normal/Low) and surfaces sentiment; S&ITD triage confirms or overrides during triage.
- PII redaction on intake. Detected PII in free-text is flagged/redacted per module E before persistence.
Draft & save-later (satisfies FR-TKT-014). A company rep can save an incomplete ticket as a draft in their personal draft store. Drafts are not visible to S&ITD or the department, do not consume a tracking ID, and have a configurable retention (default 30 days). Submitting a draft converts it to a New ticket.
Dynamic conditional intake form. The intake form is driven by the service catalog and the chosen category/sub-category. Selecting "Labour — Unpaid dues" shows different fields (last salary date, amount, employee count) than "SECP — Name reservation conflict" (proposed name, reservation number, rejection letter). Conditional sections, mandatory-field rules, and allowed attachment types are configured per category in intake_form_schema.
Tracking ID generation. On successful submission, the system allocates the next sequence number for the routed department and constructs SITP-YYYY-<DEPT>-<NNNNNN> (e.g. SITP-2026-LBR-000123). Allocation is atomic (DB transaction + row lock on the per-dept sequence). The ID is returned to the filer immediately and is the canonical reference for all subsequent communication. A confirmation is sent in the filer's preferred language (EN/UR/SD) via their preferred channel.
4.2 Triage
S&ITD triage officers see a queue of New tickets. For each, they confirm or override AI-suggested category, sub-category, priority, routed department/section, SLA definition, and sensitivity flag. They may also flag VIP (filers from priority-sector companies, large employment, foreign-investment cases) which routes through the sensitive path. Once triaged, the ticket moves to Triaged and appears in the destination department's queue.
4.3 Filing & triage flow diagram
Written description. A filer (or an inbound channel adapter) starts the flow; authenticated filers may resume a saved draft, while anonymous/whistleblower intake is restricted-visibility from the outset. The dynamic intake form is rendered based on the category selected, with AI suggesting category and destination department as the filer types. Before submission, the system runs similar-ticket deflection: if a likely duplicate or already-answered ticket exists, the filer is offered the option to not create a new ticket. If they proceed, attachments are AV-scanned and encrypted, the form is submitted, and a tracking ID is atomically allocated in the SITP-YYYY-<DEPT>-<NNNNNN> format. The ticket enters New and lands in the S&ITD triage queue, where a triage officer confirms or overrides category, priority, SLA, destination, and sensitivity. On confirmation the ticket becomes Triaged, enters the destination department's section queue, and is assigned to an officer — either by the section head or by the AI auto-router — moving to Assigned.
5. SLA Model
5.1 SLA definitions
Every ticket is bound to exactly one row in sla_definitions, selected at triage by (department, category, priority). Each row carries two timers:
- First Response Time (FRT) — from creation to the first substantive response from the assigned department (the response that flips the ticket
Assigned→In Progress). Acknowledgements, "we are looking into this", and automated receipts do not satisfy FRT. - Resolution Time — from creation to proof-gated
Resolved.
Default targets (overridable per department/category):
| Priority | Default FRT | Default Resolution Time | Typical use |
|---|---|---|---|
| Urgent | 1 business day | 5 business days | Service outage, legal deadline, mass-incident, VIP/foreign-investment blocker. |
| Normal | 2 business days | 10 business days | Standard complaints, document requests, clarification needs. |
| Low | 5 business days | 20 business days | Suggestions, FYI, non-blocking queries. |
"Business day" is computed in the destination department's business hours and timezone (default Asia/Karachi, PKT) after removing Sindh public holidays and weekends. The defaults are overridable in sla_definitions per (department, category, priority); a NULL resolution time on a row means "no resolution SLA" (advisory only — used for open-ended categories like RTI where statutory deadlines apply instead).
5.2 SLA clock — when it runs, pauses, resumes
The SLA clock is a monotonic counter of business time accumulated against each timer. Two independent clocks run per ticket: the FRT clock and the Resolution clock. Both share the same run/pause rules below, except that the FRT clock stops permanently once FRT is met.
Clock runs when status is any of: New, Triaged, Assigned, In Progress, Reopened, Appealed (during active review), Escalated (overlay — runs against the retained working state).
Clock pauses when:
- Status is
Awaiting Parties(company or third-party response outstanding). - Status is
On Hold(reason-bound deliberate pause). - The current wall-clock time is outside the department's configured business hours (default Mon–Fri 09:00–17:00 PKT; configurable per department in
dept_business_hours). - The current wall-clock date is a Sindh public holiday listed in
holiday_calendar. - The current wall-clock date is a weekend for that department (default Sat + Sun; configurable — some departments work Saturdays).
Clock resumes when:
- Company responds (status returns
Awaiting Parties→In Progress), or On Holdis lifted by an authorised actor, and- The current wall-clock time is within business hours on a non-holiday, non-weekend day.
If a resume event happens outside business hours, the clock resumes at the start of the next business hour. The elapsed counter is persisted on every state transition so a server restart never loses SLA state.
Near-breach and breach. The SLA engine evaluates each open ticket's elapsed time against its timers on every tick (default 1-minute cron + on-transition). At configurable thresholds (default: 80% of timer = near-breach warning, 100% = breach), the engine emits audit_events and triggers the notification matrix (§12) and the escalation ladder (§6).
5.3 SLA clock diagram
Written description. The SLA clock accumulates business time only — never nights, weekends, or Sindh public holidays — and only while the ticket is in a "department is responsible" state (New, Triaged, Assigned, In Progress, Reopened, Appealed-under-review, or Escalated against a working-state context). Any transition into Awaiting Parties or On Hold pauses the clock; the corresponding transition back to In Progress resumes it, but only if wall-clock time is inside the destination department's business hours on a non-holiday weekday. The FRT clock stops permanently when the first substantive response satisfies FRT, while the resolution clock continues running until proof-gated Resolved. Near-breach (default 80% of a timer) and breach (100%) thresholds emit audit events and drive the escalation ladder; the running clock keeps accumulating even past breach so the breach duration is measurable.
5.4 Business hours & holiday calendar
dept_business_hours: per-department rows of(weekday, open_time, close_time, timezone). Default for all departments: Mon–Fri 09:00–17:00 Asia/Karachi. Departments that work Saturdays or have shifted hours configure their own rows.holiday_calendar: Sindh Government public holidays, sourced and updated by S&ITD annually (Eid ul Fitr, Eid ul Adha, 9th/10th/11th Muharram, 12th Rabi ul Awwal, Pakistan Day, Independence Day, Iqbal Day, Labour Day, Eid Milad un Nabi, Ashura, Chehlum, and any notified occasional holidays). Hijri-date holidays are computed against the Islamic calendar and resolved to Gregorian dates each year; both calendars are shown in the UI per §2 of_context.md.- RTI statutory deadlines. For tickets categorised as RTI (Sindh Transparency & RTI Act 2016), the statutory deadlines (default 10 working days, extendable by 10) take precedence over the table above and are configured as a separate SLA row marked
statutory = true.
6. Escalation Ladder
6.1 Ladder structure
When a ticket's resolution SLA breaches and remains unresolved, it climbs a configurable oversight ladder. The default ladder (locked decision, overridable per department/category in escalation_ladders) is:
| Tier | Default trigger (cumulative from FRT-breach / no-resolution start) | Oversight actor | Watcher added | Channel |
|---|---|---|---|---|
| 0 — Working | Ticket in flight, SLA running | Section Officer / POC | — | — |
| 1 — DG | +2 days unresolved | Director General of the concerned department | DG added as watcher | Email + in-app + SMS |
| 2 — Secretary | +5 more days (7 cumulative) unresolved | Department Secretary | Secretary added as watcher | Email + in-app + SMS + WhatsApp |
| 3 — Minister / SACM | +10 more days (still unresolved) | SACM (S&IT) Mr. Muhammad Ali Rashid, with copy to S&ITD Secretary | Minister/SACM + S&ITD Secretary added as watchers | Email + in-app + SMS + WhatsApp + directive letter |
The same ladder applies inside S&ITD itself — S&ITD is both facilitator and a department with its own tickets (e.g. against its own sections), so an S&ITD-internal ticket escalates from S&ITD Section Officer → S&ITD Additional/Joint DG → S&ITD Secretary → SACM. Triggers and tiers are configurable per escalation_ladders row scoped to (department, category).
Triggers are anchored to the SLA. Concretely, the +2/+5/+10 counts are business days after resolution-SLA breach, not after creation. A ticket that resolves within its SLA never escalates. A ticket that breaches climbs one tier at each configured interval until resolved or force-closed by an oversight actor with action powers.
6.2 Configurable oversight powers
Each oversight tier is configured per department as either notify-only or action. The configuration lives in oversight_powers keyed by (department, tier).
| Power | Notify-only tier | Action tier |
|---|---|---|
| Receive near-breach & breach alerts | ✓ | ✓ |
| Be added as watcher; see ticket + history | ✓ | ✓ |
| Comment on ticket | ◐ (configurable) | ✓ |
| Reassign to different section/officer | ✗ | ✓ |
| Override/pause SLA (set new target or freeze) | ✗ | ✓ |
| Force-resolve or force-close | ✗ | ✓ |
| Send binding directive (formal letter to dept) | ✗ | ✓ |
| Approve closure of sensitive/VIP ticket | ✗ | ✓ (Chair/DG specifically — see §7) |
Symbols per _conventions.md §8: ✓ allow · ✗ deny · ◐ conditional/configurable.
The default policy is: tiers 1 (DG) and 2 (Secretary) are action, tier 3 (Minister/SACM) is notify + directive; this is overridable per department. Sensitive/VIP closure approval always rests with Chair/DG regardless of tier.
6.3 Alerts and audit
- Near-breach alert (80% of any timer, configurable): notify assigned officer + section head + watchers via email/in-app; SMS if configured.
- Breach alert (100% of any timer): notify officer + section head + watchers + the next oversight tier via email/in-app/SMS; WhatsApp for tier ≥ 2.
- Each escalation event writes an immutable row to
audit_events(type = escalation,actor = systemoractor = oversight-user,tier,reason,timestamp) and a correspondingticket_historyentry. The ticket'sstatusflips toEscalatedwhileescalation_contextretains the prior working state. - Repeat-escalation handling. If a ticket is de-escalated (e.g. resumed to
In Progress) and then breaches again, it re-enters the ladder at the tier it left (never resetting to tier 1) unless an oversight actor with action powers explicitly resets it. Each repeat-escalation increments anescalation_countand arepeat_offenderflag on the ticket and on the assigned officer/section, surfacing in analytics (module I) for systemic-issue detection.
6.4 Escalation sequence diagram
Written description. The SLA engine detects breach and immediately flips the ticket to Escalated, writing a breach event plus the tier-1 escalation event to audit_events and notifying the officer, section head, and the department's DG, who is added as a watcher. After 2 more unresolved business days, the engine escalates to tier 2 (Secretary), with email/in-app/SMS/WhatsApp delivery and watcher addition. After 5 more unresolved business days, it escalates to tier 3 (SACM and S&ITD Secretary), triggering a formal directive letter in addition to the standard channels. At each tier, if the configuration grants action powers, the oversight actor can reassign, override the SLA, force-resolve, or issue a binding directive — each of which is itself audited. If the tier is notify-only, the ticket remains Escalated until the working officer submits a proof-gated resolution, at which point the engine logs the de-escalation and moves the ticket to Resolved or back to its prior working state.
7. Proof-of-Resolution Gate
7.1 The gate
A ticket cannot transition to Resolved until all of the following hold:
- ≥1 evidence attachment is present on the ticket (filed under evidence category, AV-scanned, encrypted — module D). Acceptable evidence types are configured per category in
evidence_schema(e.g. signed settlement, payment proof, corrected licence, NOC, official letter). - A resolution note is submitted by the assigned officer describing what was done, with reference to the attached evidence.
- Sensitive/VIP tickets only: explicit Chair/DG approval of the proposed resolution before the transition is allowed (see §7.3).
- Inter-departmental tickets: every linked sub-task/department must individually mark itself resolved (or be explicitly waived by the lead department).
The gate is enforced server-side on the PATCH /tickets/:id/status transition; the API returns 409 Conflict with a structured error if any precondition fails. The UI disables the "Resolve" action until preconditions are met.
7.2 Auto-close logic
Once Resolved, the ticket enters the CSAT window (default 7 calendar days, configurable globally and per department in csat_config). During this window:
- The company is invited to (a) accept the resolution, (b) rate it via CSAT (1–5 stars + optional free-text), or (c) reopen with a reason.
- Auto-close triggers when either the company explicitly accepts, or the CSAT window elapses with no action. On auto-close the ticket moves to
Closed(terminal) and a closure notice is sent. - If the company submits a poor CSAT rating (default ≤ 2 stars), the system enables the appeal path (§8) and surfaces it in the company's UI.
- If the company explicitly rejects within the window, the ticket moves to
Reopenedand re-enters the work queue.
7.3 Sensitive / VIP closure approval
For tickets flagged sensitive = true (legal/political exposure, VIP filer, foreign-investment, mass-incident) or vip = true, the proof gate adds a fourth precondition: a Chair or DG approval must be recorded on the proposed resolution before Resolved is allowed. The assigned officer submits the resolution package (evidence + note); it routes to the department's Chair/DG approval queue; on approval the gate opens and the officer can flip to Resolved. Rejection returns the ticket to In Progress with the Chair/DG's reason attached. The approval is itself an audited event with actor, timestamp, and decision.
7.4 Proof-of-Resolution gate diagram
Written description. From In Progress the officer marks the ticket ready to resolve and the proof gate evaluates: at least one evidence attachment and a resolution note must exist, otherwise the transition is blocked with 409 Conflict and the ticket stays in In Progress. For sensitive/VIP tickets the package additionally routes to the Chair/DG approval queue; approval opens the gate while rejection returns the ticket to In Progress with a recorded reason. With the gate cleared the ticket becomes Resolved and the CSAT window starts (default 7 calendar days). The company can accept, rate, or reject; an explicit accept or window expiry triggers auto-close to terminal Closed, while a rejection moves the ticket to Reopened. A poor CSAT rating (default ≤ 2) enables the appeal path; if the company files an appeal within the window the ticket moves to Appealed, otherwise it closes on window expiry.
8. Reopen & Appeal
8.1 Reopen
Within the reopen window (default = the CSAT window; configurable in csat_config), the company rep (Primary/Admin, or Filer if permitted by the Primary) can reopen a Resolved or Closed ticket by providing a reason. Reopen returns the ticket to its previous working state (typically In Progress) and restarts the resolution clock for a configurable additional SLA (default = 50% of the original resolution SLA, capped). Reopens are capped per ticket (default 2) to prevent abuse; exceeding the cap forces the company down the appeal path instead. Each reopen is an audited event.
8.2 Appeal (CPGRAMS-style second chance)
Beyond reopen, the company may file a formal appeal against a Resolved or Closed ticket within the appeal window (default 30 calendar days from closure, configurable). The appeal asks a higher authority to review whether the resolution was adequate. Appeals are routed to the next oversight tier above the one that closed the ticket: if the ticket was closed at working level, the DG reviews; if closed under DG purview, the Secretary reviews; if closed under Secretary purview, the SACM/S&ITD Secretary reviews. A poor CSAT rating (≤ threshold) enables and pre-fills the appeal form and extends the appeal window by a configurable grace (default +15 days).
The reviewing authority can:
- Uphold the appeal → ticket returns to
In Progress(reopened for proper resolution) with a directive to the section. - Reject the appeal → ticket stays
Closed(terminal); the rejection letter is generated (module L) with QR verification and sent to the company. - Partially uphold → specific action items added as sub-tasks, ticket returns to
In Progressfor those items only. - Re-route → ticket moves to
Triagedfor assignment to a different section/department.
Each appeal decision is audited with actor, tier, reasoning, and resulting action.
8.3 Reopen & appeal diagram
Written description. From Resolved or Closed the company has two paths inside their respective windows. The reopen path (default window = the CSAT window) accepts a reason from the company and, subject to a per-ticket reopen cap (default 2), returns the ticket to its prior In Progress state with a reduced resolution SLA (default 50% of the original). When the reopen cap is exceeded the company is forced onto the appeal path. The appeal path (default 30-day window from closure, extendable by a poor-CSAT grace) routes the case to the next oversight tier above the one that closed it. The reviewing authority may uphold (ticket returns to In Progress with a directive), partially uphold (sub-tasks created, ticket returns to In Progress for those items), reject (closure is final; a QR-verified rejection letter is generated), or re-route (ticket moves to Triaged for a different section). All decisions are audited.
9. TRI (Tripartite) Meeting Flow
9.1 When TRI is used
A TRI (Tripartite Review) meeting is triggered when normal ticket progress stalls. Any of the following can request one:
- The company rep ("Request TRI meeting" action on the ticket).
- The assigned department officer or section head.
- The S&ITD facilitator.
- Auto-triggered by the SLA engine when a ticket has been
Escalatedat tier ≥ 2 with no movement for a configurable interval (default 3 business days).
A TRI request moves the ticket to On Hold (clock paused) with reason "TRI meeting requested" and creates a meetings record of type TRI linked to the ticket.
9.2 Parties and modality
The three required parties are:
- Company — Primary Authorized Rep (or delegate), optionally with counsel/technical staff.
- S&ITD — the assigned facilitator, who chairs the meeting.
- Concerned Department(s) — the assigned officer plus the section head; for multi-department tickets, all concerned departments.
Modality is configurable per meeting: physical (at the department or S&ITD office), virtual (Zoom / Google Meet / Microsoft Teams — the provider is selectable per meeting from the configured connectors), or hybrid. Recording consent is captured before any recording starts and is logged in meeting_consent.
9.3 Agenda auto-drafting
On TRI creation the AI (module E) auto-drafts an agenda from the ticket's full history — title, description, all messages, attachments, SLA events, prior escalations, and any related tickets — and proposes discussion items, decision points, and a recommended order. The facilitator reviews and edits the agenda before sending invitations. The agenda is multilingual (EN/UR/SD) per participant preference.
9.4 Outcome
At meeting end the facilitator records the outcome as one of:
- Resolved — agreement reached; the ticket returns to
In Progressonly long enough to attach the agreed evidence, then moves toResolved(proof gate still applies — typically the MoM + signed agreement serve as evidence). - Further action items — specific owners and due dates recorded; these become sub-tasks (§11) and the ticket returns to
In Progress. - Escalate — the meeting could not resolve the issue; the ticket moves to
Escalatedat the next tier with the meeting record as supporting context.
In all cases a MoM is produced (§10) and permanently attached to the ticket.
9.5 TRI flow diagram
Written description. When a ticket stalls or sits at escalation tier 2+ without movement, any of the company, the officer, the facilitator, or the auto-trigger can request a TRI meeting. The request creates a meetings record and parks the ticket in On Hold with reason "TRI meeting requested", pausing the SLA clock. The AI auto-drafts an agenda from the ticket's full history and uploads, which the facilitator reviews and edits. The modality — physical, virtual (Zoom/Meet/Teams), or hybrid — is selected per meeting, invites go out multilingually, and recording consent is captured. After the meeting, the facilitator records the outcome: a fully-resolved case returns to In Progress only long enough to attach the MoM and signed agreement as proof-gate evidence, then moves to Resolved; a partial outcome creates sub-tasks with owners and due dates and the ticket returns to In Progress; a failure to agree escalates the ticket to the next tier with the meeting record attached. In every case a MoM is produced and attached per §10.
10. MoM (Minutes of Meeting) Flow
The MoM flow applies to any meeting attached to a ticket — a TRI (§9), a direct company–department meeting, or any other recorded meeting. The department preparing the MoM uploads its own format (PDF, Word, or images of a signed paper MoM); manual entry and AI live-transcription are available as feature-flagged alternatives but upload-first is the default and primary path per _context.md §5.
10.1 Upload → scan → store → enrich
- Prepare & upload. The department's officer or the S&ITD facilitator prepares the MoM in the department's own template and uploads it (PDF/DOCX/PNG/JPEG). Multiple files allowed.
- AV scan. ClamAV scans every upload; infected files are quarantined and the upload is rejected with a reason.
- Store. Clean files are encrypted and stored in object storage (MinIO); a
mom_documentsrow is created linking the file to themeetingsrecord and the parent ticket. - OCR (if scanned). Image-only or scanned PDFs are routed through the pluggable OCR engine (Tesseract on-prem / Google Document AI / Azure Document Intelligence / AWS Textract). OCR supports multilingual text (English + Urdu + Sindhi, including Nastaliq and Naskh scripts) and produces a searchable text layer.
- AI extraction. The AI service (module E) reads the OCR text (or native text for born-digital files) and extracts:
- A structured summary of the meeting.
- Action items with owner, due date, priority, and dependency.
- Decisions recorded.
- Attendees (cross-referenced with the invitee list).
- A machine translation to EN/UR/SD so participants can read the MoM in their preferred language.
- Officer review & confirm. The uploading officer reviews the extracted action items in a side-by-side view (original document ↔ extracted table), corrects any mis-extraction, and confirms. Confirmed action items become sub-tasks on the parent ticket (§11), each with its own owner, due date, and SLA slice.
10.2 Approval gate
- Normal ticket: the uploader publishes directly. No approval required.
- Sensitive / VIP ticket: the MoM must pass Chair/DG approval before it can be published/shared. The MoM enters the approval queue; on approval it is publishable, on rejection it returns to the uploader with the reviewer's reason.
10.3 Publish & share
On publish:
- The MoM is permanently attached to the ticket (versioned — every revision creates a new
mom_documentsversion row; prior versions are retained and audit-logged, never overwritten). - The MoM is auto-shared to all participants (company reps, S&ITD facilitator, department attendees, oversight watchers) via:
- Email with the MoM attached (or a secure download link).
- In-app notification with deep-link to the ticket.
- SMS / WhatsApp short summary + link (per participant preference).
- Acknowledgment tracking: each participant's acknowledgment (open, download, explicit ack) is recorded against the MoM and shown in the ticket timeline. Non-acknowledgment past a configurable grace (default 3 days) triggers a reminder.
- The MoM is cross-posted to NITB e-Office if the e-Office integration is enabled for that department (module H), creating the corresponding official file movement.
10.4 MoM flow diagram
Written description. After any meeting, the responsible officer uploads the MoM in the department's own format (PDF, Word, or images of a signed paper document). Every upload is ClamAV-scanned; clean files are encrypted and stored as a mom_documents row linked to the meeting and parent ticket. Scanned documents run through the pluggable multilingual OCR engine (English, Urdu including Nastaliq, and Sindhi including Naskh) to produce a text layer; born-digital files skip OCR. The AI service then extracts a summary, structured action items with owners and due dates, recorded decisions, and attendee list, and produces machine translations in all three languages. The uploading officer reviews the extraction side-by-side with the original and confirms; confirmed action items become sub-tasks on the ticket. For normal tickets the officer publishes directly; for sensitive/VIP tickets the MoM must first pass Chair/DG approval. On publish the MoM is versioned and permanently attached (immutable, prior versions retained), auto-shared to all participants across email, in-app, and SMS/WhatsApp per their preferences, with acknowledgments tracked and reminders sent after a grace period. If the department has e-Office integration enabled, the MoM is cross-posted to NITB e-Office as an official file movement.
11. Multi-Department Coordination
11.1 Referral and parallel routing
A single ticket can involve multiple departments. Two routing modes are supported and may be combined:
- Sequential referral — the lead department resolves its part then refers the ticket onward (e.g. SECP refers to FBR for NTN correction). The ticket's working state is preserved per department; SLA clocks pause for the referring department while waiting for the next.
- Parallel routing — one ticket is worked by multiple departments concurrently, each with its own sub-task and its own SLA slice. The parent ticket cannot reach
Resolveduntil all sub-tasks are resolved or explicitly waived by the lead department (proof gate precondition §7.1).
Each routed department gets its own assignment, its own SLA row from sla_definitions, and its own escalation ladder from escalation_ladders. The S&ITD facilitator has cross-department visibility and can rebalance, merge, or split at any time.
11.2 Sub-tasks
A sub-task is a fully-fledged ticket linked via parent_ticket_id. Sub-tasks inherit category, priority, and SLA from the parent by default but can be overridden. Sub-tasks have their own status lifecycle (§2), their own SLA clocks, and their own escalation ladders. Sub-tasks created from MoM action items (§10) carry origin = mom_action_item with a reference back to the MoM. The parent ticket's resolution is gated on all mandatory sub-tasks being resolved.
11.3 Link / relate / merge / split
| Operation | Definition | Who |
|---|---|---|
| Link / relate | Declare two tickets related (e.g. same root cause, same company, dependency). Both tickets keep independent lifecycles; a relationship badge is shown. | Officer, Facilitator, AI (suggestion). |
| Merge | Combine N duplicate tickets into one canonical ticket. Non-canonical tickets become Cancelled/Withdrawn with reason "merged into SITP-…"; their history, attachments, and watchers are folded into the canonical ticket. Reversible only within a narrow window by S&ITD facilitator. |
Facilitator, Section Head. |
| Split | Create one or more new tickets from a single ticket (e.g. one filing raises three distinct issues). The original ticket is annotated with links to the splits; each split is a fresh New ticket with its own tracking ID. |
Officer, Facilitator. |
| ** watchers / CC** | Add an actor (officer, oversight, external email) as a watcher on a ticket without making them the assignee. Watchers receive transition notifications (§12) and can comment per RBAC. | Officer, Facilitator, Oversight. |
11.4 Bulk actions
Authorised actors (Facilitator, Section Head, DG/Secretary with action powers) can perform bulk operations on a filtered selection of tickets: bulk assign, bulk re-route, bulk pause (On Hold), bulk merge, bulk close (with reason), bulk add watcher, bulk export. Every bulk action is logged once per affected ticket in audit_events with the bulk-action ID for traceability.
11.5 Multi-department coordination diagram
Written description. A parent ticket can be routed by the S&ITD facilitator either sequentially (a referral chain through SECP → FBR → SRB, with each department's SLA clock running only during its turn) or in parallel (concurrent sub-tasks, each with its own SLA and escalation ladder, all of which must be resolved before the parent can pass the proof gate). Sub-tasks are full tickets linked by parent_ticket_id; those originating from MoM action items are tagged accordingly. Linking/relating connects two independent tickets without merging their lifecycles; merging folds duplicates into a canonical ticket and cancels the others with full history preservation; splitting creates fresh tracking IDs for distinct issues raised in one filing. Watchers and CC add observers without changing assignment. Bulk actions let authorised actors apply changes across filtered selections, with every affected ticket individually audited under a shared bulk-action ID.
12. Notifications at Each Transition
The Notification Service (module G) emits templated, multilingual notifications on every audited transition. Each notification's language is the recipient's preferred language; each channel honours the recipient's preference centre (digests, quiet hours, channel opt-in). Two-way inbound replies — a reply to the notification email or WhatsApp — are parsed and appended to the ticket as an inbound message, with the original notification referenced for threading.
| Transition | Who is notified | Channels | Template (illustrative) |
|---|---|---|---|
→ New (filed) |
Filer + Primary Rep | Email + in-app + SMS | "Ticket {ID} filed; we will respond within {FRT}." |
→ Triaged |
Filer + routed Dept Section Head | Email + in-app | "Ticket {ID} routed to {Dept}/{Section}." |
→ Assigned |
Assigned Officer + Filer | Email + in-app + SMS | "Ticket {ID} assigned to {Officer}." |
| FRT met (first response) | Filer | Email + in-app + SMS/WA | "Update on {ID}: {first-response excerpt}." |
→ Awaiting Parties |
Filer + watchers | Email + in-app + SMS/WA | "Action needed on {ID}: please provide {request}." |
Company responds (→ In Progress) |
Assigned Officer + watchers | In-app + email | "Company responded on {ID}." |
→ On Hold |
Filer + watchers + oversight | Email + in-app | "Ticket {ID} on hold: {reason}; resumes {date}." |
| Near-breach (80%) | Officer + Section Head + watchers | Email + in-app + SMS | "Ticket {ID} approaching SLA breach." |
→ Escalated (each tier) |
Officer + Section + corresponding tier + watchers | Email + in-app + SMS, + WA at tier ≥ 2, + directive letter at tier 3 | "Ticket {ID} escalated to {tier}." |
→ Resolved |
Filer + watchers | Email + in-app + SMS/WA | "Ticket {ID} resolved; please review by {CSAT-expiry}." |
→ Closed (auto or accept) |
Filer + watchers | Email + in-app + SMS | "Ticket {ID} closed. CSAT: {link}." |
→ Reopened |
Assigned Officer + Section + watchers | Email + in-app + SMS | "Ticket {ID} reopened by company: {reason}." |
→ Appealed |
Reviewing oversight tier + watchers + Filer | Email + in-app + SMS/WA | "Ticket {ID} appealed; under review by {tier}." |
→ Cancelled/Withdrawn |
Filer + watchers | Email + in-app | "Ticket {ID} withdrawn/cancelled: {reason}." |
| TRI meeting scheduled | All 3 parties | Email + in-app + SMS/WA + calendar invite | "TRI meeting on {ID}: {datetime}, {modality}, {link}." |
| MoM published | All participants + watchers | Email (attach) + in-app + SMS/WA | "Minutes for {ID} published: {link}. Please acknowledge." |
| Sensitive-closure approval requested | Chair/DG | Email + in-app | "Approval required: closure of sensitive ticket {ID}." |
All templates are versioned and editable by Super Admin (per language). Each sent notification is itself logged in notifications with template ID, language, channel, recipient, and delivery status, and is retained for audit.
13. Audit & Traceability
Every state change, escalation, pause, resume, approval, publish, merge, split, bulk action, and notification is recorded immutably in two complementary stores (data model in /specs/en/05-data-model/):
ticket_history— the human-readable, ticket-scoped timeline. One row per transition withticket_id,from_status,to_status,actor_id,actor_role,timestamp,reason, and a diff of changed fields.audit_events— the system-scoped, append-only event log. One row per auditable action withevent_type(state_change,escalation,sla_pause,sla_resume,sla_override,approval_decision,mom_publish,merge,split,bulk_action,notification_sent, …),actor_id,actor_role,target_type,target_id,payload(JSON),ip,user_agent,timestamp, and an optionalreason.
Rows in both tables are append-only; no UPDATE or DELETE is permitted at the application or DB-role level (enforced via MariaDB grants — see /specs/en/11-security-compliance/). A separate retention/archival job moves aged rows to cold storage per Sindh Archives rules (§6 of _context.md) without deleting them.
Each audit_events row is cross-referenced:
- To the originating
ticket_historyrow via a sharedcorrelation_id. - To any notification sent (§12) via
notifications.audit_event_id. - To any file or MoM involved via
payload.file_ids/payload.mom_id.
This gives end-to-end traceability from "company filed at T0" through every triage, pause, escalation, approval, MoM publish, and closure — satisfying both internal governance review and external audit (RTI, Auditor General, CERT-PK).
14. Edge Cases
| Edge case | Handling |
|---|---|
| Company deregisters mid-ticket | Open tickets are not auto-cancelled. The ticket continues to resolution; the company rep retains read access. New tickets cannot be filed by the deregistered entity. If deregistration is on grounds of fraud, S&ITD facilitator may Cancelled/Withdrawn with reason and notify the rep's last-known contact. |
| Company representative changes (Primary/Admin handover) | The outgoing Primary performs a transfer (or, if unreachable, the S&ITD facilitator invokes the supervised handover path). The handover is audited. Open tickets remain assigned to the company; the new Primary inherits all rights and notifications. The outgoing rep loses write access but retains read access to tickets they filed, per retention policy. |
| Department restructure (section merged/split/renamed) | The org tree (module C) is versioned with effective dates. Tickets keep their original department_id/section_id from filing time but a current_routing pointer follows the live org tree. Officers in the restructured section inherit assignments automatically; the <DEPT> code in the tracking ID is preserved for continuity. SLA and escalation configs migrate to the new structure's rows; if missing, the global defaults apply and a config-gap alert is raised. |
| SLA override by Secretary | A Secretary (or any oversight actor with action powers for that department) may pause, resume, extend, shorten, or freeze the SLA clock on a specific ticket. Each override is an audit_events row of type sla_override with actor, reason, old/new target, and timestamp. The override is visible on the ticket timeline. Overrides cannot be silently applied — the reason field is mandatory. |
| Duplicate merge | When two or more tickets are confirmed duplicates (by AI suggestion + human confirmation, or by manual facilitator action), the canonical ticket absorbs the others. Non-canonical tickets move to Cancelled/Withdrawn with reason "merged into {canonical-ID}"; their histories, attachments, watchers, and CSAT are folded into the canonical. The merge is reversible only within a narrow window (default 24h) by the facilitator; afterward it is final. |
| Mass-incident (one root cause, many tickets) | A mass-incident is declared by the S&ITD facilitator (or auto-suggested by analytics when duplicate/related counts cross a threshold). All affected tickets are linked to a mass_incident parent record; they remain individually tracked but share a common status broadcast, a single root-cause investigation thread, and a single resolution template. When the root cause is fixed, a bulk-resolve action with shared evidence closes all linked tickets in one operation (each still subject to its own proof gate and CSAT). |
| Anonymous / whistleblower ticket | Filed via the restricted-visibility intake channel (module K). The filer's identity is not stored on the ticket; an opaque pseudonymous handle and a one-way token are used instead. Visibility is restricted to a named whistleblower-handling role in S&ITD plus, optionally, the S&ITD Secretary. Standard SLA and escalation apply but oversight notifications omit filer-identifying information. Retention follows the whistleblower policy in /specs/en/24-trust-safety/. |
Company unresponsive past grace in Awaiting Parties |
After a configurable grace (default 7 business days), the SLA engine emits a final-request reminder; after a second grace (default 14 business days total), the ticket auto-moves to Cancelled/Withdrawn with reason "no response from filer", subject to a final 7-day reactivation window during which the company can reopen by responding. |
| Officer absent / leaves mid-ticket | The Section Head reassigns; the prior officer retains read access for handover. SLA clock continues unless the Section Head explicitly places the ticket On Hold with reason. |
| Cross-calendar edge (Hijri holiday) | Hijri-date holidays (Eid, Ashura, Milad un Nabi, Chehlum) are resolved to Gregorian dates each year by the calendar service; the SLA engine treats the resolved Gregorian date as a non-business day. If a Hijri holiday falls on a weekend, no extra day is added unless S&ITD explicitly notifies a compensatory holiday. |
15. Configurability Summary
The system is designed so that almost every behavioural parameter is configurable, either globally (S&ITD-wide) or per department/category. The matrix below summarises what is configurable and where it lives. Cells marked ◐ are conditional (configurable where indicated).
| Parameter | Global default | Per-department | Per-category | Stored in |
|---|---|---|---|---|
| SLA FRT targets (Urgent/Normal/Low) | 1d / 2d / 5d | ◐ | ◐ | sla_definitions |
| SLA Resolution targets | 5d / 10d / 20d | ◐ | ◐ | sla_definitions |
| Escalation ladder tiers & triggers | 2/5/10 days; DG → Secretary → SACM | ◐ | ◐ | escalation_ladders |
| Oversight powers per tier (notify-only vs action) | Tier 1, 2 = action; tier 3 = notify+directive | ◐ | — | oversight_powers |
| Business hours | Mon–Fri 09:00–17:00 PKT | ◐ | — | dept_business_hours |
| Weekend definition | Sat + Sun | ◐ | — | dept_business_hours |
| Sindh public holidays | Annual Sindh Govt calendar | — | — | holiday_calendar |
| Near-breach threshold | 80% of timer | ◐ | ◐ | sla_config |
| CSAT window | 7 calendar days | ◐ | ◐ | csat_config |
| Reopen window | = CSAT window | ◐ | ◐ | csat_config |
| Reopen cap per ticket | 2 | ◐ | ◐ | csat_config |
| Reopen SLA restart fraction | 50% of original | ◐ | ◐ | csat_config |
| Appeal window | 30 calendar days from closure | ◐ | ◐ | appeal_config |
| Poor-CSAT appeal grace | +15 days | ◐ | ◐ | appeal_config |
| Sensitive/VIP closure approval required | Yes (Chair/DG) | — | — | Policy flag on ticket |
| Awaiting-Parties grace before auto-cancel | 14 business days | ◐ | ◐ | sla_config |
| TRI auto-trigger threshold | Escalated tier ≥ 2 + 3 business days idle | ◐ | ◐ | tri_config |
| TRI default modality | Hybrid | ◐ | — | tri_config |
| Allowed video providers | Zoom, Meet, Teams | ◐ | — | Connector config |
| MoM approval required for sensitive | Yes (Chair/DG) | — | — | Policy flag on ticket |
| MoM acknowledgment reminder grace | 3 days | ◐ | ◐ | mom_config |
| OCR engine selection | Pluggable (Tesseract/Doc AI/Azure/Textract) | — | — | ai_engines |
| Notification channels per transition | Per matrix §12 | ◐ (channel opt-out) | — | notification_templates + preference centre |
| Anonymous/whistleblower visibility | Restricted to S&ITD whistleblower role + S&ITD Secretary | — | — | RBAC policy |
| Feature flags (toggle any capability on/off) | On globally | ◐ per dept/env | — | feature_flags |
Configuration governance. All configuration tables are themselves audited: any change to a sla_definitions, escalation_ladders, oversight_powers, dept_business_hours, holiday_calendar, csat_config, appeal_config, tri_config, mom_config, or feature_flags row writes an audit_events entry with the old and new value, the actor, and a mandatory change-reason. Configuration changes are restricted to Super Admin (S&ITD) for global rows and to the department's DG/Secretary (with action powers) for department-scoped rows. Sensitive global changes (e.g. disabling the proof gate) require two-person approval.
End of document.