Skip to content

feat: add limit and query params to filter data endpoints for server-side search and pagination - #3567

Merged
akshaydeo merged 1 commit into
devfrom
05-18-feat_add_search_functionality_to_the_filter_apis
May 18, 2026
Merged

feat: add limit and query params to filter data endpoints for server-side search and pagination#3567
akshaydeo merged 1 commit into
devfrom
05-18-feat_add_search_functionality_to_the_filter_apis

Conversation

@impoiler

@impoiler impoiler commented May 18, 2026

Copy link
Copy Markdown
Contributor

Summary

All "get distinct / available" filter-data methods now accept limit int and query string parameters, enabling server-side search filtering and result capping. Previously these methods returned unbounded result sets with no way to narrow results by a search term, which could cause large memory allocations and slow queries on tables with many distinct values.

Changes

  • Added limit and query parameters to all GetDistinct* and GetAvailable* methods across the LogStore interface, RDBLogStore, HybridLogStore, LoggerPlugin, LogManager, and PluginLogManager.
  • On the database layer, a LIKE/ILIKE filter is applied when query is non-empty, and LIMIT is pushed down to the query so the DB engine caps the result set rather than Go-side slicing.
  • A helper applyLikeFilter was added to RDBLogStore to emit ILIKE on Postgres and LIKE on other dialects.
  • Materialized-view paths (getDistinct*FromMatView) were updated in the same way — ILIKE filtering and LIMIT are applied before results are returned.
  • GetDistinctRoutingEngines (both raw and matview paths) now sorts results and truncates to limit after the in-process comma-split deduplication step.
  • GetDistinctMetadataKeys applies an in-process case-insensitive substring filter on both key names and values when query is set, and caps the number of returned keys at limit.
  • The /api/logs/filterdata and /api/mcp/logs/filterdata HTTP handlers now read an optional q query parameter and pass it through to all downstream calls with a defaultFilterDataLimit of 1000.
  • Cache bypass: when q is non-empty the filter-data cache is skipped entirely (both read and write), since search results are user-specific and should not be shared across callers.
  • Existing performance tests updated to pass (ctx, 1000, "") to match the new signatures.

Type of change

  • Bug fix
  • Feature
  • Refactor
  • Documentation
  • Chore/CI

Affected areas

  • Core (Go)
  • Transports (HTTP)
  • Providers/Integrations
  • Plugins
  • UI (React)
  • Docs

How to test

go test ./framework/logstore/... ./plugins/logging/... ./transports/bifrost-http/...

To validate search filtering end-to-end:

  1. Start the server with a populated log database.
  2. Call GET /api/logs/filterdata?dimensions=models&q=gpt — the response should only contain model names matching gpt.
  3. Call the same endpoint without q — the full list (up to 1000) should be returned and cached.
  4. Call GET /api/mcp/logs/filterdata?dimensions=tool_names&q=search — only matching tool names should be returned and the result should not be written to cache.

Breaking changes

  • Yes

All LogStore, LogManager, and LoggerPlugin method signatures have changed. Any external implementations of these interfaces must add limit int, query string to the affected methods.

Related issues

Security considerations

The query string is passed to the database as a parameterised LIKE/ILIKE pattern (? placeholder), so there is no SQL injection risk. The % wildcards are added in Go before binding, not interpolated into the query string directly.

Checklist

  • I read docs/contributing/README.md and followed the guidelines
  • I added/updated tests where appropriate
  • I updated documentation where needed
  • I verified builds succeed (Go and UI)
  • I verified the CI pipeline passes locally if applicable

@coderabbitai

coderabbitai Bot commented May 18, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: add4e40f-a189-4d32-8bf7-d26baccf9771

📥 Commits

Reviewing files that changed from the base of the PR and between e811375 and d02fc74.

📒 Files selected for processing (8)
  • framework/logstore/hybrid.go
  • framework/logstore/matviews.go
  • framework/logstore/rdb.go
  • framework/logstore/rdb_postgres_perf_test.go
  • framework/logstore/store.go
  • plugins/logging/operations.go
  • plugins/logging/utils.go
  • transports/bifrost-http/handlers/logging.go

📝 Walkthrough

Summary by CodeRabbit

  • New Features
    • Filter-data endpoints now accept a search query and a result limit, returning case-insensitive substring matches.
  • Improvements
    • Searches with a query bypass per-dimension cache to ensure fresh results.
    • A default limit is applied to filter-data responses to bound results and support pagination.

Walkthrough

This PR adds parameterized filtering and limiting to log store filter-data queries. LogStore interface methods for distinct models, aliases, key pairs, routing engines, stop reasons, metadata keys, and MCP tool availability are updated to accept limit and query parameters. RDBLogStore implements dialect-aware substring filtering via a shared helper and applies SQL-level LIMIT, while matview functions and HybridLogStore forward the new parameters. HTTP handlers treat empty query parameters as cacheable and pass limit and query to all log manager calls. All layers propagate these parameters through the call chain.

Changes

Filter-data limit and query parameter propagation

Layer / File(s) Summary
LogStore and LogManager interface contracts
framework/logstore/store.go, plugins/logging/utils.go
LogStore interface methods for distinct values and available values are updated to accept limit and query. LogManager interface and PluginLogManager wrapper follow the same signature changes.
RDBLogStore database filtering implementation
framework/logstore/rdb.go
A shared applyLikeFilter helper uses dialect-aware substring matching (ILIKE for Postgres, LIKE elsewhere). Updated methods apply filtering to relevant columns, enforce SQL LIMIT, and handle post-processing for routing engines (parse, dedupe, sort, truncate) and metadata keys (filter across key names and values, then limit key count).
PostgreSQL matview filtering helpers
framework/logstore/matviews.go
Matview query functions accept limit and query, apply conditional ILIKE filtering on relevant columns, and enforce LIMIT in the plucked distinct selection.
HybridLogStore and LoggerPlugin delegation
framework/logstore/hybrid.go, plugins/logging/operations.go
HybridLogStore forwards limit and query to inner store methods. LoggerPlugin methods forward new parameters to store calls while preserving error-handling semantics (log + return empty result).
PluginLogManager wrapper interface
plugins/logging/utils.go
PluginLogManager wrapper methods forward limit and query to underlying plugin and store methods with preserved nil checks for uninitialized dependencies.
HTTP handler filter-data caching and forwarding
transports/bifrost-http/handlers/logging.go
Handlers for /api/logs/filterdata and /api/mcp-logs/filterdata derive query from request parameter q, compute useCache when query is empty, and conditionally load/store cache. All per-dimension GetAvailable* calls forward defaultFilterDataLimit and query instead of parameterless calls.
Performance test updates
framework/logstore/rdb_postgres_perf_test.go
Timing-cutoff performance tests updated to pass explicit limit (1000) and query ("") arguments to distinct and available method calls.

🎯 3 (Moderate) | ⏱️ ~25 minutes

  • Possibly related PRs:
    • maximhq/bifrost#3561: Modifies related distinct/available filter-data query logic (changes around default limits and matview/rdb behavior).

"I'm a rabbit in the code so merry and spry,
I hop through queries that flutter and fly,
Limits and searches now waltz in the light,
Cache waits politely when queries take flight,
Paginated petals fall tidy and bright."

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 22.22% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately describes the main feature: adding limit and query parameters to filter data endpoints for server-side search and pagination.
Description check ✅ Passed The PR description comprehensively covers all required sections: summary, changes, type of change, affected areas, testing, breaking changes, and security considerations.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

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

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch 05-18-feat_add_search_functionality_to_the_filter_apis

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 golangci-lint (2.12.2)

level=error msg="[linters_context] typechecking error: pattern ./...: directory prefix . does not contain main module or its selected dependencies"


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

@impoiler impoiler self-assigned this May 18, 2026
@impoiler impoiler changed the title feat: add search functionality to the filter APIs feat: add limit and query params to filter data endpoints for server-side search and pagination May 18, 2026
@impoiler
impoiler marked this pull request as ready for review May 18, 2026 12:00
@greptile-apps

greptile-apps Bot commented May 18, 2026

Copy link
Copy Markdown
Contributor

Confidence Score: 4/5

Safe to merge with a targeted fix: search returns incorrect results when q contains _ or % characters, but no data is mutated and no security boundary is crossed.

The applyLikeFilter helper and all five matview query methods pass the raw user query directly into the LIKE pattern without escaping _ (single-char wildcard) or % (any-string wildcard). A user searching for gpt_4 would receive results matching gptX4, gpt14, etc., producing wrong search output on every affected dimension.

framework/logstore/rdb.go (applyLikeFilter) and framework/logstore/matviews.go (five inline ILIKE constructions) both need the same wildcard-escaping fix before the search feature behaves correctly.

Important Files Changed

Filename Overview
framework/logstore/rdb.go Adds applyLikeFilter helper and updates all GetDistinct*/GetAvailable* methods with limit/query params; unescaped LIKE wildcards in applyLikeFilter produce incorrect results when q contains % or _.
framework/logstore/matviews.go Matview query helpers updated with limit/query params; all five methods construct the ILIKE pattern with unescaped user input, mirroring the wildcard-escaping bug in rdb.go.
framework/logstore/hybrid.go Pure delegation shim - each method signature updated to forward limit and query to the inner store unchanged; no logic of its own.
framework/logstore/store.go Interface definitions updated to include limit int, query string on all filter-data methods; straightforward signature change with no logic.
plugins/logging/operations.go Plugin-layer GetAvailable* methods updated to accept and forward limit/query; also fixes a stray %w to %v formatting verb in an error log call.
plugins/logging/utils.go LogManager interface and PluginLogManager delegation methods updated with new signatures; straightforward pass-through changes.
transports/bifrost-http/handlers/logging.go HTTP handlers read optional q query parameter, skip the filter-data cache when non-empty, and pass defaultFilterDataLimit/query through to all downstream calls; cache bypass logic is correct.
framework/logstore/rdb_postgres_perf_test.go Existing perf tests updated to pass (ctx, 1000, "") to match new signatures; no new test coverage for the query filtering path.

Reviews (3): Last reviewed commit: "feat: add search functionality to the fi..." | Re-trigger Greptile

Comment thread framework/logstore/rdb.go
Comment thread framework/logstore/rdb.go

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 3

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
framework/logstore/rdb.go (1)

2860-2887: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Filter split routing engines, not just the raw CSV column.

Searching routing_engines_used before strings.Split still lets unrelated sibling values leak into the result. For example, a row containing a,b queried with b will currently return both a and b.

🎯 Proposed fix
 	// Each row may contain comma-separated values; deduplicate across all rows
 	uniqueEngines := make(map[string]struct{})
+	lowerQ := strings.ToLower(strings.TrimSpace(query))
 	for _, raw := range rawValues {
 		for _, engine := range strings.Split(raw, ",") {
 			engine = strings.TrimSpace(engine)
-			if engine != "" {
+			if engine != "" && (lowerQ == "" || strings.Contains(strings.ToLower(engine), lowerQ)) {
 				uniqueEngines[engine] = struct{}{}
 			}
 		}
 	}
 	engines := make([]string, 0, len(uniqueEngines))
@@
-	if len(engines) > limit {
+	if limit > 0 && len(engines) > limit {
 		engines = engines[:limit]
 	}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@framework/logstore/rdb.go` around lines 2860 - 2887, The current row-level
filter on "routing_engines_used" lets sibling values leak (e.g. row "a,b"
matches query "b" but you then return "a"), so stop filtering rows and instead
filter after splitting: remove the call that applies applyLikeFilter to q (the
row-level filter on routing_engines_used), retrieve rawValues as you do now,
then when iterating rawValues and splitting into engine (the loop that trims and
dedups into uniqueEngines), only add an engine when query == "" OR the engine
itself matches the query using the same LIKE semantics (case-insensitive
substring or your existing applyLikeFilter semantics applied at the string
level); keep deduping via uniqueEngines, then sort and apply the limit to
engines as before.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@framework/logstore/rdb.go`:
- Around line 2770-2776: The DISTINCT queries (e.g., the query built in the
GetDistinct/GetAvailable model methods using
s.db.WithContext(ctx).Model(&Log{})...Distinct("model")) apply LIMIT without a
stable ORDER, causing nondeterministic subsets; fix by applying a deterministic
Order (for example Order("model ASC") or Order("timestamp DESC", "model ASC") as
appropriate) on the query (call q = q.Order(...)) before calling Limit(...). Do
this change in this method and mirror the same pattern for the other capped
distinct/available methods in this file (the other GetDistinct*/GetAvailable*
functions) so the LIMIT is always applied to a stable ordering while preserving
use of applyLikeFilter.
- Around line 3004-3017: The loop enforces `limit` while ranging over the
unordered `keyValues` map, causing nondeterministic key selection; instead,
build a deterministic slice of keys (e.g., collect keys from `keyValues`, sort
them with sort.Strings) and then iterate that sorted keys slice to populate
`result` and apply the `limit`; use the existing `keyValues`, `result`, `limit`,
and `vals` variables (from the current block in rdb.go) so behavior is stable
across runs.

In `@plugins/logging/operations.go`:
- Around line 1168-1172: In GetAvailableMCPVirtualKeys, the logger.Error call
incorrectly uses the %w verb (meant for fmt.Errorf wrapping); update the error
formatting in the error branch of GetAvailableMCPVirtualKeys to use %v (or %s)
instead of %w so the log message is idiomatic — locate the p.logger.Error(...)
line in the GetAvailableMCPVirtualKeys function and replace the %w specifier
with %v while preserving the rest of the message and the err argument.

---

Outside diff comments:
In `@framework/logstore/rdb.go`:
- Around line 2860-2887: The current row-level filter on "routing_engines_used"
lets sibling values leak (e.g. row "a,b" matches query "b" but you then return
"a"), so stop filtering rows and instead filter after splitting: remove the call
that applies applyLikeFilter to q (the row-level filter on
routing_engines_used), retrieve rawValues as you do now, then when iterating
rawValues and splitting into engine (the loop that trims and dedups into
uniqueEngines), only add an engine when query == "" OR the engine itself matches
the query using the same LIKE semantics (case-insensitive substring or your
existing applyLikeFilter semantics applied at the string level); keep deduping
via uniqueEngines, then sort and apply the limit to engines as before.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 1e8efeeb-4d13-47f5-bd8d-d2c946efd727

📥 Commits

Reviewing files that changed from the base of the PR and between 5b2de1c and 18f5adf.

📒 Files selected for processing (8)
  • framework/logstore/hybrid.go
  • framework/logstore/matviews.go
  • framework/logstore/rdb.go
  • framework/logstore/rdb_postgres_perf_test.go
  • framework/logstore/store.go
  • plugins/logging/operations.go
  • plugins/logging/utils.go
  • transports/bifrost-http/handlers/logging.go

Comment thread framework/logstore/rdb.go Outdated
Comment thread framework/logstore/rdb.go
Comment thread plugins/logging/operations.go
@impoiler
impoiler force-pushed the 05-18-fix_remove_the_500_distinct_values_cap_from_the_matviews_filter_queries_to_avoid_confusion_when_data_is_missing branch from 5b2de1c to d7383b9 Compare May 18, 2026 13:01
@impoiler
impoiler force-pushed the 05-18-feat_add_search_functionality_to_the_filter_apis branch from 18f5adf to e811375 Compare May 18, 2026 13:01
@coderabbitai
coderabbitai Bot requested review from akshaydeo and danpiths May 18, 2026 13:02
coderabbitai[bot]
coderabbitai Bot previously approved these changes May 18, 2026
Comment thread framework/logstore/matviews.go

akshaydeo commented May 18, 2026

Copy link
Copy Markdown
Contributor

Merge activity

  • May 18, 1:40 PM UTC: A user started a stack merge that includes this pull request via Graphite.
  • May 18, 1:42 PM UTC: Graphite rebased this pull request as part of a merge.
  • May 18, 1:43 PM UTC: @akshaydeo merged this pull request with Graphite.

@akshaydeo
akshaydeo changed the base branch from 05-18-fix_remove_the_500_distinct_values_cap_from_the_matviews_filter_queries_to_avoid_confusion_when_data_is_missing to graphite-base/3567 May 18, 2026 13:40
@akshaydeo
akshaydeo changed the base branch from graphite-base/3567 to dev May 18, 2026 13:40
@akshaydeo
akshaydeo dismissed coderabbitai[bot]’s stale review May 18, 2026 13:40

The base branch was changed.

@akshaydeo
akshaydeo force-pushed the 05-18-feat_add_search_functionality_to_the_filter_apis branch from e811375 to d02fc74 Compare May 18, 2026 13:41
@akshaydeo
akshaydeo merged commit 80d1828 into dev May 18, 2026
14 of 15 checks passed
@akshaydeo
akshaydeo deleted the 05-18-feat_add_search_functionality_to_the_filter_apis branch May 18, 2026 13:43
Comment thread framework/logstore/rdb.go
Comment on lines +2754 to +2760
func (s *RDBLogStore) applyLikeFilter(q *gorm.DB, column, search string) *gorm.DB {
pattern := "%" + search + "%"
if s.db.Dialector.Name() == "postgres" {
return q.Where(fmt.Sprintf("%s ILIKE ?", column), pattern)
}
return q.Where(fmt.Sprintf("%s LIKE ?", column), pattern)
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P1 SQL LIKE wildcards % and _ in the user-supplied q value are not escaped before the pattern is built. When a user searches for a value like gpt_4, the pattern becomes %gpt_4% where _ is a single-character wildcard, so it incorrectly matches gptX4, gpt14, etc. Similarly, a query of q=% bypasses the filter entirely and returns all values. All commonly-used DB dialects support ESCAPE to treat these characters literally.

Suggested change
func (s *RDBLogStore) applyLikeFilter(q *gorm.DB, column, search string) *gorm.DB {
pattern := "%" + search + "%"
if s.db.Dialector.Name() == "postgres" {
return q.Where(fmt.Sprintf("%s ILIKE ?", column), pattern)
}
return q.Where(fmt.Sprintf("%s LIKE ?", column), pattern)
}
func (s *RDBLogStore) applyLikeFilter(q *gorm.DB, column, search string) *gorm.DB {
escaped := strings.NewReplacer(`%`, `\%`, `_`, `\_`).Replace(search)
pattern := "%" + escaped + "%"
if s.db.Dialector.Name() == "postgres" {
return q.Where(fmt.Sprintf("%s ILIKE ? ESCAPE '\\'", column), pattern)
}
return q.Where(fmt.Sprintf("%s LIKE ? ESCAPE '\\'", column), pattern)
}

Pluck("model", &models).Error; err != nil {
Where("model != ''")
if query != "" {
q = q.Where("model ILIKE ?", "%"+query+"%")

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P1 Unescaped LIKE wildcards in matview query paths

The same "%" + query + "%" pattern used throughout the matview methods (getDistinctModelsFromMatView, getDistinctAliasesFromMatView, getDistinctStopReasonsFromMatView, getDistinctKeyPairsFromMatView, getDistinctRoutingEnginesFromMatView) does not escape % or _ in the user-supplied query. A search for gpt_4 produces ILIKE '%gpt_4%' where _ is a single-character wildcard, returning false positives like gpt14. Since these paths are Postgres-only, using ESCAPE '\' with pre-escaped characters (matching the fix suggested for applyLikeFilter) would resolve the issue across all matview methods.

@coderabbitai coderabbitai Bot mentioned this pull request May 18, 2026
18 tasks
akshaydeo pushed a commit that referenced this pull request May 20, 2026
…ver-side search and pagination (#3567)

## Summary

All "get distinct / available" filter-data methods now accept `limit int` and `query string` parameters, enabling server-side search filtering and result capping. Previously these methods returned unbounded result sets with no way to narrow results by a search term, which could cause large memory allocations and slow queries on tables with many distinct values.

## Changes

- Added `limit` and `query` parameters to all `GetDistinct*` and `GetAvailable*` methods across the `LogStore` interface, `RDBLogStore`, `HybridLogStore`, `LoggerPlugin`, `LogManager`, and `PluginLogManager`.
- On the database layer, a `LIKE`/`ILIKE` filter is applied when `query` is non-empty, and `LIMIT` is pushed down to the query so the DB engine caps the result set rather than Go-side slicing.
- A helper `applyLikeFilter` was added to `RDBLogStore` to emit `ILIKE` on Postgres and `LIKE` on other dialects.
- Materialized-view paths (`getDistinct*FromMatView`) were updated in the same way — `ILIKE` filtering and `LIMIT` are applied before results are returned.
- `GetDistinctRoutingEngines` (both raw and matview paths) now sorts results and truncates to `limit` after the in-process comma-split deduplication step.
- `GetDistinctMetadataKeys` applies an in-process case-insensitive substring filter on both key names and values when `query` is set, and caps the number of returned keys at `limit`.
- The `/api/logs/filterdata` and `/api/mcp/logs/filterdata` HTTP handlers now read an optional `q` query parameter and pass it through to all downstream calls with a `defaultFilterDataLimit` of 1000.
- Cache bypass: when `q` is non-empty the filter-data cache is skipped entirely (both read and write), since search results are user-specific and should not be shared across callers.
- Existing performance tests updated to pass `(ctx, 1000, "")` to match the new signatures.

## Type of change

- [ ] Bug fix
- [x] Feature
- [ ] Refactor
- [ ] Documentation
- [ ] Chore/CI

## Affected areas

- [x] Core (Go)
- [x] Transports (HTTP)
- [ ] Providers/Integrations
- [x] Plugins
- [ ] UI (React)
- [ ] Docs

## How to test

```sh
go test ./framework/logstore/... ./plugins/logging/... ./transports/bifrost-http/...
```

To validate search filtering end-to-end:

1. Start the server with a populated log database.
2. Call `GET /api/logs/filterdata?dimensions=models&q=gpt` — the response should only contain model names matching `gpt`.
3. Call the same endpoint without `q` — the full list (up to 1000) should be returned and cached.
4. Call `GET /api/mcp/logs/filterdata?dimensions=tool_names&q=search` — only matching tool names should be returned and the result should not be written to cache.

## Breaking changes

- [x] Yes

All `LogStore`, `LogManager`, and `LoggerPlugin` method signatures have changed. Any external implementations of these interfaces must add `limit int, query string` to the affected methods.

## Related issues

## Security considerations

The `query` string is passed to the database as a parameterised `LIKE`/`ILIKE` pattern (`?` placeholder), so there is no SQL injection risk. The `%` wildcards are added in Go before binding, not interpolated into the query string directly.

## Checklist

- [ ] I read `docs/contributing/README.md` and followed the guidelines
- [x] I added/updated tests where appropriate
- [ ] I updated documentation where needed
- [x] I verified builds succeed (Go and UI)
- [ ] I verified the CI pipeline passes locally if applicable
@akshaydeo akshaydeo mentioned this pull request May 20, 2026
18 tasks
akshaydeo added a commit that referenced this pull request May 20, 2026
## Summary

This PR cuts the `v1.5.11` / `v1.3.11` release across core, framework, and all plugins, and introduces a new Claude skill (`release-checklist`) for pre-release migration safety auditing.

## Changes

- **`release-checklist` skill** — Adds `.claude/skills/release-checklist/SKILL.md`, a read-only pre-release audit tool that scans Go-defined database migrations changed in a release for high-scale deadlock/lock-contention risks and boot-time-blocking operations. It produces a structured `PASS`/`WARN`/`FAIL` report with a concrete remediation plan per finding. The skill is designed to grow via an extensible Checks Registry.
- **Version bumps** — `core` → `1.5.11`, `framework` → `1.3.11`, `transports` → `1.5.3`, `plugins/governance` → `1.5.11`, `plugins/logging` → `1.5.11`, `plugins/semanticcache` → `1.5.11`, `plugins/otel` → `1.2.11`, `plugins/maxim` → `1.6.11`, `plugins/prompts` → `1.0.11`, and remaining plugins bumped accordingly.
- **Changelogs populated** — All per-package changelogs updated with the full set of features and fixes shipping in this release.

Key highlights in this release:
- Temporary access tokens for scoped, time-limited API access
- MCP per-user OAuth flow refactor
- Bedrock Mantle inference engine support
- Azure Realtime provider with enriched session tracking
- Direct access control (DAC) and virtual key rotation
- Cluster-aware log metadata and per-node usage aggregation
- Feature flag framework
- Config-hash-based file value override of DB on restart
- Semantic cache plugin rewrite
- Numerous streaming stability, Bedrock, Anthropic, and Gemini fixes
- AWS SDK and dependency security updates

## Type of change

- [ ] Bug fix
- [ ] Feature
- [ ] Refactor
- [ ] Documentation
- [x] Chore/CI

## Affected areas

- [x] Core (Go)
- [x] Transports (HTTP)
- [x] Providers/Integrations
- [x] Plugins
- [x] UI (React)
- [ ] Docs

## How to test

```sh
# Verify version files reflect the new release
cat core/version          # expect 1.5.11
cat framework/version     # expect 1.3.11
cat transports/version    # expect 1.5.3

# Core/Transports
go test ./...
```

To exercise the new `release-checklist` skill, invoke it via Claude with:
```
/release-checklist origin/dev...HEAD
```
Expected output: a structured report with `PASS`/`WARN`/`FAIL` per check and a Remediation Plan table for any findings.

## Screenshots/Recordings

N/A

## Breaking changes

- [ ] Yes
- [x] No

## Related issues

#3603, #3565, #3489, #3334, #3335, #3435, #3554, #3590, #3444, #3198, #3581, #3610, #3599, #3567, #3382, #3461 and others listed in the changelogs.

## Security considerations

- AWS SDK and dependency security updates are included (#3461).
- `FullyRedacted()` for proxy passwords and `MarshalForStorage()` for `ProxyConfig` prevent partial secret leakage in API responses (#3445).
- The `release-checklist` skill is strictly read-only and never modifies files.

## Checklist

- [x] I read `docs/contributing/README.md` and followed the guidelines
- [x] I added/updated tests where appropriate
- [x] I updated documentation where needed
- [x] I verified builds succeed (Go and UI)
- [ ] I verified the CI pipeline passes locally if applicable
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.

2 participants