Interface review¶
Review date: October 14, 2026.
Scope: discovery, setup, scanning, triage, remediation, reports, automation, and contribution. Theme: Cloudscape colors, Open Sans, flat containers, semantic status, and a vector scan example.
The interface design guide explains the resulting patterns. scripts/preview_interfaces.py and docs/ui-tests/ make the human interfaces reproducible from repository fixtures.
Findings addressed¶
| Finding | User impact | Resolution |
|---|---|---|
| The homepage presented documentation before a clear starting path | New users had to infer what ASH does and how to begin | A dedicated overview, installation tabs, mode-specific commands, scanner catalog, and laptop/CI/MCP paths |
| Separate visual styles across the site, terminal, and reports | Users had to relearn hierarchy and severity presentation | Shared palette, outcome language, typography hierarchy, and restrained borders |
| Search did not refresh reliably after pasted input | A query could appear to produce no results | Bridge input changes to the indexed search update |
| Search allowed keyboard focus to leave its open dialog | Keyboard users could interact with obscured controls | Focus containment, inactive background, and Escape focus restoration |
| Framework controls appeared after their accessibility labels were assigned | Dynamic code controls and search snippets could fail navigation checks | Label new controls and make overflowing code reachable after rendering |
| Theme switching depended on hidden framework labels | Keyboard activation and focus behavior were unreliable | A native button reflects and updates the framework's saved theme state |
| Reduced motion could leave illustrated content invisible | The accessible preference removed useful content | Complete static illustration and demo, with persistent motion controls |
| The findings table overflowed narrow terminals | Important content and keyboard controls were difficult to read | Responsive columns reserve scrollbar space; literal two-line rows, selected finding preview, and a stationary footer fit at 60 columns |
| Filters replaced one another | A scanner filter could discard a severity or suppression choice | Independent criteria that compose |
| Search state and active selection were lost or confusing | Clearing, resizing, or sorting interrupted triage | Clear the actual input, explain empty states, and preserve the selected finding |
| Suppression failures dismissed or obscured the decision | Users could lose their explanation or destination context; save controls could fall below a short terminal | Focus the reason field, preserve values, show inline errors and destination context, and keep Cancel/Save visible outside the scrolling body |
| Detail views exposed parent-screen shortcuts | Hidden filters could change while reviewing a finding | Show and enable only actions available on the current screen |
| Human severity could disagree with scanner totals and the gate | A critical threshold finding could be missing from detailed review | Use the canonical SARIF severity resolver in human views without mutating flat exports |
| Empty and incomplete reports could imply successful coverage | A missing scanner or failed converter could look clean | Outcome-first presentation with scanner, target, converter, rule, workspace, and freshness notices |
| Long legends preceded the scan decision | Users had to scroll to understand the result | Put outcome, counts, and next action first; move reference material later or into details |
| GitHub comments expanded every detail at once | A pull request became difficult to scan | Compact outcome, stable scanner table, actionable hotspots, and expandable finding details |
| Offline HTML reports lacked a cohesive review workflow | Filtering, long paths, printing, and mobile reading were awkward | Responsive cards, combined filters, copy fallback, clear/reset, themes, no-JavaScript support, and complete printing |
| Finished progress rows still showed running indicators | Completion appeared ambiguous | Freeze completed summary timers and indicators |
Editor guidance omitted the terminal incomplete state |
An agent could poll indefinitely after a finished partial scan | Correct the canonical workflow and regenerate every editor integration |
MCP scan guidance used is_complete alone |
Cancellation could leave a polling loop running | Name all terminal states in the tool description and returned guidance |
| Editor examples confused the severity gate with result filtering and suppressions with ignored paths | Users could rescan unnecessarily or edit the wrong setting | Correct threshold, filtering, scanner-name, and suppression guidance |
| Bedrock detail views used SARIF levels as severity and lost some rule IDs | Generated advice was harder to trace to the actual finding | Canonical severity, ruleId fallback, safe tables/fences, and individual finding disclosures |
| Version checks read generated HTML as installation examples | Building the site could make an otherwise valid source checkout fail its DevEx checks | Check source files, exclude generated artifacts, and verify the copied installation command against the displayed release |
Surface inventory¶
The source paths below identify the implementation reviewed. The corresponding snapshot and browser suites exercise the rendered states.
| Surface | Interactions and states reviewed | Result and evidence |
|---|---|---|
| Homepage | Vector scan, file selection, scan steps, Play/Pause/Replay, install tabs, mode selection, copy, scanner filters, FAQs | home.html, ash-scan.js, and the site stylesheet and script under docs/content/assets/; responsive, theme, keyboard, reduced-motion, and fallback browser checks |
| Documentation shell | Breadcrumbs, side navigation, mobile drawer, tables, code, copy controls, section navigation, previous/next, footer, and 404 | Custom header and pagination with the existing documentation engine; strict build and browser review |
| Documentation search | Button, Ctrl/Command + K, typing, pasted queries, result links, scrolling code, Tab/Shift+Tab, Escape | Indexed Material search with progressive accessibility enhancements; browser interaction tests |
| Installation and mode choice | pipx, uvx, pip, container/local/precommit requirements, release version, no-JavaScript content | Explicit prerequisites and selectable commands; version template tests and browser copy/tab tests |
Root CLI and scan |
Help, option groups, command defaults, JSON input, quiet/verbose/debug, local/container/precommit, workspace and sharding | Help grouped by purpose; CLI snapshots and unit coverage preserve invocation and verdict behavior |
build-image, container/Nix wrappers |
Forwarded options, runtime errors, host verdict recomputation, return codes | Reviewed through existing container snapshots; shared terminal summary changes propagate; real runtime tests remain in their existing CI legs |
| Scan progress and logs | Initialization, active phases, completed/failed/warning rows, monochrome, handler cleanup, literal task descriptions | Shared terminal theme and clearer status indicators; progress and Rich log tests plus final-frame snapshots |
| Scan results and next steps | Scanner totals, severity gate, partial targets, stale databases, missing dependencies, report paths, quiet output | Verdict first, readable results table, concise guide and literal paths; metrics/summary snapshots and exit-policy tests |
config init/get/update |
Initial file creation, overwrite refusal, resolved config, invalid edits, dry run, paths | Consistent console theme and literal paths; config snapshots preserve file and prompt behavior |
config wizard/validate/lint/validate-plugin-dependencies |
Existing/default config, validation, repairs, declined writes, unused suppressions, dependency errors | Reviewed through the existing config and error snapshots; theme and hierarchy aligned |
dependencies install |
Success, partial failure, supported host variants, dependency result table | Consistent terminal presentation; all recorded host variants retain their install commands |
plugin list |
Scanner/converter/reporter/event inventory, config/default values, long plugin names | Shared console theme; plugin list and registry snapshots |
inspect findings |
Selection, sorting, resizing, severity/scanner/suppression filters, search, empty results, suppressed rows, detail view, snippet, return/quit | Responsive explorer and reliable state; real headless Textual tests at 60/80/120 columns and screen snapshots |
| Suppression dialog | Rule and path context, configuration destination, reason validation, cancel, save, save failure | Preserved input and inline feedback; real dialog regression tests |
inspect sarif-fields |
Field inventory, summaries, missing/invalid SARIF, output destinations | Reviewed through SARIF-field and error snapshots; structured content retained |
report |
Format selection, stdout, file output, missing results, invalid formats | Human formats redesigned; machine formats remain compatible; report command snapshots and output-format tests |
merge |
Results union, invalid shard sets, incomplete scan, actionable findings, clean verdict | Existing union semantics retained and checked by merge/error snapshots; shared terminal results styling |
get-genai-guide and entrypoint errors |
Local/fetched guide, write failures, dependency/import failures, CLI refusals | Reviewed through error snapshots; established diagnostic and return behavior retained |
| GitHub pull request comment | Outcome, completion count, scanner table, hotspots, finding disclosures, context snippets, compact mode | Uses MarkdownReporter; the workflow continues to consume reports/ash.summary.md |
| GitHub Actions job summary | Same report in the job summary; partial coverage and stale notices | Same renderer as the pull request comment; table column compatibility preserved |
| Offline HTML | Desktop/mobile, themes, scope/severity/scanner/search filters, suppressed reasons, zero matches, copy failure, JavaScript disabled, printing | Self-contained HtmlReporter assets; offline browser tests include network/request checks |
| Plain text and Markdown files | Scan record, outcome, counts, coverage, scanner table, hotspots, finding details | Shared factual summary; reporter snapshots cover single-project, workspace, and skipped-project models |
| Bedrock main/executive/technical Markdown | Deterministic outcome, no selected findings, generated analysis, traceable indices, severity, rule IDs, raw details and snippets | Shared outcome and coverage introduction; AWS is stubbed in tests; no live model calls are needed for review |
| MCP lifecycle | Start, progress, results, summary, active scans, cancellation, missing scan IDs, incomplete coverage | Corrected client guidance; lifecycle snapshots and a real Inspector handshake |
| MCP discovery and configuration | Installation, scanners, config read/validation, finding explanation, suppression suggestion, result diff | Registry/result snapshots and tool-reference freshness tests |
| MCP workspace and session interfaces | Resolve/run workspace, missing projects, source delivery by Git/zip, profiles, clear source, errors | Existing contracts reviewed and retained; session/workspace snapshots and schema parity checks |
| MCP resources and prompts | Help, status, exit codes, configuration/suppression schemas, security-analysis prompts | Resource/prompt snapshots and protocol surface golden |
| Editor/agent integrations | Scan command, security scanner workflow, canonical skill, troubleshooting, tool reference, generated platform variants | Edit _base/, regenerate all integrations, and run the transpiler drift/validation check |
| Contributor workflow | Build, fixture preview, browser checks, image gallery, package assets, intentional snapshot changes | scripts/preview_interfaces.py, docs/ui-tests/, and the interface check workflow make review repeatable |
Reporter and integration contracts¶
Every shipped reporter is covered by the explicit reporter catalog in tests/snapshot/support/reporter_catalog.py. Each is exercised with single-project, workspace, and skipped-project models. The review distinguishes human layout from formats consumed by another application.
| Reporter | Consumer | Review decision |
|---|---|---|
html |
Browser / printable artifact | Redesigned, self-contained review interface |
markdown |
GitHub comment, Actions summary, Markdown reader | Redesigned, concise outcome and expandable evidence |
text |
Terminal, file, stdout | Redesigned information hierarchy |
bedrock-summary-reporter |
Main, executive, technical Markdown | Factual outcome and coverage first; traceable and safely formatted details |
csv |
Spreadsheet / ingestion | Preserve columns and escaping |
flat-json |
Scripts / agents | Preserve wire fields and cached data |
sarif |
SARIF consumers | Preserve schema and finding data |
github-ghas |
GitHub code scanning | Preserve host integration contract |
gitlab-sast |
GitLab vulnerability UI | Preserve schema and attribution |
cyclonedx |
SBOM consumers | Preserve component/relationship data |
gitlab-cyclonedx |
GitLab dependency UI | Preserve SBOM integration contract |
spdx |
SBOM consumers | Preserve document contract |
junitxml |
CI test result viewers | Preserve suite/case and failure representation |
ocsf |
Security data consumers | Preserve event mapping |
yaml |
Structured report readers | Preserve serialization |
unused-suppressions |
Suppression maintenance | Preserve the configuration-oriented output |
aws-security-hub |
Security Hub findings | Preserve upload payload and mapping |
cloudwatch-logs |
CloudWatch Logs | Preserve event payload |
s3 |
Object storage / ingestion | Preserve uploaded aggregate data |
MCP retains tool names, input/output schemas, resources, prompts, response fields, and transport behavior. Its reviewed golden changes the scan-start description; runtime guidance text changes to name all terminal states.
Verification and practical limits¶
The browser matrix checks the homepage at 320, 390, 820, and 1440 pixels in both themes; it checks documentation navigation, indexed search, command copying, keyboard tabs, filters, motion, and no-JavaScript behavior. Report checks cover single-project, workspace, and empty models; responsive layout, both themes, offline operation, filtering, clipboard fallback, printing, and no-JavaScript behavior.
Textual tests use the real app and dialogs. Python coverage also checks reporter compatibility, output escaping, critical threshold detail visibility, incomplete converters/rules, terminal table rendering, progress, configuration flows, report stdout, and JSON-RPC stdout safety.
The snapshot suite reviews CLI help, diagnostics, config prompts, dependency installation, plugins, wrappers, terminal views, every reporter, and MCP results. Golden updates must be reviewed and committed under the repository's Snapshot-Update policy.
The package check builds a wheel, confirms all HTML/CSS/JavaScript report assets are included, and renders a report from the installed artifact.
Automated accessibility checks supplement keyboard and visual review. GitHub's exact native styling belongs to GitHub; the local comment preview is an approximation. Container/Nix execution and live AWS uploads are covered by their existing integration jobs rather than by the local visual preview. The flat export's legacy severity representation is retained for consumer compatibility; a versioned normalization change would require its own migration.