Repository navigation
Releases
RCARS v1.5.17
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__.componentslink that it already resolves (owner_ci_nameinshowroom_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-inventoryand 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.
Jira: RHDPCD-2238 · RHDPCD-74
Full diff: v1.5.16...v1.5.17
RCARS v1.5.16
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-a46bfor Showroom analysis, rationale, chat answers and OSSPA analysis.claude-haiku-5-5-a8bfor 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_msllm_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_idyet. 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_pathcan now be an Antora start path, such asdocumentation. If<content_path>/modules/ROOT/pagesexists, the scanner reads pages from there and findsnav.adocone level up. This matches how the defaultcontentpath already works.- Existing overrides that point straight at a pages folder, such as
docs/labs/, still work. nav.adocparsing 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
contentfailed withno_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 oldrcars_jira_api_emailandrcars_jira_api_tokenare 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
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_itemsgetsplatform,tdp1andtdp2columns.rcars init-dbadds 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
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
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_jobfrom 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
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.
Full diff: v1.5.12...main
🤖 Generated with Claude Code
RCARS v1.5.12
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
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-pullworks on macOS again. BSDmktempfailed 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
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 RECOMMENDEDorRETIRING <date>. Example: all LB2596 stages showRETIRING 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 newretirement_labelfield.GET /api/v1/catalog/{identifier}: now returnsworkflow_status,retirement_target_date, andretirement_label.retirement_labelisrecommended,in_progress,retired, ornull.
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(defaultRHDPCD-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.
Full diff: v1.5.9...v1.5.10
🤖 Generated with Claude Code
RCARS v1.5.9
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
Poolboypool instances. It includes RHDP staff.
- User columns count only users outside RHDP (
- 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 RECOMMENDEDorRETIRING <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_provisionsand the per-environment breakdown:
rcars reporting-db sync
Full diff: v1.5.8...v1.5.9
🤖 Generated with Claude Code
RCARS v1.5.8
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, andrcars scan.
Full diff: v1.5.7...v1.5.8
🤖 Generated with Claude Code