Some checks are pending
Bidi Control Character Guard / bidi-control-guard (push) Waiting to run
Circular Dependency Check / Check for new circular dependencies (push) Waiting to run
Citus Migration Smoke / Combined migrations on single-node Citus (push) Waiting to run
E2E Fresh Install Tests / fresh-install-e2e (push) Waiting to run
ext-v2 guardrails / Run ext-v2 guard and ESLint (push) Waiting to run
Integration Tests / Check for relevant changes (push) Waiting to run
Integration Tests / ${{ (github.event_name == 'schedule' || github.event.inputs.suite == 'full') && 'Full integration suite' || 'Tier-1 integration subset' }} (push) Blocked by required conditions
Mobile checks / Mobile lint + typecheck (push) Waiting to run
Mobile checks / Mobile unit tests (push) Waiting to run
Mobile checks / Mobile dependency audit (report) (push) Waiting to run
Mobile checks / Mobile reproducibility checks (push) Waiting to run
Secrets guard (env backups) / Ensure no tracked env backup files (push) Waiting to run
Temporal Readiness / fast-readiness (push) Waiting to run
Temporal Readiness / docker-parity (push) Waiting to run
TypeScript Type Check / Nx affected typecheck (push) Waiting to run
Unit Tests / Skipped-test budget (push) Waiting to run
Unit Tests / Nx affected unit tests (push) Waiting to run
Unit Tests / Server unit coverage (informational) (push) Waiting to run
Validate Tenant Management Schema / Check for relevant changes (push) Waiting to run
Validate Tenant Management Schema / Validate Tenant Management Schema (push) Blocked by required conditions
EE Workflows Build Guard / ee-workflows-build-guard (push) Waiting to run
Excluded: .git, node_modules, secrets/, compose.env, assemblyscript tgz Source: /opt/alga-psa on psa.joliet.tech
7.0 KiB
7.0 KiB
Manual Smoke Pass — Ticket Close Rules
Run this after implementation, before merge. It replaces the Playwright/UI
entries trimmed from tests.json (board settings dialog, templates settings,
checklist section, blocked-close dialog, override flow, bulk summary,
auto-close banner, timeline rendering, job wiring, i18n) — automated coverage
owns the logic; this pass owns the screens and the end-to-end business
outcomes.
Steps below are derived from the plan and the existing screens it extends, not from a running build of the feature. Exact button/label copy may drift during implementation — treat the live screens as ground truth and update this file when they disagree.
Preflight
- Dev stack up for this worktree (alga-env-manager), logged in as an Admin
and a second technician user without
ticket:close_override. - A test board with open statuses and a closed status; a client with a contact that has portal access; a way to see outbound email (e.g. the dev mail catcher).
- For the auto-close flows: a rule with small
inactivity_days, and either wait out a 15-minute scan cycle or trigger theauto-close-ticketsjob manually; backdate the ticket's last comment in the DB to make it stale.
Risks this smoke is defending
- Stranded revenue — tickets close with no time logged.
- Accountability theater — checklist signoff doesn't durably record who/when.
- Rules theater — bulk close or an unauthorized override smuggles tickets past enabled gates, or an override leaves no audit trail.
- Auto-close kills a live conversation — the customer replies and the ticket closes anyway.
- Silent auto-close divergence — auto-closed tickets skip the side effects manual closes get (customer email, automatic comment, audit attribution), or the engine never fires and stale tickets pile up unnoticed.
- Audit-history mutation — editing a template rewrites checklists already signed off on tickets.
- Cross-board bleed — one board's gates or auto-applied templates leak onto another board's tickets.
Flows
Flow 1 — stranded revenue: the time-entry gate blocks, then yields (risks 1, 3)
- Settings → Ticketing → Boards → edit the test board → Close Rules section: enable the time-entry and resolution-comment gates. Save, reopen the dialog, confirm the toggles persisted.
- Open a ticket on that board with no time logged → set status to the closed status.
- Expect: closure is refused; the blocked-close dialog lists both unmet conditions (not just the first).
- Use the dialog's quick actions: add a time entry and a resolution comment.
- Close again. Expect: ticket closes; the client contact receives the normal ticket-closed email.
Flow 2 — accountability is durable and visible (risk 2)
- On a ticket, add two checklist items (one required, one optional) as the technician user; check the required item.
- Expect: the item immediately shows the technician's name and timestamp inline, and the progress chip near the status control reads "1 of 1 required done".
- As the Admin, uncheck the item. Expect: the inline signoff clears, and the activity timeline shows both the original check (by the technician) and the uncheck (by the Admin) with the prior signoff preserved in the entry.
Flow 3 — overrides are permissioned and leave a trail (risk 3)
- As the technician (no
ticket:close_override), attempt to close a gated ticket with unmet conditions. Expect: the dialog shows the failures and offers no "Close anyway" control. - As the Admin, repeat. Expect: "Close anyway" appears; provide a reason and confirm.
- Expect: the ticket closes and the activity timeline shows an override entry listing the skipped conditions and the reason.
Flow 4 — bulk close can't smuggle tickets past gates (risk 3)
- From the ticket list, select one ticket that satisfies the gates and one that doesn't; bulk-set both to the closed status.
- Expect: a summary like "1 closed, 1 blocked by close rules" with the blocked ticket's reasons; the blocked ticket is still open afterward.
Flow 5 — auto-close never kills a live conversation (risk 4)
- Configure an auto-close rule (trigger status, short inactivity, 1-day warning) on the board; put a stale ticket in the trigger status and let the scan run.
- Expect: the ticket shows the banner "Will close automatically on unless there's new activity", and the contact receives the warning email once (not again on the next scan).
- Reply as the customer from the client portal.
- Expect: after the next scan, the banner is gone and the ticket does not close at the originally scheduled time.
Flow 6 — an auto-close is a real close (risk 5)
- Let a stale ticket pass its scheduled close time and let the scan run.
- Expect: the ticket is in the rule's target closed status with an automatic comment ("Closed automatically after N days of inactivity"); the contact receives the standard ticket-closed email; the activity timeline attributes the closure to the system (no human user); if the board had gates enabled, a bypass entry (source: auto-close) appears rather than a gate failure.
Flow 7 — template edits don't rewrite signed history (risks 6, 2)
- Settings → Ticketing → Checklist Templates: create a template with two ordered required items; apply it to a ticket; check both items.
- Back in settings, rename one template item, delete the other, and add a third.
- Expect: the ticket's checklist is byte-for-byte unchanged — original names, order, and signoffs intact. Re-applying the same template to the same ticket adds nothing (idempotent).
Flow 8 — rules and templates stay on their board (risk 7)
- With gates, an auto-close rule, and a board-scoped auto-apply rule all configured on Board A only: create a ticket on Board B in the same category.
- Expect: the Board B ticket gets no auto-applied checklist, closes freely with no gate dialog, and never grows an auto-close banner.
- Move the Board B ticket to Board A. Expect: the matching template attaches now (once), and closure is now gated.
Pass criteria
- No ticket can be closed by hand past an enabled time-entry/comment gate without satisfying it or leaving an audited override (risks 1, 3 — Flows 1, 3, 4).
- Every checklist signoff and its removal is attributable on the ticket forever (risk 2 — Flows 2, 7).
- A replying customer is never auto-closed on, and a fired auto-close is indistinguishable from a careful manual close in side effects and audit (risks 4, 5 — Flows 5, 6).
- Template maintenance can't alter past signoffs (risk 6 — Flow 7).
- Nothing configured on one board observably touches another board's tickets (risk 7 — Flow 8).
- Incidental: no raw translation keys or layout breakage on any new screen visited during the pass (board dialog, templates settings, checklist section, blocked-close dialog, banner).