Skip to content

Release: 2026-03-04#203

Merged
jeff-matthews merged 6 commits intomainfrom
release/v8.7.0
Mar 4, 2026
Merged

Release: 2026-03-04#203
jeff-matthews merged 6 commits intomainfrom
release/v8.7.0

Conversation

@jeff-matthews
Copy link
Contributor

@jeff-matthews jeff-matthews commented Feb 26, 2026

Purpose

This pull request (PR) publishes docs for the March 4, 2026 release across the following versions:

  • BloodHound v8.7.0
  • SharpHound v2.10.0
  • AzureHound v2.10.0

Note

Confirm the release date before merging!

This includes individual PRs that have been reviewed and approved separately:

Staging

https://specterops-release-v8-7-0.mintlify.app/home

Summary by CodeRabbit

  • New Features

    • Table column resizing via drag or double-click for auto-size.
    • Meta node information now displayed in Entity Panel.
    • Improved edge information presentation.
    • Enhanced graph speed and responsiveness.
    • Explore improvements.
  • Bug Fixes

    • Resolved issues in Findings, Zone Builder, and Explore.
  • Documentation

    • Added comprehensive guides for Meta nodes and analysis request endpoints.
    • Updated table layout documentation with clearer action descriptions.

jeff-matthews and others added 4 commits February 20, 2026 16:18
…182)

* docs: initial restructuring

* wip: initial draft of IWA for sharphound

* wip: IWA edits

* wip: edits for IWA requirements

* wip: edits for create collector client

* refactor: create snippet for scan options and delete redundant page

* wip: edits for adfs config

* wip: edits for switching collector client auth

* docs: apply suggestions from CR review

* docs: apply suggestions from tech review
* docs: add Meta node information BED-4760

* fix: Three > Two; rabbit feedback

* fix: update docs json for sidebar vis

* docs: detail and link traversable edges for meta node
@jeff-matthews jeff-matthews self-assigned this Feb 26, 2026
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 26, 2026

Walkthrough

Documentation updates across multiple areas including table layout guidance, new API endpoint specification for analysis requests, Meta node documentation, release notes for versions 8.7.0/2.10.0, and updates to navigation structure and API schema validation rules.

Changes

Cohort / File(s) Summary
Table Layout Documentation
docs/analyze-data/explore/search.mdx
Restructured Table layout guidance: replaced CSV export callout with expanded options section; reworded column management instructions from "Click Columns" to drag/double-click resizing patterns.
API Specification
docs/openapi.json
Added new GET /api/v2/analysis endpoint returning analysis request metadata; updated Prefer header validation pattern to accept wait=-1; expanded schema to allow object type in unified-graph property literals; added OpenGraph to tag groups.
Datapipe Documentation
docs/reference/datapipe/gets-analysis-request-information.mdx, docs/reference/datapipe/cancels-an-analysis-request.mdx
New documentation files for GET and DELETE analysis operations with OpenAPI directives and enterprise/community edition badges.
Node Resources and Navigation
docs/resources/nodes/meta.mdx, docs/docs.json
Added new Meta node documentation describing properties and edge linkage; updated docs.json structure with meta node reference and reorganized release notes into Archive 2026 sub-group.
Release Notes
docs/resources/release-notes/2026-03-04.mdx, docs/resources/release-notes/summary.mdx
Added comprehensive v8.7.0/2.10.0 release notes covering table column resizing, Meta node information display, edge information improvements, performance enhancements, and bug fixes; expanded summary page with structured multi-section format.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Poem

🐰 Tables now resize with grace so bright,
Meta nodes emerge in documentation light,
New endpoints spring forth for analysis calls,
Release notes cascade through marble halls—
A rabbit's delight in each crafted word! ✨

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'Release: 2026-03-04' directly matches the PR's primary objective to publish documentation for the March 4, 2026 release, clearly summarizing the main purpose of the changeset.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch release/v8.7.0

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

* wip: added stub files for march release

* wip: added v8.7.0 release notes

* wip: added v8.7.0 release summary

* style: replace badges w/ logo image

* docs: added additional enhancements and fixed issues

* docs: refresh announcements

* docs: bump v8.7.0 release date

* fix: links to release notes
@jeff-matthews jeff-matthews changed the title Release: 2026-03-02 Release: 2026-03-04 Mar 4, 2026
@jeff-matthews jeff-matthews marked this pull request as ready for review March 4, 2026 20:55
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (2)
docs/openapi.json (2)

13719-13719: Clarify DELETE description text.

Line [13719] is hard to parse; simpler phrasing improves API docs readability.

✏️ Suggested wording
-        "description": "Flags the API to request the cancellation of analyzing ingest data.",
+        "description": "Requests cancellation of the current ingest-data analysis.",
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/openapi.json` at line 13719, Update the ambiguous DELETE operation
description string "Flags the API to request the cancellation of analyzing
ingest data." to a clearer, simpler sentence; locate the JSON "description"
value that currently contains that exact text and replace it with a concise
alternative such as "Requests cancellation of ongoing ingest data analysis." so
the API docs are easier to read and unambiguous.

13634-13634: Use retrieval wording for the GET description.

Line [13634] implies mutation (“Flags the API”), which is confusing for a GET endpoint.

✏️ Suggested wording
-        "description": "Flags the API to request the information of an analysis request.",
+        "description": "Retrieves information about the current analysis request.",
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/openapi.json` at line 13634, The GET operation's description string
currently reads as a mutation ("Flags the API to request the information of an
analysis request."); update the "description" value for that GET endpoint to use
retrieval wording (e.g., "Retrieves information for an analysis request" or
similar) so it clearly communicates a read-only operation; locate and replace
the JSON "description" property for that GET operation in openapi.json (the
string shown in the diff) with the new retrieval-focused text.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@docs/openapi.json`:
- Around line 21046-21049: The top-level "type": "object" on the "value"
property conflicts with the following anyOf branches (which are
primitives/array); remove the top-level "type": "object" constraint and instead
place an object branch as the first entry inside the existing anyOf (e.g., add {
"type": "object", ... } as the first anyOf element), so that "value" is valid if
it matches any branch rather than being forced to be an object and a primitive
simultaneously.

---

Nitpick comments:
In `@docs/openapi.json`:
- Line 13719: Update the ambiguous DELETE operation description string "Flags
the API to request the cancellation of analyzing ingest data." to a clearer,
simpler sentence; locate the JSON "description" value that currently contains
that exact text and replace it with a concise alternative such as "Requests
cancellation of ongoing ingest data analysis." so the API docs are easier to
read and unambiguous.
- Line 13634: The GET operation's description string currently reads as a
mutation ("Flags the API to request the information of an analysis request.");
update the "description" value for that GET endpoint to use retrieval wording
(e.g., "Retrieves information for an analysis request" or similar) so it clearly
communicates a read-only operation; locate and replace the JSON "description"
property for that GET operation in openapi.json (the string shown in the diff)
with the new retrieval-focused text.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 58cff14f-b1aa-4948-b6ac-7077a1fe4c23

📥 Commits

Reviewing files that changed from the base of the PR and between f82ea7a and 39ae225.

⛔ Files ignored due to path filters (3)
  • docs/images/release_notes/8_7_0/meta-nodes.png is excluded by !**/*.png
  • docs/images/release_notes/8_7_0/resize-columns.gif is excluded by !**/*.gif
  • docs/images/release_notes/8_7_0/zone-membership.gif is excluded by !**/*.gif
📒 Files selected for processing (8)
  • docs/analyze-data/explore/search.mdx
  • docs/docs.json
  • docs/openapi.json
  • docs/reference/datapipe/cancels-an-analysis-request.mdx
  • docs/reference/datapipe/gets-analysis-request-information.mdx
  • docs/resources/nodes/meta.mdx
  • docs/resources/release-notes/2026-03-04.mdx
  • docs/resources/release-notes/summary.mdx

Comment on lines +21046 to 21049
"type": "object",
"nullable": true,
"anyOf": [
{
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

# Check if the file exists and get line count
if [ -f docs/openapi.json ]; then
  wc -l docs/openapi.json
  # Show the relevant lines
  sed -n '21040,21060p' docs/openapi.json
else
  echo "File not found"
fi

Repository: SpecterOps/bloodhound-docs

Length of output: 698


🏁 Script executed:

#!/bin/bash
# Verify schemas where top-level "type":"object" is combined with anyOf containing non-object types.
python3 - <<'PY'
import json
from pathlib import Path

p = Path("docs/openapi.json")
doc = json.loads(p.read_text())

issues = []

def walk(node, path="$"):
    if isinstance(node, dict):
        if node.get("type") == "object" and isinstance(node.get("anyOf"), list):
            anyof_types = sorted({
                s.get("type")
                for s in node["anyOf"]
                if isinstance(s, dict) and "type" in s
            })
            non_object = [t for t in anyof_types if t not in (None, "object")]
            if non_object:
                issues.append((path, anyof_types, non_object))
        for k, v in node.items():
            walk(v, f"{path}.{k}")
    elif isinstance(node, list):
        for i, v in enumerate(node):
            walk(v, f"{path}[{i}]")

walk(doc)

if not issues:
    print("No conflicting schemas found.")
else:
    print(f"Found {len(issues)} potentially conflicting schema(s):")
    for path, all_types, non_obj_types in issues:
        print(f"\nPath: {path}")
        print(f"  anyOf contains types: {all_types}")
        print(f"  Non-object types: {non_obj_types}")
PY

Repository: SpecterOps/bloodhound-docs

Length of output: 361


Remove top-level type: "object" to resolve conflicting schema constraint.

The value property at line 21046 has "type": "object" combined with anyOf containing primitive types (string, number, boolean, array). In JSON Schema, both constraints apply simultaneously, making the schema logically impossible to satisfy—an instance cannot be both an object and a primitive type.

Move the object type into the anyOf branches as the first option:

Fix
                 "value": {
-                  "type": "object",
                   "nullable": true,
                   "anyOf": [
+                    { "type": "object" },
                     { "type": "string" },
                     { "type": "number" },
                     { "type": "boolean" },
                     { "type": "array" }
                   ]
                 }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"type": "object",
"nullable": true,
"anyOf": [
{
"value": {
"nullable": true,
"anyOf": [
{ "type": "object" },
{ "type": "string" },
{ "type": "number" },
{ "type": "boolean" },
{ "type": "array" }
]
}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/openapi.json` around lines 21046 - 21049, The top-level "type": "object"
on the "value" property conflicts with the following anyOf branches (which are
primitives/array); remove the top-level "type": "object" constraint and instead
place an object branch as the first entry inside the existing anyOf (e.g., add {
"type": "object", ... } as the first anyOf element), so that "value" is valid if
it matches any branch rather than being forced to be an object and a primitive
simultaneously.

@jeff-matthews jeff-matthews merged commit d43da22 into main Mar 4, 2026
3 checks passed
@jeff-matthews jeff-matthews deleted the release/v8.7.0 branch March 4, 2026 21:02
@github-actions github-actions bot locked and limited conversation to collaborators Mar 4, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants