Files
rengine/api
Yogesh OjhaandClaude Opus 5 2aac7a8d31 feat(scans): focused scans at estate scale
A focused scan was bound to one parent scan, so one target. Selection was a
list of row ids, capped at 200 and pruned to the visible page. The project-wide
result views could not start one at all.

A selection is now a value the server resolves: `SeedSelection` carries either
explicit picks or the query that matches them, and resolves into one group per
target's covering scan. One action fans out into a focused scan per target,
tied by `scans.run_group_id`. `parent_scan_id` + `assets` stays as the older
one-scan form, normalized by a validator, so MCP and the row menu are unchanged.

Resolution reuses the query grammar rather than a second matcher: a `seeds()`
per results service over the existing `_scoped(scope, f, columns=...)` hook,
projecting `(value, scan_id)`. Addresses are the exception, since the derived
CTE folds them across targets and exposes `target_ids`; the resolver maps those
through `SurfaceScopeService.scans_by_target`, as it does for a pick that names
no scan.

`MAX_SEED_ASSETS = 200` becomes `MAX_RUN_ASSETS = 5000` with `MAX_RUN_SCANS = 25`.
One cap, not one per scan: a group is per target, and a lower per-scan cap would
need intra-target chunking that `parent_scan_id` and `AssetRecheck` cannot
express. `matched` is null once the probe limit is reached, so nothing reports
the probe as a total.

Frontend:
- `RowSelection` replaces the per-table `SvelteSet` and the effect that pruned
  it to the current page on every page, sort and filter change
- the `projectWide` guards are gone, so /surface/* can act on what it shows
- the selection bar offers the search as the selection, and states the cap
- `POST /scans/rescan/preview` feeds the dialog a per-target breakdown
- the Endpoints tab gains a query-only entry point

Verified against the dev estate: tech:cloudflare reports 3,484 across 5 targets
in the bar, the dialog and the API; title:Census seeded 3 as 2+1 across gov.np
and gov.ng under one run group.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01799buekQvDvH41ns8EdhdH
2026-09-11 21:31:11 +05:30
..
2026-02-04 20:05:28 +05:30
2026-02-04 20:05:28 +05:30