SideButton Knowledge Module
SideButton Portal — Jobs — Knowledge Module
SideButton knowledge module — UI selectors, data model, and page states documenting Portal — Jobs.
sidebutton install sidebutton PRIVACY CONVENTION: This skill file must describe the PAGE — elements, selectors, layouts, states, and public UI copy (placeholder text, button labels, default headings). It must NOT record tenant-specific data visible to a logged-in user: real ticket keys (use
PROJ-123), real agent hostnames (useagent-hostor{hostname}), real IP addresses (use203.0.113.10), real workflow/automation IDs (use{id}), real user names or emails, real Jira host (use{tenant}.atlassian.net), real registry names (use{registry-name}), or real automation display names. When re-verifying, generalize observed values before writing them into this file.
VERIFIED 2026-04-26: H1 "Jobs". Filter tabs are 6
linkelements: All, Running, Waiting, Completed, Failed, Cancelled. Active filter pill is dark grey solid (NOT green/blue as earlier notes claimed). Controls:textbox "Search tickets…",comboboxwith label "Workflow" (idworkflow-filter-select, 29 options including legacyagent_*and dash IDs),comboboxwith label "Agent". NEW (Apr 2026): job rows show cost + model inline in the format{Workflow} #{id} {effort} 1 step {duration} ${cost} {model_short}— visible on jobs created after cost-tracking landed; older jobs omit${cost} {model}. Token-usage span on each row reads"N in · N,NNN out · N turns · claude-opus-4-7"(model withclaude-prefix in span; without prefix in row text). NEW (Apr 2026): LLM USAGE card on detail page — large dark card showing model name (top-right), Cost / Turns / Input Tokens / Output Tokens stat columns, Cache read / Cache write / Prompt sha row, and PER STEP breakdown table. NEW: yellow "Status mismatch" inline alert above Temporal timeline when portal status diverges from orchestrator status. NEW: floating "Report a Bug" button in viewport bottom-right (global to portal, anchored to viewport). Effort badges use distinct background colors per level (NOT all green): MAX = purple, HIGH = orange/amber, MEDIUM = dark grey. Auth0 login required.
Portal — Jobs
What This Is
Job execution history page -- lists all workflow jobs that have been dispatched to agents. Shows a filterable, searchable list of jobs with status badges, workflow names, ticket references, agent assignments, step counts, durations, and relative timestamps. Each job links to a detail page showing input parameters, step execution timeline with task progress, expandable step logs, and output/error cards. Jobs are created when workflows are dispatched to agents (via Run Workflow, Run Job, Queue dispatch, or Automation trigger). Supports cancel (running/waiting) and resend (failed/cancelled) actions.
URL Patterns
| Pattern | Description |
|---|---|
/portal/jobs | Job list (all) |
/portal/jobs?status=running | Filtered to running jobs |
/portal/jobs?status=waiting | Filtered to waiting jobs |
/portal/jobs?status=completed | Filtered to completed jobs |
/portal/jobs?status=failed | Filtered to failed jobs |
/portal/jobs?status=cancelled | Filtered to cancelled jobs |
/portal/jobs/{id} | Job detail view |
/portal/jobs/{id}?from_status={status} | Job detail with back-link context to filtered list |
Page Structure
Job List (/portal/jobs)
+--[Sidebar]--+--[Main Content]------------------------------------------+
| Chat | H1: "Jobs" |
| Agents | "{N} jobs" (e.g. "2551 jobs") |
| Jobs * | |
| Queue | [Filter Tabs: All | Running N | Waiting | Completed | Failed | Cancelled] |
| Automations| |
| Workflows | [Search: "Search tickets..."] Workflow [▼] Agent [▼] |
| Settings | |
| | ITEM AGENT STATUS |
| | [dot] Workflow Name TICKET #ID |
| | [EFFORT] N step Nm Ns $X.XX model-short |
| | [avatar] agent-name |
| | [Status Badge] time ago |
| | [Cancel/Resend] |
| | ... |
| | Loading more... |
| | [Report a Bug ⌶] |
+-------------+-----------------------------------------------------------+
New in Apr 2026: each row's secondary line includes inline $X.XX cost and a model-short tag (e.g. opus-4-7, sonnet-4-6). These render only on jobs created after cost-tracking shipped — older jobs render the secondary line without $cost model. Each row also exposes a hidden <span> with the verbose "N in · N,NNN out · N turns · claude-{model}" summary (visible in the accessibility tree, used as a tooltip).
Job Detail (/portal/jobs/{id})
+--[Sidebar]--+--[Main Content]------------------------------------------+
| | < Back to jobs |
| Jobs * | |
| | H1: workflow-slug — ticket/source [Status Badge] |
| | [Cancel/Resend] |
| | Job #N [avatar] agent [EFFORT] Nm Ns Created {date} |
| | pipeline-id (green monospace) |
| | |
| | [INPUT card] |
| | hint: focus: /customers/ID/tasks |
| | (or trigger_* fields for automation jobs) |
| | |
| | [LLM USAGE card] ← NEW Apr 2026 |
| | LLM USAGE claude-opus-4-7 |
| | |
| | COST TURNS INPUT TOKENS OUTPUT TOKENS |
| | $9.79 128 208 62,084 |
| | |
| | Cache read 11,565,708 Cache write 392,651 |
| | Prompt sha 8065ecd866c2 |
| | |
| | PER STEP |
| | #1 agent_sd_coverage 62,292 tok 128t $9.79 |
| | |
| | [ERROR card] (failed jobs only) |
| | Step N (step-name) failed: error message |
| | |
| | [Status mismatch alert] (yellow inline, when divergent) |
| | ⚠ Status mismatch: portal says "failed" but |
| | orchestrator says "COMPLETED" |
| | |
| | [Temporal Timeline] OR [Temporal unreachable] |
| | Job: STATUS | N events | size KB | short_id |
| | Init Nms N activities |
| | Agent Setup Nms N activities |
| | Execution Nm Ns |
| | runAndMonitor Nm Ns |
| | workflow: agent_workflow agent: agent-name |
| | Teardown Nms N activities |
| | |
| | [OUTPUT card] (completed jobs only) |
| | "Workflow X completed on agent-name" |
| | |
| | [Report a Bug ⌶] |
+-------------+-----------------------------------------------------------+
Key Elements
Job List
| Element | Selector / Ref | Notes |
|---|---|---|
| Page heading | heading "Jobs" | H1 |
| Job count | Below heading | "N jobs" summary |
| Filter: All | link "All" | Green pill (bg-emerald-500/20 text-emerald-400) when active |
| Filter: Running | link "Running" | Shows count badge (e.g. "Running 3") when jobs are running |
| Filter: Waiting | link "Waiting" | |
| Filter: Completed | link "Completed" | |
| Filter: Failed | link "Failed" | Blue pill when active as selected filter |
| Filter: Cancelled | link "Cancelled" | 6th status filter tab |
| Search textbox | textbox "Search tickets…" | Searches by ticket reference (e.g. "PROJ-123") |
| Workflow filter | combobox / label "Workflow" / #workflow-filter-select | Native <select>, default "All workflows". Options populate dynamically from job data — currently 29 options including legacy agent_* IDs (e.g. agent_se_work) and dash IDs (e.g. se-work); display labels are Title Case |
| Agent filter | combobox / label "Agent" | Native <select>, default "All agents" |
| Column header: ITEM | Above job rows | Left column |
| Column header: AGENT | Above job rows | Middle column |
| Column header: STATUS | Above job rows | Right column |
| Job row | link (each job) | Clickable, navigates to /portal/jobs/{id} |
| Status dot (green) | Left of workflow name | Completed |
| Status dot (red) | Left of workflow name | Failed |
| Status dot (blue, pulsing) | Left of workflow name | Running |
| Status dot (grey) | Left of workflow name | Cancelled / Waiting |
| Workflow name | Bold text in row | Title case display name (e.g. "SE Rca Fix", "QA Validate", "Pull Repos") |
| Ticket reference | Orange/cyan text after name | e.g. "PROJ-123" — only present when job has a linked ticket |
| Job ID | Grey text | e.g. "#3121" |
| Agent avatar | img inside agent link | Small green circle with agent avatar image |
| Agent name link | link "agent-name" | Links to /portal/agents, shows agent hostname |
| Effort badge | [MAX] / [HIGH] / [MEDIUM] | Pill badge — color varies per level: MAX = purple, HIGH = orange/amber, MEDIUM = dark grey (NOT all green; earlier docs were wrong) |
| Step count | Grey text | "N step" (singular) |
| Duration | Grey text | "Nm Ns" format (e.g. "6m 31s", "5m 46s") or "Ns" for short durations |
| Inline cost | Green text after duration | $X.XX (e.g. $9.79, $0.127) — only present on jobs with cost-tracking data; older jobs omit |
| Inline model tag | Grey text after cost | Short model name (e.g. opus-4-7, sonnet-4-6, opus-4-6) — paired with inline cost |
| Token usage span | <span> inside row link, e.g. span "208 in · 62,084 out · 128 turns · claude-opus-4-7" | Full LLM usage summary (with claude- prefix). Visible in accessibility snapshot — likely a tooltip on hover |
| Completed badge | Status area | Green dot + "Completed" |
| Failed badge | Status area | Red dot + "Failed" |
| Running badge | Status area | Blue dot + "Running" |
| Cancelled badge | Status area | Grey dot + "Cancelled" |
| Waiting badge | Status area | Amber dot + "Waiting" |
| Relative time | Right side | "Nm ago", "Nh ago", "Nd ago" |
| Cancel button | button "Cancel" | On running/waiting jobs — cancels the job |
| Resend button | button "Resend" | On failed and cancelled jobs — re-dispatches the job |
| Resended button | button "Resended" | Shown after a job has already been resent — disabled/grey state |
| Loading more | Bottom of list | "Loading more..." text, infinite scroll trigger (50 items/page) |
Job Detail
| Element | Selector / Ref | Notes |
|---|---|---|
| Back link | link "Back to jobs" | Chevron left + text, returns to job list |
| Workflow heading | H1 text | Format: "workflow-slug — ticket-key" or "workflow-slug — queued" |
| Status badge | Next to heading | "Completed" / "Failed" / "Running" / "Cancelled" with colored dot |
| Cancel button | button "Cancel" | On running/waiting jobs only, top-right, blue outline |
| Resend button | button "Resend" | On failed/cancelled jobs, top-right, blue outline. Changes to "Resended" after use |
| Job number | Below heading | "Job #N" |
| Agent avatar link | link > img "agent-name" | Green circle avatar, links to /portal/agents |
| Agent name | Below heading | Agent hostname next to avatar |
| Effort badge | Below heading | "MAX" / "HIGH" / "MEDIUM" green pill |
| Duration | Below heading | "Nm Ns" format (ticks live on running jobs) |
| Created date | Below heading | Full date string, e.g. "Created 4/2/2026, 9:33:59 PM" |
| Pipeline ID | Below metadata | Green/teal monospace text, e.g. "pipeline-job-4227" |
| Temporal Workflow ID | span "Temporal Workflow ID" | Visible in accessibility tree, links to Temporal tracking |
| INPUT card | Dark card below metadata | "Input" header, key-value pairs of input parameters |
| INPUT trigger variables | Inside INPUT card | Automation-triggered jobs show: trigger_ticket_url, trigger_project, trigger_assignee, trigger_status, trigger_issue_key, trigger_issue_type |
| INPUT ticket URL | Inside INPUT card | Clickable cyan link when input contains a URL (e.g. Jira ticket) |
| INPUT hint | Inside INPUT card | "hint:" field showing dispatch instructions (e.g. "Jira webhook: jira:issue_updated", "focus: /customers/ID/tasks") |
| LLM USAGE card (NEW Apr 2026) | Dark card below INPUT | "LLM USAGE" header (left) + full model name claude-opus-4-7 / claude-sonnet-4-6 / claude-opus-4-6 (top-right). Stat columns + cache + per-step block. Hidden when no LLM telemetry exists for the job |
| LLM Cost stat | First column under "COST" label | Large green dollar value (e.g. $9.79, $0.127) |
| LLM Turns stat | Second column under "TURNS" | Plain number (e.g. 128, 8) |
| LLM Input Tokens stat | Third column under "INPUT TOKENS" | Plain number — non-cached prompt input (e.g. 208, 14) |
| LLM Output Tokens stat | Fourth column under "OUTPUT TOKENS" | Plain number with thousands comma (e.g. 62,084, 2,264) |
| Cache read | Below stat row | Label "Cache read" + monospace number (e.g. 11,565,708) |
| Cache write | Below stat row | Label "Cache write" + monospace number (e.g. 392,651, 11,008) |
| Prompt sha | Below stat row | Label "Prompt sha" + 12-char hex prefix (e.g. 8065ecd866c2) |
| PER STEP table | Bottom of LLM USAGE card | Heading "PER STEP" + one row per executed step |
| Per-step row | Inside PER STEP | Format: #{idx} + step_name (monospace) + {N,NNN} tok + {N}t (turns) + ${cost} (green) |
| ERROR card | Red background card | Shown on failed jobs only, "Error" header + "Step N (step-name) failed" + error message |
| Status mismatch alert (NEW Apr 2026) | Yellow ⚠ inline alert above timeline | Reads "Status mismatch: portal says 'X' but orchestrator says 'Y'" — appears when portal/Temporal status differ |
| Temporal Timeline | Below ERROR/alert | Full job execution timeline from Temporal orchestrator |
| Timeline summary | First line of timeline | "Job: STATUS | N events | size KB | short_id" |
| Timeline: Init phase | Timeline row | Duration (ms) + activity count (e.g. "3 activities") |
| Timeline: Agent Setup phase | Timeline row | Duration (ms) + activity count (e.g. "4 activities") |
| Timeline: Execution phase | Timeline row | Duration (Nm Ns) — main execution time |
| Timeline: runAndMonitor | Sub-row under Execution | Duration + "workflow: {workflow_id} agent: {agent-name}" |
| Timeline: Teardown phase | Timeline row | Duration (ms) + activity count (e.g. "5 activities") |
| Temporal unreachable | Replaces timeline | Shown when Temporal workflow history is unavailable (old jobs, cancelled jobs, service down) |
| OUTPUT card | Dark card at bottom | Shown on completed jobs. "Output" header + monospace green completion message of shape Workflow {workflow_slug} completed on {agent_hostname} |
Data Model
Job
| Field | Type | Description |
|---|---|---|
| id | number | Job ID (auto-increment) |
| pipeline_id | string | Pipeline tracking ID (e.g. "pipeline-job-3121") |
| name | string | Display name format: "{workflow_id} — {ticket_key|queued}" |
| status | string | "pending" / "running" / "waiting" / "completed" / "failed" / "cancelled" |
| effort_level | string | "max" / "high" / "medium" (optional — may be absent) |
| input | string (JSON) | Key-value map of input parameters (ticket_url, hint, etc.) |
| output | string | Completion message (on completed jobs) |
| error | string | Error message (on failed jobs) |
| ticket_url | string | Full Jira ticket URL (optional) |
| ticket_key | string | Jira ticket key e.g. "PROJ-123" (optional) |
| current_step | number | Index of currently executing step |
| steps | string (JSON) | Array of pipeline step definitions |
| started_at | string (datetime) | When job started executing |
| completed_at | string (datetime) | When job finished |
| created_at | string (datetime) | Job creation timestamp |
| slack_channel_id | string | Slack channel for notifications (optional) |
| slack_thread_ts | string | Slack thread timestamp (optional) |
Temporal Timeline (Job Detail)
The job detail page fetches execution history from the Temporal orchestrator. When available, it renders a phase-based timeline. When unavailable, it shows "Temporal unreachable".
| Field | Type | Description |
|---|---|---|
| status | string | Temporal workflow status: "COMPLETED" / "FAILED" / "RUNNING" / "CANCELLED" |
| event_count | number | Total events in workflow history (e.g. "83 events") |
| data_size | string | History data size (e.g. "14.9 KB") |
| short_id | string | Short hex workflow run ID prefix (e.g. "019d500e") |
Timeline Phases
| Phase | Description |
|---|---|
| Init | Workflow initialization (~15-20ms, 3 activities) |
| Agent Setup | Agent environment preparation (~24-25ms, 4 activities) |
| Execution | Main workflow execution — contains runAndMonitor sub-entry showing workflow ID + agent name |
| Teardown | Cleanup and reporting (~38-48ms, 4-5 activities) |
LLM Usage (Job Detail card — NEW Apr 2026)
The detail page renders an LLM USAGE card aggregating token, cost, and cache telemetry from the agent's LLM calls. The card is omitted when telemetry is unavailable.
| Field | Type | Description |
|---|---|---|
| model | string | Full Claude model id, e.g. claude-opus-4-7, claude-sonnet-4-6, claude-opus-4-6 (rendered top-right of card) |
| cost | string | Total cost in USD, formatted with $ prefix and 2-3 decimals (e.g. $9.79, $0.127) |
| turns | number | Total LLM round-trips (e.g. 128) |
| input_tokens | number | Non-cached input tokens (e.g. 208) |
| output_tokens | number | Output tokens, comma-separated (e.g. 62,084) |
| cache_read | number | Cache hit token count, comma-separated (e.g. 11,565,708) |
| cache_write | number | Cache write token count, comma-separated (e.g. 392,651) |
| prompt_sha | string | 12-char hex prefix of prompt SHA (e.g. 8065ecd866c2) |
| per_step | array | Per-step usage breakdown |
Per-Step Usage Row
| Field | Type | Description |
|---|---|---|
| index | number | 1-based step index, displayed as #1, #2, ... |
| step_name | string | Step identifier (e.g. agent_sd_coverage, agent_pull_repos) — monospace |
| tokens | number | Total tokens consumed in this step (e.g. 62,292 tok) |
| turns | number | Turns in this step, suffixed t (e.g. 128t) |
| cost | string | Step cost (e.g. $9.79) — green text |
Input Trigger Variables (Automation-triggered jobs)
Jobs triggered by Jira automations include trigger context in the INPUT card:
| Field | Type | Description |
|---|---|---|
| trigger_ticket_url | string | Full Jira ticket URL from trigger event |
| trigger_project | string | Jira project key (e.g. "MVP") |
| trigger_assignee | string | Jira account ID of assignee |
| trigger_status | string | Jira issue status at trigger time (e.g. "To Do", "In Review") |
| trigger_issue_key | string | Jira issue key (e.g. "MVP-1601") |
| trigger_issue_type | string | Jira issue type (e.g. "Bug", "Story") |
States & Variations
| State | Trigger | Visual Indicator |
|---|---|---|
| All filter active | Default / click "All" | Active filter pill is dark grey solid background (NOT green/blue — earlier docs were wrong) |
| Running filter | ?status=running | Only running jobs shown, Running tab active. Count badge ("Running 3") only when jobs are actually running |
| Completed filter | ?status=completed | Only completed jobs shown |
| Failed filter | ?status=failed | Only failed jobs shown |
| Waiting filter | ?status=waiting | Only waiting jobs shown |
| Cancelled filter | ?status=cancelled | Only cancelled jobs shown |
| Running count badge | Running jobs exist | Running tab shows count badge (e.g. "Running 3") |
| Job completed | Finished successfully | Green dot + "Completed" badge |
| Job failed | Error occurred | Red dot + "Failed" badge |
| Job running | In progress | Blue pulsing dot + "Running" badge, live-ticking duration |
| Job waiting | Blocked at gate | Amber dot + "Waiting" badge |
| Job pending | Not yet started | "Pending" badge |
| Job cancelled | User cancelled | Grey dot + "Cancelled" badge |
| Effort: Max | effort_level = "max" | Purple "MAX" pill badge |
| Effort: High | effort_level = "high" | Orange/amber "HIGH" pill badge |
| Effort: Medium | effort_level = "medium" | Dark grey "MEDIUM" pill badge |
| Inline cost+model present | Job has cost-tracking telemetry | Row shows ${cost} {model_short} after duration (e.g. $9.79 opus-4-7) |
| Inline cost+model absent | Older job (pre-cost-tracking) | Row stops at duration; no $ or model in row text |
| LLM USAGE card present | Detail page, telemetry available | Card with cost/turns/tokens/cache/per-step breakdown renders below INPUT |
| LLM USAGE card absent | Detail page, no LLM telemetry | LLM USAGE card omitted entirely (e.g. cancelled before any LLM call) |
| Status mismatch alert | Portal status ≠ Temporal status | Yellow ⚠ inline alert above timeline reads Status mismatch: portal says "X" but orchestrator says "Y" |
| Ticket reference present | Job linked to ticket | Orange/cyan ticket key text next to workflow name |
| Cancel available | Job is running or waiting | "Cancel" button shown in list row and detail top-right |
| Resend available | Job is failed or cancelled | "Resend" button shown in list row and detail top-right |
| Already resent | Resend was clicked | "Resended" button shown (disabled/past tense) |
| Detail: Temporal timeline | Temporal history available | Phase-based timeline: Init → Agent Setup → Execution → Teardown with durations and activity counts |
| Detail: Temporal unreachable | Temporal history unavailable | "Temporal unreachable" text replaces timeline (old jobs, cancelled jobs, service down) |
| Detail: Temporal status mismatch | Portal vs orchestrator differ | ERROR card may show "Status mismatch: portal says 'failed' but orchestrator says 'COMPLETED'" |
| Detail: ERROR card | Job has failure | Red "Error" card above timeline with "Step N (step-name) failed" + error detail |
| Detail: OUTPUT card | Job completed | Dark "Output" card below timeline with green completion message |
| Detail: trigger variables | Automation-triggered job | INPUT card shows trigger_ticket_url, trigger_project, trigger_assignee, trigger_status, trigger_issue_key, trigger_issue_type |
| Empty: All tab | No jobs dispatched, "All" active | Lightning bolt icon + "No jobs yet" heading + "Run a workflow from the agents page to create a job" hint |
| Empty: Running tab | No running jobs, "Running" active | Lightning bolt icon + "No running jobs" heading + same hint |
| Empty: Waiting tab | No waiting jobs, "Waiting" active | Lightning bolt icon + "No waiting jobs" heading + same hint |
| Empty: Completed tab | No completed jobs, "Completed" active | Lightning bolt icon + "No completed jobs" heading + same hint |
| Empty: Failed tab | No failed jobs, "Failed" active | Lightning bolt icon + "No failed jobs" heading + same hint |
| Empty: Cancelled tab | No cancelled jobs, "Cancelled" active | Lightning bolt icon + "No cancelled jobs" heading + same hint |
| Agent filter hidden | No agents registered or no jobs | Agent dropdown not rendered in filter bar; only Workflow filter shown |
| Workflow filter empty | No jobs exist | Workflow dropdown only shows "All workflows" — options populate dynamically from job data |
| Infinite scroll | Scroll to bottom | "Loading more..." appears, loads next 50 jobs |
Common Tasks
1. View job list
- Navigate to
/portal/jobs - See all jobs with status, workflow name, ticket ref, agent, step count, duration, time
2. Filter jobs by status
- Click filter tab (Running / Waiting / Completed / Failed / Cancelled)
- List filters to matching jobs, URL updates to
?status={status}
3. Search by ticket reference
- Click the "Search tickets..." textbox
- Type ticket reference (e.g. "PROJ-123")
- List filters to matching jobs
4. Filter by workflow
- Click the "Workflow" dropdown (native
<select>) - Select a workflow name (e.g. "SE Rca Fix", "QA Validate")
- List filters to jobs for that workflow
5. Filter by agent
- Click the "Agent" dropdown (native
<select>) - Select an agent name
- List filters to jobs for that agent
6. View job detail
- Click any job row in the list
- See workflow name, ticket ref, status, input parameters, step execution timeline
7. View Temporal timeline
- On job detail page, see the timeline section below INPUT/ERROR
- Timeline shows 4 phases: Init, Agent Setup, Execution, Teardown with durations
- Execution phase shows runAndMonitor sub-entry with workflow ID and agent name
- If Temporal is unreachable, shows "Temporal unreachable" instead
8. Cancel a running or waiting job
- On a running/waiting job (list or detail), click the "Cancel" button
- Job transitions to "Cancelled" status
9. Resend a failed or cancelled job
- On a failed/cancelled job (list or detail), click the "Resend" button
- Job is re-dispatched — button changes to "Resended" (disabled)
Tips
- Jobs are created when workflows are dispatched via Run Workflow button, Run Job on agent, Queue dispatch, or Automation trigger
- The effort level maps to LLM model: Max/High = Opus, Medium = Sonnet — confirmed by inline
model_shorttext on rows (opus-4-7for max/high,sonnet-4-6for medium) - Inline
$cost model_shortwas added in Apr 2026 cost-tracking. Use it as a quick filter heuristic when scanning lists for expensive runs - The LLM USAGE card is the canonical source for total spend per job — sum the
Costfield across rows for fleet-level totals. The PER STEP table itemizes per pipeline step Cache readtypically dwarfsinput_tokensbecause of system-prompt + skill-pack caching; large cache_read with low input_tokens is the expected, healthy patternPrompt shaidentifies the canonical prompt build — same SHA across jobs means identical static prompt content, useful for reproducibility checks- The token-usage span on each row (
"N in · N,NNN out · N turns · claude-{model}") is the same data the LLM USAGE card aggregates; both are absent on jobs without telemetry - Pipeline ID format is
pipeline-job-{id} - Job list shows relative timestamps ("Nm ago", "Nh ago"); detail page shows absolute timestamps
- The Temporal timeline shows 4 phases (Init, Agent Setup, Execution, Teardown) — Execution contains the actual workflow run with agent name
- Workflow names appear as Title Case in the list (e.g. "SE Rca Fix") but as slugs in detail headings (e.g. "se-rca-fix")
- Heading format on detail page: "workflow-slug — ticket-key" (when ticket linked) or "workflow-slug — queued" (from queue)
- Agent names link to
/portal/agentspage - Automation-triggered jobs show trigger context variables in INPUT (trigger_ticket_url, trigger_project, trigger_assignee, trigger_status, trigger_issue_key, trigger_issue_type)
- INPUT card may contain
hint:field showing extra dispatch instructions or automation trigger context (e.g. "Jira webhook: jira:issue_updated") - Queued jobs (non-automation) show only standard params (ticket_url, hint) without trigger_* variables
- Infinite scroll loads 50 items per page
- Job links from filtered views include
?from_status={status}for back-navigation context
Gotchas
- Cancel works on running AND waiting: Both running and waiting jobs can be cancelled
- Resend button: Apr 2026 — current accessibility tree exposes only
button "Resend"on failed/cancelled rows. Earlier docs claimed a "Resended" disabled state appears post-click; this could not be reverified non-destructively in the Apr 2026 pass. Treat the post-click label as needs verification and avoid double-clicking Resend in automation - No delete: There is no UI to delete jobs from history
- Effort badge colors are NOT all green: Earlier docs were wrong. As of Apr 2026: MAX = purple, HIGH = orange/amber, MEDIUM = dark grey. Color-based selectors must use per-level CSS classes, not a single shared green class
- Inline cost/model only on telemetry-present jobs: Older jobs and any job created before cost-tracking shipped omit the
$cost model_shortsegment. Don't rely on its presence to detect "completed"; rely on the explicit Status badge instead - LLM USAGE card may be absent: Cancelled-before-execution jobs and very old jobs render the detail page without the LLM USAGE card. Tests must guard with
if card presentrather than assuming presence - Status mismatch alert is a real failure signal: When the yellow
⚠ Status mismatchalert renders, the portal DB and Temporal disagree about the job outcome. The portal-side status drives the badge and Resend availability; the Temporal-side status drives the timeline. Investigators should check both to find the truth - "Report a Bug" floating button: Anchored to viewport bottom-right on every portal page (not just Jobs). Don't snapshot it as Jobs-specific; it's global to
/portal/* - Status dots: Colored dots match status: green=completed, red=failed, blue=running (pulsing), amber=waiting, grey=cancelled
- Workflow/Agent dropdowns: Native
<select>elements — useselect_option()to interact - Search scope: "Search tickets..." searches by ticket reference only, not by workflow name or agent
- Temporal unreachable: Older jobs, cancelled jobs, and jobs during Temporal outages show "Temporal unreachable" instead of the phase timeline — OUTPUT/ERROR cards still display from portal DB
- Temporal status mismatch: A job's portal status and Temporal status can differ — e.g., portal shows "Failed" but Temporal shows "COMPLETED". The ERROR card shows the mismatch detail
- Cancelled jobs: Often show "Temporal unreachable" rather than a timeline — no step-level detail available
- Live duration: Running jobs show a ticking duration counter
- hint field: The INPUT card may show a
hint:field with automation context (e.g. "Jira webhook: jira:issue_updated") — this helps trace how the job was triggered - Empty state per filter: Each filter tab shows its own empty state heading — "No running jobs", "No completed jobs", etc. Only the All tab says "No jobs yet". The hint text is always the same
- Dynamic dropdown options: Workflow and Agent filter dropdowns populate dynamically from existing job data. An account with 0 jobs shows only "All workflows" and no Agent dropdown at all
- Workflow filter dual IDs: Historical jobs use legacy
agent_*prefixed IDs (e.g.agent_se_work); newer jobs use dash-separated IDs (e.g.se-work). Both appear in the Workflow filter dropdown since it populates from job data - Workflow filter select ID: The select element has
id="workflow-filter-select"— useful for targeted automation - Page title format: List page: "Jobs - SideButton Fleet". Detail page: "Job #{id} - SideButton Fleet"
- No Show details expandable: The old
<details>expandable with RESOLVED INPUT/OUTPUT is gone — replaced by Temporal timeline phases