Skip to content

docs(vuln): align Vulnerability Reporting doc with shipped code#224

Merged
maximelb merged 1 commit into
vuln-uplift/asset-tags-and-extension-docsfrom
vuln-uplift/doc-code-alignment-fixes
May 13, 2026
Merged

docs(vuln): align Vulnerability Reporting doc with shipped code#224
maximelb merged 1 commit into
vuln-uplift/asset-tags-and-extension-docsfrom
vuln-uplift/doc-code-alignment-fixes

Conversation

@maximelb
Copy link
Copy Markdown
Contributor

Summary

Audited docs/5-integrations/extensions/limacharlie/vulnerability-reporting.md against the actual ext-vulnerability-reporting/ext/ source. Found six things wrong or missing — this PR fixes them. Stacked on top of vuln-uplift/asset-tags-and-extension-docs (#223) since that's where the doc lives.

Wrong claims removed

  • sla_windows_hours config field — doc described it as a top-level config knob with defaults and a JSON example. The Configuration struct (extension.go:87-99) has only scan_mode and criticality_tag_overrides; configSchema() confirms only those two are exposed. Removed from the config table, JSON example, validation paragraph, and the SLA-configuration best-practices section.
  • vuln_finding.sla_breach_warning event — never emitted anywhere in code; no sla_breach scan exists in the daily tick. Removed from the events table, the workflow text, the Outputs-integration list, and the glossary.
  • vuln_finding.resolution_changed event name — the actual constant is vuln_finding.state_changed (events.go:18). Renamed everywhere.
  • Daily tick = "four scans" with "60-second timeout"scans.go:97-105 runs three scans (kev_match, daily_snapshot, epss_history) with scanLongRunningTimeout = 10 * time.Minute. Updated the tick description, the table, and the glossary.
  • "Counts against SLA" lifecycle column — implied SLA enforcement that does not exist. Dropped the column; surviving language describes posture only.
  • "Prioritize findings" bullet calling lc:asset:criticality:* the SLA-window source — only the LC Risk multiplier remains.

Capabilities now documented

  • vuln_finding.closed event (events.go:16 / events.go:185) — fires when the last sensor holding (cve, normalized_package_name) clears it on a rescan, and per cleared fingerprint when reset_asset_findings wipes a host. Added to the events table.
  • reset_asset_findings action (extension.go:812, reset_findings.go) — wipes every finding owned by (oid, sid). Added to the API actions table and given a reference subsection with request, response, and side-effect notes.

Replacement guidance

The deleted "SLA configuration" section is replaced with a "Tracking remediation deadlines" section explaining that the extension does not enforce a built-in SLA and pointing operators at the available signals (vuln_finding.created, first_seen_at, vuln_finding.closed, mitigated state_changed) for wiring deadlines in their downstream ticketing system.

Test plan

  • Open the rendered doc in a preview and skim each updated section for flow.
  • Verify the events table renders four rows (created, closed, kev_match, state_changed).
  • Verify the Daily Update tick table renders three rows.
  • Search the rendered doc for sla_breach, resolution_changed, and sla_windows_hours — should be zero hits.

🤖 Generated with Claude Code

Removes claims that don't match the extension as it ships:

- `sla_windows_hours` config field (doesn't exist in Configuration struct)
- `vuln_finding.sla_breach_warning` event (never emitted; no SLA-breach
  scan in the daily tick)
- `vuln_finding.resolution_changed` event (real name is
  `vuln_finding.state_changed`)
- Lifecycle "Counts against SLA" column (no SLA enforcement in code)
- Daily tick described as four scans (it's three) with 60s timeout
  (it's 10 minutes — `scanLongRunningTimeout`)

Adds documentation for capabilities the doc had previously omitted:

- `vuln_finding.closed` event (fired by org-scope fingerprint reconciliation
  and by `reset_asset_findings`)
- `reset_asset_findings` action (used for reformat / reimage / decommission
  of a host)

Replaces the SLA-configuration best-practices section with guidance on
how to track remediation cadence externally given that the extension
does not enforce SLAs natively.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@maximelb maximelb requested a review from steveatlc May 13, 2026 03:12
@maximelb maximelb added the to-code-review Used to tag PRs that are force-pushed and will need to be reviewed after the fact. label May 13, 2026
@maximelb maximelb marked this pull request as ready for review May 13, 2026 03:12
@maximelb maximelb merged commit f2d02ae into vuln-uplift/asset-tags-and-extension-docs May 13, 2026
1 of 2 checks passed
@maximelb maximelb deleted the vuln-uplift/doc-code-alignment-fixes branch May 13, 2026 03:12
maximelb added a commit that referenced this pull request May 20, 2026
…tension (#223)

* docs(vuln-uplift): asset-tag namespace and Vulnerability Reporting extension

Vulnerability-management uplift documentation:

- New concept page for the canonical lc:asset:* tag namespace under
  2-sensors-deployment/ — schema, validation rules, mass-tagging examples,
  and override-hatch behaviour. Intended to be a cross-cutting reference,
  not specific to vulnerabilities.
- New extension overview for ext-vulnerability-reporting under
  5-integrations/extensions/limacharlie/ — covers scan modes, configuration,
  asset metadata, KEV/EPSS enrichment, the Phase 2 lifecycle workflow and
  events (caveated as not-yet-GA), and the full API action surface.
- Cross-links the two pages, adds them to mkdocs.yml nav and the
  LimaCharlie extensions index, and adds a 2026-05-09 entry to release
  notes summarizing the uplift.

Refs refractionPOINT/tracking#4259

* docs(vuln-uplift): document LC Risk persistence, audit log, EPSS history, and reachability deferral

Extends the Vulnerability Reporting extension page with the new pieces
landing in this round of the vuln-management uplift:

- New API actions: list_finding_state_history (audit log read path) and
  query_epss_history (90-day EPSS percentile time-series, backs the
  CVE-detail sparkline). Replaces the prior round's placeholder
  list_finding_states entry with the shipping name.
- Row schema additions: query_host_vuln_packages now returns fix_version
  (NVD-derived) and lc_risk; query_cves now returns max_lc_risk;
  set_finding_state and bulk_set_finding_state responses now echo
  first_seen_at and remediated_at.
- New sort_by value lc_risk on query_cves (max_lc_risk DESC) and
  query_host_vuln_packages (lc_risk DESC).
- Lifecycle audit log subsection: vuln_finding_state_history table,
  state="cleared" event for clear_finding_state, list_finding_state_history
  as the read path, with cross-link from Accepted exceptions.
- mitigated_by validation: write-time D&R hive lookup, hard-fail with
  HTTP 400 on unknown rule key, no soft-fail mode.
- LC Risk section: scan-time computation in ApplySensorReports,
  persisted to vuln_reports.lc_risk and rolled up to
  vuln_cve_counts.max_lc_risk, formula reproduced verbatim and noted as
  hardcoded-in-sync with src/utils/lcRisk.ts in web-app-frontend.
- EPSS history section: daily Update-tick capture model, 90-day default
  / 365-day max window, reference consumer is the CVE-detail sparkline.
- Reachability subsection: documented as deferred (sensor-side telemetry
  not exposed today); LC Risk criticality multiplier is the interim
  proxy for triage prioritization.

Cross-links from the audit-log and EPSS-history sections to the actions
they describe; cross-links from the action table back to the conceptual
sections.

mkdocs build --strict and markdownlint-cli2 both clean.

Refs: refractionPOINT/tracking#4259

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* docs(vuln-uplift): full Vulnerability Reporting reference, workflows, and best practices

Pivot the page from a Phase-1/2 milestone-keyed reference into an
operator-facing extension manual: complete API action reference for every
read/write action including request/response shapes, concept sections for
lifecycle states / fingerprints / LC Risk / KEV / EPSS / daily snapshots /
the daily Update tick, ten numbered operator workflows (triage, acceptance,
mitigated-by-DR, compliance export, audit-log review, EPSS trend
monitoring, bulk ops), a real best-practices section (state choice
decision tree, tag combos, LC Risk vs CVSS, mitigated_by wiring, SLA
configuration, daily-tick expectations, downstream Output wiring), and a
glossary. Flagged the backend/frontend `low` criticality multiplier
mismatch (0.6 vs 0.8) inline.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* docs(vuln): collapse lifecycle states to 3-resolution model

The remediation surface collapsed from a 5-state machine + audit log to a
3-resolution model (mitigated / accepted / false_positive) with no
per-finding history. Update the docs to match: rewrite the lifecycle
section, replace the set/clear/bulk/list state actions with the new
resolution actions, drop the D&R-rule and audit-log workflows + best
practices, and note that case_number is reserved for upcoming ext-cases
linkage.

* docs(vuln): align doc with shipped code (#224)

Removes claims that don't match the extension as it ships:

- `sla_windows_hours` config field (doesn't exist in Configuration struct)
- `vuln_finding.sla_breach_warning` event (never emitted; no SLA-breach
  scan in the daily tick)
- `vuln_finding.resolution_changed` event (real name is
  `vuln_finding.state_changed`)
- Lifecycle "Counts against SLA" column (no SLA enforcement in code)
- Daily tick described as four scans (it's three) with 60s timeout
  (it's 10 minutes — `scanLongRunningTimeout`)

Adds documentation for capabilities the doc had previously omitted:

- `vuln_finding.closed` event (fired by org-scope fingerprint reconciliation
  and by `reset_asset_findings`)
- `reset_asset_findings` action (used for reformat / reimage / decommission
  of a host)

Replaces the SLA-configuration best-practices section with guidance on
how to track remediation cadence externally given that the extension
does not enforce SLAs natively.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* docs(vuln): fix bulk-resolution example, output filter key, release-note drift

Three doc-vs-code mismatches surfaced after the previous align-with-code
pass:

- `bulk_set_finding_resolution` example showed a per-target `resolution`
  field. The real `FindingTarget` carries only scope + finding identifiers;
  `resolution` / `expires_at` / `case_number` are top-level on the request
  and apply to every target. The response example also flattened
  `results[].row` into the result object — restored the `row` wrapper so
  the shape matches `BulkSetFindingResolutionResult`.
- Slack output example used a non-existent `filter_event_type:` key. The
  Outputs system filters by event type via the standard `event_white_list`
  newline-separated whitelist (see stream-structures.md). Switched the
  example to use it and linked the reference.
- 2026-05-09 release note still listed "per-criticality SLA windows" and
  the `in_progress` lifecycle state. Both were removed earlier in this
  branch (no SLA enforcement in code; lifecycle collapsed to the
  3-resolution model). Updated the bullets to match what shipped.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* docs(vuln): add blank lines around fenced code blocks inside numbered lists

markdownlint MD031 flagged five fenced code blocks (one bash, one bash,
one bash, one json) that sit immediately under a numbered-list line
without a blank line. The list-item indentation was carried into the
fence but the blank-line buffer was missing, so the rule failed even
though the rendered output looked fine.

Inserts a blank line between the list item's prose line and the
following fence (and after each closing fence) so the rule is satisfied.
No content changes; verified locally with markdownlint-cli2 v0.20.0 (the
CI version) — 0 errors on this file after the edit.

The remaining check-markdown failures on the PR — MD028 in
docs/8-reference/edr-events.md:362 and :453 — are pre-existing on
master (master's own CI is currently failing on the same two lines) and
out of scope here.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* docs(edr-events): lift FILE_DELETE/FILE_MODIFIED examples out of blockquote

markdownlint MD028 was firing on the two `history_dump` examples inside
the FILE_DELETE and FILE_MODIFIED "Best Practices" blockquotes — the
indented fenced code block inside a list inside a blockquote was being
parsed as a separate blockquote, leaving a blank line between two
blockquote blocks. Master's own CI has been red on these two lines all
day.

Moving the example fence out of the blockquote (it still reads
naturally — the bullet ends with "ex." pointing at the example below)
satisfies the rule and keeps the rendered output identical. Tagging
the fix here so this PR's CI can go green; same edit would be welcome
on master.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* docs(edr-events): join Note + Be Aware into single blockquote (MD028)

After merging master into the branch, edr-events.md picked up the new
`> Note:` block that lives immediately before each `> Be Aware:` block
(FILE_DELETE and FILE_MODIFIED). The blank line separating the two
adjacent blockquotes is the MD028 trigger the lint check is failing on
— most parsers treat them as a single quote, but markdownlint considers
the bare blank line ambiguous.

Replaces the blank line with `>` so the two paragraphs share one
blockquote. Rendered output is unchanged; the Note paragraph and Be
Aware paragraph still read as two distinct sections separated by a
visual gap.

Verified locally: `markdownlint-cli2@0.20.0` (the CI version) reports 0
errors across all 308 files.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

to-code-review Used to tag PRs that are force-pushed and will need to be reviewed after the fact.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant