Kiket docs
Compliance

Findings inbox and remediation

Master–detail Findings Inbox, URL-synced triage filters, inline remediation stepper, and Remediation Workbench accountability loop.

Audience: operators, compliance reviewers, and integrators
Status: shipped — master–detail Findings Inbox, URL-synced triage filters, inline remediation stepper, and Remediation Workbench execution cockpit.

Strategy: future-vision.md · Architecture: overview.md

Operational queue (shared)

Cases (/cases), Findings Inbox, Remediation Workbench, and Audit Room share the same operational queue chrome:

ParamMeaning
qClient-side text search over the filtered list
pagePage number (default 1; omitted from URL)
pageSizeRows per page (default 25)
sortSurface-specific sort key (cases only today)

Each surface adds its own slice filter param (filter or triage), scope params (processId, workspaceId, findingId), and selected for the master–detail panel.

Example: /cases?filter=sla_risk&q=vendor&page=2&selected=<caseId>

Findings Inbox

The Findings Inbox (/findings) is the primary triage surface for scanner output. It uses a master–detail layout:

RegionPurpose
Filter chipsCount and filter by actionable, critical, missing evidence, or report-ready findings
Queue toolbarText search (q), result range, and pagination
QueueSeverity-sorted list; row checkboxes enable bulk triage; selection drives the detail panel
Review & remediateScanner context, recommended action, and remediation stepper

URL parameters

Query params are the source of truth for inbox state (deep-linkable and shareable). Shared queue params: q, page, pageSize (see Operational queue above).

ParamMeaning
triageOne of actionable, critical, missing_evidence, report_ready, since_last_scan
selectedSelected finding id for the detail panel
processIdScope findings to a monitored process

Example: /findings?triage=missing_evidence&selected=<findingId>

When selected is absent or invalid, the inbox auto-selects the highest-priority finding in the filtered list and writes selected back to the URL.

Bulk triage

Select multiple findings with row checkboxes, then use the bulk action bar:

ActionAPINotes
AcknowledgePOST /platform/findings/bulk-actions { action: "acknowledge", findingIds: [...] }Open findings only
Assign to mesame with { action: "assign" }Sets owner, starts remediation when needed, transitions to remediating
Resolvesame with { action: "resolve" }Requires linked evidence and no active remediation; partial success per finding

The API returns { data, results } where each results[] entry reports ok or error for that finding id.

Inline remediation stepper

From the detail panel, operators can close the accountability loop without leaving the inbox:

1. Acknowledge     → POST /platform/findings/:id/transition { status: "acknowledged" }
2. Start remediation → POST /platform/remediations (+ transition to remediating when applicable)
3. Attach proof    → navigate to Evidence Center for linked case/process
4. Complete & resolve → PATCH /platform/remediations/:id { status: "completed", completionEvidenceId }
                     → POST /platform/findings/:id/transition { status: "resolved" }

Remediation create payloads are derived from finding metadata (finding.remediation YAML hints) and scanner context — not from model output.

Remediation Workbench

Remediation Workbench (/remediation) is the execution cockpit for open remediation actions. It mirrors the Findings Inbox master–detail pattern:

RegionPurpose
Filter chipsCount and filter by needs proof, ready to complete, overdue, in progress, or completed
Queue toolbarText search (q), result range, and pagination
QueueSeverity- and due-date-sorted list; selection drives the detail panel
ExecuteScanner context, next-step guidance, and the shared remediation stepper

URL parameters

Shared queue params: q, page, pageSize (see Operational queue above).

ParamMeaning
filterOne of needs_proof, ready_to_complete, overdue, in_progress, completed
selectedSelected remediation id for the detail panel
findingIdScope remediation to a linked finding
processIdScope remediation to a monitored process

Legacy deep links using remediationId= still parse into selected.

Example: /remediation?filter=needs_proof&selected=<remediationId>

When selected is absent or invalid, the workbench auto-selects the highest-priority action in the filtered list and writes selected back to the URL. When no filter is set, the default queue shows in progress actions.

Operators can execute the full accountability loop (acknowledge → start → attach proof → complete/resolve) from the workbench detail panel without returning to the Findings Inbox. Each row still links back to the finding via View finding in inbox when cross-surface context is needed.

API surfaces

ResourceRoutes
FindingsGET /platform/findings, POST /platform/findings/:id/transition
RemediationGET /platform/remediations, POST /platform/remediations, PATCH /platform/remediations/:id
OverviewGET /platform/overview (findings, evidence, remediations for inbox)

OpenAPI and generated SDKs use finding and remediation vocabulary (not legacy issue terminology).

Findings inbox triage

The findings queue supports slice filters via the triage query param:

ParamMeaning
actionableOpen / acknowledged / remediating findings
since_last_scanFindings observed in the latest completed scanner run per process (or for one process when processId is set)
criticalActionable findings with critical severity
missing_evidenceActionable findings with no linked case/process evidence
report_readyResolved, suppressed, or false-positive findings

Example: /findings?triage=since_last_scan&processId=<processId>

Tests

  • Unit: apps/web/tests/findings-inbox-filters.test.ts, scanner-run-triage.test.ts, findings-bulk-selection.test.ts; apps/api/tests/services/event-scanner-platform.test.ts (bulk actions)
  • Route: apps/api/tests/routes/platform-findings-bulk.test.ts
  • E2E: e2e/tests/findings-inbox.spec.ts (bulk acknowledge)

Operational Cases queue

Operational Cases (/cases) uses the same queue chrome with case-specific slice filters:

ParamMeaning
filterOne of open, sla_risk, has_findings, closed
selectedSelected case id for the detail panel
processIdScope cases to a monitored process
workspaceIdScope cases to a workspace
sortOne of updated, opened, priority

Example: /cases?filter=has_findings&q=vendor&sort=priority&selected=<caseId>

On this page