Skip to content

[pull] main from CPAtoCybersecurity:main - #43

Merged
pull[bot] merged 17 commits into
ericrihm:mainfrom
CPAtoCybersecurity:main
Aug 5, 2026
Merged

[pull] main from CPAtoCybersecurity:main#43
pull[bot] merged 17 commits into
ericrihm:mainfrom
CPAtoCybersecurity:main

Conversation

@pull

@pull pull Bot commented Aug 5, 2026

Copy link
Copy Markdown

See Commits and Changes for more details.


Created by pull[bot] (v2.0.0-alpha.4)

Can you help keep this open source service alive? 💖 Please sponsor : )

Layer 1: anthropics/claude-code-security-review runs on same-repo PRs
(fork PRs are skipped because secrets are stripped; maintainers use
/security-review locally). Layer 2: Google Mantis positioned as the
periodic offline deep review, never CI. SECURITY.md maps the layers to
CSF DE.CM and ID.RA and records the operating rules: findings are
advisory, humans verify, the reviewer itself is a prompt-injection
surface so external-contributor approval gating stays on.

Maintainer setup: add a CLAUDE_API_KEY repo secret; leave the check out
of required branch protection until the first green run.
… pane

The Details pane is an overflow-auto column and its Auditor trigger is
right-aligned, so the dropdown's 'absolute left-0 w-72' panel overflowed the
pane rather than drawing over it: 258 of its 288px were clipped, reachable only
by scrolling the pane sideways.

Portal the panel to <body>, position it fixed against the trigger, and clamp it
to the viewport (flipping above when there's no room below). The z-[9999] class
was inert -- this stylesheet defines no arbitrary-value or z-50+ utilities -- so
the z-index is now set inline.

Keeps the themed utility classes rather than reusing DropdownPortal, whose
hardcoded #1f2937 would override this theme's --bg-primary (#0f172a).
Each evaluation card was a div with an onClick, so the browser had no link
to build a context menu around: no "Open Link in New Window", no Cmd-click,
no middle-click, and no keyboard focus. There was also no URL addressing a
single evaluation.

Each card title is now a react-router Link to /assessments?selected=<id>,
with a stretched ::after overlay so the whole card is the hit area and the
clone/delete/status buttons raised above it. The page honors ?selected= in a
pre-paint layout effect, reusing handleSelectAssessment and clearing the
param -- the same convention Findings and Controls already use.

A plain left-click is intercepted and selects in place, so it adds no
history entry; modified clicks and right-click fall through to the browser
untouched, which is what makes the new-window affordance work.

Known cost: the overlay owns the hit test, so card text is no longer
drag-selectable in the list.
The artifact pick list in the Assessments evaluation pane rendered behind the
Findings field and was squeezed into 160px. Root cause: .z-10 has no rule in
index.css -- this stylesheet is hand-maintained with no Tailwind build, so the
class applied, z-index computed to auto, and later positioned siblings painted
over the panel. Same silent-no-op class as the inert z-[9999] in 40efe46.

Add the .z-10 rule, which also repairs the Finding, Control, and Artifacts-page
pick lists that share the defect. Portal the artifact panel to <body> with
fixed positioning and an inline z-index, since the pane is overflow-auto inside
an overflow-hidden grid and clips absolute panels. Measure width from the
trigger (content-box makes w-full render wider than its parent), flip above
when there is no room below, and clamp to the viewport.

Add an inline New artifact form that creates, scope-stamps, and links in one
action. Duplicate and empty names are blocked -- linkedArtifacts keys on name.

19 new tests; full suite 1331 passing.
Add Claude diff security review and document the AI review layers
…in-new-window

Make Assessments-list evaluations right-clickable into a new window
# Conflicts:
#	src/stores/findingsStore.js
…i-parity

Assessment UI fixes and CSV/UI export parity
…v-parity

Give the CSV-only findings columns a panel surface
…links

Add external ticket links to Controls and Artifacts
The checkbox columns on Artifacts and Findings rendered with no `checked`
and no `onChange` — clicking one did nothing. Controls had no checkbox
column at all. Deleting several records meant opening each detail panel
in turn, one confirm dialog per record.

Adds a shared `useRowSelection` hook and a `BulkDeleteBar` strip, then
wires all three pages to them: a header select-all checkbox, working
per-row checkboxes, and a Delete action that removes every selected
record behind a single confirmation.

The hook reads the selection through the rows currently rendered rather
than trusting stored ids. These pages re-scope constantly (assessment
filter, search, and pagination on Controls), and without that
intersection a selection made before a filter change would queue a
delete against records the user can no longer see.

Delete is offered whenever at least one row is selected. Gating it on a
full selection would make it useless on a filtered list.

BulkDeleteBar styles only with classes that exist in index.css — this
project has no Tailwind build — and does the destructive button's hover
with inline handlers, since `hover:bg-red-700` has no rule to fall back
on.
Advisor review of the select-all work flagged four gaps. Three are
addressed here; one was already covered.

The header checkbox drew an empty box on a partial selection, which
reads as "nothing is selected" while the bar beside it says three are.
React has no `indeterminate` prop, so it is set through a ref, with
`aria-checked="mixed"` alongside.

Adds the test that actually secures the design: select every finding,
narrow the assessment scope so one goes hidden, then bulk delete — the
hidden finding must survive. Proving the prune at the hook layer does
not prove the page's delete loop consumed the pruned value, and a page
holding its own copy of the raw set would pass every hook test while
deleting records behind the filter.

Writing it surfaced that `filterByScope` fails open for unassigned
records, so both fixtures are stamped to assessments — an unassigned
finding is visible in every scope and can never go hidden.

Also adds named-row delete tests (index-based probes pass even when a
checkbox is bound to the wrong row) and indeterminate-state coverage.
@pull pull Bot locked and limited conversation to collaborators Aug 5, 2026
@pull pull Bot added the ⤵️ pull label Aug 5, 2026
@pull
pull Bot merged commit 54b37d8 into ericrihm:main Aug 5, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant