Commit Graph

77 Commits

Author SHA1 Message Date
Binh 3b8cb78717 feat(comparison): compare scanners, GPO settings and score basis across timeslots
Separate new from regressed scanner deviations and accept a timeslot without
scanner runs on one side. Pair rolled-up GPO Work verdicts by scope and
technical identity with a newer backup set and the same baselines; a changed
value of a still deviating setting stays neutral. compareTimeslots yields the
change categories for the UI and a score delta over comparable sources only.
2026-10-13 11:52:56 +02:00
Binh c982f0a0a2 feat(comparison): register the Comparison Engine and relocate the Phase 8 scan-run comparison
Move compareScanRuns, comparison normalization and local comparison rules
unchanged to src/evaluation/scan-run-comparison so src/comparison can become
the Comparison Engine; only import paths change. Register the engine paths,
document it in AGENTS.md and onboarding, extend the boundary test and add the
permanent on/off invariance test. Record the decision and staging in the plan.
2026-10-13 11:34:10 +02:00
Binh f83edc83ac feat(data-flow): show the Remediation Engine and its engine-owned schema
- Engines & relationships: Remediation Engine, its tables and UI in a new
  right column; port, published Context, own data and UI relationships.
- DB Structure reads the declared engine schema assessor_remediation and
  lists its tables schema-qualified.
2026-10-12 13:30:53 +02:00
Binh fbd73819dd test: align three tests with Michael's cluster order, optional app read and Data Hub donut props 2026-10-12 11:57:01 +02:00
Binh 09a60e6a9f test(imports): re-record PingCastle contracts for the approved 2.19.1 changes 2026-10-12 11:09:03 +02:00
Binh 8d72805b27 2.25.0: integrate the rebased branch with Michael's Remediation base
- Client Info: Defender, Compliance and AI Overview move into Michael's
  ClientInfoTabs (Overview, Security, Defender, Compliance, AI Overview);
  engine tabs are lazy so hidden tabs start no requests.
- Drop the old client-info-tabs nav styles; compliance switches use the
  shared defender-tabs segmented style.
- Port the derived-forest note into client-info-facts.ts; tolerate
  observations without attributes.
- Risk register ring opens the matched record (recordId is optional for
  scoped acceptances).
- Import gate: additive synthetic Defender vulnerability and alert contracts.
  PingCastle snapshots stay unchanged pending review.
- Version 2.25.0; AGENTS engine list names the Remediation Engine.
2026-10-12 10:53:44 +02:00
Binh 682ce43c45 fix(compliance): fit Compliance tab tiles to content; mapping refresh and hit cap
Compliance tab layout (user corrections 2026-10-12):
- Overview row is only as tall as its taller tile; Mapping coverage is no longer forced square and both tiles share the row height.
- Annex A and BSI Kernel footprint cells grow with the tile up to 64px (5:3, 14px numbers); each Annex A theme column is as wide as its six cells and the columns spread across the tile. BSI requirements fill an auto-fill grid of the same cell size, also in the Show all window.
- Kernel footprint tile shows only the practice with the most findings.
- BSI Grundschutz++ framework tile shows 4 to 10 practices, as many as its square fits (container queries on the inner width).

Fixes from 2026-10-09:
- Compliance tab signals changed coverage or mapping history so Work reloads its assignments; `Mapping failed` no longer opens Work without its filter value.
- Hybrid ISO retrieval counts hits in rank order against the 8,000 character cap per control and always keeps the best hit, so large mappings no longer fail with regulatory_mapping_prompt_too_large.

Governance (Core-Freigabe: Governance): AGENTS.md BSI tile rule updated to the content-fitted practice count. Engine code only otherwise.
2026-10-12 10:38:14 +02:00
Binh be16428fbb feat(compliance): direct BSI mapping, ISO/BSI review and hybrid search
Release 2.23.0 (Phase 13F, BSI Grundschutz++ stage 2).

- Map rules directly to BSI Kernel requirements from a dedicated BSI
  corpus in Qdrant; mappings and decisions carry a framework
  (migration 029, verified backup before applying).
- Compare directly accepted BSI requirements with those derived from
  accepted ISO controls (Consistent / Inconsistent / No ISO reference)
  in a new "ISO <-> BSI review" tile in the Client Info Compliance tab,
  with Accept/Reject and "Mark reviewed" per fingerprint.
- Hybrid retrieval for ISO and BSI: German restatement of the public
  query, dense English + dense German + German BM25 fused by
  reciprocal rank; BSI skips BES/DLS/GEB/PERS and sends 16 candidates.
- ISO prompt 1.3.0 gives the model the full ISO/IEC 27002 control text
  (never sent to the browser).
- Auto-accept only the first two strong proposals (primary, high or
  medium confidence).
- Recognize Purple Knight scoped tool ids and SI indicator ids in the
  mapping query.
- Rename Result DB "Map all ISO controls" to "Compliance mapping" with
  ISO and BSI batches; "Mapping history" lists ISO and BSI runs.
- Data Hub BSI tile shows the BSI search index state and can build or
  rebuild it.
- Update AGENTS.md and the implementation plan with these decisions.
2026-10-12 10:37:59 +02:00
Binh 560e936faf feat(compliance): preload Compliance tab and fix AI overview generation
Client Info now loads the Compliance tab overview when a timeslot opens, so the first switch to the tab shows it at once.

AI overview fixes:
- drop references to IDs that are not in the input instead of failing the run
- keep source IDs when chunked analyses are consolidated (prompt version 1.3.0)
- allow CIS rule numbers and other address-like values from the input in the email/IP check
- remove the count limit for questions and assumptions; the panel shows ten with a Show all toggle
- label AI overview requests as Compliance Engine in the activity log and keep one Generating AI overview entry open for the whole run

The product version stays unchanged.

Core-Release: Platform, Presentation
2026-10-12 10:37:49 +02:00
Binh c55c47f38b Add docs/mockups/ to .gitignore 2026-10-12 10:37:48 +02:00
Binh 75a600fa82 Compliance tab overview: mapping coverage and ISO/BSI footprints
- Client Info Compliance tab: overview row above the framework tiles with an
  ISO/BSI switch. Mapping coverage (square donut, per mapping state) and the
  Annex A footprint (all 93 controls, titles from the active corpus) or the
  BSI Kernel footprint (top two practices, Show all window with all 901
  requirements, unreachable ones marked, pinned detail line).
- Mapping failed and ISO control without BSI requirement open Work through
  the new Compliance Engine facet ISO mapping; Client and Assessment context
  row in the tab (Core release Presentation for the DashboardPanel drilldown
  and context row).
- Fix: an ISO control accepted by an earlier run can be decided again after a
  remap of the same pipeline version no longer proposes it.
- Overview response adds coverage, bsiFootprint and annexATitles; Work
  assignments add failedFindings. Product version unchanged pending Platform release.
2026-10-12 10:37:48 +02:00
Binh ca66fbdef9 2.22.0: BSI Grundschutz++ derived from ISO mappings
Compliance Engine stage 1 for BSI Grundschutz++ (Kernel requirements only):
- Pinned snapshots of the BSI Kernel catalog and the official ISO 27001
  Annex A -> Grundschutz++ mapping with source URL, SHA-256 and CC BY-SA
  attribution, generated by server/compliance/update-bsi-assets.mjs.
- Requirements are derived from accepted ISO controls, never stored as
  decisions; missing mapping targets are reported.
- Client Info Compliance tab: BSI Grundschutz++ tile and Results window.
- Finding Reader: collapsed BSI requirements section grouped by ISO control.
- Work: BSI requirement and BSI practice facets.
- Data Hub: BSI catalog tile with Update from BSI and Use bundled catalog;
  new outbound target documented in SECURITY.md.
2026-10-12 10:37:39 +02:00
Binh 8649d01229 2.21.0: Client Info Compliance tab with ISO mapping history
The Compliance row moves from the Client Info Overview into its own
Compliance tab (before AI Overview). The framework tile row and its
Results button stay unchanged so later frameworks add a tile.

The tab heading carries a Last mapping button. Its window lists up to 50
mapping batches and single finding mappings of all clients, because
mappings are global per rule. Each entry shows its trigger (Automatic,
Manual, Single finding), where it came from relative to the shown
timeslot (This timeslot, Other timeslot, Other client, Unknown), status
and content-free counts. Mapping runs now record their trigger, and
single mappings their origin as SHA-256 tokens only, since runs are
exported with every client. The tab refreshes while a mapping runs and
shows the last overview at once when returning to it.

Also: history table keeps the 14px table role in every column, and the
flaky sheet-selection-cost test uses 300 instead of 2,537 sheets.

Core changes (released Presentation, Governance, Platform, Core Tests):
DashboardPanel Compliance tab, AGENTS.md decisions, product version
2.20.0 -> 2.21.0, sheet-selection-cost test.
2026-10-12 10:37:29 +02:00
Binh 5fd8f98014 2.20.0: Automatic ISO mapping of new scans and GPO imports
The Compliance Engine maps newly uploaded scans and GPO evaluations to
ISO controls while the new Data Hub switch "Map new scans automatically"
is on (default off). An engine-side watcher reads only through
ComplianceReadPort: active scan runs and, for GPOs, the deviation rows of
each timeslot as filtered Result DB pages. It starts the existing ISO
batch per new scan run or per timeslot with new GPO rows; already mapped
rules are reused, so only new rules reach the model. Existing data forms
the baseline and is not mapped retroactively.

The switch lives in the engine's own settings file, not a Core table.
Switching the Compliance Engine off in the Engines popup also switches
automatic mapping off server-wide.

Core changes (released Platform, Core Tests, Presentation, Governance):
PUT /reference-data/iso-corpus/auto-mapping route, setIsoAutoMapping API
client method, subscribeEnginePreferences export, AGENTS.md decision and
product version 2.19.1 -> 2.20.0.
2026-10-12 10:37:17 +02:00
Binh 3a515a0440 Add onboarding SVG diagrams for data layers, AI workflows, and user journey 2026-10-12 10:37:04 +02:00
Binh 8506d066b4 test(reporting): skip read-only write check when running as root
CI job containers run as root, which bypasses file permission bits.
The mode check still verifies the archived file has no write bits.
2026-10-12 10:36:32 +02:00
Binh ac7c7b6283 feat(compliance): update compliance UI and logic for ISO controls
- Refactor compliance CSS to enhance layout and styling for the new Compliance row.
- Update RESULT_DB_DISCLOSURE_POLICY_VERSION to 3.8.0 for consistency across modules.
- Implement rollup logic for policy comparisons in result DB materialization.
- Enhance DashboardPanel to support theme filtering alongside control filtering.
- Introduce new ClientTileParts component for shared dashboard elements.
- Add tests for result DB materialization to ensure correct handling of GPO comparisons.
- Update existing tests to reflect changes in compliance logic and UI.
2026-10-12 10:36:31 +02:00
Binh 7185ec0e56 feat: extend Compliance Engine and ISO workflows for v2.19.0
- Move AI overview and privacy-safe JSON export into Compliance Engine
- Add ISO control and theme facets to Work, including GPO settings
- Enrich ISO queries with baseline context, Windows code meanings and technical explanations
- Count GPO settings once and preserve editable decisions across mapping runs
- Fix GPO mapping version conflicts and backup domain identity resolution
- Add regression coverage and update architecture and reimport documentation
2026-10-12 10:35:38 +02:00
Binh c5edcd9aa0 2.18.0: Compliance Engine for ISO control mapping
Extract the regulatory ISO control mapping from the Core into the
Compliance Engine (src/compliance, server/compliance, tests/compliance).

- Fix ISO mapping after the Result DB privacy merge: look up a finding's
  Result DB row scoped to its project instead of comparing a stripped
  project id.
- Engine reads the Core only through ComplianceReadPort and writes only
  its own ComplianceStore (existing migration 026 tables, own pool);
  engine writes no longer advance the Core revision.
- Engines popup gains Compliance Engine; switched off it shows nothing
  and sends no requests. Permanent on/off invariance test.
- Map ISO controls opens a window like Accepted Risk; accepted controls
  appear as an ISO controls section in the Finding Reader and as tiles
  below the Context heatmap in Client Info (drill-down into Work).
- First two proposals of a finished mapping are accepted automatically
  (provisional user decision); existing decisions are never overridden.
- Activity log names Compliance Engine work, keeps running mappings,
  batches and corpus embedding until the backend ends them, and no
  longer logs repeated status checks.
- Data Flow diagram shows the Compliance Engine.
- Core guard treats a bare engine folder name as engine path; new guard
  area test.
2026-10-12 10:34:43 +02:00
Binh f9c347ae7c fix: align Defender branch with Michael's Business Impact base
Read Maester `Result` as the native status when no separate Status
column exists, so the Work deviation filter matches the documented
Maester rule again (regressed in the vulnerability result type commit).
Expect the Result DB audience in Michael's empty-state test and record
the rebase and product version 2.17.0 in the implementation plan.
2026-10-12 10:33:38 +02:00
Binh fd97b111d1 feat(result-db): disclose Defender for IoT findings by public CVE ID
Defender part of 21a6266 on disclosure policy 3.5.0: Defender is a known
Result DB tool, and a formally valid public CVE ID crosses as rule ID and
title. Includes the securityToolId mapping deferred from c056c21 and a
projection regression for Work and Result DB titles.
2026-10-12 10:33:30 +02:00
Binh b51af79334 fix(risk-acceptance): keep same-CVE devices with their own occurrence
Device part of 95ec322: scoped risk targets are derived from the source
rows of each occurrence, so a device-finding cannot target a device that
the selected occurrence does not list.
2026-10-12 10:33:23 +02:00
Binh bad06d15e8 fix(defender-for-iot): align panel styles with the UI contracts
Defender part of 3f6259d: 14px labels and table headers, compact metric
tiles inside a segment, marker width token. Keeps the tile hairline,
shared text roles and the blue table-row marker.
2026-10-12 10:33:14 +02:00
Binh 45088e9bcd feat(profiles): add Microsoft Defender for IoT Alerts profile
Adapted pick of fdd46e8: recognition, source extractor, domain model and
tool profile for Defender for IoT alert exports, the common-description
first read with its AGENTS.md rule, and the shared markdown, recognition,
status-outcome and scan-sequence changes.

Also brings forward two fixes Defender needs on this base: the title
fallback in recordTitleFor (from 210bbc0) and the Source Rule ID
exception for ID columns that are the finding title (from 21a6266).

Product version 2.12.0 for the Defender series.
2026-10-12 10:33:06 +02:00
Binh 2eafefc5a1 feat: scoped risk acceptance for Defender devices
Adapted pick of d9ff6a8: device-finding and device-snapshot targets with
immutable snapshots, migration 028, repositories, API, Defender panel,
Finding Reader and the Accepted Risks register.

Unlike the original, the register keeps the base rule for its current
count, and a scoped decision covers only the occurrences it captured.
After a reimport it stays with its full history, shows Review required
and covers nothing, like a whole-finding acceptance.
2026-10-12 10:32:52 +02:00
Binh 8beea97ce4 feat(defender-for-iot): inline drill-downs in the vulnerability panel
Partial pick of b438f25. CVE, device and site rows expand their details
in place; the Affected Devices table lists name and IP separately.

Unlike the original, the expanded row uses the blue table-row marking
tokens and the drill-down keeps the shared tile tokens. The NVD client
fix is left out with the skipped CVE enrichment.
2026-10-12 10:32:22 +02:00
Binh e0067311f3 feat(defender-for-iot): update to version 1.2.0 with new features and improvements 2026-10-12 10:32:08 +02:00
Binh a181d264bf feat(defender-for-iot): dashboard layout and outcome marking
Adapted pick of 08771d5. findingOutcomeMark supplies the outcome mark in
the Work card and the Finding Reader header, including sources without a
status column. The Defender panel uses the Client Info header and a
six-column metrics row.

Unlike the original, tiles stay on the shared tile and text tokens
instead of --client-info-* colours, border: 0 and --btn-radius.
2026-10-12 10:32:00 +02:00
Binh 0b5dcfbcc6 docs(defender-for-iot): document the vulnerability finding result type
Partial pick of 33d2019: the CANONICAL_MODEL.md section and the comment
on CanonicalResultType.

Left out: the Defender backfill migration and the read-side outcome
fallback in unified-result.ts with its test.
2026-10-12 10:31:52 +02:00
Binh 03f5d999f3 feat(defender-for-iot): introduce vulnerability finding result type
Adapted pick of fe71246. Adds the vulnerability_finding result type,
missingStatusOutcome for sources whose rows are the finding, and Defender
profile 1.1.0. The Work deviation filter uses the canonical predicate
through isDeviationRecord; Michael's GPO status logic and status cache
stay in front of it.

The constraint migration is renumbered from 022 to 027. The CVE
enrichment commit e048295 is skipped for now.
2026-10-12 10:31:45 +02:00
Binh 2a80ca9867 feat(defender-for-iot): aggregate affected devices in findings
Partial pick of 5fbbda2. One finding per CVE with an Affected Devices
table and device count; the Finding Reader hides the raw Source
Observations field.

Left out: the Affected Devices label in the Result DB row detail, since
the disclosure policy withholds affectedAsset for every row.
2026-10-12 10:31:32 +02:00
Binh 6ccd6f009a feat(defender-for-iot): add dataset model, source extractor, and profile on Michael's base
Adapted pick of 7d3ef5f. The profile declares the now mandatory
securityScoring, priorityBasis and timeslotComparison. Client Info adds
Defender as a third tab beside Overview and AI Overview, and a
Defender-only timeslot starts in the Defender view. recordTitleFor only
replaces the title candidate; the Maester and CIS title rules stay.

Left out: the .gitignore entry, --tile-inset, the stored-profile
precedence Michael's fileProfile already has, and the old processing
version assertion.
2026-10-12 10:31:16 +02:00
Binh 2338c04e9f chore: ignore local Defender mock, artifacts, evaluation and backups folders 2026-10-12 10:31:08 +02:00
Binh a01ac3e4e5 feat: add ISO regulatory corpus PDF uploads 2026-10-12 10:31:08 +02:00
Binh 402442f86b fix: keep saved AI overviews and ISO mappings available
Partial pick of 95ec322: a failed or queued regeneration keeps the previous successful AI overview visible, and a stored ISO mapping stays readable while the retrieval index is unavailable. The Defender device risk-acceptance fix of that commit is not taken here.
2026-10-12 10:31:07 +02:00
Binh 169fd6884d fix: prevent stale AI overview and ISO mapping state
Partial pick of 3f6259d: both hooks bind each response to its request scope and discard a late response for a previous selection. The Result window palette, MITRE path gradient removal and Defender styles of that commit are not taken.
2026-10-12 10:30:59 +02:00
Binh 841b5f9d02 feat(regulatory): map GPO baseline comparisons to ISO controls
policy-evaluation rows map like scanner findings in the Finding Reader and the filtered Result DB batch. The query is built after the Result DB disclosure projection, so the customer value never reaches retrieval or the mapper. The global rule key is the technical setting ID; Work GPO rows carry their current comparison ID. Raw GPO and environment observations stay excluded. Retrieval version unchanged.
2026-10-12 10:30:46 +02:00
Binh fb6712d3db feat: add regulatory mapping batch functionality 2026-10-12 10:30:36 +02:00
Binh 2be20b7889 feat: add regulatory mapping panel and hooks for managing regulatory mappings 2026-10-12 10:30:36 +02:00
Binh 7877c00c4e feat(regulatory-rag): add Qdrant-backed regulatory RAG retrieval and deployment wiring 2026-10-12 10:30:03 +02:00
Binh d9ebdd22fd feat: add AI Overview panel and integrate AI overview functionality 2026-10-12 10:30:02 +02:00
Binh af4f14845a feat(exports): add GPO comparison to privacy-safe JSON export
Actionable policy-evaluation findings carry a policy block built from the Result DB disclosure projection, so the customer value stays withheld. Raw policy observations are counted separately instead of as findings.
2026-10-12 10:29:30 +02:00
Binh d9da5c39c0 fix(branding): track transparent app icon 2026-10-12 10:29:23 +02:00
Binh a7e92de0ec feat(ai): add prototyp for LLM integration 2026-10-12 10:29:23 +02:00
Binh 1c01118956 feat(results-browser): implement load all functionality for results db 2026-10-12 10:29:12 +02:00
Michael 614ac1b147 Backup 2026-10-11 03:33:25 +02:00
Michael 250c213fc1 Business Impact + Management Report 2026-10-04 19:58:04 +02:00
Michael d234f94315 Test Merge Fokus Agent.md 2026-10-02 08:23:25 +02:00
Michael ec0d9f2d3e Context Engine + Backup Commit - not ready yet! 2026-10-01 18:05:02 +02:00
Michael ba461cb1f7 test: Donut-Vertragstest unabhaengig von Zeilenenden
Die CSS-Dateien werden beim Einlesen auf LF normalisiert, weil
Windows-Checkouts mit core.autocrlf=true CRLF liefern. Die
Vertragspruefungen selbst bleiben unveraendert.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 10:02:53 +02:00