Skip to content

feat(rhdh-release): consume RHIDP Operational Rich Filter export - #68

Merged
durandom merged 7 commits into
redhat-developer:mainfrom
durandom:feat/rich-filter-integration
Jul 17, 2026
Merged

feat(rhdh-release): consume RHIDP Operational Rich Filter export#68
durandom merged 7 commits into
redhat-developer:mainfrom
durandom:feat/rich-filter-integration

Conversation

@durandom

@durandom durandom commented Jul 14, 2026

Copy link
Copy Markdown
Member

Why

The release skill duplicated operational Jira logic in local Markdown JQL. That logic drifted from the RHIDP Operational Rich Filter used by release managers. This PR makes the exported Rich Filter the runtime source of truth wherever it has an authoritative equivalent, while keeping release versions dynamic and preserving clearly documented local queries where no equivalent exists.

What changed

Rich Filter integration

  • discover the private-data repository through shared RHDH configuration, with RHDH_RICH_FILTER_PATH as an explicit override
  • parse and validate the complete exported base filter, static filters, smart-filter clauses, rich queues, time series, custom ratios, dynamic fields, and Rich Views
  • compose exported JQL with release/team scope using parentheses around the base filter and exported OR expressions
  • fail with actionable diagnostics when a required named release filter or queue is renamed or missing; no copied-JQL fallback is used

First-class release mappings

The release CLI now sources these behaviors from the export:

  • Feature Freeze and Code Freeze, including Cloud ID-scoped team variants
  • Post Code Freeze
  • feature demos and Test Day
  • Scrum Team Cloud IDs
  • release-note lifecycle: unclassified, proposed, done, and text present
  • complete operational base scope (excluding only ORDER BY)

The CLI retains local JQL for active-release discovery, generic open-work counts, blockers, EPICs, CVEs, feature subtasks, and recently added features because the export has no semantically equivalent named entry. The rationale is documented in references/rich-filter-coverage.md.

New CLI behavior

python scripts/release.py --json check
python scripts/release.py --json notes 2.1.0
python scripts/release.py --json post-freeze 2.1.0
python scripts/release.py --json rich-filter inventory
python scripts/release.py --json rich-filter query static demo --version 2.1.0 --count
python scripts/release.py --json rich-filter query smart AI --group "Scrum Team" --version 2.1.0 --count
python scripts/release.py --json rich-filter query queue "RNs Proposed" --version 2.1.0 --count
python scripts/release.py --json rich-filter query time-series "Last week" --version 2.1.0 --count
python scripts/release.py --json rich-filter query ratio-numerator "1.10 Plan to Commit" --count

rich-filter inventory exposes all query-bearing entries and reports dynamic field/Rich View metadata without treating presentation configuration as executable JQL.

Robustness and performance fixes

  • check validates the required Rich Filter contract
  • an absent .jira-token remains visible as an optional warning but no longer makes all_pass false when Jira connectivity succeeds
  • missing gog, authentication, Rich Filter data, or required contract entries remain actionable warnings/failures
  • milestone dates parse Jira ADF date nodes, timestamps, and legacy plain text
  • EPIC reporting uses the fields already present in one acli --json search instead of making one enrichment request per issue
  • workflow docs no longer recommend stale hardcoded fallback JQL for Rich Filter-owned behavior

Intentional behavior change

The exported operational filters are broader than the old demo/Test Day templates. A live comparison for 2.1.0 on 2026-07-15 showed:

Query Old local JQL Rich Filter composition
Feature demos 31 34
Test Day 27 52

These differences are expected: the export is now authoritative rather than preserving the narrower RHDHPlan/RHIDP + Feature + open scope.

Battle-test results

Tested end-to-end against live Jira, Google Sheets/Docs, and the configured private-data export:

  • all 15 routed release workflows complete successfully
  • all 20 composed release templates parse in live Jira for 2.1.0
  • all four freeze Slack commands generate complete messages with live dates, counts, Jira links, team Cloud IDs, leads, and release-note data
  • dates and future schedule agree for the 2.1.0 milestones
  • static, smart, queue, time-series, ratio-numerator, and ratio-denominator queries execute successfully
  • inventory reads 24 static filters, 23 smart-filter groups / 93 clauses, 4 queues, 16 dynamic fields, 19 views, 5 time series, and 6 ratios
  • the 382-issue EPIC workflow now completes with one Jira search in about 11 seconds instead of hundreds of enrichment calls
  • check returns all_pass: true with the optional token warning preserved and no misleading setup steps

Test plan

  • uv run pytest — 393 passed
  • uv run ruff check .
  • uv run ruff format --check .
  • complete, partial/renamed, and absent export fixtures
  • optional-warning readiness regression test
  • regression test proving EPIC reporting does not call enrichment
  • live Jira syntax/count checks for every release template and every exported query kind
  • all 15 routed workflows exercised with live data

…JSON

Replace hardcoded Feature Freeze, Code Freeze, and Release Notes JQL
templates with queries parsed at runtime from the Jira Rich Filter
export ("RHIDP Operational"). The Rich Filter is the operational source
of truth managed by Matt Reid and Jasper Chui — sourcing from it
eliminates drift between the skill and the live Jira configuration.

- Add rich_filter.py parser for the Rich Filter JSON structure
- Extend jql.py to compose templates from Rich Filter (no fallback)
- Register rhdh-skill-private-data repo in rhdh router config
- Add Rich Filter status to release.py check command
- Remove 5 JQL templates from jql-release.md (now Rich Filter-only)
- Add 30 new tests covering parser, integration, and no-filter behavior

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@durandom
durandom marked this pull request as draft July 14, 2026 13:27
durandom and others added 4 commits July 14, 2026 15:40
…stem

Replace rich_filter.py's custom _candidate_paths() discovery with
rhdh.config.get_repo("private-data"), the same config system all other
skills use. The repo is just another RHDH repo people clone wherever
they want — fix descriptions that incorrectly called it "internal" or
"private".

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove sys.path manipulation from rich_filter.py — defer to rhdh
config system via try/except ImportError instead of hardcoding sibling
paths. Remove hardcoded relative directory references from config.md
and private-data.md setup instructions.

Restore the 5 JQL template sections removed from jql-release.md
(release_notes, feature_freeze_issues, code_freeze_issues, and their
_by_team variants) — keeping descriptions, placeholder docs, and
source annotations while the actual JQL comes from Rich Filter.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@durandom durandom changed the title feat(rhdh-release): source freeze/release-notes JQL from Rich Filter feat(rhdh-release): consume RHIDP Operational Rich Filter export Jul 15, 2026
@durandom
durandom marked this pull request as ready for review July 15, 2026 20:58
@durandom
durandom merged commit b1e537a into redhat-developer:main Jul 17, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant