Parallax Bug Reporter¶
Summary — A drop-in JavaScript widget embedded in the Parallax APEX app: a floating button on every page that captures diagnostics + a screenshot, asks the user for a title/description/type/urgency/impact, writes a
BUG_REPORTSrow, and POSTs the payload to an n8n webhook that opens a Jira ticket and emails the team. The flow is one-way — once submitted, the reporter never hears back, nothing tracks lifecycle or SLA, and theSTATUScolumn drives nothing. This page is the current-state baseline ahead of a redesign.
| Field | Value |
|---|---|
| Component | Bug Reporter (widget v1.1.0) — part of Parallax |
| Parent app | 01 Parallax (Oracle APEX, schema UR) |
| Implementation repo | git.projecteidos.com/vishnu/parallax (local /home/coder/parallax/) |
| Source snapshot | apps/data/bug-reporter/ (point-in-time copies) |
| Status table | BUG_REPORTS (+ V_BUG_REPORTS view) |
| APEX AJAX process | AJX_BUG_REPORTER_LOG |
| Webhook target | n8n (legacy O1) → Jira + email — see 25 n8n |
| Owner | Vishnu Kant (vishnukant@projecteidos.com) |
| Last reviewed | 2026-06-02 |
1. At a glance¶
The Bug Reporter is a self-contained widget (bug-reporter.js, ~81 KB, served as an APEX static application file) that any APEX page can mount with a single BugReporter.init(...) call. In Parallax it is mounted globally via the APEX Global Page (page 0), so the button appears on every authenticated page.
On submit it does two things: (1) inserts a row into BUG_REPORTS through an APEX AJAX process, and (2) POSTs the full payload (including screenshot and attachments) to an n8n webhook, which is what actually raises the Jira ticket and sends the notification email. After that, communication stops — there is no acknowledgement to the reporter, no status updates, and no link back from Jira to the BUG_REPORTS row. See §8 Gaps.
2. What it captures & asks¶
Captured automatically (no user effort):
- Console — a
ConsoleInterceptorwrapsconsole.error/console.warnand listens forwindowerror+unhandledrejection, retaining the last 50 entries with stack + timestamp. - APEX context —
appId,pageId,sessionId,appUser,debugMode, and all page-item values (P*_*). Items whose name matches a sensitive list (password, credit_card, ssn, pin, cvv, secret, token) are stored as[REDACTED]. - Environment — browser + OS (parsed from UA), screen + viewport size, timezone, language, online flag, full user-agent, URL, referrer.
- Screenshot — captured with
html2canvas(bundled as a local static file, no CDN). Auto-taken for bug reports; the modal hides itself during capture. - Reporter identity — name/email/role prefetched from the server (
GET_USER_INFO, sourceAPEXworkspace users orUR_USERS).
Asked of the user:
- Type — Bug Report or Feature Request (toggle; feature requests skip the auto-screenshot).
- Title + Description (both required).
- Urgency —
low | medium | high | critical(relabelled "Priority" for features). - Impact —
single_user | team | multiple_teams | organization. - Attachments — up to 3 files, 5 MB each (images, PDF, text/log/json).
3. Architecture & components¶
Four layers cooperate:
- Client widget —
bug-reporter.js+ thehtml2canvasstatic file, both hosted as APEX static application files (no external CDN). Renders the floating button (draggable, snaps to nearest edge), the modal form, and the success state. - Global wiring — APEX Global Page (page 0). A Page Load dynamic action ("Initialize Bug Reporter") calls
BugReporter.init({ apexProcessName: 'AJX_BUG_REPORTER_LOG' }), colours the button to the theme header, and runs aMutationObserverthat hides the button whenever an APEX dialog/modal is open. Gated by the server-side condition:APP_USER != 'nobody'(authenticated users only). Source:apps/data/bug-reporter/p00000-global-page.yaml. - Server (APEX + DB) — the AJAX process
AJX_BUG_REPORTER_LOGservices four calls from the widget: default (insert a report fromx01JSON),GET_USER_INFO,GET_WEBHOOK_CONFIG, andUPDATE_WEBHOOK. Backed by theBUG_REPORTStable,V_BUG_REPORTSview, and audit trigger (see §4). - Routing (n8n → Jira) — the webhook receiver lives in n8n on legacy O1; it creates the Jira ticket and emails the team. See 25 n8n §7. This hop currently runs through Adam's personal Atlassian API token (KI-044).
sequenceDiagram
actor U as User (Parallax page)
participant W as bug-reporter.js
participant P as AJX_BUG_REPORTER_LOG
participant DB as BUG_REPORTS
participant N as n8n webhook
participant J as Jira + email
U->>W: Click button, fill form, Submit
W->>W: Gather diagnostics + screenshot
W->>P: x01 = report JSON (no screenshot)
P->>DB: INSERT row (STATUS = NEW)
W->>P: GET_WEBHOOK_CONFIG (url + key)
W->>N: POST full payload (incl. screenshot, X_API_KEY)
N->>J: Create ticket + email team
W->>P: UPDATE_WEBHOOK (sent flag + response)
W-->>U: Success toast (auto-close 5s)
Note over U,J: No path back to the reporter after this point
4. Data model¶
Defined in installation-script-bug-reporter.sql:
BUG_REPORTS—ID RAW(16) DEFAULT SYS_GUID()PK;TITLE,DESCRIPTION,REPORTER,REPORT_DATA(CLOB, constrainedIS JSON— holds the full diagnostics blob),SCREENSHOT_BLOB,ATTACHMENTS_BLOB/_META, webhook tracking (WEBHOOK_SENT,WEBHOOK_RESPONSE,WEBHOOK_SENT_AT),AI_ANALYSIS, and audit columns. Three CHECK domains:URGENCY ∈ {low, medium, high, critical}IMPACT ∈ {single_user, team, multiple_teams, organization}STATUS ∈ {NEW, TRIAGED, IN_PROGRESS, RESOLVED, CLOSED, WONT_FIX}(defaultNEW)V_BUG_REPORTS— reporting view that shredsREPORT_DATAJSON into columns (APP_ID,PAGE_ID,BROWSER,OS,PAGE_URL,REPORTER_EMAIL) and exposesHAS_SCREENSHOT/HAS_ATTACHMENTSflags.TRG_BUG_REPORTS_AUDIT— setsCREATED_*on insert,UPDATED_*on update, and auto-stampsRESOLVED_ATwhenSTATUSfirst moves intoRESOLVED/CLOSED.- Indexes on
CREATED_ON,STATUS,REPORTER,URGENCY.
Note — columns present but inert today: STATUS (nothing transitions it from the app), RESOLVED_AT (trigger would fire, but nothing updates status), AI_ANALYSIS, and the WEBHOOK_* set are written but never read back into any workflow.
5. End-to-end lifecycle (today)¶
- User clicks the button → modal opens → diagnostics + screenshot gathered, form validated (title + description required).
submitToApex— POSTsx01= report JSON toAJX_BUG_REPORTER_LOG, which inserts theBUG_REPORTSrow. Screenshot and attachments are stripped from this call (too large for the AJAXf01path — there is an in-codeTODOfor chunked upload).resolveWebhookCredentials—GET_WEBHOOK_CONFIGreturns the URL + key from server-side application items.submitToWebhook— POSTs the full payload (including screenshot + attachments) to n8n with anX_API_KEYheader. If a webhook is configured it must succeed, otherwise the whole submit is treated as failed.updateWebhookStatus—UPDATE_WEBHOOKwrites the sent flag + response back onto the row.- Success view shows a generated
bugIdand auto-closes after 5 s.
n8n then creates the Jira ticket and emails the team. Nothing flows back to the reporter or to BUG_REPORTS after step 6.
6. Configuration & secrets¶
- Webhook URL / key are never hard-coded in the client. They are resolved server-side from APEX Application Items
G_BUG_REPORTER_WEBHOOK_URLandG_BUG_REPORTER_WEBHOOK_KEY(each with a matching application computation), returned viaGET_WEBHOOK_CONFIG. The key is sent to n8n as theX_API_KEYheader. apexProcessNamedefaults toAJX_BUG_REPORTER_LOG(set explicitly in the Global Page init).userInfoSourcetoggles whether reporter identity comes from APEX workspace users or theUR_USERStable.
7. Source artifacts¶
- Snapshot (this repo):
apps/data/bug-reporter/—bug-reporter.js,p00000-global-page.yaml,installation-script-bug-reporter.sql, with a README mapping each back to its authoritative location. - Authoritative source (parallax repo): widget at
application/shared_components/files/bug_reporter_js.sql(+_min_js), AJAX processapplication/shared_components/logic/application_processes/ajx_bug_reporter_log.sql, webhook items/computations underapplication/shared_components/logic/application_{items,computations}/g_bug_reporter_webhook_{url,key}.sql, install scriptapplication/deployment/install/install_installation_script_bug_reporter.sql. - Install / how-to:
docs/BUG_REPORTER_INSTALLATION_GUIDE.mdin the parallax repo (https://git.projecteidos.com/vishnu/parallax/-/blob/main/docs/BUG_REPORTER_INSTALLATION_GUIDE.md).
8. Gaps & limitations (redesign inputs)¶
These are the current-state problems the redesign should address — captured here, not solved:
- No reporter feedback loop — the submitter gets a client-side toast and a
bugIdonly; they never learn whether it was triaged, worked, or fixed. - No bug lifecycle / events — the
STATUSdomain exists but nothing transitions it; Jira is the de-facto tracker with no sync back toBUG_REPORTS. The two systems diverge immediately. - No SLA — no urgency→response-time mapping, no breach tracking, no escalation path.
- Webhook depends on a personal token — the n8n→Jira hop runs through Adam's personal Atlassian API token; its expiry silently breaks ticket creation (KI-044, migration tracked under RM-046).
- One-way comms — the team gets the initial new-bug email; there are no further updates in either direction.
- Screenshot path gap — screenshots bypass the APEX insert (size limit) and are only delivered if a webhook is configured; a
BUG_REPORTSrow can therefore haveHAS_SCREENSHOT = Neven though the user took one. In-codeTODOfor chunked upload. - Latent / unused capability —
AI_ANALYSIScolumn and theenableAIAnalysiswidget option exist but are inert. - Single-instance assumption —
BugReporter.initwarns and no-ops on re-init; the global-page show condition is a hard-coded page-id allowlist string, easy to drift from reality.
9. References & links¶
- Parent app: 01 Parallax
- Routing / Jira hop: 25 n8n (§7 Atlassian-touching workflows)
- Token risk: KI-044 · migration RM-046
- Source snapshot:
apps/data/bug-reporter/ - Install guide (parallax repo):
https://git.projecteidos.com/vishnu/parallax/-/blob/main/docs/BUG_REPORTER_INSTALLATION_GUIDE.md