resmon Update 1 — April 24, 2026
Update 1 — Config-Deletion Propagation Fix & Query Keyword Transparency
Metadata
- Update number: 1
- Update type: mixed (bugfix + feature)
- Date: 2026-04-24
- Author: Ryan Kamp
- Commit hash: 707c07221f607297a7a919bd3f4d527a968832c8
- Commit timestamp: 2026-04-25T03:01:35-04:00
- GitHub push timestamp: 2026-04-25T07:01:45Z
Summary
This update ships the first post-release change set for resmon. It fixes a frontend cache-staleness bug where deleted manual_dive / manual_sweep configurations continued to appear in the Deep Dive and Deep Sweep Load Configuration dropdowns, and it introduces a “Query Keyword Transparency” feature that surfaces, on every page where a user picks repositories, exactly how each repository’s upstream API combines space-separated keywords. The feature also adds a consolidated, grouped, color-coded glossary on the Repositories & API Keys page and per-repository keyword-combination metadata in the catalog and on .ai/prep/repos.csv. Per-repository research replaces the previously lumped row for SSRN, RePEc, PLOS, DBLP, and IEEE Xplore (SSRN and RePEc are not in the active catalog and were therefore not added; PLOS, DBLP, and IEEE were classified individually).
Motivation
Both items in this update originated in the user’s first-after-release feedback session and map back to the change inventory in .ai/updates/update_4_24_26/update_4_24_26_workflow.md:
- Bug — Improper Config Deletion (workflow item #1, batch 1). After deleting a
manual_diveormanual_sweepconfiguration from the Configurations page, the deleted entry was still selectable in theLoad Configurationdropdown on the Deep Dive and Deep Sweep pages and could still auto-populate the form. The Routines page was unaffected. Root cause: the sharedConfigLoaderonly refetched on itsconfigType/refreshKeyprops, neither of which changed when a deletion happened on a different page; there was no cross-page invalidation channel. - Feature — Query Keyword Transparency (workflow item #2, batch 2). Users had no in-app indication of how each repository’s upstream API combines keywords (some are implicit AND, some are implicit OR, several are relevance-ranked Lucene/Solr backends). The user requested per-repo banners on Deep Dive, Deep Sweep, and Routines, an enriched expander plus a glossary on the Repositories & API Keys page, the same metadata in
.ai/prep/repos.csv, and individual research for the lumped row in.ai/prep/keyword_booleans_overview.md.
Changes
Batch 1 — Improper Config Deletion (cluster, shared root cause)
resmon_scripts/frontend/src/lib/configurationsBus.ts(new, 33 lines) — tiny in-renderer pub/sub bus withnotifyConfigurationsChanged()anduseConfigurationsVersion()so any mutation site can invalidate every mountedConfigLoaderwithout page-to-page coupling.resmon_scripts/frontend/src/components/Forms/ConfigLoader.tsx— subscribe to the bus viauseConfigurationsVersion()and add the version to the fetch effect’s dependency array so deletions, saves, and imports anywhere in the app force a refetch.resmon_scripts/frontend/src/pages/ConfigurationsPage.tsx— callnotifyConfigurationsChanged()after a successful delete and after a successful import.resmon_scripts/frontend/src/pages/DeepDivePage.tsx— callnotifyConfigurationsChanged()after a successful “Save Configuration” so newly saved rows immediately appear in sibling loaders.resmon_scripts/frontend/src/pages/DeepSweepPage.tsx— same notify-on-save wiring as Deep Dive.
Batch 2 — Query Keyword Transparency (single feature)
resmon_scripts/implementation_scripts/repo_catalog.py— addkeyword_combinationandkeyword_combination_notesfields toRepoCatalogEntryand populate them for all 16 active repositories, using “Implicit AND”, “Explicit OR”, “Relevance-ranked”, or “Relevance-ranked (… upstream-default, unverified)” labels per the workflow’s uncertainty policy. DBLP, IEEE Xplore, and PLOS are individually classified (replacing the previously lumped row); SSRN and RePEc are not in the active catalog and were therefore not added.resmon_scripts/verification_scripts/test_repo_catalog.py— extendexpected_keysand addtest_keyword_combination_populated_for_every_active_repo.resmon_scripts/frontend/src/api/repositories.ts— extend theRepoCatalogEntryTypeScript interface with the two new optional fields.resmon_scripts/frontend/src/components/Forms/KeywordCombinationBanner.tsx(new, 42 lines) — compact banner mounted under the repository selector on Deep Dive, Deep Sweep, and Routines that shows the keyword-combination label and notes for each currently selected repository, with a tooltip pointing to the consolidated glossary.resmon_scripts/frontend/src/components/Repositories/KeywordSemanticsGlossary.tsx(new, 182 lines) — consolidated, expandable glossary on the Repositories & API Keys page. Three categories (“Boolean combination”, “Ranking & confidence”, “Underlying search platforms”), each rendered as a color-accented section with a card grid of color-coded badge + short label + definition for every term (“Implicit AND”, “Explicit AND”, “Implicit OR”, “Explicit OR”, “Relevance-ranked”, “upstream-default, unverified”, “Lucene”, “Solr”). Iterated through three visual formats during review; final layout is the grouped card-grid format.resmon_scripts/frontend/src/components/Repositories/RepoDetailsPanel.tsx— render the new “Effective Default Keyword Combination” and “Keyword Combination Notes” rows in the per-repo expander.resmon_scripts/frontend/src/pages/DeepDivePage.tsx— mountKeywordCombinationBannerfor the selected single repository.resmon_scripts/frontend/src/pages/DeepSweepPage.tsx— mountKeywordCombinationBannerfor each selected repository.resmon_scripts/frontend/src/pages/RoutinesPage.tsx— mountKeywordCombinationBannerin the Create/Edit modal for each selected repository.resmon_scripts/frontend/src/pages/RepositoriesPage.tsx— mountKeywordSemanticsGlossaryabove the catalog table..ai/prep/repos.csv(internal scaffolding, not tracked by git) — extended withkeyword_combinationandkeyword_combination_notescolumns mirroring the catalog entries; per the user’s directive this file is enriched in place rather than relocated.
Out-of-Band Additions (T-UPD-ADD)
None.
Verification
- Backend unit tests:
python -m pytest resmon_scripts/verification_scripts/test_repo_catalog.py -q→10 passed in 0.02s. Includes the newtest_keyword_combination_populated_for_every_active_repoand the extendedtest_catalog_as_dicts_shapeexpected_keysset. - Frontend production build:
npm run build:renderer(run fromresmon_scripts/frontend/) →webpack 5.106.2 compiled successfully in 5111 msafter batch 2’s components were finalized. Re-run after each visual iteration of the glossary; final iteration also compiled cleanly. - Manual UI verification: the live Electron app (attached to the running daemon on
127.0.0.1:8742) was used to verify (a) deleting amanual_diveconfig from the Configurations page makes it disappear from the Deep DiveLoad Configurationdropdown without a reload, and the same formanual_sweepon the Deep Sweep page; (b) the keyword-combination banner appears under the repository selector on Deep Dive, Deep Sweep, and the Routines create/edit modal, and lists one row per selected repository with the correct label; (c) the consolidated glossary on the Repositories & API Keys page expands, renders three category sections with colored accents, and shows every defined term as a card; (d) each row in the catalog table exposes the two new entries in its expander. - Skipped tests: none. No frontend Jest suite was run because the project does not currently maintain one for these surfaces; manual UI verification is the existing standard for renderer-only changes.
Follow-ups
- Optional: add a Playwright/Jest smoke test for
ConfigLoadercross-page invalidation so future regressions are caught without manual reproduction. - Optional: confirm the “upstream-default, unverified” labels for DBLP, IEEE Xplore, and PLOS by directly probing each upstream search box; promote the labels to the unqualified form once verified.
- The cloud catalog mirror (if/when the cloud service serializes the catalog independently) will need the two new fields surfaced in its
/api/v2/repositories/catalogresponse; not in scope for this update.