Skip to content

Releases

RCARS v1.5.17

Choose a tag to compare

@stencell stencell released this 04 Nov 15:11
9099f90

Content owners own their stubs' analysis, OSSPA empty-inventory retirement fix

Content owner model (RHDPCD-2238)

A pure stub is a published virtual CI that only points at a base component and overrides nothing. A stub keeps its catalog row, but it no longer has its own LLM analysis. Its analysis and embeddings belong to its content owner, the base component it points at.

  • Why: before this release, each stub was analyzed as if it were separate content. That made a duplicate Advisor card, a duplicate Browse summary, and one extra ~37k-token LLM call for each stub on each scan.
  • How ownership is found: RCARS reads the AgnosticV __meta__.components link that it already resolves (owner_ci_name in showroom_source_json). It no longer compares analysis signatures to decide this. Signature matching is still used for stage siblings only.
  • A CI with its own override (repo, ref, or content_path) at or below the stub is not a pure stub. It is still scanned on its own.

Scan

  • Scans skip pure stubs. The stale check skips them too.
  • Each scan entry point first reconciles stubs. For each stub, it:
    • merges any curator notes, durations, and review flags into the owner, then
    • deletes the stub's own analysis, embeddings, and overlap rows, then
    • copies the owner's card fields (summary, products, topics, audience, difficulty, scan status) onto the stub.
  • When an owner is scanned, its stubs get the new card in the same step.

Advisor

  • When the owner matches a query and it has exactly one eligible stub, the Advisor shows the stub card in its place, with the same score.
  • References to a CI by name, and scoped follow-up turns, look up a stub through its owner.

Browse

  • A stub's detail view shows its owner's analysis and a "Content from ..." link to the owner.
  • A stub's Stale and Needs Review badges show the owner's values. The difficulty filter finds stubs.
  • The Stale and Needs Review filters still match only the owner row. The owner is the item that needs the rescan.

Curation

  • Note, review flag, and duration edits on a stub are saved to the owner. Source overrides still apply to the CI you edit.
  • Reanalyze on a stub now analyzes its owner. Before, it made no LLM call.

OSSPA: confirmed empty inventory now retires (RHDPCD-74)

  • rcars osspa sync --confirm-empty-inventory and the admin API now retire the remaining architectures when the inventory is empty. Before, a database guard ignored the confirmation and retired nothing.
  • An empty inventory with no confirmation is still refused.
  • The API test suite is repaired: 45 failures and 12 setup errors are fixed.

Deploy

  • Full deploy (--tags full). The API and the frontend both changed.
  • No schema change. No new Ansible vars.
  • Expect this after the deploy: the first scan reconciles about 88 pure stubs in prod. It deletes their own analysis and embeddings and copies the owner card onto each one. It makes no LLM calls. No prod stub has curator data today, so no curator work is lost. Dev was reconciled and checked on 2026-11-04.

2 PRs · #200 · #201

Jira: RHDPCD-2238 · RHDPCD-74

Full diff: v1.5.16...v1.5.17

RCARS v1.5.16

Choose a tag to compare

@stencell stencell released this 04 Nov 08:51
d743eec

Claude 5.5 on LiteMaaS, Jira OAuth2, per-call LLM logging, Antora start paths

LLM models: Claude 5.5, LiteMaaS only

  • New defaults:
    • claude-sonnet-5-5-a46b for Showroom analysis, rationale, chat answers and OSSPA analysis.
    • claude-haiku-5-5-a8b for triage, chat routing, overlap and workload scans.
  • LiteMaaS is the only provider. The Vertex/Anthropic fallback is removed. Direct Vertex access no longer works. If a model is not on LiteMaaS, the call fails with a clear error. It does not fall back.
  • The anthropic[vertex] dependency is removed.
  • Temperature: Claude 5.5 on LiteMaaS rejects temperature. RCARS leaves it out for these models. For any other model that rejects it, RCARS retries once without it and remembers that model.
  • Status page: the LLM Provider card shows the active provider (LiteMaaS), its models, and one row for each LLM use.

Every LLM call is logged with its model

  • Each LLM call writes one log line:
    • llm_call_complete (info): model, provider, input_tokens, output_tokens, elapsed_ms
    • llm_call_failed (warning): model, provider, elapsed_ms, error
  • This covers chat routing, triage, rationale, synthesis and scans. Before this release, only synthesis logged its model.
  • Known gap: these lines do not carry job_id yet. The PR text for #199 says they do, but that is wrong. Tracked in RHDPCD-2229.

Jira: OAuth2 client credentials

  • Retirement ticketing now uses an OAuth2 service account (rhdp-automation-jira-sa) instead of a personal API token. The token expired often and had to be rotated by hand.
  • Calls go to api.atlassian.com/ex/jira/{cloud_id} with a Bearer token. A token is fetched only when a Jira call needs one, and is reused until 60 seconds before it expires.
  • The retirement sweep and the nightly Jira step run when OAuth2 is configured.

Showroom: Antora start paths in content_path

  • content_path can now be an Antora start path, such as documentation. If <content_path>/modules/ROOT/pages exists, the scanner reads pages from there and finds nav.adoc one level up. This matches how the default content path already works.
  • Existing overrides that point straight at a pages folder, such as docs/labs/, still work.
  • nav.adoc parsing now skips AsciiDoc block comments (////). Before, xrefs inside a block comment counted as active pages.
  • Before this fix, Showrooms with a start path other than content failed with no_content.

Deploy

  • Full deploy (--tags full). The API and the frontend both changed.
  • No schema change.
  • Ansible vars, set before you deploy:
    • rcars_jira_client_id, rcars_jira_client_secret, rcars_jira_cloud_id. The old rcars_jira_api_email and rcars_jira_api_token are no longer used.
    • Vertex vars (vertex_enabled, vertex_region, vertex_credentials_path) are no longer read. You can remove them.
    • See ansible/vars/prod.yml.example.
  • Clean up after the deploy. Ansible does not delete secrets that the templates no longer create. When Jira works on the new release, delete these:
    • rcars-jira (old Jira API token)
    • rcars-vertex-credentials (if present)

4 PRs · #195 · #196 · #198 · #199

Jira: RHDPCD-2226 · RHDPCD-2227 · RHDPCD-74

Full diff: v1.5.15...v1.5.16

RCARS v1.5.15

Choose a tag to compare

@stencell stencell released this 28 Oct 13:30
b9cd86f

Platform and TDP filters, collapsible sidebar, counts that follow your filters

Platform and Technical Decision Point filters

  • New filters: Platform and Technical Decision Point (TDP), read from the Babylon CatalogItem labels.
  • Pages: Performance, Non-Prod Items and Browse.
  • None finds items with no label.
  • Retirement does not get these filters. Its rows were retired before labels existed, and there is no backfill.

Collapsible sidebar

  • Every filter group folds behind its title, except the top group on each page.
  • A group opens by itself when it has an active filter. Its header shows how many filters are active.
  • Browse order: Content Type, Stage, Platform, TDP, Audience & Difficulty, Architectures (renamed from "Architecture Filters"), Hands-on Labs, Curator Tools.
  • The dev/event toggles moved from the top bar into the Stage group. Only curators see it.

Counts follow your filters

  • Every count shows how many items you get with the other active filters applied. Example: check Namespace agd-v2 (21 items), and the Platform counts stay inside those 21.
  • Browse now shows Platform and TDP counts.
  • Performance: the band buttons and the stat cards follow the filters too.
  • Retirement: the Status counts follow Namespace, and Namespace counts follow Status.
  • A checked option that drops to 0 stays visible, so you can uncheck it.

Performance access

  • Regular users see the score bands, Metrics, Platform and TDP.
  • Namespace and Retirement (the filter and the row badge) are for curators and admins only. Status stays admin-only.
  • Hidden filters never apply, even from a shared URL.

Fixes

  • Browse ignores responses from older requests, so quick filter changes cannot show stale results.

Deploy

  • Full deploy (--tags full). The API and the frontend both changed.
  • Schema: babylon_items gets platform, tdp1 and tdp2 columns. rcars init-db adds them on deploy.
  • Labels fill in on the next catalog refresh. Until then, most items show under None. The nightly run does this, or start a refresh from the Sync page.

1 PR · #193

Full diff: v1.5.14...v1.5.15

RCARS v1.5.14

Choose a tag to compare

@stencell stencell released this 27 Oct 10:25
2913539

Retirement matches Non-Prod, 3/6/9/12 month windows, fixed 9-month drawer

Retirement report looks like Non-Prod Items

  • Columns: Name, Type, Stages, Status, Scheduled, User Provisions, User Experiences, Unique Users, Total Provisions, First Prov, Last Prov. Every column sorts. Empty values stay at the bottom in both directions.
  • Expanded row: Jira, environments (links to Browse), success and failure rates, requested by, approved by, actual retired date and replacement.
  • Total Provisions includes RHDP staff. Only the non-prod sync counts it, so prod items show a dash.

3, 6, 9 and 12 month windows

  • Non-Prod Items and Retirement now offer 3, 6, 9 and 12 months, the same as Performance.
  • Retirement starts on 9 months, the same as the retirement drawer. A caption says the window only changes the usage columns. It never hides rows.
  • If an item has no data for the chosen window, it shows zero. It no longer shows 12-month numbers under a shorter label.

Retirement drawer

  • The header shows the item name. It no longer hides under the page masthead.
  • Usage always shows the last 9 months of sales-channel data, whichever page opened the drawer. Items with no Performance row use their non-prod usage.
  • If 9-month data is missing, the drawer and the owner email label the numbers with the period they really cover.

Performance

  • The environments list no longer shows the catalog badge.

Dependencies

  • vite 8.0.16 → 8.3.5 (#178)
  • vitest and @vitest/mocker (#182)
  • certifi 2026.7.22 → 2026.10.19 (#181)

Deploy

  • Full deploy (--tags full). The API and the frontend both changed. No schema change.
  • Non-prod items show zero for 3 and 9 months until the next reporting sync fills in those windows. The nightly run does this. No UI button starts this sync, so to run it sooner, enqueue run_reporting_sync_job from the API pod.

4 PRs · #178, #181, #182, #192

Full diff: v1.5.13...v1.5.14

🤖 Generated with Claude Code

RCARS v1.5.13

Choose a tag to compare

@stencell stencell released this 26 Oct 15:23
a7345a1

Finished retirements leave Non-Prod, every column sorts, badges open Browse

Finished retirements leave Non-Prod Items

An item whose retirement workflow had finished stayed in Non-Prod Items with no badge until the next Babylon catalog rescan. It looked like it was never retired.

  • Non-Prod Items now hides an item when any of its stages has a finished retirement workflow. It still shows in the Retirement view.
  • Recommended and in-progress items stay listed with their badge.

Every table column sorts

  • Non-Prod Items: Type, Stages, User Experiences, First Prov and Last Prov.
  • Performance: the Data column, ordered by channel count.
  • Retirement: Status and Type.
  • Rows with an empty value stay at the bottom in both directions.

Environment badges open the RCARS Browse page

On the analysis pages, the environment badges (dev, event, prod) did not work the same way. Retirement showed them as plain text. Non-Prod opened the RHDP catalog. Performance opened Browse, but dev and event items did not show up because the stage toggle was off.

  • Badges on Retirement, Performance, the Performance workflow drawer, and the Non-Prod Items environment table now open RCARS Browse in a new tab.
  • The link turns on the matching stage toggle, so dev and event items show up in the results. Example: a dev badge opens /browse?search=<name>&stage=dev.
  • From Browse, users can follow the RHDP catalog link or the Showroom repo link.

Who sees links:

  • prod badges are links for everyone.
  • dev and event badges are links for curators and admins only. Browse hides those stages from other users.
  • test badges stay plain text. Browse has no test stage, and RCARS does not scan test items.
  • The Non-Prod table row badges stay plain text. A click on the row expands it.
  • The Performance "catalog" badge still opens the RHDP catalog. It shows only for items without RCARS content.

Deploy

  • Full deploy (--tags full). The Non-Prod filter and sorting need the API. The badges and headers need the frontend. No schema change.

2 PRs · #190, #191

Full diff: v1.5.12...main

🤖 Generated with Claude Code

RCARS v1.5.12

Choose a tag to compare

@stencell stencell released this 23 Oct 16:09
2d39d95

Retired items leave Non-Prod Items right after a catalog refresh

When an item left Babylon, a catalog refresh marked it retired, but it stayed in Non-Prod Items until the next reporting sync. That could take up to a day. Example: after LB2860 and LB2865 stages were removed from Babylon and the catalog was refreshed, 7 retired stages still showed.

Non-Prod Items

  • An item is hidden as soon as a catalog refresh retires all of its stages.
  • If one stage is retired but a sibling stage is still active, the item stays listed. The next reporting sync moves its usage row to the active stage, as before.
  • The reporting sync still removes the old usage rows, as before.
  • Performance already worked this way.

Deploy

  • API only (--tags api). No reporting sync and no schema change.

1 PR · #189

Full diff: v1.5.11...v1.5.12

🤖 Generated with Claude Code

RCARS v1.5.11

Choose a tag to compare

@stencell stencell released this 23 Oct 16:09
305bf0d

Visible retirement badges on long names, and a cleaner retirement PR footer

Three small fixes.

Retirement badges

  • Non-Prod Items and Performance: the retirement badge (and the muted badge) now always shows. Before, a long item name pushed the badge past the cell edge, so it was cut off. Example: LB2391 (Self-Service) had a retirement in progress but showed no badge.
  • Only the name is cut off now, and it ends in "…".
  • Browse was not affected.

Retirement PRs in AgnosticV

  • The notice, disable, and removal PRs that RCARS opens now end with Generated by RCARS agv-retire integration. The footer no longer names the Jira issue that built the feature.

Local development

  • ./dev-services.sh db-pull works on macOS again. BSD mktemp failed on the old temp file name.

Deploy

  • API and frontend (--tags api, then --tags frontend). No reporting sync and no schema change.

1 PR · #188

Full diff: v1.5.10...v1.5.11

🤖 Generated with Claude Code

RCARS v1.5.10

Choose a tag to compare

@stencell stencell released this 23 Oct 12:36
16d4d8c

Retirement status on every stage, and retirement Jiras under the epic

A retirement is started from one stage of a CI. Before, only that stage showed the retirement. Now every stage of the CI (.dev, .event, .prod) shows it.

New retirement Jira tickets now go under the retirement epic and start In Progress.

Retirement status on all stages

  • Browse: sibling stages now show RETIREMENT RECOMMENDED or RETIRING <date>. Example: all LB2596 stages show RETIRING NOV 22, not only the stage the retirement was started from.
  • This is a read-time join by stage family. It does not create or copy workflow rows. Workflows that are not approved yet are still ignored.

Catalog API

  • GET /api/v1/catalog: each item has a new retirement_label field.
  • GET /api/v1/catalog/{identifier}: now returns workflow_status, retirement_target_date, and retirement_label.
  • retirement_label is recommended, in_progress, retired, or null.

Retirement Jira tickets

  • New tickets get the retirement epic RHDPCD-2191 as parent. Tickets filed in another project (for example GPTEINFRA) get no parent.
  • New tickets move to In Progress right after creation. If the transition fails, the start still succeeds, and the failure is logged.
  • New setting RCARS_JIRA_RETIREMENT_PARENT (default RHDPCD-2191). Set it to empty to turn off the parent.
  • Start Retirement now takes a lock per item. Two starts at the same time can no longer create two Jira tickets. The second start gets HTTP 409.

Deploy

  • API only (--tags api). No reporting sync and no backfill are needed.

2 PRs · #186 · #187

Full diff: v1.5.9...v1.5.10

🤖 Generated with Claude Code

RCARS v1.5.9

Choose a tag to compare

@stencell stencell released this 23 Oct 10:40
16ad999

Accurate Non-Prod usage and visible retirement status

Non-Prod Items now counts usage the same way as Superset and Performance. Before, it counted RHDP staff and Poolboy pool accounts as users. Example: LB2596 Quarkus on OpenShift (Tenant) showed 704 provisions. Superset showed 106. RCARS now shows 106.

Retirement status is now visible outside the Retirement view.

Non-Prod Items

  • New columns, in this order: User Provisions, User Experiences, Unique Users, Total Provisions. Header tooltips explain each column.
    • User columns count only users outside RHDP (Only Regular Users, Red Hat Console). This matches Superset and Performance.
    • Total Provisions counts every provision except unclaimed Poolboy pool instances. It includes RHDP staff.
  • Per-environment breakdown (dev/event) in the expanded row is now filled in. It uses the same column order.
  • First/last provision dates span the Total population, so a lab used only at RHDP-run events still shows recent use.

Retirement status

  • Non-Prod Items and Performance: a badge next to the name (recommended / in progress · <date>), and a Retirement sidebar filter (All / Hide / Only). The default is All.
  • Browse: all users see RETIREMENT RECOMMENDED or RETIRING <date>.
  • Retirement view: a new sortable Scheduled column. Items without a date sort last. Success rate and first/last provision moved into the expanded row.

Schema

  • After deploy, run a reporting sync to fill total_provisions and the per-environment breakdown:
    rcars reporting-db sync

2 PRs · #184 · #185

Full diff: v1.5.8...v1.5.9

🤖 Generated with Claude Code

RCARS v1.5.8

Choose a tag to compare

@stencell stencell released this 23 Oct 08:31
815558b

Retire base components from Browse

Curators can now start the retirement workflow from Browse. This covers base components that sit under a published (virtual) CI. The Performance view merges their usage into the published CI and the Non-Prod view excludes them, so they had no retirement entry point before.

UI

  • Browse: curators and admins see a Retire button next to Edit on expanded lab cards. It opens the same retirement drawer as Performance and Non-Prod Items. Architecture cards do not get the button.
  • Retirement drawer: it now opens for items without performance data. It shows a "No performance data" note instead of the usage grid. The owner email omits the key metrics block when there are no metrics.
  • System → Recent Jobs: queued analyze jobs show their CI name. Running jobs are listed first, so a large queued backlog no longer hides them.

Scan efficiency

  • Sibling stages of one item (.dev, .event, .prod) that share a Showroom now queue behind one leader (prod preferred). The siblings reuse the leader's analysis instead of making their own LLM calls. On the first v1.5.7 prod rescan, 223 of 763 analyses could have been reused this way.
  • A per-source Postgres advisory lock holds siblings until the leader persists. The wait is capped at 300s, after which the scan proceeds and logs showroom_reuse_lock_timeout. Forced rescans (rescan-all) still skip reuse.
  • The leader-first ordering applies to the nightly Babylon pipeline, POST /analysis/scan, and rcars scan.

3 PRs · #179 · #180 · #183

Full diff: v1.5.7...v1.5.8

🤖 Generated with Claude Code