Skip to content

feat(search): inline field:value query syntax + matched-text highlighting (GH-157) - #290

Merged
unbraind merged 2 commits into
mainfrom
feat/search-inline-query-highlight
Jun 18, 2026
Merged

unbraind merged 2 commits into
mainfrom
feat/search-inline-query-highlight

Conversation

@unbraind

Copy link
Copy Markdown
Owner

Summary

Completes the GH-157 remainder for pm search (the threshold/exact/count parts shipped in #238). Both additions reduce agent round-trips and token cost — directly serving project management = context management.

1. Inline field:value query syntax

Embed filter tokens directly in the query string; recognized fields are tag:, status:, type:, priority:. The value runs to the end of the token, so colon-bearing values like tag:area:search parse correctly. Remaining words drive keyword/semantic matching.

pm search "auth tag:area:auth status:open"     # query "auth" + --tag area:auth --status open
  • Precedence: an explicit --flag always wins over a conflicting inline token; the override is surfaced as a search_inline_filter_ignored:<field>:flag_takes_precedence warning (never silent).
  • Two complementary layers: the bootstrap parseBareKeyValueToken rewriter already handles unquoted argv tokens (tag:x → --tag x) on the CLI. The new in-runSearch parser covers the gap: quoted multi-word CLI queries and the pm_search MCP path, where the entire query arrives as a single string (no argv normalization). Both yield identical applied filters.
  • A query consisting solely of inline tokens is rejected with guidance to use pm list for pure filtering.

2. --highlight matched-text snippets

Off by default for token efficiency. Emits per-field highlights: [{ field, snippet }] with matching token runs wrapped in «…» and a … ellipsis where the field text was windowed (±60 chars around the first match).

pm search "auth" --highlight          # adds highlights to each hit
pm search "auth" --full --highlight   # full payloads + highlights

scoreDocument and the highlighter now share one SEARCHABLE_FIELD_BUILDERS source of truth, so the highlighter can only ever produce snippets for fields the scorer actually inspected.

Wiring

register-list-query (--highlight + description), registration-helpers (normalizeSearchOptions), SEARCH_FLAG_CONTRACTS, SEARCH_CONTRACT_PARAMETER_KEYS, MCP tool-parameter-tables (property + description), zsh + fish completions, contracts golden file, docs/COMMANDS.md.

Verification

  • pnpm build clean
  • 4607 tests pass; coverage 100/100/100/100 (statements/branches/functions/lines)
  • pnpm contracts:check current · pnpm quality:static passed · changelog:pm:check no drift
  • Manual sandbox: inline tag/status/type filters, precedence warning, empty-residual guard, highlight (compact/full), count mode — all verified

pm tracking

Closes pm-ldr1 (parent epic pm-ydp6 Search & semantic retrieval). Triage note added to pm-28cf (GH-244 — already resolved by #254; persist-on-read normalization declined).

🤖 Generated with Claude Code

https://claude.ai/code/session_01WPY4oWVsYs2FjZ6shgUyrL

…ting (pm-ldr1, GH-157)

Completes the GH-157 remainder for `pm search`:

1. Inline `field:value` query syntax — parseInlineQueryFilters /
   applyInlineQueryFilters extract tag:/status:/type:/priority: tokens
   from the query string (value runs to end-of-token so tag:area:search
   parses; first occurrence per field wins). Explicit --flags win over a
   conflicting inline token, surfacing
   search_inline_filter_ignored:<field>:flag_takes_precedence. This
   complements the bootstrap parseBareKeyValueToken rewriter (UNQUOTED
   argv tokens only) by covering quoted multi-word CLI queries AND the
   pm_search MCP path where the whole query arrives as one string.

2. --highlight — per-field matched-text snippets (highlights:[{field,
   snippet}], «…» markers, windowed ±60 chars with … ellipsis), off by
   default for token efficiency; added to compact/fields projections
   when set. scoreDocument and the highlighter now share a single
   SEARCHABLE_FIELD_BUILDERS source of truth.

Wiring: register-list-query, registration-helpers normalizeSearchOptions,
SEARCH_FLAG_CONTRACTS, SEARCH_CONTRACT_PARAMETER_KEYS, MCP
tool-parameter-tables (+description), zsh+fish completions, contracts
golden file, COMMANDS.md. 100/100/100/100 coverage, 4607 tests green,
static + contracts gates pass.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WPY4oWVsYs2FjZ6shgUyrL

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Sorry @unbraind, you have reached your weekly rate limit of 500000 diff characters.

Please try again later or upgrade to continue using Sourcery

@unbraind

Copy link
Copy Markdown
Owner Author

@coderabbitai full review

@unbraind

Copy link
Copy Markdown
Owner Author

@gemini-code-assist review

@unbraind

Copy link
Copy Markdown
Owner Author

@codex review

@coderabbitai

coderabbitai Bot commented Jun 18, 2026 •

Copy link
Copy Markdown
✅ Action performed

Full review finished.

@chatgpt-codex-connector

Copy link
Copy Markdown

To use Codex here, create a Codex account and connect to github.

@coderabbitai

coderabbitai Bot commented Jun 18, 2026 •

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@unbraind, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 38 minutes and 13 seconds. Learn how PR review limits work.

Your organization has used up its prepaid credits, and credit purchases are no longer available. Enable the review add-on in the billing tab to keep reviews running — you're only billed for reviews past your plan's rate limits ($0.25/file).

⌛ How to resolve this issue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based credits.

🚦 How do rate limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan refill rate.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, the refill rate gradually slows as usage increases. The highest same-day bursts are limited more strictly.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro

Run ID: 4a8ad76f-6ed8-4034-bf49-0973b158949e

📥 Commits

Reviewing files that changed from the base of the PR and between cb7f313 and 936a199.

📒 Files selected for processing (15)
  • .agents/pm/features/pm-ldr1.toon
  • .agents/pm/history/pm-28cf.jsonl
  • .agents/pm/history/pm-ldr1.jsonl
  • .agents/pm/issues/pm-28cf.toon
  • CHANGELOG.md
  • docs/COMMANDS.md
  • src/cli/commands/completion.ts
  • src/cli/commands/search.ts
  • src/cli/register-list-query.ts
  • src/cli/registration-helpers.ts
  • src/sdk/cli-contracts.ts
  • src/sdk/cli-contracts/tool-parameter-tables.ts
  • tests/fixtures/contracts/full.json
  • tests/unit/cli/registration-helpers.spec.ts
  • tests/unit/commands/search-command.spec.ts
📝 Walkthrough

Walkthrough

Adds two features to pm search: inline field:value query token parsing (tag:, status:, type:, priority:) and a --highlight flag that emits per-field matched-text snippets wrapped in «…». Changes span the search command core, SDK contracts, CLI registration, shell completions, documentation, tests, and agent PM tracking records.

Changes

pm search: Inline Filter Syntax and --highlight Snippets

Layer / File(s) Summary
SearchOptions, SearchHit, and SDK contracts
src/cli/commands/search.ts, src/sdk/cli-contracts.ts, src/sdk/cli-contracts/tool-parameter-tables.ts
Adds highlight?: boolean to SearchOptions, highlights?: SearchHitHighlight[] to SearchHit, introduces SearchHitHighlight interface, defines inline filter field constants and «» marker constants, and registers --highlight in SEARCH_FLAG_CONTRACTS, SEARCH_CONTRACT_PARAMETER_KEYS, PM_TOOL_PARAMETER_PROPERTIES, and PM_TOOL_PARAMETER_METADATA.
Inline field:value query parsing helpers
src/cli/commands/search.ts
Implements parseInlineQueryFilters (extracts field:value tokens and residual query) and applyInlineQueryFilters (merges into SearchOptions with explicit-flag precedence, emitting warnings for ignored tokens). Both helpers are exposed via _testOnlySearchCommand.
Highlight pipeline: field extractors, token marking, and snippet generation
src/cli/commands/search.ts
Adds a canonical searchable-field extractor list shared between lexical scoring and snippet generation. Implements escapeTokenForRegex, markTokenRuns, highlightFieldSnippet (context-window with ellipsis), and buildHitHighlights. Refactors the lexical scorer to use the canonical extractor list.
runSearch integration of inline filters and highlight projection
src/cli/commands/search.ts
runSearch parses inline tokens at entry, throws on token-only queries, appends inline warnings after document load, conditionally attaches highlights for the post-limit hit slice when --highlight is set, and updates the effective projection to include highlights in compact/fields outputs.
CLI registration, normalization, and shell completions
src/cli/register-list-query.ts, src/cli/registration-helpers.ts, src/cli/commands/completion.ts
Registers --highlight on the search command and updates its description to document inline token syntax. Normalizes highlight in normalizeSearchOptions. Adds --highlight completion entries for Zsh and Fish.
Unit tests, contract fixture, and registration-helpers spec
tests/unit/commands/search-command.spec.ts, tests/unit/cli/registration-helpers.spec.ts, tests/fixtures/contracts/full.json
Adds unit tests for all new helpers (token parsing, flag precedence, markTokenRuns, highlightFieldSnippet windowing, buildHitHighlights) and runSearch wiring tests (inline filter application, explicit-flag override with warning, empty-residual rejection, highlight attachment across full/compact/fields projections). Updates contract fixture and registration-helpers spec to include highlight.
COMMANDS.md documentation and CHANGELOG entry
docs/COMMANDS.md, CHANGELOG.md
Adds a pm search documentation section covering inline field:value token syntax, parsing and precedence rules, usage-error behavior, and --highlight snippet format. Adds an Unreleased CHANGELOG entry for GH-157.

Agent PM Tracking Records

Layer / File(s) Summary
pm-ldr1 and pm-28cf agent record updates
.agents/pm/features/pm-ldr1.toon, .agents/pm/history/pm-ldr1.jsonl, .agents/pm/history/pm-28cf.jsonl, .agents/pm/issues/pm-28cf.toon
Closes the pm-ldr1 feature record with resolution, expected/actual results, comments, learnings, referenced files, and close_reason. Adds matching status transitions and closure metadata to its history. Appends a triage comment to the pm-28cf issue and history records.

Sequence Diagram(s)

sequenceDiagram
    participant CLI as CLI / MCP caller
    participant register as register-list-query
    participant normalize as normalizeSearchOptions
    participant runSearch
    participant parseInline as parseInlineQueryFilters
    participant applyInline as applyInlineQueryFilters
    participant buildHL as buildHitHighlights

    CLI->>register: pm search "tag:auth login" --highlight
    register->>normalize: options with highlight=true
    normalize-->>runSearch: SearchOptions{highlight:true}
    runSearch->>parseInline: rawQuery="tag:auth login"
    parseInline-->>runSearch: inlineMap={tag:"auth"}, residual="login"
    runSearch->>applyInline: inlineMap + SearchOptions
    applyInline-->>runSearch: merged options + inlineWarnings
    Note over runSearch: score and rank documents
    runSearch->>buildHL: limited hits + query tokens
    buildHL-->>runSearch: SearchHitHighlight[] per hit
    runSearch-->>CLI: hits with highlights + warnings
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • unbraind/pm-cli#282: Modifies SearchHit shape and the runSearch/ranking pipeline in src/cli/commands/search.ts, directly intersecting with this PR's inline filtering and SearchHit.highlights additions.
  • unbraind/pm-cli#274: Adds --format json|toon option to pm search in src/cli/register-list-query.ts, the same file this PR modifies to wire --highlight.
  • unbraind/pm-cli#147: Changes the pm search compact/projection output contract in src/cli/commands/search.ts; this PR's effectiveProjection logic for injecting highlights builds on the same projection shape.
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 68.75% 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 clearly and concisely describes the main changes: inline field:value query syntax and matched-text highlighting for the pm search command, directly corresponding to the primary features implemented in GH-157.
Description check ✅ Passed The description is well-detailed and comprehensively related to the changeset, explaining both features (inline field:value syntax and --highlight), implementation approach, wiring, verification results, and pm tracking updates.
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.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Code Review

This pull request implements structured inline query syntax (parsing tag:, status:, type:, and priority: tokens directly inside the query string) and matched-text highlighting via --highlight for pm search. Feedback highlights that the explicit --priority option is missing from CLI registration, normalization, and contracts, making its precedence behavior impossible to trigger. Additionally, buildHitHighlights should lazily evaluate field builders for matched fields to improve performance, and tokens in markTokenRuns should be sorted by length descending to prevent shorter prefixes from eagerly matching and disrupting longer highlights.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

// colons (e.g. `tag:area:search`), so only the FIRST colon delimits field from
// value. Explicit --field flags take precedence over an inline token (see
// resolveInlineQueryFilters).
const INLINE_QUERY_FILTER_FIELDS = ["tag", "status", "type", "priority"] as const;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

high

The inline query syntax includes priority as a recognized filter field, and the documentation in docs/COMMANDS.md explicitly references using --priority 1 as an explicit flag override. However, the explicit --priority option is completely missing from the CLI registration, option normalization, and SDK/MCP contracts. Specifically:

  1. registerListQueryCommands in src/cli/register-list-query.ts does not register .option("--priority <value>") for the search command.
  2. normalizeSearchOptions in src/cli/registration-helpers.ts does not handle or preserve the priority option.
  3. SEARCH_FLAG_CONTRACTS and SEARCH_CONTRACT_PARAMETER_KEYS in src/sdk/cli-contracts.ts do not include --priority / priority.
  4. PM_TOOL_PARAMETER_PROPERTIES and PM_TOOL_PARAMETER_METADATA in src/sdk/cli-contracts/tool-parameter-tables.ts do not define priority.

This prevents users from using --priority as an explicit flag (which will throw an unknown option error on the CLI), prevents MCP clients from using priority as a search parameter, and makes the documented precedence behavior for priority impossible to trigger. Please add the missing CLI option, normalization, and contract definitions for priority to ensure consistency with tag, status, and type.

References
  1. Ensure MCP tool schemas and enums strictly align with the underlying CLI command contracts and implementation.

Comment on lines +1318 to +1332
function buildHitHighlights(document: ItemDocument, matchedFields: string[], tokens: string[]): SearchHitHighlight[] {
const fieldValues = new Map(SEARCHABLE_FIELD_BUILDERS.map((builder) => [builder.name, builder.value(document)]));
const highlights: SearchHitHighlight[] = [];
for (const field of matchedFields) {
const value = fieldValues.get(field);
if (value === undefined) {
continue;
}
const snippet = highlightFieldSnippet(value, tokens);
if (snippet !== null) {
highlights.push({ field, snippet });
}
}
return highlights;
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

medium

Evaluating all 12 field builders in SEARCHABLE_FIELD_BUILDERS for every single search hit is highly inefficient, especially since fields like comments, notes, learnings, and plan perform expensive array mapping, corpus building, and string joining. Since matchedFields typically contains only a few fields, we should lazily evaluate only the builders for the fields that actually matched.

Suggested change
function buildHitHighlights(document: ItemDocument, matchedFields: string[], tokens: string[]): SearchHitHighlight[] {
const fieldValues = new Map(SEARCHABLE_FIELD_BUILDERS.map((builder) => [builder.name, builder.value(document)]));
const highlights: SearchHitHighlight[] = [];
for (const field of matchedFields) {
const value = fieldValues.get(field);
if (value === undefined) {
continue;
}
const snippet = highlightFieldSnippet(value, tokens);
if (snippet !== null) {
highlights.push({ field, snippet });
}
}
return highlights;
}
function buildHitHighlights(document: ItemDocument, matchedFields: string[], tokens: string[]): SearchHitHighlight[] {
const highlights: SearchHitHighlight[] = [];
for (const field of matchedFields) {
const builder = SEARCHABLE_FIELD_BUILDERS.find((b) => b.name === field);
if (builder === undefined) {
continue;
}
const value = builder.value(document);
const snippet = highlightFieldSnippet(value, tokens);
if (snippet !== null) {
highlights.push({ field, snippet });
}
}
return highlights;
}

Comment on lines +1268 to +1275
function markTokenRuns(text: string, tokens: string[]): string {
const escaped = tokens.filter((token) => token.length > 0).map(escapeRegExpLiteral);
if (escaped.length === 0) {
return text;
}
const pattern = new RegExp(escaped.join("|"), "gi");
return text.replace(pattern, (match) => `${HIGHLIGHT_OPEN}${match}${HIGHLIGHT_CLOSE}`);
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

medium

When joining tokens with | in a regular expression, shorter tokens that are prefixes of longer tokens (e.g., auth and authority) can eagerly match first and prevent the longer token from being fully highlighted (resulting in «auth»ority instead of «authority»). Sorting the escaped tokens by length in descending order ensures that the longest possible match is always preferred.

function markTokenRuns(text: string, tokens: string[]): string {
  const escaped = tokens
    .filter((token) => token.length > 0)
    .map(escapeRegExpLiteral)
    .sort((a, b) => b.length - a.length);
  if (escaped.length === 0) {
    return text;
  }
  const pattern = new RegExp(escaped.join("|"), "gi");
  return text.replace(pattern, (match) => HIGHLIGHT_OPEN + match + HIGHLIGHT_CLOSE);
}

@gemini-code-assist

Copy link
Copy Markdown

Warning

You have reached your daily quota limit. Please wait up to 24 hours and I will start processing your requests again!

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 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 `@docs/COMMANDS.md`:
- Around line 143-153: The section header for "Inline filter syntax and
matched-text highlighting (GH-157)" in COMMANDS.md is missing a tracker
reference that is present in the corresponding CHANGELOG.md entry. Add the
tracker reference (matching the one used in CHANGELOG.md) to the section header
in COMMANDS.md to align the documentation with the changelog and follow the
established pattern for new documentation sections that have associated pm
items.
🪄 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: Repository UI (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro

Run ID: d2ee1ed2-04b7-4b62-aaa1-bfa10df607c0

📥 Commits

Reviewing files that changed from the base of the PR and between cb7f313 and 9226a1f.

📒 Files selected for processing (15)
  • .agents/pm/features/pm-ldr1.toon
  • .agents/pm/history/pm-28cf.jsonl
  • .agents/pm/history/pm-ldr1.jsonl
  • .agents/pm/issues/pm-28cf.toon
  • CHANGELOG.md
  • docs/COMMANDS.md
  • src/cli/commands/completion.ts
  • src/cli/commands/search.ts
  • src/cli/register-list-query.ts
  • src/cli/registration-helpers.ts
  • src/sdk/cli-contracts.ts
  • src/sdk/cli-contracts/tool-parameter-tables.ts
  • tests/fixtures/contracts/full.json
  • tests/unit/cli/registration-helpers.spec.ts
  • tests/unit/commands/search-command.spec.ts

Comment thread docs/COMMANDS.md Resolved
- markTokenRuns: sort tokens length-descending before building the regex
  alternation so a longer token (authority) is never shadowed by a prefix
  token (auth) — fixes «auth»ority -> «authority» (Gemini).
- buildHitHighlights: resolve matched fields via a module-level
  name->builder map and evaluate ONLY the matched fields' extractors,
  instead of materializing all twelve per hit (Gemini perf).
- docs(COMMANDS.md): add pm-ldr1 tracker reference to the new section
  header (CodeRabbit).

Declined Gemini's "explicit --priority missing" finding: --priority is
already registered (register-list-query), normalized
(normalizeSearchOptions), and in SEARCH_FLAG_CONTRACTS; precedence
verified live (flag wins, warning emitted) — false positive.

100/100/100/100 coverage, 81 search tests + full suite green, static +
contracts gates pass.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WPY4oWVsYs2FjZ6shgUyrL
@unbraind

Copy link
Copy Markdown
Owner Author

Thanks for the reviews — pushed 936a199 addressing the feedback:

  • markTokenRuns prefix shadowing (Gemini): fixed — tokens are now sorted length-descending before the regex alternation, so authority is no longer shadowed by auth («authority» not «auth»ority). Added a regression test.
  • buildHitHighlights perf (Gemini): fixed — matched fields now resolve via a module-level name→builder map and only the matched fields' extractors are evaluated, instead of materializing all twelve per hit.
  • COMMANDS.md tracker reference (CodeRabbit): added pm-ldr1 to the new section header.
  • Explicit --priority missing (Gemini, high): respectfully declining — this is a false positive. --priority is already registered in register-list-query.ts (search command), normalized in normalizeSearchOptions, and present in SEARCH_FLAG_CONTRACTS. Precedence was verified live: pm search 'alpha priority:3' --priority 1 yields filters.priority=1 with search_inline_filter_ignored:priority:flag_takes_precedence.

Coverage remains 100/100/100/100; static + contracts gates pass.

@coderabbitai full review
@gemini-code-assist review
@codex review

@gemini-code-assist

Copy link
Copy Markdown

Warning

You have reached your daily quota limit. Please wait up to 24 hours and I will start processing your requests again!

@chatgpt-codex-connector

Copy link
Copy Markdown

To use Codex here, create a Codex account and connect to github.

@coderabbitai

coderabbitai Bot commented Jun 18, 2026 •

Copy link
Copy Markdown

@unbraind: Thanks for the detailed summary of the fixes! The markTokenRuns length-descending sort and the buildHitHighlights module-level map are solid improvements. The --priority precedence explanation is clear and convincing. Kicking off a fresh full review of commit 936a1994.

✅ Action performed

Full review finished.

@unbraind
unbraind merged commit fa494bb into main Jun 18, 2026
15 checks passed
@unbraind
unbraind deleted the feat/search-inline-query-highlight branch June 18, 2026 23:00
unbraind added a commit that referenced this pull request Jun 18, 2026
Documents that the 2026-06-18 Auto Release failure ran pre-fix code
(push-retry landed in bf35af2 hours later), the current-main dry-run is
fully green, the telemetry stack is healthy (15k events/24h), and Sentry
shows no new errors from PR #290.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WPY4oWVsYs2FjZ6shgUyrL
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