Commit Graph
520 Commits
Author SHA1 Message Date
12f8e134ff test(autoe2e): generated E2E tests for #11813 (logs-visualize-persistence) (#13010)
🤖 Auto-generated E2E tests for #11813 — **healed to passing** against a
live OpenObserve before this PR was opened.

- Branch `autoe2e/pr-11813` (stacked on `main`), so the tests run
against the feature code and pass before it merges.
- Spec:
`tests/ui-testing/playwright-tests/Logs/logsVisualizePersistence.spec.js`

The repo Playwright CI re-validates here. Review is for **quality +
coverage** — the tests already pass.

_Generated by the E2E Council pipeline._


**Test cases added / changed:**

| Test case | Type | What it verifies |
|---|---|---|
| `should persist live mode / auto-run toggle across navigation` |
extend | live-mode toggle state-guard added before navigation to catch
silent no-op when auto_query_enabled is false |

---------

Co-authored-by: Shrinath-O2 <214651540+Shrinath-O2@users.noreply.github.com>
Co-authored-by: Hengfei Yang <hengfei.yang@gmail.com>
2026-07-10 10:12:34 +00:00
Bhargav 223a748b9f fix: translation workflow improved (#13091) 2026-07-08 08:30:55 +00:00
ktx-akshay 816e920cf4 test: add E2E coverage for dashboard table column formatting & filtering (#13057)
## Test Coverage — Dashboard Table Column Formatting & Filtering (PR
#12531)

### Column Formatting

| # | Test | Coverage |
|---|------|----------|
| 1 | Field type override | Auto-detected numeric column shows Value
Formatting + Conditional Styling sections; forcing "text" hides them;
forcing "num" restores them |
| 2 | Custom unit | Custom unit input appears when unit = Custom; value
persists after save + reopen |
| 3 | Text/background color | Configured text & background color render
correctly on the table cell |
| 4 | Conditional styling | Two rules with non-overlapping thresholds
prove genuine per-row, order-sensitive, last-match-wins rule evaluation
|
| 5 | Alignment | Changing alignment (Center) updates the cell's content
justification |
| 6 | Auto/unique color | Distinct column values render with distinct
auto-assigned background colors |

### Column Filtering

| # | Test | Coverage |
|---|------|----------|
| 7 | Filtering toggle | Enabling "Filtering" shows a filter icon in
every column header |
| 8 | Filter by value | Selecting a value narrows the table to matching
rows; filter icon shows active state |
| 9 | Clear filter | Clearing restores all rows and resets the filter
icon |
| 10 | Filter search | Typing in the search box narrows the value list
to a "no matches" placeholder |
| 11 | Filtering persistence | `table_filtering` toggle state survives
save + reopen |

### Additional Changes
- Extended `dashboard-panel-configs.js` / `dashboard-table-helpers.js`
with reusable page-object methods for column formatting and filtering
- Added `Dashboards-Charts` CI matrix entry in
`.github/workflows/playwright.yml`
2026-07-07 11:16:10 +00:00
BhargavandClaude Opus 4.8 2a3416ee35 fix: Rum automation (#13064)
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-07 10:09:16 +00:00
aed618785e ci: refine e2e gate — label always runs + skip unrelated workflow changes (#13061)
Two refinements to the `e2e` label gate (Playwright + API, OSS + ENT).

## 1. Adding the `e2e` label always runs the suite

Previously the auto-bypass could override the label — add `e2e` to an
otherwise-skippable PR and nothing ran, which was confusing. Now the
label is an explicit **"run it"**: it always runs the full suite.
Without the label, the skip logic still decides.

| Event | `e2e` label | Change | Result |
|---|---|---|---|
| PR | **yes** | anything (even docs) | **run full suite** → pass/fail
on results |
| PR | no | relevant (code) | **block** (fail, "add label") |
| PR | no | skip category (docs / unrelated workflow) | **pass, no run**
|
| push / merge queue / dispatch | n/a | relevant | run |
| push / merge queue / dispatch | n/a | nothing relevant | pass, no run
|

Gate flips from `has_changes && (non-PR || label)` to `(PR && label) ||
(non-PR && has_changes)`; the summary is reworked to match.

## 2. Unrelated workflow changes no longer require e2e

`check_changes` treated **any** `.github/workflows/**` change as
relevant, so a Dependabot bump to an unrelated workflow
(openobserve#13060, `update-translations.yml`) demanded the label. Now
workflow files are bypassed by default; only a change to the suite's
**own** workflow (`playwright.yml` / `api-testing.yml`) triggers it.
Implemented with captured non-ignored lines instead of `grep -qv`
(portable across grep builds).

## Note

This PR changes `playwright.yml` + `api-testing.yml`, so it correctly
**needs the `e2e` label** to run. Sibling PR on the other repo uses the
same branch `ci/e2e-skip-unrelated-workflows`.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Hengfei Yang <hengfei.yang@gmail.com>
2026-07-07 04:57:23 +00:00
dependabot[bot]andHengfei Yang 48b3f1f58a chore(deps): bump peter-evans/create-pull-request from 7 to 8 (#13060)
Bumps
[peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request)
from 7 to 8.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/peter-evans/create-pull-request/releases">peter-evans/create-pull-request's
releases</a>.</em></p>
<blockquote>
<h2>Create Pull Request v8.0.0</h2>
<h2>What's new in v8</h2>
<ul>
<li>Requires <a
href="https://github.com/actions/runner/releases/tag/v2.327.1">Actions
Runner v2.327.1</a> or later if you are using a self-hosted runner for
Node 24 support.</li>
</ul>
<h2>What's Changed</h2>
<ul>
<li>chore: Update checkout action version to v6 by <a
href="https://github.com/yonas"><code>@​yonas</code></a> in <a
href="https://redirect.github.com/peter-evans/create-pull-request/pull/4258">peter-evans/create-pull-request#4258</a></li>
<li>Update actions/checkout references to <a
href="https://github.com/v6"><code>@​v6</code></a> in docs by <a
href="https://github.com/Copilot"><code>@​Copilot</code></a> in <a
href="https://redirect.github.com/peter-evans/create-pull-request/pull/4259">peter-evans/create-pull-request#4259</a></li>
<li>feat: v8 by <a
href="https://github.com/peter-evans"><code>@​peter-evans</code></a> in
<a
href="https://redirect.github.com/peter-evans/create-pull-request/pull/4260">peter-evans/create-pull-request#4260</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/yonas"><code>@​yonas</code></a> made
their first contribution in <a
href="https://redirect.github.com/peter-evans/create-pull-request/pull/4258">peter-evans/create-pull-request#4258</a></li>
<li><a href="https://github.com/Copilot"><code>@​Copilot</code></a> made
their first contribution in <a
href="https://redirect.github.com/peter-evans/create-pull-request/pull/4259">peter-evans/create-pull-request#4259</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/peter-evans/create-pull-request/compare/v7.0.11...v8.0.0">https://github.com/peter-evans/create-pull-request/compare/v7.0.11...v8.0.0</a></p>
<h2>Create Pull Request v7.0.11</h2>
<h2>What's Changed</h2>
<ul>
<li>fix: restrict remote prune to self-hosted runners by <a
href="https://github.com/peter-evans"><code>@​peter-evans</code></a> in
<a
href="https://redirect.github.com/peter-evans/create-pull-request/pull/4250">peter-evans/create-pull-request#4250</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/peter-evans/create-pull-request/compare/v7.0.10...v7.0.11">https://github.com/peter-evans/create-pull-request/compare/v7.0.10...v7.0.11</a></p>
<h2>Create Pull Request v7.0.10</h2>
<p>⚙️ Fixes an issue where updating a pull request failed when targeting
a forked repository with the same owner as its parent.</p>
<h2>What's Changed</h2>
<ul>
<li>build(deps): bump the github-actions group with 2 updates by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/peter-evans/create-pull-request/pull/4235">peter-evans/create-pull-request#4235</a></li>
<li>build(deps-dev): bump prettier from 3.6.2 to 3.7.3 in the npm group
by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/peter-evans/create-pull-request/pull/4240">peter-evans/create-pull-request#4240</a></li>
<li>fix: provider list pulls fallback for multi fork same owner by <a
href="https://github.com/peter-evans"><code>@​peter-evans</code></a> in
<a
href="https://redirect.github.com/peter-evans/create-pull-request/pull/4245">peter-evans/create-pull-request#4245</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/obnyis"><code>@​obnyis</code></a> made
their first contribution in <a
href="https://redirect.github.com/peter-evans/create-pull-request/pull/4064">peter-evans/create-pull-request#4064</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/peter-evans/create-pull-request/compare/v7.0.9...v7.0.10">https://github.com/peter-evans/create-pull-request/compare/v7.0.9...v7.0.10</a></p>
<h2>Create Pull Request v7.0.9</h2>
<p>⚙️ Fixes an <a
href="https://redirect.github.com/peter-evans/create-pull-request/issues/4228">incompatibility</a>
with the recently released <code>actions/checkout@v6</code>.</p>
<h2>What's Changed</h2>
<ul>
<li>~70 dependency updates by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a></li>
<li>docs: fix workaround description about <code>ready_for_review</code>
by <a href="https://github.com/ybiquitous"><code>@​ybiquitous</code></a>
in <a
href="https://redirect.github.com/peter-evans/create-pull-request/pull/3939">peter-evans/create-pull-request#3939</a></li>
<li>Docs: <code>add-paths</code> default behavior by <a
href="https://github.com/joeflack4"><code>@​joeflack4</code></a> in <a
href="https://redirect.github.com/peter-evans/create-pull-request/pull/3928">peter-evans/create-pull-request#3928</a></li>
<li>docs: update to create-github-app-token v2 by <a
href="https://github.com/Goooler"><code>@​Goooler</code></a> in <a
href="https://redirect.github.com/peter-evans/create-pull-request/pull/4063">peter-evans/create-pull-request#4063</a></li>
<li>Fix compatibility with actions/checkout@v6 by <a
href="https://github.com/ericsciple"><code>@​ericsciple</code></a> in <a
href="https://redirect.github.com/peter-evans/create-pull-request/pull/4230">peter-evans/create-pull-request#4230</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/joeflack4"><code>@​joeflack4</code></a>
made their first contribution in <a
href="https://redirect.github.com/peter-evans/create-pull-request/pull/3928">peter-evans/create-pull-request#3928</a></li>
<li><a href="https://github.com/Goooler"><code>@​Goooler</code></a> made
their first contribution in <a
href="https://redirect.github.com/peter-evans/create-pull-request/pull/4063">peter-evans/create-pull-request#4063</a></li>
<li><a
href="https://github.com/ericsciple"><code>@​ericsciple</code></a> made
their first contribution in <a
href="https://redirect.github.com/peter-evans/create-pull-request/pull/4230">peter-evans/create-pull-request#4230</a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/peter-evans/create-pull-request/commit/5f6978faf089d4d20b00c7766989d076bb2fc7f1"><code>5f6978f</code></a>
fix: retry post-creation API calls on 422 eventual consistency errors
(<a
href="https://redirect.github.com/peter-evans/create-pull-request/issues/4356">#4356</a>)</li>
<li><a
href="https://github.com/peter-evans/create-pull-request/commit/d32e88dac789dcc7906e7d26f69f24116fa9c97d"><code>d32e88d</code></a>
build(deps-dev): bump the npm group with 3 updates (<a
href="https://redirect.github.com/peter-evans/create-pull-request/issues/4349">#4349</a>)</li>
<li><a
href="https://github.com/peter-evans/create-pull-request/commit/8170bccad11c0df62542c04dcaefe36d342dfd39"><code>8170bcc</code></a>
build(deps-dev): bump handlebars from 4.7.8 to 4.7.9 (<a
href="https://redirect.github.com/peter-evans/create-pull-request/issues/4344">#4344</a>)</li>
<li><a
href="https://github.com/peter-evans/create-pull-request/commit/00418193b417f888dbf1d993c5c0d31d27fdc7de"><code>0041819</code></a>
build(deps): bump picomatch (<a
href="https://redirect.github.com/peter-evans/create-pull-request/issues/4339">#4339</a>)</li>
<li><a
href="https://github.com/peter-evans/create-pull-request/commit/b993918c8536b6d44706130734d5456879762b27"><code>b993918</code></a>
build(deps-dev): bump flatted from 3.3.1 to 3.4.2 (<a
href="https://redirect.github.com/peter-evans/create-pull-request/issues/4334">#4334</a>)</li>
<li><a
href="https://github.com/peter-evans/create-pull-request/commit/36d7c8468b48f9c2f8f29e260e82f10d4b90d2bd"><code>36d7c84</code></a>
build(deps-dev): bump undici from 6.23.0 to 6.24.0 (<a
href="https://redirect.github.com/peter-evans/create-pull-request/issues/4328">#4328</a>)</li>
<li><a
href="https://github.com/peter-evans/create-pull-request/commit/a45d1fb447fcaf601166e405fd4f335cde1a8aa8"><code>a45d1fb</code></a>
build(deps): bump <code>@​tootallnate/once</code> and
jest-environment-jsdom (<a
href="https://redirect.github.com/peter-evans/create-pull-request/issues/4323">#4323</a>)</li>
<li><a
href="https://github.com/peter-evans/create-pull-request/commit/3499eb61835cc0015c0b786e203d74b1e8f55e43"><code>3499eb6</code></a>
build(deps): bump the github-actions group with 2 updates (<a
href="https://redirect.github.com/peter-evans/create-pull-request/issues/4316">#4316</a>)</li>
<li><a
href="https://github.com/peter-evans/create-pull-request/commit/3f3b473b8c148f5a7520efb4d1f9a70eea3d9d1f"><code>3f3b473</code></a>
build(deps): bump minimatch (<a
href="https://redirect.github.com/peter-evans/create-pull-request/issues/4311">#4311</a>)</li>
<li><a
href="https://github.com/peter-evans/create-pull-request/commit/6699836a213cf8b28c4f0408a404a6ac79d4458a"><code>6699836</code></a>
build(deps-dev): bump the npm group with 2 updates (<a
href="https://redirect.github.com/peter-evans/create-pull-request/issues/4305">#4305</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/peter-evans/create-pull-request/compare/v7...v8">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=peter-evans/create-pull-request&package-manager=github_actions&previous-version=7&new-version=8)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Hengfei Yang <hengfei.yang@gmail.com>
2026-07-07 03:21:50 +00:00
Bhargav 9cbc586ca4 fix: rmum datasources cdn integration (#13039) 2026-07-04 12:43:03 +00:00
Shrinath RaoandClaude Opus 4.8 df68a26fcf ci: drop redundant post-merge runs, gate regression on main changes (#13024)
## Why

Our OSS Playwright + API CI compute (ubicloud build + eks matrix) is a
major cost driver. Two sources of avoidable spend:

1. **Every merged PR ran the full heavy suite up to 3×** — on the PR
(label-gated), in the merge queue (`merge_group`), and *again* on `push:
main`. The `push: main` run is a duplicate of the `merge_group` run
(both build/test the exact commit landing on main) **and** it bypasses
the `e2e` label gate, clawing back the gate's savings.
2. **Regression runs every 4h regardless of whether `main` moved** —
rebuilding and re-running the full matrix on identical code
overnight/weekends.

## Changes

**`playwright.yml` + `api-testing.yml`**
- Remove the `push: main` trigger. `merge_group` remains the trusted
main-ward validation.
- **Cache fix (important):** the Rust cache was only *saved* on `push:
main` runs (`save-if: github.ref == 'refs/heads/main'`). Deleting `push`
alone would stop the cache ever refreshing → cold builds → *more*
compute. So `save-if` now also fires on the `merge_group` run, which
builds the exact soon-to-be-main commit.

**`playwright_regression.yml`**
- New `check_main_changed` gate: compares `main`'s HEAD to the last
run's `head_sha` and skips build+matrix when nothing merged since.
Manual `workflow_dispatch` always runs. The skip cascades cleanly
(`playwright_summary` already treats skipped build/ui as success → stays
green).

## Impact
- ~1 full build + 146-shard matrix eliminated per merged PR (the
`push:main` duplicate).
- Idle-period regression runs (no merges) skipped instead of running the
full matrix.
- No coverage loss: merge queue still gates every merge; cache stays
warm.

## Not in this PR (deferred per discussion)
- `db-testing.yml` / `unit-tests.yml` `push:main` removal (cheaper,
later).
- ENT merge-queue adoption.
- OSS→ENT dispatch (semgrep / endpoint-auth-probe) gating.

Paired ENT change (regression gate): openobserve/o2-enterprise
`ci/trim-redundant-runs`.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-03 11:41:52 +00:00
Shrinath RaoandClaude Opus 4.8 62a8f3f30b ci: gate Playwright + API tests behind an 'e2e' label + auto-bypass non-code changes (#13014)
## What

Gate the full **Playwright (UI)** and **API** test suites on PRs behind
a single **`e2e` label**, and **auto-bypass** PRs that only touch files
which can't affect those suites. Covers `playwright.yml` and
`api-testing.yml`.

## Behaviour (both suites)

| Situation | build/test jobs | summary check (`playwright_summary` /
`api_tests_summary`) | Mergeable? |
|---|---|---|---|
| PR with `e2e` label | full suite runs | green if tests pass | ✅ if
green |
| PR, no label, relevant code changed | skipped | **fails** ("add `e2e`
label") | ❌ blocked |
| PR, no label, docs/meta only | skipped | **passes** (auto-bypass) | ✅
|
| Remove the `e2e` label | skipped (fresh run) | **fails** again | ❌
until re-added |
| push to `main` / merge queue / dispatch | full suite runs | green if
tests pass | n/a |

One `e2e` label runs **both** UI + API. `push`, `merge_group`, and
`workflow_dispatch` are never label-gated.

## Why the gate lives in the summary job

A job that `if:`-skips reports `skipped`, which branch protection treats
as **pass**. So a no-label PR can't be blocked by merely skipping jobs —
the summary job **actively fails** when the change is relevant and the
`e2e` label is absent.

## Auto-bypass (`check_changes`)

No label needed for: `*.md/.mdx/.markdown/.rst/.adoc`, `docs/`,
images/media, `LICENSE/NOTICE/AUTHORS/CONTRIBUTORS/CHANGELOG/.mailmap`,
`CODEOWNERS`, GitHub issue/PR/funding templates,
`dependabot`/`renovate`,
`.gitignore/.gitattributes/.editorconfig/.gitkeep/.husky/.vscode/.idea`.
The **API** workflow additionally bypasses `web/` + UI-test dirs
(frontend changes don't affect API tests).

**Not** bypassed (still trigger): `.github/workflows/**` (incl. these
workflow files), source, `package*.json`/lockfiles, configs, `*.txt`.

## Rollout prerequisites

- Create the **`e2e`** label in this repo.
- Required status checks = **`playwright_summary`** and
**`api_tests_summary`** — the individual shard jobs must NOT be required
(they legitimately skip and would auto-pass).

Sibling PR on the other repo uses the same branch `ci/e2e-label-gate`.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-03 08:41:01 +00:00
Shrinath RaoandClaude Opus 4.8 b36e7ce97d ci: add vamsikarthikr to team CI allowlists (#12997)
Adds new team member **@vamsikarthikr** to the OSS CI allowlists:

- `.github/workflows/auto-assign-metadata.yml` — his PRs/issues get
auto-assigned + milestoned like the rest of the engineering team.
- `.github/workflows/query-agent.yml` — he can run `/query-agent` and
`/qa-generate`.

Allowlist entries only — no logic change. Sister PR (o2-enterprise#2085)
adds him to the ENT auto-assign + codegen-council allowlists.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-03 07:40:06 +00:00
Shrinath RaoandShrinath-O2 ffb50b8345 test(autoe2e): generated E2E tests for #11814 (report-csv-media-type) (#13008)
🤖 Auto-generated E2E tests for #11814 — **healed to passing** against a
live OpenObserve before this PR was opened.

- Branch `autoe2e/pr-11814` (stacked on `main`), so the tests run
against the feature code and pass before it merges.
- Spec:
`tests/ui-testing/playwright-tests/Reports/reportCsvMediaType.spec.js`

The repo Playwright CI re-validates here. Review is for **quality +
coverage** — the tests already pass.

_Generated by the E2E Council pipeline._


**Test cases added / changed:**

| Test case | Type | What it verifies |
|---|---|---|
| `CSV option is visible in the Report Type dropdown` | new | the CSV
(Data) option appears in the report type OSelect dropdown |
| `Selecting CSV hides Attachment Type and Custom Dimensions` | new |
selecting CSV hides the email attachment type dropdown and custom
dimensions section |
| `Save a report with CSV type succeeds` | new | a full create-report
flow with CSV type completes and the report appears in the list |
| `Switching from CSV back to PDF restores Attachment Type and Custom
Dimensions` | new | toggling from CSV to PDF re-displays the attachment
type and custom dimensions controls |
| `Selecting PNG type shows PNG warning banner` | new | selecting PNG as
the report type displays the PNG deprecation warning banner |
| `Edit mode: a previously saved CSV report shows CSV as selected and
controls hidden` | new | editing a CSV report reflects CSV as selected
and keeps attachment type + dimensions hidden |

---------

Co-authored-by: Shrinath-O2 <214651540+Shrinath-O2@users.noreply.github.com>
2026-07-03 06:22:38 +00:00
Shrinath RaoandClaude Opus 4.8 81e2d7a42f test: heal E2E regressions + ENT shard failures from scoped SCSS removal (#12764) & OTag refactors (#12999)
## What this fixes

The scheduled **regression suite** started failing on `main` after
**#12764 (scoped scss styles removal)**, and validating the fix on the
**enterprise build** surfaced several more failures in the same family
(plus a couple unrelated ones). This PR heals **all of them**. Every fix
is either a page-object selector update or a small, inert `data-test`
hook — **no product behaviour changes**.

## Everything fixed

| Area | Test | Root cause | Fix | Verified |
|---|---|---|---|---|
| **Streams** regression | `query expand icon #9337` | #12764 replaced
`.editor-fullscreen` class with inline classes on `isFocused` |
`data-fullscreen` hook on the container + detect via it | ✅ local |
| **Alerts** regression | `Bug #9967 PromQL alert` | #12764 turned the
PromQL operator into `<OSelect
data-test="alert-threshold-operator-select">`, dropping
`.alert-v3-select` | data-test + popover-option pattern (+ fail-fast
fallback) | ✅ local |
| **RUM** (ENT) | 3× `sourcemap-ui` | #12764 moved
`.error-viewer-container` → data-test and dropped `.tags-title` |
rumPage selectors + `data-test="error-tags-title"` hook | ✅ local |
| **Logs-Features** (ENT) | `searchPatterns … wildcard chips` | chip
moved from `.wildcard-chip` class to `<OTag
data-test="pattern-card-wildcard-chip">` | target the data-test hook | ✅
local |
| **Traces** (ENT) | `service-graph` user/search-service status | health
badge moved from `.health-badge.<status>` classes to `<OTag
data-test="service-health-badge">` | read status from the badge's text |
⚙️ ENT CI¹ |
| **Dashboards-Core** | `line chart … camelCase zero values` | *(not
#12764)* a line chart whose series are entirely zero renders "No Data" |
one series counts all rows so the chart always renders | ✅ local |

¹ Traces service-graph needs an enterprise daemon that isn't available
locally; validated against the component's own unit spec
(`ServiceGraphNodeSidePanel.spec.ts`), confirmed on ENT CI.

## Root-cause themes
1. **#12764 (scoped SCSS removal)** deleted/renamed CSS classes that E2E
page objects targeted. It added `data-test` hooks to *some* elements but
not others — so tests anchored on bare `.class` selectors broke. The fix
everywhere is to move those anchors to durable `data-test` hooks.
2. **`OTag`/`OSelect` component migrations on `main`** continued this:
the components gained `data-test` hooks but the (enterprise-only) page
objects were never updated. Because those specs are `@enterprise`, OSS
CI never runs them — so they merged broken and only surfaced on the
enterprise build.

## Product-code touched (test hooks only, inert)
- `SearchBar.vue` — `data-fullscreen` attribute (no CSS/JS/snapshot
consumers; styling still driven by the existing `isFocused` class
binding)
- `ErrorTags.vue` — `data-test="error-tags-title"`

Everything else is under `tests/ui-testing/`.

## Verification
Verified locally against a fresh frontend build (all green): Streams
`#9337`, Alerts `#9967`, RUM (3), Dashboards-Core, Logs-Features
searchPatterns. Traces service-graph is validated via its component unit
spec + the enterprise CI run (it can't run locally without the
service-graph daemon).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-02 14:40:10 +00:00
Neha PandClaude Opus 4.7 7ad182b167 test(test-assist-ci): vision-preprocessor fixture + caller filter fix (#12973)
Consolidated OSS-side changes for the vision preprocessor rollout. Two
things bundled here — both small, both OSS-only, related by "unblocks
test-assist real-issue verification."

## Change 1 — Caller filter fix (originally in #12972, now closed)

**One-line fix** for `.github/workflows/test-assist-caller.yml`:

```yaml
# BEFORE — broken (silently skipped every /verify-bug comment on real issues)
github.event.issue.pull_request == null

# AFTER — truthy negation, evaluates correctly for undefined fields
!github.event.issue.pull_request
```

Yesterday: 5 `/verify-bug` comments on real issues (#12452, #12647,
#12603, #12820, #11700 — all by @neha00290, MEMBER association) produced
5 caller runs with `conclusion: skipped` and empty steps arrays. Root
cause: `== null` compared against an *undefined* field in GHA expression
context returns unexpected results → the entire OR short-circuited to
false.

The council caller uses the truthy check in the opposite direction
(`github.event.issue.pull_request` alone → *requires* a PR). We use the
negation of the same pattern — proven, works.

## Change 2 — Vision preprocessor fixture
(`bug-002-image-attachment.json`)

Adds fixture #90002 whose repro info lives **entirely in an image
attachment**:
- body has `Steps to Reproduce: _No response_`
- body embeds a stable github.com/user-attachments/... permalink
(streams-page screenshot from real bug #11700)

Pairs with the ENT-side vision preprocessor PR (adds extract-attachments
+ describe-via-GLM-4.6V-Flash steps before Analyst). Success = pipeline
extracts the image, GLM describes it, Analyst uses the description →
produces `area: Streams` + `testability >= MEDIUM` instead of skipping
for "no repro steps."

`expected-verdicts.json` updated with the pipeline-signal expectations
for #90002.

## Why bundled

Both changes unblock real-bug verification. The caller fix means
`/verify-bug` starts dispatching; the fixture proves the vision
preprocessor works on visual-only bugs. Reviewing them together is
faster than in isolation.

## Test plan

- [x] YAML parses; fixture JSON valid; expected-verdicts JSON valid
- [ ] After merge (this + ENT PR): comment `/verify-bug` on any
Needs-Testing issue → expect caller job to RUN (not skip) → engine
dispatched
- [ ] After merge: dispatch fixture 90002 via workflow_dispatch →
confirm vision preprocessor produces non-empty
`bug-90002-attachments.md` → confirm Analyst produces `area: Streams` +
non-SKIP testability

Closes #12972.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-07-01 14:46:20 +00:00
Yashodhan JoshiandYashodhan Joshi 86fc9973c1 ci: revert the env specification in package.json (#12974)
~Powershell is ... weird~
~bash good.~

No no, no no no, this time maybe windows was  right and I was wrong.

---------

Signed-off-by: Yashodhan Joshi <yjdoc2@gmail.com>
Co-authored-by: Yashodhan Joshi <yjdoc2@gmail.com>
2026-07-01 18:41:48 +05:30
Neha PandClaude Sonnet 4.6 ee008d661a test: convert query-agent to thin caller (engine in o2-enterprise) (#12853)
## Summary

- Thin caller (~70 lines) that watches OSS PRs and forwards to the
reusable engine in \`o2-enterprise\`
- Replaced the old self-contained 374-line workflow — all real logic
(triage, build, test, generation) lives in the ENT engine
- Running as \`workflow_call\` means the engine executes in OSS context
(OSS \`GITHUB_TOKEN\`) — so it can comment on OSS PRs, push \`autoqa/*\`
branches, and open OSS PRs without a cross-repo token
- Input validation job guards the \`workflow_dispatch\` path (numeric
\`pr_number\` check) before forwarding to the engine
- ENT engine is pinned to a specific commit SHA (supply-chain safety —
no floating \`@main\`)

## Entry points

| Comment | Phase | Action |
|---|---|---|
| \`/query-agent\` | A | Run existing 675+ SQL regression suite |
| \`/qa-generate\` | A + B | Run regression suite AND generate new SQL
queries, open autoqa PR |
| \`workflow_dispatch\` | A or B | Manual trigger via
\`generation_mode\` choice |

## What lives where

| Thing | Repo | Why |
|---|---|---|
| Caller workflow | OSS | Triggers from OSS PR comments |
| Engine workflow | ENT | All logic, private |
| Agent prompt files (qa-ci-\*) | ENT | Private — never exposed in
public OSS repo |
| Generated test files (\`queries/\*.json\`) | OSS | OSS SQL regression
tests run in ENT CI |
| \`compute_counts.py\`, \`data_gen.py\` | OSS | Test data generation
scripts |

## Related

- Engine PR (o2-enterprise):
https://github.com/openobserve/o2-enterprise/pull/1988
- Supersedes: #12749 (standalone Phase B workflow — logic moved to ENT
engine)

## Merge order

ENT PR #1988 must merge first. After merge, update the SHA pin on line
84 of this file to the new ENT \`main\` commit, then merge this PR.

## Test plan
- [ ] \`/query-agent\` comment on an OSS PR triggers Phase A via the
engine; triage comment appears on the OSS PR
- [ ] \`/qa-generate\` comment triggers Phase A + B; an \`autoqa/pr-N\`
PR is opened in OSS with new query JSON files
- [ ] \`workflow_dispatch\` with \`dry_run=true\` runs triage only, no
tests
- [ ] Non-integer \`pr_number\` in \`workflow_dispatch\` is rejected
before forwarding

🤖 Generated with [Claude Code](https://claude.ai/claude-code)

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-01 06:23:09 +00:00
Neha PandClaude Opus 4.7 ea039d0940 ci: add test-assist-ci caller + fixture data (#12946)
## Summary

Thin OSS caller for the upcoming **Test-Assist** automated
bug-verification pipeline — first piece of a 3-PR rollout. Mirrors the
existing [`docgen-caller.yml`](.github/workflows/docgen-caller.yml) and
[`e2e-council-caller.yml`](.github/workflows/e2e-council-caller.yml)
patterns: the heavy engine will live in `o2-enterprise`; this caller
only gates the trigger and dispatches via `ORG_ADMIN_TOKEN`.

- **`.github/workflows/test-assist-caller.yml`** — caller workflow with
two doors (`workflow_dispatch` + `/verify-bug` issue comments by org
members). Defaults to `fixture_mode=true` / `write_mode=false` so the
engine can't post to real issues until explicitly flipped.
- **`tests/test-data/test-assist-ci/`** — fixture issue (#90001) + log
seed data + `expected-verdicts.json` contract. Lets the engine soak in
`FIXTURE_MODE=true` against synthetic data without touching real
`Needs-Testing` issues.
- **`tests/ui-testing/.gitignore`** — adds `_ci_tmp/` for the throwaway
specs the engine generates per run.

### Differences from docgen / e2e-council callers

| Dimension | docgen / e2e-council | test-assist |
|---|---|---|
| Operates on | PRs | **Issues** (`.issue.pull_request` filter dropped)
|
| Comment trigger | `/docgen`, `/e2e` | `/verify-bug` |
| Inputs | pr_number, dry_run | issue_number, **fixture_mode**,
**write_mode** |
| Default safety | dry_run=true on comment | write_mode=false on every
door |

### Rollout sequencing

1. **This PR** — OSS caller + fixtures + gitignore (no engine yet →
caller will 404 on dispatch; intentional)
2. **Follow-up ENT PR** —
`o2-enterprise/.opencode/agents/test_assist_ci/` (6 opencode sub-agents
+ README)
3. **Follow-up ENT PR** —
`o2-enterprise/.github/workflows/test-assist.yml` (the engine itself)

## Test plan

- [ ] CI: workflow YAML parses (verified locally via `python3 -c "import
yaml; yaml.safe_load(open(...))"` — passes)
- [ ] After ENT engine PR merges: trigger via `workflow_dispatch` with
default inputs (`issue_number=90001`, `fixture_mode=true`,
`write_mode=false`) → expect engine ack + fixture verdict in job
summary, **no** GitHub writes
- [ ] After soak: trigger `workflow_dispatch` with `fixture_mode=false`
on a hand-picked `Needs-Testing` issue, `write_mode=false` → verdict in
summary only
- [ ] After verdict accuracy is calibrated: org member comments
`/verify-bug` on a real issue, `write_mode=true` flipped via repo vars →
comment + labels post

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-07-01 05:24:27 +00:00
Shrinath RaoandClaude Opus 4.8 34646a9cfa test: auto-rerun failed Playwright Regression jobs (#12953)
## What

Adds **Playwright Regression Tests** to the auto-rerun workflow
(`playwright-auto-rerun.yml`), so a failed regression run automatically
re-runs only its failed jobs once — matching the existing behavior for
UI tests.

## Why

Until now `playwright-auto-rerun.yml` only watched **Playwright UI
Tests**. Regression failures (often flakes) required manual re-runs.

## Change

- Added `"Playwright Regression Tests"` to the `workflow_run`
`workflows` list.

The existing `if` (`run_attempt == 1`) and `gh run rerun --failed` step
are workflow-name-agnostic, so no other changes are needed — regression
gets exactly 1 auto-retry.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 14:11:55 +00:00
Shrinath RaoandClaude Opus 4.8 6081bcd3d8 ci: split merge / TestDino / OpenObserve into separate jobs + harden merge (#12942)
## Why
The scheduled OSS regression kept failing in `Merge Reports and Upload
to TestDino` even after the reporter fix (#12939): in [run
28417106847](https://github.com/openobserve/openobserve/actions/runs/28417106847)
all 11 shards passed but `merge-reports` **bailed mid-merge** on the
`ubicloud-standard-4` runner (extracted ~4 of 10 blobs, exited 0 without
building the report). The blobs are valid 1.50.0 and merge cleanly
locally — it's a runner-resource issue. ENT's EKS runner completes the
same merge, which is why it passed there.

The job also folded merge + TestDino upload + OpenObserve metrics
together, so any hiccup cascaded.

## What
Split the one job into **three independent jobs** (in both
`playwright.yml` and `playwright_regression.yml`):

| Job | Role |
|-----|------|
| **merge_reports** | merge blobs → extract stats/flaky → upload merged
report as artifact. Bumped to `ubicloud-standard-8` + `merge-reports`
wrapped in a 3× retry. |
| **upload_testdino** | own job, only on test failure, consumes the
merged report via artifact. |
| **report_openobserve** | own job, `continue-on-error` metrics,
consumes stats/flaky via job outputs. |

`playwright_summary` now `needs:` only `[build_binary,
ui_integration_tests, merge_reports]` — **never** TestDino or
OpenObserve, so reporting plumbing can't block the run's pass/fail
signal.

Pairs with ENT `test/ci-split-report-jobs`.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 07:26:05 +00:00
Shrinath RaoandClaude Opus 4.8 43263ad45e test: fix regression Merge Reports failing with missing html-report (force reporters) (#12939)
## Did we introduce this?

**No.** This is a pre-existing fragility in the `Merge Reports and
Upload to TestDino` job of the **Playwright Regression Tests** workflow
— the `unset CI` mechanism has been there since the workflow was created
(#11669, 2026-05). It is unrelated to any test change.

## Symptom

Job fails with exit code 2 **even when all e2e shards pass** (e.g. run
[28410300804](https://github.com/openobserve/openobserve/actions/runs/28410300804/job/84183381446)
— 11/11 shards green, only Merge Reports red):

```
Contents of playwright-results:
-rw-r--r-- 1 runner runner 0 ... .gitkeep
ls: cannot access 'playwright-results/html-report/': No such file or directory
##[error]Process completed with exit code 2.
```

## Root cause

`playwright.config.js` selects reporters by `process.env.CI`:

```js
reporter: process.env.CI
  ? [['blob', { outputDir: 'blob-report' }]]
  : [['html', { outputFolder: 'playwright-results/html-report' }], ['json', { outputFile: 'playwright-results/report.json' }]]
```

The merge step depended on `unset CI` to take the html/json branch. The
runner exports `CI=true`, and `unset CI` does not reliably reach the
`merge-reports` subprocess — so the config re-selects the **`blob`**
reporter, which writes a merged `blob-report/` and **nothing** into
`playwright-results/`. The downstream `ls
playwright-results/html-report/` then exits 2.

### Reproduced locally with this run's blob artifacts
- `CI=true` + `merge-reports --config playwright.config.js` → writes
`blob-report/report.zip`, no `playwright-results/html-report/` → `ls`
exit 2 (matches CI exactly).
- Reporters forced explicitly → always writes `html-report/index.html` +
`report.json`, regardless of `CI`.

## Fix

Stop depending on `unset CI`. Force the reporters and their output paths
explicitly:

```bash
PLAYWRIGHT_HTML_OUTPUT_DIR=playwright-results/html-report \
PLAYWRIGHT_HTML_OPEN=never \
PLAYWRIGHT_JSON_OUTPUT_NAME=playwright-results/report.json \
  npx playwright merge-reports --reporter html,json ./all-blob-reports
```

Plus a guard that fails with a clear message (and lists
`all-blob-reports/`) if the expected outputs are missing — instead of
the cryptic `ls` exit 2.

## Verification (local, against this run's 10 blob artifacts)

Simulating CI (`CI=true GITHUB_ACTIONS=true`):

```
merge exit=0
GUARD: PASS
playwright-results/html-report/index.html   (717 KB)
playwright-results/report.json              (587 KB, stats: expected=75 unexpected=0 flaky=0 skipped=9)
blob-report/   → not created
```

Downstream `jq '.stats'` reads the produced `report.json` correctly.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 01:49:58 +00:00
dependabot[bot] 01f4a6cc08 chore(deps): bump actions/cache from 5 to 6 (#12936)
Bumps [actions/cache](https://github.com/actions/cache) from 5 to 6.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/actions/cache/releases">actions/cache's
releases</a>.</em></p>
<blockquote>
<h2>v6.0.0</h2>
<h2>What's Changed</h2>
<ul>
<li>Update packages, migrate to ESM by <a
href="https://github.com/Samirat"><code>@​Samirat</code></a> in <a
href="https://redirect.github.com/actions/cache/pull/1760">actions/cache#1760</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/actions/cache/compare/v5...v6.0.0">https://github.com/actions/cache/compare/v5...v6.0.0</a></p>
<h2>v5.1.0</h2>
<h2>What's Changed</h2>
<ul>
<li>Bump <code>@​actions/cache</code> to v5.1.0 - handle read-only cache
access by <a
href="https://github.com/jasongin"><code>@​jasongin</code></a> in <a
href="https://redirect.github.com/actions/cache/pull/1775">actions/cache#1775</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/actions/cache/compare/v5...v5.1.0">https://github.com/actions/cache/compare/v5...v5.1.0</a></p>
<h2>v5.0.5</h2>
<h2>What's Changed</h2>
<ul>
<li>Update ts-http-runtime dependency by <a
href="https://github.com/yacaovsnc"><code>@​yacaovsnc</code></a> in <a
href="https://redirect.github.com/actions/cache/pull/1747">actions/cache#1747</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/actions/cache/compare/v5...v5.0.5">https://github.com/actions/cache/compare/v5...v5.0.5</a></p>
<h2>v5.0.4</h2>
<h2>What's Changed</h2>
<ul>
<li>Add release instructions and update maintainer docs by <a
href="https://github.com/Link"><code>@​Link</code></a>- in <a
href="https://redirect.github.com/actions/cache/pull/1696">actions/cache#1696</a></li>
<li>Potential fix for code scanning alert no. 52: Workflow does not
contain permissions by <a
href="https://github.com/Link"><code>@​Link</code></a>- in <a
href="https://redirect.github.com/actions/cache/pull/1697">actions/cache#1697</a></li>
<li>Fix workflow permissions and cleanup workflow names / formatting by
<a href="https://github.com/Link"><code>@​Link</code></a>- in <a
href="https://redirect.github.com/actions/cache/pull/1699">actions/cache#1699</a></li>
<li>docs: Update examples to use the latest version by <a
href="https://github.com/XZTDean"><code>@​XZTDean</code></a> in <a
href="https://redirect.github.com/actions/cache/pull/1690">actions/cache#1690</a></li>
<li>Fix proxy integration tests by <a
href="https://github.com/Link"><code>@​Link</code></a>- in <a
href="https://redirect.github.com/actions/cache/pull/1701">actions/cache#1701</a></li>
<li>Fix cache key in examples.md for bun.lock by <a
href="https://github.com/RyPeck"><code>@​RyPeck</code></a> in <a
href="https://redirect.github.com/actions/cache/pull/1722">actions/cache#1722</a></li>
<li>Update dependencies &amp; patch security vulnerabilities by <a
href="https://github.com/Link"><code>@​Link</code></a>- in <a
href="https://redirect.github.com/actions/cache/pull/1738">actions/cache#1738</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/XZTDean"><code>@​XZTDean</code></a> made
their first contribution in <a
href="https://redirect.github.com/actions/cache/pull/1690">actions/cache#1690</a></li>
<li><a href="https://github.com/RyPeck"><code>@​RyPeck</code></a> made
their first contribution in <a
href="https://redirect.github.com/actions/cache/pull/1722">actions/cache#1722</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/actions/cache/compare/v5...v5.0.4">https://github.com/actions/cache/compare/v5...v5.0.4</a></p>
<h2>v5.0.3</h2>
<h2>What's Changed</h2>
<ul>
<li>Bump <code>@actions/cache</code> to v5.0.5 (Resolves: <a
href="https://github.com/actions/cache/security/dependabot/33">https://github.com/actions/cache/security/dependabot/33</a>)</li>
<li>Bump <code>@actions/core</code> to v2.0.3</li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/actions/cache/compare/v5...v5.0.3">https://github.com/actions/cache/compare/v5...v5.0.3</a></p>
<h2>v.5.0.2</h2>
<h1>v5.0.2</h1>
<h2>What's Changed</h2>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/actions/cache/blob/main/RELEASES.md">actions/cache's
changelog</a>.</em></p>
<blockquote>
<h1>Releases</h1>
<h2>How to prepare a release</h2>
<blockquote>
<p>[!NOTE]
Relevant for maintainers with write access only.</p>
</blockquote>
<ol>
<li>Switch to a new branch from <code>main</code>.</li>
<li>Run <code>npm test</code> to ensure all tests are passing.</li>
<li>Update the version in <a
href="https://github.com/actions/cache/blob/main/package.json"><code>https://github.com/actions/cache/blob/main/package.json</code></a>.</li>
<li>Run <code>npm run build</code> to update the compiled files.</li>
<li>Update this <a
href="https://github.com/actions/cache/blob/main/RELEASES.md"><code>https://github.com/actions/cache/blob/main/RELEASES.md</code></a>
with the new version and changes in the <code>## Changelog</code>
section.</li>
<li>Run <code>licensed cache</code> to update the license report.</li>
<li>Run <code>licensed status</code> and resolve any warnings by
updating the <a
href="https://github.com/actions/cache/blob/main/.licensed.yml"><code>https://github.com/actions/cache/blob/main/.licensed.yml</code></a>
file with the exceptions.</li>
<li>Commit your changes and push your branch upstream.</li>
<li>Open a pull request against <code>main</code> and get it reviewed
and merged.</li>
<li>Draft a new release <a
href="https://github.com/actions/cache/releases">https://github.com/actions/cache/releases</a>
use the same version number used in <code>package.json</code>
<ol>
<li>Create a new tag with the version number.</li>
<li>Auto generate release notes and update them to match the changes you
made in <code>RELEASES.md</code>.</li>
<li>Toggle the set as the latest release option.</li>
<li>Publish the release.</li>
</ol>
</li>
<li>Navigate to <a
href="https://github.com/actions/cache/actions/workflows/release-new-action-version.yml">https://github.com/actions/cache/actions/workflows/release-new-action-version.yml</a>
<ol>
<li>There should be a workflow run queued with the same version
number.</li>
<li>Approve the run to publish the new version and update the major tags
for this action.</li>
</ol>
</li>
</ol>
<h2>Changelog</h2>
<h3>6.1.0</h3>
<ul>
<li>Bump <code>@actions/cache</code> to v6.1.0 to pick up <a
href="https://redirect.github.com/actions/toolkit/pull/2435">actions/toolkit#2435
Handle cache write error due to read-only token</a></li>
<li>Switch redundant &quot;Cache save failed&quot; warning to debug log
in save-only</li>
</ul>
<h3>6.0.0</h3>
<ul>
<li>Updated <code>@actions/cache</code> to ^6.0.1,
<code>@actions/core</code> to ^3.0.1, <code>@actions/exec</code> to
^3.0.0, <code>@actions/io</code> to ^3.0.2</li>
<li>Migrated to ESM module system</li>
<li>Upgraded Jest to v30 and test infrastructure to be ESM
compatible</li>
</ul>
<h3>5.0.4</h3>
<ul>
<li>Bump <code>minimatch</code> to v3.1.5 (fixes ReDoS via globstar
patterns)</li>
<li>Bump <code>undici</code> to v6.24.1 (WebSocket decompression bomb
protection, header validation fixes)</li>
<li>Bump <code>fast-xml-parser</code> to v5.5.6</li>
</ul>
<h3>5.0.3</h3>
<ul>
<li>Bump <code>@actions/cache</code> to v5.0.5 (Resolves: <a
href="https://github.com/actions/cache/security/dependabot/33">https://github.com/actions/cache/security/dependabot/33</a>)</li>
<li>Bump <code>@actions/core</code> to v2.0.3</li>
</ul>
<h3>5.0.2</h3>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/actions/cache/commit/55cc8345863c7cc4c66a329aec7e433d2d1c52a9"><code>55cc834</code></a>
Merge pull request <a
href="https://redirect.github.com/actions/cache/issues/1768">#1768</a>
from jasongin/readonly-cache</li>
<li><a
href="https://github.com/actions/cache/commit/d8cd72f230726cdf4457ebb61ec1b593a8d12337"><code>d8cd72f</code></a>
Bump <code>@​actions/cache</code> to v6.1.0 - handle cache write error
due to RO token</li>
<li><a
href="https://github.com/actions/cache/commit/2c8a9bd7457de244a408f35966fab2fb45fda9c8"><code>2c8a9bd</code></a>
Merge pull request <a
href="https://redirect.github.com/actions/cache/issues/1760">#1760</a>
from actions/samirat/esm_migration_and_package_update</li>
<li><a
href="https://github.com/actions/cache/commit/e9b91fdc3fea7d79165fceb79042ef45c2d51023"><code>e9b91fd</code></a>
Prettier fixes</li>
<li><a
href="https://github.com/actions/cache/commit/e4884b8ff7f92ef6b52c79eda480bbc86e685adb"><code>e4884b8</code></a>
Rebuild dist</li>
<li><a
href="https://github.com/actions/cache/commit/10baf0191a3c426ea0fa4a3253a5c04233b6e18f"><code>10baf01</code></a>
Fixed licenses</li>
<li><a
href="https://github.com/actions/cache/commit/e39b386c9004d72a15d864ade8c0b3a702d47a37"><code>e39b386</code></a>
Fix test mock return order</li>
<li><a
href="https://github.com/actions/cache/commit/b6928203372a8571ff984c0c883ef3a1adfb0c06"><code>b692820</code></a>
PR feedback</li>
<li><a
href="https://github.com/actions/cache/commit/60749128a44d25d3c520a489e576380cf00ff3f1"><code>6074912</code></a>
Rebuild dist bundles as ESM to match type:module</li>
<li><a
href="https://github.com/actions/cache/commit/5a912e8b4af820fa082a0e75cfd2c782f8fbfe0e"><code>5a912e8</code></a>
Fix lint and jest issues</li>
<li>Additional commits viewable in <a
href="https://github.com/actions/cache/compare/v5...v6">compare
view</a></li>
</ul>
</details>
<br />

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-29 16:48:31 +00:00
bfd8c72504 ci: migrate CI runners repo-openobserve-standard -> eks-openobserve-standard (#12931)
Migrates the self-hosted runner label from the
`repo-openobserve-standard-*` pool to the `eks-openobserve-standard-*`
pool.

### Changes
- \`.github/workflows/release.yml\`: \`repo-openobserve-standard-4\` →
\`eks-openobserve-standard-4\` (1 instance)

This is the OSS half of a paired runner migration. The ENT counterpart
(same branch name \`ci/eks-runner-rename\`) renames
\`repo-o2-enterprise-standard-*\` → \`eks-o2-enterprise-standard-*\`
across its workflows.

Untouched: \`ubicloud-standard-*\` labels (different pool, not part of
this migration).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: mmosarafO2 <mosraf@openobserve.ai>
2026-06-29 15:51:00 +00:00
Shrinath RaoandClaude Opus 4.8 1155da8400 ci: per-test flaky/failed → ci_test_results + per-shard API counts → ci_test_counts (#12930)
## Why
Two CI-observability gaps, both about **per-test/per-shard counts** that
the run-level metrics couldn't show:

1. **Flaky vs failed was conflated.** "Failed Shards by Module" counted
shard-*job* failures — but a shard that **failed then passed on rerun is
flaky, not failed**. A bare count told you nothing and misclassified
recovered flakes as failures.
2. **API had no test counts at all.** API `ci_test_runs` rows carried
only run health (conclusion/duration) — `tests_total` was NULL — so the
Test Counts dashboard had nothing for API.

## What

### Per-test flaky **and** failed → `ci_test_results`
- The **merge job** parses the merged `report.json` for tests with
`status="flaky"` (failed→passed on retry) or `status="unexpected"`
(failed after retries) via the new commented
**`.github/scripts/extract-flaky.js`**, emitting **title + module +
status**.
- **report_to_openobserve** posts **one row per such test** to
**`ci_test_results`**.
- Row schema: `{run_id, repo, suite, workflow, ingest_source, status
("flaky"|"failed"), module, test_title, test_file}` — powers accurate
per-module **flaky** *and* **failed** dashboards, no misclassification.

### Per-shard API test counts → `ci_test_counts` (+ run-doc total)
- Each API pytest job emits `--junitxml` and uploads an
**`api-junit__<category>__<leg>`** artifact (category = the test shard:
integration / query_agent / regression / … ENT also cli / vortex_* /
oss_in_ent / ent_top / ent_rbac).
- **report_to_openobserve** runs
**`.github/scripts/parse-api-junit.py`**, which reads the category per
artifact and **dedups config-leg reruns by test identity** (query_agent
opt true|false, regression flag combos) so the same suite isn't counted
twice.
- The deduped **total** folds into the run doc (`ci_test_runs`,
suite=api) so API shows in the same KPI/pie panels as UI; **per-category
rows** go to the new **`ci_test_counts`** stream for the per-shard
breakdown (the API analog of UI's `ci_test_modules`).

## Notes
- **Forward-only** — historical runs never stored junit / per-test names
(only counts), so no backfill; both streams accumulate from merge.
- All **non-fatal**: any parse/ingest error only warns, never fails the
workflow. `_timestamp` unset → ingest time.
- Pairs with the same-named branch on the other repo (OSS ⇄ ENT).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 13:52:50 +00:00
Bhargav 8af4a70be1 fix: refactored translation job to make it more effective (#12921) 2026-06-29 06:04:57 +00:00
99b3093c2f ci: bump node version to 24 (#12811)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Shrinath Rao <shnath@openobserve.ai>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 01:36:20 +00:00
Shrinath RaoandClaude Opus 4.8 65296d88ab ci: capture build time + shard tallies (UI/API) + per-shard regression rows (#12917)
Closes the **UI ↔ Regression dashboard parity** gaps by capturing the
few fields the dashboards were missing. One PR (pairs with the
same-branch ENT PR).

## Changes
- **`o2-run-report.sh`** (UI + API runs → `ci_test_runs`): adds
  - `build_duration_sec` (from the `build_binary` job)
- `shards_total / shards_passed / shards_failed / shards_skipped` (from
the `e2e /` shard jobs)
  - Null/0 for suites without them (API) — harmless.
- **`playwright_regression.yml`**: after the run doc, emits **one row
per shard** to a new **`ci_regression_shards`** stream (flattened from
`payload.shards`) → enables per-shard duration / slowest-shard /
per-module panels.

## Why
The Regression tab had per-shard + build-time panels that UI/Combined
couldn't match because the data wasn't captured. Now it is.

## Safety
All additions are non-fatal (the report job is `continue-on-error`;
shard emit is guarded). Verified locally: build/shard jq (build=360,
shards total/passed/failed correct), per-shard row shape (module
extracted), and YAML.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 05:56:41 +00:00
Shrinath RaoandClaude Opus 4.8 9bf7164e2b ci: capture UI (Playwright) per-test counts (ci_test_runs) (#12915)
## What

Capture **UI (Playwright) per-test counts** in the `ci_test_runs`
OpenObserve stream — `tests_total/passed/failed/flaky/skipped` per run.

This was meant to land in #12914 but missed that squash-merge (pushed
just after), so it's its own PR now. Companion: o2-enterprise#2046.

## How
- `playwright.yml` merge job gains a `stats` output (from the merged
`report.json`).
- `report_to_openobserve` reads it and emits the test-count fields via a
small generic **`EXTRA_JSON`** merge hook added to `o2-run-report.sh`.
- Non-fatal as before; no-ops when secrets are unset.

API (pytest) counts are not included (would need `--junitxml` + XML
aggregation — separate change).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-27 17:29:44 +00:00
Shrinath RaoandClaude Opus 4.8 5f3bda8bac fix(council/docgen caller): post 'started' + failure comments as the human PAT, not github-actions[bot] (#12900)
The OSS **caller** workflows posted their source-PR comments with
`github.token`, so they showed as `github-actions[bot]` — e.g. the "🤖
E2E Council — started" comment on #12857. This completes the
committer/comment PAT work from o2-enterprise#2022 (commits) and #2033
(docgen engine comments), which covered the **engines** but not the
**OSS-side callers**.

### Changed
- `e2e-council-caller.yml` — "started" ack + dispatch-failure notice →
`ORG_ADMIN_TOKEN`
- `docgen-caller.yml` — "started" ack → `ORG_ADMIN_TOKEN`
- **Deleted `e2e-council-legacy.yml`** — the retired OSS-resident
engine, superseded by the ENT engine + caller. It was
`workflow_dispatch`-only (its `/e2e` + auto-on-merge triggers were
removed on retirement) so it couldn't fire on `/e2e`, but it still had
~8 `github-actions[bot]` comment/reaction steps. No workflow references
it.

`ORG_ADMIN_TOKEN` is already used in these callers to dispatch the
engine, so it's available; comments now post as the human PAT owner.

### Full audit (both repos, all council/docgen workflows)
After this + #2033, **every** comment/PR-posting op across ENT
`e2e-council.yml` + `docgen.yml` and OSS `e2e-council-caller.yml` +
`docgen-caller.yml` uses `ORG_ADMIN_TOKEN`. No remaining
`github.token`/`GITHUB_TOKEN` posters.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-27 16:50:53 +00:00
Shrinath RaoandClaude Opus 4.8 94f6aab74e ci: live retry-aware metrics for playwright, api-testing + regression (#12914)
## What

Makes the per-run test dashboards **live**. Adds non-fatal
`report_to_openobserve` jobs that emit **one retry-aware run-summary doc
per run** to OpenObserve, following the metrics work merged earlier
(regression/docgen/council). Companion PR in the other repo mirrors
this.

**Scope (this PR):**
1. **`playwright.yml` + `api-testing.yml`** → new report jobs →
`ci_test_runs` (`suite=ui` / `suite=api`).
2. **`playwright_regression.yml`** → retry-aware reporting →
`ci_regression` (OSS: augments the existing job; ENT: adds the job — was
uninstrumented).

## How it works

- **Shared `.github/scripts/o2-run-report.sh`** (used by playwright/api)
derives the run's `conclusion` from job results, wall-clock from the
jobs API, and **sums cost across all attempts**. Regression jobs do the
same inline (they also emit shard/build/test fields).
- Emits: `run_id`, `run_attempt`, `retries`, `was_retried`,
`conclusion`, `suite`, `repo`, `branch`, `author`, `commit_sha`,
`pr_number`, `trigger`, `final_duration_sec`, `total_duration_sec`,
`retry_wasted_sec`.
- **Dedup model:** re-runs append one doc per attempt; dashboards keep
the **latest attempt per `run_id`** via `row_number() OVER (PARTITION BY
run_id ORDER BY run_attempt DESC)`. Retries become an *attribute*, never
duplicate rows; `total_duration_sec` on the kept row carries cumulative
compute.
- **Safe by construction:** `continue-on-error` + the never-fail poster
— can't fail/slow a test run; skips when no tests ran; **no-ops until
`O2_REPORTING_*` secrets are set**.

## Review
AI review addressed (mktemp payload, `GH_TOKEN` guard, non-negative
duration clamp). YAML + jq unit-tested + `actionlint` clean on the added
jobs.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-27 16:13:05 +00:00
Shrinath RaoandClaude Opus 4.8 bfade1f4f3 ci: report regression run metrics to OpenObserve (ci_regression) (#12912)
## What

Adds a CI→OpenObserve metrics sidecar to the Playwright Regression
workflow. A new terminal job `report_to_openobserve` emits **one summary
JSON document per run** into the `ci_regression` OpenObserve stream, so
we can build reliability/performance dashboards.

This is the OSS half of a cross-repo change — the companion
o2-enterprise PR (`ci/o2-reporting`) instruments the DocGen and E2E
Council engines into `ci_docgen` / `ci_council`.

## How it works (safe by construction)

- **Non-invasive:** derives per-job timings + per-shard pass/fail from
the GitHub jobs API and the merged Playwright stats. The only edit to an
existing job is one additive `stats` output on
`merge_and_upload_reports`.
- **Cannot break CI:** the job is `continue-on-error` and posts through
`.github/scripts/o2-report.sh`, which always `exit 0`s (a missing secret
/ rotated passcode / unreachable host only warns).
- **No-ops until secrets exist** — safe to merge first.

## Metrics captured
Reliability (conclusion, shard pass/fail, test pass/fail/flaky/skipped),
duration & cost (wall-clock, `runner_seconds`, build time, per-shard
durations), throughput (trigger/actor/branch).

## Required secrets (this repo + o2-enterprise)
- `O2_REPORTING_INGEST_BASE` — `https://<host>/api/<org>`
- `O2_REPORTING_AUTH` — `base64("email:passcode")`

Full schema, dashboard SQL, and setup notes:
`.github/scripts/O2-REPORTING.md`.

## Validation
- YAML parse + jq unit tests + `actionlint` clean on the added code.
- Live **HTTP 200** test-ingest into the target instance, both via raw
curl and through the poster script.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-27 05:34:29 +00:00
702af87f0b test: add alert history and report bulk-ops E2E tests (main / UX revamp) (#12883)
## Summary

Port of [#12882](https://github.com/openobserve/openobserve/pull/12882)
(v0.80.0) adapted for main branch's UX revamp.

**Alerts — `alerts-history.spec.js` (6 tests)**
- All selectors identical to v0.80.0 — `AlertHistory.vue` data-test
attrs unchanged in main
- `expectDetailsDialogVisible()` updated to use
`data-test="alert-history-details-dialog"` (ODialog) instead of
`.alert-details-dialog` CSS class

**Reports — `reports-bulk-operations.spec.js` (6 tests)**
- Bulk pause/resume tests **omitted** — `report-list-pause-reports-btn`
/ `report-list-resume-reports-btn` do not exist in main's
`ReportList.vue` (only row-level pause exists)
- Bulk delete confirmation updated for `ConfirmDialog`'s new ODialog
pattern: `[data-test="confirm-dialog"]
[data-test="o-dialog-primary-btn"]`
- `cancelBulkDelete` updated to use `o-dialog-secondary-btn`

## Key selector changes from v0.80.0 → main

| Component | v0.80.0 | main |
|---|---|---|
| Alert details dialog | `.alert-details-dialog` (CSS class) |
`[data-test="alert-history-details-dialog"]` |
| Confirm button | `[data-test="confirm-button"]` |
`[data-test="confirm-dialog"] [data-test="o-dialog-primary-btn"]` |
| Cancel button | `[data-test="cancel-button"]` |
`[data-test="confirm-dialog"] [data-test="o-dialog-secondary-btn"]` |

## Related PRs
- v0.80.0 OSS: #12882
- v0.80.0 ENT: openobserve/o2-enterprise#2017

## Test plan
- [ ] CI passes on `main`
- [ ] Alert history: 6 tests green
- [ ] Report bulk operations: 6 tests green (move, delete, cancel ×2,
hidden, select-all)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Shrinath Rao <shnath@openobserve.ai>
2026-06-26 11:28:00 +00:00
udev e529f99100 ci: instrument code review (#12901) 2026-06-26 10:36:15 +00:00
f4ba2e2dd6 test(autoe2e): generated E2E tests for #12857 (fts-default-column) (#12902)
🤖 Auto-generated E2E tests for #12857 — **healed to passing** against a
live OpenObserve before this PR was opened.

- Branch `autoe2e/pr-12857` (stacked on `main`), so the tests run
against the feature code and pass before it merges.
- Spec:
`tests/ui-testing/playwright-tests/Logs/ftsDefaultColumn.spec.js`

The repo Playwright CI re-validates here. Review is for **quality +
coverage** — the tests already pass.

_Generated by the E2E Council pipeline._


**Test cases added / changed:**

| Test case | Type | What it verifies |
|---|---|---|
| `should clear FTS selection on stream change and re-resolve for new
stream` | extend | switching streams clears the carried-over FTS default
selection, then re-resolves the FTS default column for the new stream on
the next search |
| `should clear FTS default on field reset and re-resolve on next
search` | extend | clicking the field-list reset icon clears the
auto-picked FTS default column from the table, then running a new search
re-resolves it |

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Shrinath-O2 <214651540+Shrinath-O2@users.noreply.github.com>
2026-06-26 10:31:30 +00:00
Shrinath RaoandClaude Opus 4.8 6f1d2094c6 ci: E2E Council — thin caller + retire legacy workflow (#12886)
## E2E Council — thin caller + retire legacy workflow

Cutover to the **DocGen topology**: the heavy E2E Council engine now
lives in the private `o2-enterprise` repo
(openobserve/o2-enterprise#2019); this OSS repo keeps only a **thin
caller** that dispatches it.

### What's here
- **NEW** `.github/workflows/e2e-council-caller.yml` — thin caller.
Three doors: `workflow_dispatch`, `issue_comment` (`/e2e`,
`/e2e-dryrun`, org-member gated), and `pull_request: [closed]`
auto-on-merge (behind `vars.E2E_AUTO_ON_MERGE`). Gates the commenter,
resolves pr/dry_run/clobber/actor, then `gh workflow run e2e-council.yml
--repo openobserve/o2-enterprise` via `secrets.ORG_ADMIN_TOKEN`, and
acks on the OSS PR.
- **RENAMED** `e2e-council.yml` → `e2e-council-legacy.yml` — header
marked RETIRED, triggers reduced to `workflow_dispatch`-only (manual
fallback) so it can't double-fire with the caller. Agent assets
intentionally kept so the legacy fallback still runs; delete once the
ENT engine is proven.

### Why dispatch (not `workflow_call`)
A cross-repo reusable call needs an ENT Actions access policy; a PAT
with `Actions: R/W` can `workflow_dispatch` with none. Mirrors DocGen.

### Rollout note
The `/e2e` comment path only takes effect once this caller is on `main`
(comment/dispatch triggers read from the default branch). Until then,
test the engine directly via `workflow_dispatch --ref` on the ENT PR.

Paired with the engine PR: openobserve/o2-enterprise#2019

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 14:21:06 +00:00
Shrinath RaoandClaude Opus 4.8 0ee8a667c2 test: E2E Council Refiner — remediate Sentinel findings instead of dead-ending (#12876)
## Why

The E2E Council blocked **#12857** (no test PR opened) because the
post-heal **Sentinel re-audit found 2 critical quality issues** — even
though **9/10 tests passed**. The tests were **not worthless**; 2 just
*under-claimed* (the body asserted something weaker than the test name
promised):

1. `"should not persist FTS default across page reload"` — re-searches
after reload and asserts the column visible, which passes whether it
*persisted* or *re-resolved*. Never verifies non-persistence.
2. `"should clear FTS marker and re-resolve for new stream on stream
change"` — only checks "table rendered", never that FTS actually
re-resolved.

Blocking was correct (green ≠ meaningful), but a **dead-end block throws
away the other 90%**. The pipeline should **fix the problem and make it
right**, not give up. A no-PR outcome should be a *true last resort*.

## What — The Refiner (Phase 5.5)

A remediation loop **inside `verify_heal`**, after the Sentinel re-audit
and before the quality gate (**reuses the already-booted binary** — no
rebuild):

- **Only fires when needed.** If the re-audit is clean (PASS / 0
critical), the step reads the verdict, sets `ran=false`, and exits —
**no DeepSeek call, no test re-run**. Cheap on the happy path.
- **Strengthen-first.** Feeds the exact Sentinel findings to the
Refiner, which **adds/tightens assertions** so each test verifies what
its name promises → re-runs on the live binary (**green must hold**) →
re-checks assertion-integrity → re-audits. Capped at **2 rounds**.
- **Anti-laundering (the whole game).** Assertions may only be
**ADDED/strengthened — never dropped, inverted in place, or
renamed-to-dodge** a missing assertion. If strengthening goes red
because the **feature isn't wired**, it takes the honest `test.fixme` +
evidence exit (no green-wash).
- **`assert_integrity.py --strengthen`**: permits *added* negative
matchers (assert-absence is legit strengthening) while **still blocking
any dropped assertion** (removed/skipped guards + all static checks
stay). Unit-proven in the commit.
- **Quality gate** now judges the **post-refine** state; blocks only if
the Refiner couldn't keep the spec green honestly.
- **No-PR report** now phrases a block as a true last resort ("the
Refiner attempted to strengthen … but could not resolve every finding
honestly").

### Reuse path (clobber off)
`verify_heal` now also runs on **reuse runs**, and the "already covered"
short-circuit is suppressed on reuse — so **re-running `/e2e` on a
previously-BLOCKED spec re-validates + refines the existing tests into a
PR** instead of stopping at "already covered". No new tests are added on
reuse; the Refiner only strengthens what's there. (Cost: a reuse run
rebuilds even when tests were already perfect — acceptable since re-runs
are explicit; can add a "skip if a green test PR already exists" guard
later.)

## Validation
- `assert_integrity.py` unit-checked: added negative → FAIL without
`--strengthen`, PASS with it; dropped assertion → still FAIL with
`--strengthen`.
- Workflow YAML validated; step order confirmed **Sentinel re-audit →
Refiner → Quality gate**.
- Live end-to-end best validated by re-running `/e2e` on **#12857 with
clobber off** — the Refiner should strengthen the 2 flagged tests and
open the PR.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 09:20:31 +00:00
Shrinath RaoandClaude Opus 4.8 43bbf2c88c test: DocGen OSS caller — dispatch the engine via PAT (no org access-policy) (#12871)
Reworks the OSS DocGen caller from a **cross-repo `workflow_call`** to
**dispatching** the engine (`o2-enterprise` `docgen.yml`) via
`workflow_dispatch`, authenticated with `ORG_ADMIN_TOKEN`.

**Why:** `workflow_call` into the private ENT repo needs a repo/org
**Actions access-policy** grant. A PAT-based dispatch doesn't — a
fine-grained PAT with **`Actions: read & write`** on `o2-enterprise` can
trigger it. No org settings touched.

**Flow:** org-member `/docgen` (gate unchanged, = trust boundary for the
PAT) → resolve PR/dry-run/actor (event data via env, not spliced into
commands) → `gh workflow run docgen.yml --repo o2-enterprise …` with the
PAT → ack on the OSS PR. The engine runs in ENT and comments results
back via the same PAT (pairs with o2-enterprise engine PR).

**PAT requirement:** `ORG_ADMIN_TOKEN` needs **Actions: R/W** on
`o2-enterprise` (distinct from "Workflows"), plus Issues/Pull-requests
R/W on `openobserve` + `o2-enterprise` for comments (Contents/PRs on
docs already present).

Merge alongside the engine PR. Stranger comments still fail the `if:` →
no dispatch, PAT never used.

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 17:03:42 +00:00
Shrinath RaoandClaude Opus 4.8 d85c2850fb ci(docgen): OSS caller forwards DEEPSEEK_API_KEY_E2E (pairs with ENT 1999) (#12864)
The OSS caller forwarded `DEEPSEEK_API_KEY` (which doesn't exist on OSS
— the secret is `DEEPSEEK_API_KEY_E2E`), so an OSS `/docgen` would get
an empty DeepSeek key. This forwards `DEEPSEEK_API_KEY_E2E` under the
engine's matching (renamed) input.

**Merge order: merge ENT o2-enterprise#1999 FIRST**, then this. Until
#1999 is on `main`, the engine still expects the old `DEEPSEEK_API_KEY`
input name, so editors/actionlint will flag this as a mismatch — that's
expected and resolves once #1999 merges.

Part of enabling the OSS `/docgen` path end-to-end (with
o2-enterprise#1999, which also fixes the private-ENT checkout for the
screenshots build).

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 13:58:17 +00:00
Shrinath Raoandgithub-actions[bot] 744c648102 test(autoe2e): generated E2E tests for #12423 (prebuilt-template-management) (#12840)
🤖 Auto-generated E2E tests for #12423 — **healed to passing** against a
live OpenObserve before this PR was opened.

- Branch `autoe2e/pr-12423` (stacked on `main`), so the tests run
against the feature code and pass before it merges.
- Spec:
`tests/ui-testing/playwright-tests/Alerts/alerts-template-prebuilt-guard.spec.js`

The repo Playwright CI re-validates here. Review is for **quality +
coverage** — the tests already pass.

_Generated by the E2E Council pipeline._


**Test cases added / changed:**

| Test case | Type | What it verifies |
|---|---|---|
| `P0.1: Template List Renders with Tabs and Action Buttons` | new |
template list core UI renders with tab toggle group, add/import buttons,
and data table |
| `P0.2: Prebuilt Template Guard — Delete Button Disabled & Badge
Visible` | new | prebuilt templates show a distinguishing badge and have
disabled delete buttons |
| `P1.1: Template Tab Filtering — All / Prebuilt / Custom` | new |
clicking tab toggles correctly filters visible rows to match the
selected filter |
| `P1.2: Edit (Update) a Custom Template` | new | opening a custom
template in edit mode allows updating the body and persisting the change
|
| `P1.3: Clone a Custom Template` | new | cloning a template creates a
Copy_of_ copy without overwriting the original |
| `P1.4: Prebuilt Templates Excluded from Bulk Selection` | new |
select-all checkbox excludes prebuilt rows so only custom rows get
selected for bulk delete |
| `P2.1: Empty Template Name Validation` | new | saving with an empty
name triggers inline validation error |
| `P2.2: Invalid Resource Name Validation` | new | names with spaces or
disallowed characters are rejected with a descriptive error |

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-23 15:07:23 +00:00
Shrinath RaoandClaude Opus 4.8 187d382502 ci(docgen): OSS caller — forward /docgen to the ENT DocGen engine (#12842)
Brings the **OSS side** of DocGen-on-CI online. This is the thin
"caller" that lets `/docgen` work on `openobserve` PRs; all real logic
lives in the reusable engine in `o2-enterprise`.

## What it does
- Triggers on a `/docgen` or `/docgen-dryrun` **comment** on an OSS PR
(org-member gated via `author_association`), or a manual
**`workflow_dispatch`** (write-access gated by GitHub).
- Forwards to
`openobserve/o2-enterprise/.github/workflows/docgen.yml@main` via
`workflow_call`.

## Why this is just a thin caller
GitHub only delivers a repo's PR/comment events to workflows **in that
repo**, so OSS needs its own listener. Crucially, a **reusable workflow
runs in the caller's context** — so an OSS-triggered run executes *as
openobserve* (OSS runner + OSS `GITHUB_TOKEN`) and comments on the OSS
PR with OSS's own `github-actions[bot]`. No cross-repo token needed for
comments.

## Runtime
OpenCode + DeepSeek (`deepseek-v4-pro`). `DEEPSEEK_API_KEY` already
exists in OSS (used by `e2e-council.yml` + `ai-code-review.yml`), so no
new secret is required.

## ⚠️ Merge order
**Merge this AFTER `o2-enterprise#1977`** lands on ENT `main`. This
caller runs the engine at `@main`; the `github-actions[bot]`
comment-identity fix is in #1977. Merging earlier would make OSS triage
comments post as the PAT owner instead of the bot. Opening now so it's
review-ready.

## Phase A only
Triage only — generates nothing. Inert until a `/docgen[-dryrun]`
comment or manual dispatch. `DOCGEN_DISABLED` repo/org variable is a
global kill switch (in the engine).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 13:49:01 +00:00
Shrinath RaoandClaude Opus 4.8 e9b39844db test(e2e-council): scope existing_tests_in_diff to E2E specs only (#12826)
## What

On the triage for **#12423**, the bot set `existing_tests_in_diff: true`
and cited:

> **EXISTING TESTS: Yes** — The diff modifies
`web/src/components/alerts/TemplateList.spec.ts` — a **Vitest unit
test**…

But that's **not** an E2E test. `existing_tests_in_diff` must mean
**only Playwright specs under `tests/ui-testing/playwright-tests/`** —
Vitest (`web/src/**/*.spec.ts`) and Rust tests aren't E2E coverage, and
the Architect only ever scans the Playwright folder.

The triage prompt's detection grep *was* scoped correctly, but it lived
in the skip-gate discussion and the field wasn't enforced — so the LLM
counted a unit test loosely.

## Fix

1. **Deterministic override (no LLM trust):** a new workflow step
recomputes the flag straight from the diff and overwrites the agent's
value in both `run-context.json` (the Architect reads it) and
`triage.json` (the comment renders it):
   ```bash
grep -qE '^\+\+\+ b/tests/ui-testing/playwright-tests/.+\.spec\.js'
diff.patch
   ```
2. **Prompt tightened:** the flag *and* the `existing_tests` rationale
count **only** E2E specs; a changed Vitest/Rust test is dev
test-maintenance, not coverage.

## Test

Verified the scoped grep against real cases:
| diff touches | result |
|---|---|
| `web/src/components/alerts/TemplateList.spec.ts` (the #12423 Vitest) |
**false** ✅ |
| `tests/ui-testing/playwright-tests/Alerts/alerts-prebuilt.spec.js` |
**true** ✅ |
| `tests/ui-testing/pages/alertsPages/alertsPage.js` (page object) |
**false** ✅ |
| `src/service/alerts/templates.rs` (Rust) | **false** ✅ |

No functional change to the *outcome* on #12423 (E2E was still
warranted; the Architect is already scoped) — this fixes the
**misleading flag/comment** and prevents a non-E2E test from mis-routing
the *enhance* path on another PR.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 08:36:19 +00:00
dependabot[bot]andHengfei Yang d23aac58e5 chore(deps): bump actions/github-script from 7 to 9 (#12675)
Bumps [actions/github-script](https://github.com/actions/github-script)
from 7 to 9.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/actions/github-script/releases">actions/github-script's
releases</a>.</em></p>
<blockquote>
<h2>v9.0.0</h2>
<p><strong>New features:</strong></p>
<ul>
<li><strong><code>getOctokit</code> factory function</strong> —
Available directly in the script context. Create additional
authenticated Octokit clients with different tokens for multi-token
workflows, GitHub App tokens, and cross-org access. See <a
href="https://github.com/actions/github-script#creating-additional-clients-with-getoctokit">Creating
additional clients with <code>getOctokit</code></a> for details and
examples.</li>
<li><strong>Orchestration ID in user-agent</strong> — The
<code>ACTIONS_ORCHESTRATION_ID</code> environment variable is
automatically appended to the user-agent string for request
tracing.</li>
</ul>
<p><strong>Breaking changes:</strong></p>
<ul>
<li><strong><code>require('@actions/github')</code> no longer works in
scripts.</strong> The upgrade to <code>@actions/github</code> v9
(ESM-only) means <code>require('@actions/github')</code> will fail at
runtime. If you previously used patterns like <code>const { getOctokit }
= require('@actions/github')</code> to create secondary clients, use the
new injected <code>getOctokit</code> function instead — it's available
directly in the script context with no imports needed.</li>
<li><code>getOctokit</code> is now an injected function parameter.
Scripts that declare <code>const getOctokit = ...</code> or <code>let
getOctokit = ...</code> will get a <code>SyntaxError</code> because
JavaScript does not allow <code>const</code>/<code>let</code>
redeclaration of function parameters. Use the injected
<code>getOctokit</code> directly, or use <code>var getOctokit =
...</code> if you need to redeclare it.</li>
<li>If your script accesses other <code>@actions/github</code> internals
beyond the standard <code>github</code>/<code>octokit</code> client, you
may need to update those references for v9 compatibility.</li>
</ul>
<h2>What's Changed</h2>
<ul>
<li>Add ACTIONS_ORCHESTRATION_ID to user-agent string by <a
href="https://github.com/Copilot"><code>@​Copilot</code></a> in <a
href="https://redirect.github.com/actions/github-script/pull/695">actions/github-script#695</a></li>
<li>ci: use deployment: false for integration test environments by <a
href="https://github.com/salmanmkc"><code>@​salmanmkc</code></a> in <a
href="https://redirect.github.com/actions/github-script/pull/712">actions/github-script#712</a></li>
<li>feat!: add getOctokit to script context, upgrade
<code>@​actions/github</code> v9, <code>@​octokit/core</code> v7, and
related packages by <a
href="https://github.com/salmanmkc"><code>@​salmanmkc</code></a> in <a
href="https://redirect.github.com/actions/github-script/pull/700">actions/github-script#700</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/Copilot"><code>@​Copilot</code></a> made
their first contribution in <a
href="https://redirect.github.com/actions/github-script/pull/695">actions/github-script#695</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/actions/github-script/compare/v8.0.0...v9.0.0">https://github.com/actions/github-script/compare/v8.0.0...v9.0.0</a></p>
<h2>v8.0.0</h2>
<h2>What's Changed</h2>
<ul>
<li>Update Node.js version support to 24.x by <a
href="https://github.com/salmanmkc"><code>@​salmanmkc</code></a> in <a
href="https://redirect.github.com/actions/github-script/pull/637">actions/github-script#637</a></li>
<li>README for updating actions/github-script from v7 to v8 by <a
href="https://github.com/sneha-krip"><code>@​sneha-krip</code></a> in <a
href="https://redirect.github.com/actions/github-script/pull/653">actions/github-script#653</a></li>
</ul>
<h2>⚠️ Minimum Compatible Runner Version</h2>
<p><strong>v2.327.1</strong><br />
<a
href="https://github.com/actions/runner/releases/tag/v2.327.1">Release
Notes</a></p>
<p>Make sure your runner is updated to this version or newer to use this
release.</p>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/salmanmkc"><code>@​salmanmkc</code></a>
made their first contribution in <a
href="https://redirect.github.com/actions/github-script/pull/637">actions/github-script#637</a></li>
<li><a
href="https://github.com/sneha-krip"><code>@​sneha-krip</code></a> made
their first contribution in <a
href="https://redirect.github.com/actions/github-script/pull/653">actions/github-script#653</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/actions/github-script/compare/v7.1.0...v8.0.0">https://github.com/actions/github-script/compare/v7.1.0...v8.0.0</a></p>
<h2>v7.1.0</h2>
<h2>What's Changed</h2>
<ul>
<li>Upgrade husky to v9 by <a
href="https://github.com/benelan"><code>@​benelan</code></a> in <a
href="https://redirect.github.com/actions/github-script/pull/482">actions/github-script#482</a></li>
<li>Add workflow file for publishing releases to immutable action
package by <a
href="https://github.com/Jcambass"><code>@​Jcambass</code></a> in <a
href="https://redirect.github.com/actions/github-script/pull/485">actions/github-script#485</a></li>
<li>Upgrade IA Publish by <a
href="https://github.com/Jcambass"><code>@​Jcambass</code></a> in <a
href="https://redirect.github.com/actions/github-script/pull/486">actions/github-script#486</a></li>
<li>Fix workflow status badges by <a
href="https://github.com/joshmgross"><code>@​joshmgross</code></a> in <a
href="https://redirect.github.com/actions/github-script/pull/497">actions/github-script#497</a></li>
<li>Update usage of <code>actions/upload-artifact</code> by <a
href="https://github.com/joshmgross"><code>@​joshmgross</code></a> in <a
href="https://redirect.github.com/actions/github-script/pull/512">actions/github-script#512</a></li>
<li>Clear up package name confusion by <a
href="https://github.com/joshmgross"><code>@​joshmgross</code></a> in <a
href="https://redirect.github.com/actions/github-script/pull/514">actions/github-script#514</a></li>
<li>Update dependencies with <code>npm audit fix</code> by <a
href="https://github.com/joshmgross"><code>@​joshmgross</code></a> in <a
href="https://redirect.github.com/actions/github-script/pull/515">actions/github-script#515</a></li>
<li>Specify that the used script is JavaScript by <a
href="https://github.com/timotk"><code>@​timotk</code></a> in <a
href="https://redirect.github.com/actions/github-script/pull/478">actions/github-script#478</a></li>
<li>chore: Add Dependabot for NPM and Actions by <a
href="https://github.com/nschonni"><code>@​nschonni</code></a> in <a
href="https://redirect.github.com/actions/github-script/pull/472">actions/github-script#472</a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/actions/github-script/commit/3a2844b7e9c422d3c10d287c895573f7108da1b3"><code>3a2844b</code></a>
Merge pull request <a
href="https://redirect.github.com/actions/github-script/issues/700">#700</a>
from actions/salmanmkc/expose-getoctokit + prepare re...</li>
<li><a
href="https://github.com/actions/github-script/commit/ca10bbdd1a7739de09e99a200c7a59f5d73a4079"><code>ca10bbd</code></a>
fix: use <code>@​octokit/core/</code>types import for v7
compatibility</li>
<li><a
href="https://github.com/actions/github-script/commit/86e48e20ac85c970ed1f96e718fd068173948b7b"><code>86e48e2</code></a>
merge: incorporate main branch changes</li>
<li><a
href="https://github.com/actions/github-script/commit/c1084728b5b935ec4ddc1e4cee877b01797b3ff9"><code>c108472</code></a>
chore: rebuild dist for v9 upgrade and getOctokit factory</li>
<li><a
href="https://github.com/actions/github-script/commit/afff112e4f8b57c718168af75b89ce00bc8d091d"><code>afff112</code></a>
Merge pull request <a
href="https://redirect.github.com/actions/github-script/issues/712">#712</a>
from actions/salmanmkc/deployment-false + fix user-ag...</li>
<li><a
href="https://github.com/actions/github-script/commit/ff8117e5b78c415f814f39ad6998f424fee7b817"><code>ff8117e</code></a>
ci: fix user-agent test to handle orchestration ID</li>
<li><a
href="https://github.com/actions/github-script/commit/81c6b7876079abe10ff715951c9fc7b3e1ab389d"><code>81c6b78</code></a>
ci: use deployment: false to suppress deployment noise from integration
tests</li>
<li><a
href="https://github.com/actions/github-script/commit/3953caf8858d318f37b6cc53a9f5708859b5a7b7"><code>3953caf</code></a>
docs: update README examples from <a
href="https://github.com/v8"><code>@​v8</code></a> to <a
href="https://github.com/v9"><code>@​v9</code></a>, add getOctokit docs
and v9 brea...</li>
<li><a
href="https://github.com/actions/github-script/commit/c17d55b90dcdb3d554d0027a6c180a7adc2daf78"><code>c17d55b</code></a>
ci: add getOctokit integration test job</li>
<li><a
href="https://github.com/actions/github-script/commit/a047196d9a02fe92098771cafbb98c2f1814e408"><code>a047196</code></a>
test: add getOctokit integration tests via callAsyncFunction</li>
<li>Additional commits viewable in <a
href="https://github.com/actions/github-script/compare/v7...v9">compare
view</a></li>
</ul>
</details>
<br />

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Hengfei Yang <hengfei.yang@gmail.com>
2026-06-22 10:09:19 +00:00
Shrinath RaoandClaude Opus 4.8 900ebe67c6 ci(e2e-council): test-quality gate — stop certifying green-but-worthless specs (#12722)
## The problem (from the #12719 review)

The pipeline's only hard gate was **"the Healer's authoritative run is
green."** That objective *rewards* making a spec pass by gutting the
assertions that test the feature. In #12719 the result was a suite that:
- dropped the fix-query-card assertion,
- asserted `count >= 0` (a tautology),
- buried real assertions inside `if`s whose `else` just logs, and
- **asserted the feature is absent** (`expectFixQueryCardNotVisible`) —
certifying a half-built feature and set to **turn red when the feature
is finished**.

> A passing test and a valuable test are different things, and we only
measured the first.

This PR makes **"done" mean "the tests would fail if the feature were
broken."**

## Deterministic backbone (no LLM) —
`.github/scripts/assert_integrity.py`

The most important guards don't depend on the model behaving:
- **Diff-aware heal guard** — snapshot the spec's assertions *before*
healing; **reject** any heal that **deleted**, **inverted**
(`toBeVisible` → `not.toBeVisible`), or **skipped** assertions to reach
green.
- **Static anti-patterns** — tautologies (`count >= 0`, `expect(true)`)
and **conditional-only** tests (every `expect` inside an `if` → the test
can pass asserting nothing).
- Conservative by design (only high-confidence patterns) — a gate with
false positives gets disabled by humans. Restored from a **trusted ref**
in verify_heal (never the PR tree's copy).

## Workflow

- New **Assertion-integrity gate** after the authoritative run + a
combined **Quality gate decision** (integrity **+** Sentinel verdict).
`pr_back` now requires `quality_status == pass` → a green-but-worthless
spec **never becomes a PR**.
- The post-heal **Sentinel re-audit now feeds the blocking gate** (was
advisory-only). LLM flakiness fails **open**; the deterministic gate is
the hard teeth.
- **`feature-incomplete`** honest exit: when a test can't pass because
the feature isn't wired, the Healer parks it `test.fixme` + writes
**evidence**; the workflow opens **no PR** and posts the gap (file:line)
on the source PR — the single highest-value output.
- `pr_back` **reconciles `test-summary.json` against the FINAL spec**
(drops phantom rows) so the PR body can't claim tests that don't exist.

## Prompts

- **Healer:** hard anti-weakening rules + the `feature-incomplete`
honest exit.
- **Sentinel:** tautology / conditional-only / negative-only-on-feature
/ name-mismatch as **CRITICAL** checks.
- **Engineer:** no dead page-object scaffolding; ban `waitForTimeout` as
a sync primitive; assertions must be real and match the test name.
- **Architect:** one spec = one area (no Frankenstein specs);
de-duplicate scenarios.

## Considered and deferred: mutation-sanity (extra feature-absent build)

Theoretically the cleanest definition of a valuable test, but **dropped
for now**: it overlaps the cheap static checks, has **no clean
"feature-absent" baseline** under merged/multi-PR input, risks false
positives that erode trust, and doubles the build. The static guards
catch the same #12719 failures at near-zero cost; prevention (Healer
can't invert + honest `feature-incomplete`) beats the expensive
detector.

## Testing

- `assert_integrity.py` unit-tested against tautology / conditional-only
(incl. single-line) / heal-removed / heal-inverted fixtures, with no
false positive on a legit `if` + unconditional `expect`.
- Workflow YAML validated; analyzer compiles.
- **First live run still needed** (per the project's "run the path
before done" rule) — to see the gate block a real weak spec and the
`feature-incomplete` comment fire.

Stacked on #12716 (ENT sister flow); the diff collapses to just the
quality program once #12716 lands.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 09:30:03 +00:00
Neha PandClaude Opus 4.7 3ec3a5d4e4 fix(ci): query-agent run_tests job missing permissions to post PR comment (#12777)
## Summary
The `run_tests` job's job-level `permissions: contents: read` was
overriding the top-level `issues: write` and `pull-requests: write`,
causing the "Post results comment" step to fail with `HttpError:
Resource not accessible by integration`.

## Test
- Verified on [run
#27815374013](https://github.com/openobserve/openobserve/actions/runs/27815374013)
— both matrix configurations passed all 672 queries but failed to post
results comments
- After this fix, comments will post correctly

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-19 09:26:00 +00:00
Neha PandClaude Opus 4.7 7d3e67903e ci: add single_node_opt matrix mode to query agent tests (#12756)
## Summary

- Adds a matrix strategy to the query agent SQL regression suite jobs in
both `api-testing.yml` and `query-agent.yml`
- Each job now runs with `ZO_FEATURE_SINGLE_NODE_OPTIMIZE_ENABLED=false`
and `ZO_FEATURE_SINGLE_NODE_OPTIMIZE_ENABLED=true`
- Verifies both DataFusion physical optimizer paths produce identical
query results
- Matrix legs run in parallel with `fail-fast: false`
- All artifact/log names include the matrix label to avoid collisions

## Test plan

- [ ] PR CI shows two `api_query_agent` matrix legs
(single_node_opt_false and single_node_opt_true), both pass
- [ ] `/query-agent` PR comment triggers both modes and posts per-mode
results comments

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-18 14:16:31 +00:00
Neha PandClaude Opus 4.7 10412e91ea ci: add query-agent SQL regression workflow (#12749)
## Summary

Adds a standalone workflow that runs the 672-query SQL regression suite
on-demand against a live OpenObserve instance. Triggered by
`/query-agent` PR comment or manual `workflow_dispatch`.

## How it works

```
/query-agent PR comment (or manual dispatch)
  │
  ├── Job 1: Triage
  │     - Allowlist gate (same engineering team list as council)
  │     - Resolve PR number from comment or dispatch input
  │     - Fetch PR diff, grep for query-engine paths
  │     - Post decision comment (skip/run/dry-run)
  │
  └── Job 2: Run tests (if not skipped + not dry-run)
        - Build OO debug binary (nightly-2026-05-20, mimalloc)
        - Setup Python 3.11 + rye
        - Run compute_counts.py to regenerate expected values
        - Start OO server with ZO_MAX_FILE_RETENTION_TIME=1
        - Run pytest tests/query_agent/ (excluding test_3_vortex.py)
        - Post pass/fail comment on PR
```

## Details

- **Trigger**: Exact `/query-agent` comment on a PR (not `contains`), or
manual dispatch with `pr_number`
- **Runner**: `ubicloud-standard-4` (matches api-testing.yml)
- **Timeout**: triage 10 min, tests 60 min
- **Concurrency**: one run per PR, cancel-in-progress
- **Artifacts**: server logs + pytest logs uploaded on failure, JUnit
XML always

## Test plan
- [ ] Merge to main first (required for comment triggers to take effect)
- [ ] Comment `/query-agent` on a PR with query-engine changes →
workflow runs
- [ ] Comment `/query-agent` on a PR with docs-only changes → triage
skips
- [ ] Non-allowlist user comments `/query-agent` → no reaction
- [ ] Manual dispatch with `dry_run=true` → triage only, no tests

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-18 11:15:45 +00:00
ktx-vaidehi f1913e6d97 test: form e2e (#12632) 2026-06-17 11:52:13 +00:00
4f3c0fcba3 fix(tests): verify match_all FTS result correctness and enforce Tantivy readiness (#12717)
## Summary

Fixes a test gap where `match_all` Tantivy queries could return wrong
results after a DataFusion upgrade without being caught by existing
assertions.

### Problem

After a DataFusion upgrade merge, the DataFusion access plan was no
longer used for `match_all` queries, causing Tantivy to return wrong
results. The existing tests only compared row counts against a DuckDB
oracle that emulates `match_all` with `LIKE '%term%'` — so wrong rows
that still matched the LIKE pattern passed undetected.

Additionally, `node/flush` does not generate Tantivy indexes
immediately. The default `ZO_MAX_FILE_RETENTION_TIME=600s` means
WAL→parquet→Tantivy conversion can lag, so FTS queries may fall back to
a non-Tantivy path during tests.

### Changes

1. **Content verification**
([conftest.py](tests/api-testing/tests/query_agent/conftest.py)): Every
hit from a `match_all` query that returns the `log` field is now checked
— each search term word must be present in `log`. A hard assertion fails
if Tantivy returns rows that don't contain the search terms.

2. **Tantivy readiness gate**
([test_2_parquet.py](tests/api-testing/tests/query_agent/test_2_parquet.py)):
After `node/flush`, the test now polls with a `match_all('warehouse')
LIMIT 1` query (up to 120s timeout) to confirm Tantivy indexes are built
before running FTS assertions. Previously only COUNT(*) was checked.

3. **Multi-word match_all emulation**
([compute_counts.py](tests/test-data/query-agent/compute_counts.py)):
`match_all('ACK batch')` now translates to `(log LIKE '%ACK%' AND log
LIKE '%batch%')` — per-token AND conditions matching Tantivy's
token-level search semantics, instead of the old phrase match `log LIKE
'%ACK batch%'`.

4. **Regenerated expected results** across all query JSON files.

## Test plan

- [ ] Run query agent test suite against an environment with Tantivy
enabled
- [ ] Verify `match_all` content assertions catch intentionally
corrupted results
- [ ] Confirm post-flush Tantivy readiness poll works within the timeout

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Co-authored-by: Huaijin <haohuaijin@gmail.com>
2026-06-17 08:30:33 +00:00
ktx-akshayandAbhay Padamani bc5303eb54 test(logs): add SQL queries test cases for inline comments handling (#12663)
## Summary

- Add E2E test coverage for SQL queries containing `--` inline comments
in the Logs search page
- Fix verified: queries like `-- comment\nSELECT _timestamp FROM stream`
no longer produce `SQL ParserError("Expected: end of statement, found:
_timestamp")`
- Add two reusable page object methods to `logsPage.js` for asserting
SQL error state

## What Was Broken

SQL queries with `--` style comments followed by a `SELECT` statement
were failing with:
> `SQL error: ParserError("Expected: end of statement, found: _timestamp
at Line: 1, Column: 45")`

The parser was not stripping comment lines before executing the query,
causing it to misread the `SELECT` column list as a second statement.

## Test Scenarios Covered

| # | Scenario | Tag |
|---|----------|-----|
| 1 | Single-line comment before SELECT | `@P0 @smoke` |
| 2 | Multiple comment lines before SELECT | `@P1` |
| 3 | Inline comment at end of a line (`SELECT ... -- comment`) | `@P1`
|
| 4 | Comment in the middle of a multi-line SQL query | `@P1` |
| 5 | Comment + WHERE clause using `str_match_ignore_case` | `@P1` |
| 6 | Comment-only query — must NOT produce `_timestamp` parser error
(edge case) | `@P2` |

## Files Changed

-
`tests/ui-testing/playwright-tests/Logs/logsqueries.sql-comments.spec.js`
← new spec file
- `tests/ui-testing/pages/logsPages/logsPage.js` ← two new assertion
methods added
- `.github/workflows/playwright.yml` ← spec registered in CI pipeline

---------

Co-authored-by: Abhay Padamani <141122205+ktx-abhay@users.noreply.github.com>
2026-06-17 07:17:38 +00:00
Shrinath RaoandClaude Opus 4.8 3dceaa1d91 ci(e2e-council): ENT sister flow — validate generated specs on the enterprise build (#12716)
## What & why

Every OpenObserve Playwright spec also runs on the **enterprise** binary
— ENT CI tree-merges OSS in via a *branch-of-same-name* lookup
(`o2-enterprise/.github/workflows/playwright.yml` → "Determine OSS
Branch"). So a council-generated spec isn't fully validated until it
passes on enterprise too.

This adds an **always-on Job 6 (`ent_sister`)** that runs after
`pr_back`, reusing the same `autoe2e/pr-<n>` branch name so ENT CI
auto-pulls the generated spec.

## Two cases (decided in design)

| Situation | Action |
|---|---|
| Spec **not yet** in ENT `run_files` | **Case 1:** register it in the
matching ENT group on a new ENT branch `autoe2e/pr-<n>`, open a
**non-blocking** ENT PR, cross-link on the OSS source + test PRs. ENT CI
pulls the same-named OSS branch and runs the new spec on enterprise. |
| Spec **already** in ENT `run_files` | **Case 2:** no PR —
`workflow_dispatch` ENT's `playwright.yml` with
`o2_opensource_repo=autoe2e/pr-<n>`; post the run link on the OSS PR. |

The case is decided by checking the spec filename against ENT's
`run_files` (more robust than new-vs-modified — also catches a modified
OSS spec ENT never ran).

## Decisions baked in

- **No merge gate** — we *link*, we don't block (per the agreed design).
Merge or close the ENT PR once enterprise CI is green.
- **Always on** — there's no OSS-only spec; everything must validate on
enterprise.
- **Async** — ENT builds take ~20–30 min, too long to hold a job, so v1
posts the PR/run **link** and a human confirms green (polling can come
later).
- **Group mapping** — uses the OSS registration group (ENT mirrors the
names); falls back to the spec's folder, then `GeneralTests` with a
warning.

## Security

Like `pr_back`, this job **never checks out or runs PR code** — pure
GitHub API + the trusted `generate` artifact. `ORG_ADMIN_TOKEN`
(cross-repo Contents+PR+Actions write) stays isolated to jobs that don't
build/run untrusted code.

## Notes / to verify on first live run

- Reuses `ORG_ADMIN_TOKEN` for `o2-enterprise` — the job fails fast with
a clear message if the token can't reach the ENT repo.
- Whole-suite cost: any ENT validation (PR or dispatch) runs ENT's full
Playwright matrix — inherent to ENT CI, not a choice.
- Stacked behind #12700 (merged-PR detection / cap-6) — rebase if that
lands first.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 05:44:19 +00:00
Shrinath RaoandClaude Opus 4.8 74c98c45a9 ci(test): reliable healer (no /tmp) + fresh-context heal loop + merged-PR input (#12700)
Heal-loop robustness + merged-PR input for the e2e-council pipeline
(found while testing on a real merged Metrics PR).

## 1. Healer `/tmp` reliability fix
The Healer sometimes emitted `mkdir -p /tmp/heal-logs && … | tee
/tmp/heal-logs/…`. OpenCode's sandbox **auto-rejects creating dirs
outside the workspace** (`permission … external_directory (/tmp/*);
auto-rejecting`) → that command failed → heal silently did nothing.

It's **intermittent** (LLM non-determinism — only when it reaches for a
new `/tmp` dir; a plain `tee /tmp/file` often slipped through), which is
why most runs still healed fine and one real feature didn't. **Fix:**
the Healer never touches `/tmp` — runs plainly (stdout captured) or
writes scratch *inside the repo*. Now reliable regardless of the command
it emits.

## 2. Fresh-context heal loop (retry a stuck heal with a clean slate)
Instead of one agent grinding many internal iterations (and exhausting
its context), the heal step loops **up to 3 fresh Healer invocations**:
- each does ≤3 internal iterations;
- if it can't get the spec passing, it **appends what it tried** to
`heal-notes.md` and stops;
- a **fresh-context** Healer reads those notes and tries a *different*
approach.
- stop on pass, or after 3 fresh contexts. The authoritative run stays
the real gate.

(A stuck context usually just needs a clean slate, not more grinding —
so this beats both "loop forever in one context" and "hard-stop on no
progress".)

## 3. Accept an already-merged PR as input
A dispatch / `/e2e` on an already-merged PR used to base the test PR on
the deleted feature branch → `pr_back` failed. Now merged-mode keys on
the PR's actual state (`data.merged`, guarded by `state==='closed'`) →
base = `main` + merge-commit checkout. Lets you backfill tests for
merged features.

(Heal step timeout 30→40m, job backstop 90→100m to fit the deeper loop.)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 04:26:14 +00:00
Shrinath Raoandgithub-actions[bot] 90a08f28c3 test(autoe2e): generated E2E tests for #12607 (metrics-share-deep-link) (#12706)
🤖 Auto-generated E2E tests for #12607 — **healed to passing** against a
live OpenObserve before this PR was opened.

- Branch `autoe2e/pr-12607` (stacked on `main`), so the tests run
against the feature code and pass before it merges.
- Spec:
`tests/ui-testing/playwright-tests/Metrics/metrics-share-deep-link.spec.js`

The repo Playwright CI re-validates here. Review is for **quality +
coverage** — the tests already pass.

_Generated by the E2E Council pipeline._


**Test cases added / changed:**

| Test case | Type | What it verifies |
|---|---|---|
| `Default state — page loads with defaults, no auto-run` | new |
metrics page loads with default config, no metrics_data blob in URL, and
core UI elements visible |
| `Deep-link with bad metrics_data blob falls back to defaults` | new |
corrupt base64 blob does not crash the page — falls back silently to
default panel state |
| `Deep-link with unknown version blob falls back to defaults` | new |
blob with version 9999 is ignored and page shows default panel
configuration |
| `Deep-link with override params only builds panel from scratch` | new
| chart_type and query override params configure the panel without a
metrics_data blob |
| `URL syncs metrics_data blob after manual query and Apply` | new |
running a query adds a valid metrics_data blob to the URL with correct
version |
| `metrics_data blob excludes volatile data (id, title, description)` |
new | decoded blob does not contain id, title, or description keys |
| `Deep-link restores absolute from/to time range` | new | deep-link
with explicit from/to unix timestamps restores the time range correctly
|
| `Deep-link restores relative time period (period param wins)` | new |
period param takes precedence over from/to and restores relative time
range |
| `Share button disabled state — detects when web_url is not configured`
| new | share button is visible but disabled when web_url is not set |
| `Share button copies shortened URL to clipboard` | new | clicking
share generates a short URL containing /short/ and copies it to
clipboard with success toast |
| `Share button shows loading state during API call` | new | share
button enters loading spinner state during API call and clears after
completion |
| `Deep-link blob restore auto-runs query on mount` | new | valid
metrics_data blob restores panel config and auto-executes query without
manual Apply |
| `Deep-link restores auto-refresh interval` | new | refresh=30s param
sets the auto-refresh interval on the page |
| `Deep-link without stream — query populated, no stream selected` | new
| a deep-link with query but no stream_name does not crash the page |
| `Share URL contains absolute from/to timestamps, not period` | new |
shared URL freezes time to absolute from/to seconds, not relative period
|

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-16 16:56:03 +00:00