)]}'
{
  "log": [
    {
      "commit": "8001e4c86e8d60971887ad7509b88c42a9fd1ad5",
      "tree": "0109e84986341fe8a52ce5cadea7283c79fbbdc0",
      "parents": [
        "1abb3002647da47446790eb87cab2a2023ff092a"
      ],
      "author": {
        "name": "Yicong Huang",
        "email": "17627829+Yicong-Huang@users.noreply.github.com",
        "time": "Thu Jun 11 15:29:10 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 11 22:29:10 2026 +0000"
      },
      "message": "feat(bench): add Arrow Flight E2E benchmark + Benchmarks CI workflow (#5557)\n\n### What changes were proposed in this PR?\n\nA bench-agnostic CI lifecycle that future suites (e.g. JMH for\n`ArrowUtils` micros) plug into by appending one line to\n`bin/run-benchmarks.sh`, plus the first concrete suite: an end-to-end\nArrow Flight + `PythonWorkflowWorker` micro-bench.\n\n**Lifecycle**\n\n| Trigger | Mode | PR comment | Publish to gh-pages |\n|---|---|---|---|\n| `pull_request` (label-gated, mirrors `amber-integration`\u0027s set) | `pr`\n— 3 configs × 20 batches (~5 min) | ✓ | — |\n| `push` to `main` | `pr` (post-merge fast signal) | — | ✓ |\n| `schedule` Sundays 08:00 UTC | `full` — 36 configs × 200 batches\n(~50-60 min) | — | ✓ |\n| `workflow_dispatch` | `full` | — | — |\n\nPR runs upload the bench as an artifact + render a markdown summary\ntable on the workflow page; the `workflow_run`-triggered `Benchmarks PR\nComment` listener (separate file because `pull_request` from forks gets\na read-only token and zero secret access) downloads the artifact,\nsanitizes the CSV, and upserts a single marker-tagged PR comment.\nNon-blocking — not part of `required-checks.yml`\u0027s aggregator.\n\n**First benchmark: Arrow Flight E2E (`ArrowFlightActorBench`)**\n\nSpawns a real `PythonWorkflowWorker` actor (real Pekko mailbox + real\n`texera_run_python_worker.py` subprocess + real Arrow Flight gRPC) wired\nto an identity Python UDF, then times per-batch send→echo round-trip\nacross a sweep of `batch_size × schema_width × string_len`. Per-config\noutput: throughput (tuples/s, MB/s), latency p50/p95/p99, total ms. Each\nconfig writes incrementally so a killed sweep still leaves usable\nartifacts.\n\nASF: `benchmark-action/github-action-benchmark` is SHA-pinned to\n`52576c92bccf6ac60c8223ec7eb2565637cae9ba` (v1.22.1) per the\napache-infrastructure-actions allow-list.\n\n### Any related issues, documentation, discussions?\n\nCloses #5556\n\n### How was this PR tested?\n\nEnd-to-end validated on a fork-internal PR —\n[Yicong-Huang/texera#17](https://github.com/Yicong-Huang/texera/pull/17)\nran the full `Benchmarks` workflow, the `workflow_run` listener fired,\nand a marker-tagged comment landed and upserted across two push cycles\n([rendered\nexample](https://github.com/Yicong-Huang/texera/pull/17#issuecomment-4645589605)).\n`workflow_run` only listens on the default branch, so the loop can\u0027t be\ntested from a non-default branch — that\u0027s why the dry-run lived on a\nfork; after merge, the same flow takes effect on `apache/texera:main`\nautomatically.\n\n### Was this PR authored or co-authored using generative AI tooling?\n\nGenerated-by: Claude Code (Opus 4.7)"
    },
    {
      "commit": "1abb3002647da47446790eb87cab2a2023ff092a",
      "tree": "d2099f5bc57fa0c01858efdc98738f824a83d503",
      "parents": [
        "ae3128d999c48d0f014be2eea2eb4fc0f4ee9e66"
      ],
      "author": {
        "name": "Matthew B.",
        "email": "mgball@uci.edu",
        "time": "Thu Jun 11 11:33:28 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 11 18:33:28 2026 +0000"
      },
      "message": "docs: backport content updates from incubator-texera-site (#5628)\n\n### What changes were proposed in this PR?\n- Backport doc content that was edited directly on the website\n(`apache/incubator-texera-site`, `content/docs/latest/`) back into this\nrepo\u0027s `docs/` source, so `docs/` is the source of truth for the docs\nsync.\n- `getting-started/installing-using-docker.md`: use the released\ndownload link instead of the RC5 dev-dist URL, add \"Enable the Texera\nAgent\" and \"Add more LLMs or providers\" sections, and fix the stop\ncommand to `docker compose --profile examples stop`.\n- `tutorials/migrate-jupyter-notebook.md`: correct the\n`hub.texera.io/dashboard/...` URLs.\n- Each file keeps its existing local front matter; website-only fields\n(`aliases`) and the `_index.md` `/docs/latest/` routing differences are\nintentionally not pulled, since they are site-specific.\n### Any related issues, documentation, or discussions?\nCloses: #5627\n### How was this PR tested?\n- Docs-only change, no code paths affected, so no automated tests apply.\n- To verify content: open\n`docs/getting-started/installing-using-docker.md` and confirm the\ndownload link points to\n`downloads.apache.org/incubator/texera/1.1.0-incubating/...`, the\n\"Enable the Texera Agent\" and \"Add more LLMs or providers\" sections are\npresent, and the stop command reads `docker compose --profile examples\nstop`.\n- To verify content: open `docs/tutorials/migrate-jupyter-notebook.md`\nand confirm the example links use the `hub.texera.io/dashboard/...`\npaths.\n- To confirm parity: diff `docs/` against the website\u0027s\n`content/docs/latest/` bodies and confirm the only remaining differences\nare website-only front matter and `_index.md` routing.\n### Was this PR authored or co-authored using generative AI tooling?\nGenerated-by: Claude Opus 4.8"
    },
    {
      "commit": "ae3128d999c48d0f014be2eea2eb4fc0f4ee9e66",
      "tree": "6817ef090832079ecff4db536cdd5c6a42b6f68f",
      "parents": [
        "539a68551288a951d4c0a6d262105a8e6c211790"
      ],
      "author": {
        "name": "Jiadong Bai",
        "email": "43344272+bobbai00@users.noreply.github.com",
        "time": "Wed Jun 10 23:32:48 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 11 06:32:48 2026 +0000"
      },
      "message": "fix(agent-service): authenticate to the LLM proxy as the delegating user (#5605)\n\n### What changes were proposed in this PR?\n\nSince #5421, the access-control-service LLM gateway requires a\nREGULAR/ADMIN-role user JWT and injects `LITELLM_MASTER_KEY` into the\ndownstream request itself, but the agent-service still authenticated\nwith the static `LLM_API_KEY` default (`\"dummy\"`), so every agent\ngeneration call returned 401 Unauthorized. This PR makes the delegating\nuser\u0027s JWT the only credential the agent-service ever sends:\n\n- Creating an agent (`POST /agents`) now requires the user\u0027s JWT in the\n`Authorization: Bearer` header (the standard place for credentials,\ninstead of a `userToken` field in the JSON payload); requests without it\nare rejected with 401, since an agent without a user could never call\nthe gateway anyway. The frontend\u0027s JWT interceptor already attaches this\nheader, so `agent.service.ts` simply stops duplicating the token in the\nrequest body.\n- The OpenAI client authenticates with the delegating user\u0027s JWT; the\n`LLM_API_KEY` env var is removed from the service (`env.ts`), the helm\nchart (deployment env, `llm-api-key` secret entry, `llmApiKey` values),\nand the single-node `.env`. The master key now lives only in the\naccess-control-service and LiteLLM.\n- Elysia `VALIDATION`/`PARSE` errors are mapped to 400 instead of\nfalling through to a generic 500 (surfaced by Copilot\u0027s review comment\non the schema-violation tests).\n\n```mermaid\nsequenceDiagram\n    participant FE as Frontend (user JWT)\n    participant AS as agent-service\n    participant ACS as access-control-service (LLM gateway)\n    participant LLM as LiteLLM\n\n    FE-\u003e\u003eAS: POST /agents\u003cbr/\u003eAuthorization: Bearer (user JWT) — required, else 401\n    FE-\u003e\u003eAS: send message\n    rect rgb(255, 235, 235)\n    Note over AS,ACS: before: Authorization: Bearer dummy → 401\n    end\n    AS-\u003e\u003eACS: POST /api/chat/completions\u003cbr/\u003eAuthorization: Bearer (user JWT) ✅\n    ACS-\u003e\u003eLLM: forward with Authorization: Bearer (LITELLM_MASTER_KEY)\n    LLM--\u003e\u003eAS: completion\n    AS--\u003e\u003eFE: agent response\n```\n\n### Any related issues, documentation, discussions?\n\nCloses #5604\n\n### How was this PR tested?\n\nUpdated `server.test.ts`: agent creation sends a minted JWT in the\n`Authorization` header; added cases for a missing header, a non-Bearer\nscheme, and an invalid token (93 tests pass via `bun test`). Also\nverified end-to-end on a local Kubernetes deployment (this branch\u0027s\nchart + agent-service image, everything else from `ghcr.io/apache`\nnightlies): creation without the header → 401, with the header → 200,\nand a websocket message produced a real `gpt-5-mini` completion through\naccess-control-service → LiteLLM. `typecheck` and `format:check` pass;\nthe frontend change typechecks via `tsc --noEmit`.\n\n### Was this PR authored or co-authored using generative AI tooling?\n\nGenerated-by: Claude Fable 5 (1M context)\n\n---------\n\nCo-authored-by: Bob Bai \u003cbobbai0509@gmail.com\u003e"
    },
    {
      "commit": "539a68551288a951d4c0a6d262105a8e6c211790",
      "tree": "3714e40e3afb0fab7ffbd03c2f8691c1a68b8d52",
      "parents": [
        "17607c5a99171a636b4fa8336d43b570b0705bc1"
      ],
      "author": {
        "name": "Sarah Asad",
        "email": "sarah_asad@live.com",
        "time": "Wed Jun 10 15:53:26 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 10 22:53:26 2026 +0000"
      },
      "message": "feat(operator): Add Case Sensitivity to Keyword Search Operator (#5600)\n\n\u003c!--\nThanks for sending a pull request (PR)! Here are some tips for you:\n1. If this is your first time, please read our contributor guidelines:\n[Contributing to\nTexera](https://github.com/apache/texera/blob/main/CONTRIBUTING.md)\n  2. Ensure you have added or run the appropriate tests for your PR\n  3. If the PR is work in progress, mark it a draft on GitHub.\n  4. Please write your PR title to summarize what this PR proposes, we \n    are following Conventional Commits style for PR titles as well.\n  5. Be sure to keep the PR description updated to reflect all changes.\n--\u003e\n\n### What changes were proposed in this PR?\n\u003c!--\nPlease clarify what changes you are proposing. The purpose of this\nsection\nis to outline the changes. Here are some tips for you:\n  1. If you propose a new API, clarify the use case for a new API.\n  2. If you fix a bug, you can clarify why it is a bug.\n  3. If it is a refactoring, clarify what has been changed.\n  3. It would be helpful to include a before-and-after comparison using \n     screenshots or GIFs.\n  4. Please consider writing useful notes for better and faster reviews.\n--\u003e\n\nSupersedes #3510. Since the PR is old and the repository structure has\nchanged, this PR reapplies the relevant changes on top of the current\nmaster branch.\n\nThis PR adds an option for case sensitivity to the keyword search\noperator. Users can now use a checkbox to specify whether their search\nshould be case sensitive or case insensitive. This functionality is\nenabled through the addition of a CaseSensitiveAnalyzer that extends the\nbase Lucene Analyzer for case sensitive searches, while the original\nStandardAnalyzer is used for case insensitive searches.\n\n\u003cimg width\u003d\"2574\" height\u003d\"1366\" alt\u003d\"image\"\nsrc\u003d\"https://github.com/user-attachments/assets/5e2d6686-642a-49e4-8ad5-3d052d616f68\"\n/\u003e\n\u003cimg width\u003d\"2564\" height\u003d\"1350\" alt\u003d\"image\"\nsrc\u003d\"https://github.com/user-attachments/assets/1d766f3e-993e-4229-84ce-c41b72bf1f46\"\n/\u003e\n\u003cimg width\u003d\"2572\" height\u003d\"1350\" alt\u003d\"image\"\nsrc\u003d\"https://github.com/user-attachments/assets/f254761f-ceaa-4c30-ada9-89b63f9347fa\"\n/\u003e\n\n\n### Any related issues, documentation, discussions?\n\u003c!--\nPlease use this section to link other resources if not mentioned\nalready.\n1. If this PR fixes an issue, please include `Fixes #1234`, `Resolves\n#1234`\nor `Closes #1234`. If it is only related, simply mention the issue\nnumber.\n  2. If there is design documentation, please add the link.\n  3. If there is a discussion in the mailing list, please add the link.\n--\u003e\n\nCloses #3045. \n\n\n### How was this PR tested?\n\u003c!--\nIf tests were added, say they were added here. Or simply mention that if\nthe PR\nis tested with existing test cases. Make sure to include/update test\ncases that\ncheck the changes thoroughly including negative and positive cases if\npossible.\nIf it was tested in a way different from regular unit tests, please\nclarify how\nyou tested step by step, ideally copy and paste-able, so that other\nreviewers can\ntest and check, and descendants can verify in the future. If tests were\nnot added,\nplease describe why they were not added and/or why it was difficult to\nadd.\n--\u003e\n\nTested Manually. \n\n\n### Was this PR authored or co-authored using generative AI tooling?\n\u003c!--\nIf generative AI tooling has been used in the process of authoring this\nPR,\nplease include the phrase: \u0027Generated-by: \u0027 followed by the name of the\ntool\nand its version. If no, write \u0027No\u0027. \nPlease refer to the [ASF Generative Tooling\nGuidance](https://www.apache.org/legal/generative-tooling.html) for\ndetails.\n--\u003e\nCo-authored using: Claude Code"
    },
    {
      "commit": "17607c5a99171a636b4fa8336d43b570b0705bc1",
      "tree": "0d6222ac72215de8e136148fcad10d46ad1780dd",
      "parents": [
        "c82d4d1c644b8c6dd822d3d7e4ef39d653f61a81"
      ],
      "author": {
        "name": "ali risheh",
        "email": "ali.risheh876@gmail.com",
        "time": "Wed Jun 10 13:39:19 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 10 20:39:19 2026 +0000"
      },
      "message": "fix(config-service): expose inviteOnly on /config/pre-login so INACTIVE users see the registration-request form (#5572)\n\n### What changes were proposed in this PR?\n\n#5305 moved `GET /config/user-system` from `@PermitAll` to\n`@RolesAllowed(\"REGULAR\", \"ADMIN\")`. A freshly-registered user is\n`INACTIVE`\nuntil admin approval, so they cannot reach `@RolesAllowed` endpoints —\nthe\nrequest returns 403/401, `inviteOnly` is left undefined on the frontend,\nthe\nregistration-request form never appears, and no admin notification email\nis\nsent. In invite-only deployments, new sign-ups are silently dropped.\n\nPer review feedback (@Yicong-Huang), instead of re-opening the whole\n`/config/user-system` endpoint with `@PermitAll`, this PR exposes only\nthe\n`inviteOnly` boolean on the already-public `/config/pre-login` and keeps\n`/config/user-system` `@RolesAllowed`. The frontend already loads\n`/config/pre-login` anonymously during APP_INITIALIZER, so `inviteOnly`\nis now\navailable before activation without widening the authenticated surface.\n\n\u003c!-- BEFORE \u0026 AFTER screenshots to be added. --\u003e\n\n### Any related issues, documentation, discussions?\n\nResolves #5587\n\n### How was this PR tested?\n\n- Updated `ConfigResourceAuthSpec`: `/config/pre-login` exposes exactly\n`{localLogin, googleLogin, defaultLocalUser, attributionEnabled,\ninviteOnly}`\nanonymously; `/config/user-system` returns 401 + `Bearer` challenge\nwithout a\ntoken and 200 with a valid Bearer token. `sbt ConfigService/test` → 9\npassed.\n- Verified live on an invite-only deployment: a fresh INACTIVE\nregistration\nreads `inviteOnly: true` from `/config/pre-login`, the\nregistration-request\n  form appears, and the admin notification email is sent, while\n  `/config/user-system` still returns 403/401 to anonymous callers.\n\n### Was this PR authored or co-authored using generative AI tooling?\n\nGenerated-by: Claude Code (Claude Opus 4.8)\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "c82d4d1c644b8c6dd822d3d7e4ef39d653f61a81",
      "tree": "d68f1db11e86553d53967aaf1da8a7a4db8b3512",
      "parents": [
        "27c1df41355d230b929c58ce9bd3eefa3835acc4"
      ],
      "author": {
        "name": "Matthew B.",
        "email": "mgball@uci.edu",
        "time": "Wed Jun 10 11:14:55 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 10 18:14:55 2026 +0000"
      },
      "message": "ci: Compact first-time contributor welcome and stop issue-link pollution (#5317)\n\n### What changes were proposed in this PR?\nReworks the first-time-contributor welcome comment posted by\n`welcome-first-time-contributor.yml`.\n\n- Rewrote the welcome message: an opening pointer to `starter-task`\nissues for newcomers, plus clearer full-sentence guidance for the three\ncomment-command groups (issues, sub-issues, pull requests).\n- Wrapped every issue reference in inline code so GitHub no longer\nautolinks the examples (these previously created cross-reference\nbacklinks into real issues each time the welcome fired) and switched the\nexamples to the self-referential `#5166` and `#5222`.\n- Moved the message body out of the workflow `.yml` and into\n`.github/welcome-first-time-contributor.txt`, read at runtime via a\nsparse checkout and rendered by substituting `{{author}}`, `{{owner}}`,\nand `{{repo}}`.\n\nThe rendered message a first-time contributor now sees:\n\n\u003e 👋 Thanks for your first contribution to Texera, @\u0026lt;author\u0026gt;!\n\u003e\n\u003e If you\u0027re looking for a good place to start, browse issues labeled\n[`starter-task`](https://github.com/apache/texera/issues?q\u003dis%3Aissue+is%3Aopen+label%3Astarter-task);\nthey\u0027re scoped to be approachable for newcomers.\n\u003e\n\u003e You can drive common housekeeping yourself by commenting one of these\ncommands on its own line:\n\u003e\n\u003e - **Issues.** Comment `/take` to assign an open issue to yourself, or\n`/untake` to release it. You can find unclaimed work with the search\nfilter `is:issue is:open no:assignee`.\n\u003e - **Sub-issues.** To link issues into a parent/child hierarchy,\ncomment `/sub-issue #5166 #5222` on the parent to attach those children\n(or `/unsub-issue #5166 #5222` to detach them). From a child issue,\ncomment `/parent-issue #5166` to set its parent, or `/unparent-issue` to\nclear it (the current parent is detected automatically). References may\nbe written as `#5166` or as a bare `5166`; cross-repository references\nare not supported.\n\u003e - **Pull requests (author only).** Comment `/request-review @user` to\nrequest a review from someone, or `/unrequest-review @user` to withdraw\nthat request.\n\u003e\n\u003e Each command must match exactly: `/take this` will not work, only\n`/take` does. For the full contribution flow, see\n[CONTRIBUTING.md](https://github.com/apache/texera/blob/main/CONTRIBUTING.md).\n\n### Any related issues, documentation, or discussions?\nCloses: #5315\n\n### How was this PR tested?\n- Cross-referenced every command claim against `comment-commands.yml`\nfor accuracy.\n- Simulated the runtime substitution locally (read the `.txt`, replaced\nthe placeholders, prepended the idempotency marker) and confirmed the\noutput matches the message above with no leftover placeholders.\n- Confirmed via GitHub docs that `#N` inside inline code is not\nautolinked, and verified zero bare `#N` remain in the message body.\n\n### Was this PR authored or co-authored using generative AI tooling?\nCo-authored with Claude Opus 4.8 in compliance with ASF"
    },
    {
      "commit": "27c1df41355d230b929c58ce9bd3eefa3835acc4",
      "tree": "c77a9d3354f0d53455c90d22453d9c431119edaf",
      "parents": [
        "cd6053567094fcab1dfffd91e070411f64769d14"
      ],
      "author": {
        "name": "Jiadong Bai",
        "email": "43344272+bobbai00@users.noreply.github.com",
        "time": "Wed Jun 10 11:09:04 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 10 18:09:04 2026 +0000"
      },
      "message": "chore(licensing): add per-module NOTICE-binary generation script and CI checks for detecting NOTICE-binary drifting (#5417)\n\n### What changes were proposed in this PR?\n\nAuto-generates each module\u0027s `NOTICE-binary` from the third-party\n`META-INF/NOTICE` files in its bundled jars — replacing the hand-curated\nsubsets introduced in #4668 — and adds a CI drift-check so the committed\nfiles can never silently rot when dependencies change.\n\n- **New generator — `bin/licensing/generate_notice_binary.py`:** walks a\nmodule\u0027s dist `lib/` dir, extracts every `META-INF/NOTICE` (and\nroot-level `NOTICE`) from each bundled jar, skips first-party\n`org.apache.texera.*` jars, dedupes by content hash so jars sharing an\nupstream notice collapse into one block, prepends the project\u0027s own root\n`NOTICE`, and emits one block per unique notice with a synthesized\nheading + the contributing-jar list. Output is deterministic (CRLF→LF\nnormalized, stably sorted by jar-count). An optional `--extras \u003cfile\u003e`\nappends non-jar attributions.\n- **`amber/NOTICE-binary-extras` (new):** the aiohttp + Matplotlib\nnotices, which ship as Python wheels (not jars) and so can\u0027t be\nextracted from the `lib/` dir.\n- **6 per-module `NOTICE-binary` files regenerated** from the actual\nbundled jars: `amber`, `access-control-service`, `config-service`,\n`file-service`, `computing-unit-managing-service`,\n`workflow-compiling-service`.\n- **CI drift-check (`build.yml`):** after each dist is built and\nunzipped, a new step regenerates that module\u0027s `NOTICE-binary` and diffs\nit against the committed file, failing the build with a one-line fix-up\ncommand on any drift. The amber check runs in the scala job; the five\nplatform services are each checked in the per-service `platform` matrix\njob, alongside the existing `LICENSE-binary` check.\n\n`LICENSE-binary` stays hand-maintained (it needs human judgment on each\nlicense); only `NOTICE-binary` — a mechanical carry-forward of upstream\nnotices — is generated. So future dep bumps fail CI with the exact\ncommand to regenerate, instead of silently drifting.\n\n### Any related issues, documentation, discussions?\n\nCloses #4674\n\nASF guidance: https://infra.apache.org/licensing-howto.html (Apache-2.0\n§4(d)).\n\n### How was this PR tested?\n\n- Built all six module dists locally (`sbt \u003cproject\u003e/Universal/stage`)\nand ran the generator against each freshly-built `lib/`; the committed\n`NOTICE-binary` files are byte-identical to the generator output, so the\nnew CI drift-check passes for every module.\n- Verified the existing `LICENSE-binary` checks (`check_binary_deps.py`,\nPR mode) still pass against the same libs for all six modules.\n- `build.yml` validated as well-formed YAML.\n\n### Was this PR authored or co-authored using generative AI tooling?\n\nGenerated-by: Claude Opus 4.8 (1M context)\n\n---------\n\nCo-authored-by: Bob Bai \u003cbobbai0509@gmail.com\u003e"
    },
    {
      "commit": "cd6053567094fcab1dfffd91e070411f64769d14",
      "tree": "40367e35ddbf738a09520db987ab5117a7f017b4",
      "parents": [
        "07ca5d4cd6efebf2de284a599db1e88f2a778c08"
      ],
      "author": {
        "name": "yangzhang75",
        "email": "yangz75@uci.edu",
        "time": "Tue Jun 09 21:57:25 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 10 04:57:25 2026 +0000"
      },
      "message": "test(frontend): add unit tests for DatasetFileSelectorComponent (#5576)\n\n\u003c!--\nThanks for sending a pull request (PR)! Here are some tips for you:\n1. If this is your first time, please read our contributor guidelines:\n[Contributing to\nTexera](https://github.com/apache/texera/blob/main/CONTRIBUTING.md)\n  2. Ensure you have added or run the appropriate tests for your PR\n  3. If the PR is work in progress, mark it a draft on GitHub.\n  4. Please write your PR title to summarize what this PR proposes, we \n    are following Conventional Commits style for PR titles as well.\n  5. Be sure to keep the PR description updated to reflect all changes.\n--\u003e\n\n### What changes were proposed in this PR?\n\u003c!--\nPlease clarify what changes you are proposing. The purpose of this\nsection\nis to outline the changes. Here are some tips for you:\n  1. If you propose a new API, clarify the use case for a new API.\n  2. If you fix a bug, you can clarify why it is a bug.\n  3. If it is a refactoring, clarify what has been changed.\n  3. It would be helpful to include a before-and-after comparison using \n     screenshots or GIFs.\n  4. Please consider writing useful notes for better and faster reviews.\n--\u003e\nAdds a unit test spec for DatasetFileSelectorComponent, which previously\nhad no *.spec.ts. The component is a Formly field type whose\nonClickOpenFileSelectionModal() opens a dataset-selection modal and\nwrites the chosen path back into the form control when the modal closes\nwith a value.\n\n### Any related issues, documentation, discussions?\n\u003c!--\nPlease use this section to link other resources if not mentioned\nalready.\n1. If this PR fixes an issue, please include `Fixes #1234`, `Resolves\n#1234`\nor `Closes #1234`. If it is only related, simply mention the issue\nnumber.\n  2. If there is design documentation, please add the link.\n  3. If there is a discussion in the mailing list, please add the link.\n--\u003e\nCloses #5471\n\n### How was this PR tested?\n\u003c!--\nIf tests were added, say they were added here. Or simply mention that if\nthe PR\nis tested with existing test cases. Make sure to include/update test\ncases that\ncheck the changes thoroughly including negative and positive cases if\npossible.\nIf it was tested in a way different from regular unit tests, please\nclarify how\nyou tested step by step, ideally copy and paste-able, so that other\nreviewers can\ntest and check, and descendants can verify in the future. If tests were\nnot added,\nplease describe why they were not added and/or why it was difficult to\nadd.\n--\u003e\nNew unit tests added in dataset-file-selector.component.spec.ts, run via\n`ng test` (Vitest). They cover:\n- component creation\n- onClickOpenFileSelectionModal() opens the dataset selection modal\nexactly once\n- a selected path is written back into the form control\n- the form control is left unchanged when the modal is dismissed without\na path\n- isFileSelectionEnabled reflects the GUI config\n\nAll 5 tests pass; eslint and prettier checks are clean.\n\n### Was this PR authored or co-authored using generative AI tooling?\n\u003c!--\nIf generative AI tooling has been used in the process of authoring this\nPR,\nplease include the phrase: \u0027Generated-by: \u0027 followed by the name of the\ntool\nand its version. If no, write \u0027No\u0027. \nPlease refer to the [ASF Generative Tooling\nGuidance](https://www.apache.org/legal/generative-tooling.html) for\ndetails.\n--\u003e\nGenerated-by: Claude Code"
    },
    {
      "commit": "07ca5d4cd6efebf2de284a599db1e88f2a778c08",
      "tree": "a9b540afb121d1e5c85a9c7ce7c152d53cce0f5f",
      "parents": [
        "5b02684cbd299b847a810c4df296c0705fefc4ca"
      ],
      "author": {
        "name": "Neil Ketteringham",
        "email": "53205839+Neilk1021@users.noreply.github.com",
        "time": "Tue Jun 09 15:35:42 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 09 22:35:42 2026 +0000"
      },
      "message": "test(frontend): add unit tests for RowModalComponent (#5580)\n\n### What changes were proposed in this PR?\n\nThis PR adds a comprehensive unit test suite\n(`result-panel-modal.component.spec.ts`) for the `RowModalComponent`.\n\nThe newly introduced test cases verify that:\n\n* The component instantiates successfully with injection tokens mapped\ncorrectly (`NZ_MODAL_DATA`, `NzModalRef`).\n* The lifecycle method `ngOnChanges()` executes smoothly to resolve\nnested service streams through `WorkflowResultService` and\n`PanelResizeService`.\n* The internal property `currentDisplayRowData` is accurately populated\nwith target row values evaluated from mock RxJS data streams.\n\n### Any related issues, documentation, discussions?\n\nCloses #5469\n\n### How was this PR tested?\n\nThis PR was tested by executing the newly added unit test suite\n(`result-panel-modal.component.spec.ts`) to ensure all assertions pass\nsuccessfully, validating both the dependency injection setup and the\nreactive stream logic.\n\n### Was this PR authored or co-authored using generative AI tooling?\n\nNo"
    },
    {
      "commit": "5b02684cbd299b847a810c4df296c0705fefc4ca",
      "tree": "f4066b74043e44c3ef8af5a664c3231a783286de",
      "parents": [
        "8f4a11a60b108029604bb511ee0409d793200780"
      ],
      "author": {
        "name": "Xuan Gu",
        "email": "162244362+xuang7@users.noreply.github.com",
        "time": "Tue Jun 09 15:02:13 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 09 22:02:13 2026 +0000"
      },
      "message": "chore(licensing): refresh transitive versions in LICENSE-binary-python (#5589)\n\n### What changes were proposed in this PR?\n\nThis PR refreshes `amber/LICENSE-binary-python` to match the\ncurrently-bundled\ntransitive Python dependency versions. These are calver/semver bumps of\nalready-declared deps — the licenses are unchanged, only the recorded\nversion\nstrings had drifted behind upstream:\n\n- aiohttp 3.13.5 → 3.14.1\n- filelock 3.29.0 → 3.29.1\n- hf-xet 1.5.0 → 1.5.1\n- huggingface-hub 1.16.1 → 1.18.0\n- idna 3.16 → 3.18\n- safetensors 0.7.0 → 0.8.0\n- tifffile 2026.5.15 → 2026.6.1\n- tqdm 4.67.3 → 4.68.2\n- update-checker 0.18.0 → 1.0.0\n\nThis clears the License Binary Checker drift on both `main` and\n`release/v1.2`\n(they share an identical `amber/LICENSE-binary-python`).\n\n### Any related issues, documentation, discussions?\n\nCloses #5297. Closes #5588. To be backported to `release/v1.2` via the\n`release/v1.2` label.\n\n### How was this PR tested?\n\nLicense Binary Checker (build.yml strict mode) passes against the\nbundled wheels.\n\n### Was this PR authored or co-authored using generative AI tooling?\n\nGenerated-by: Claude Code\n\nCo-authored-by: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "8f4a11a60b108029604bb511ee0409d793200780",
      "tree": "3ada519f854017ef752b4a4ef87f1be4bde7fe9e",
      "parents": [
        "961c9996ae7efcda486893ea6278d4faa46fac28"
      ],
      "author": {
        "name": "Neil Ketteringham",
        "email": "53205839+Neilk1021@users.noreply.github.com",
        "time": "Tue Jun 09 15:02:07 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 09 22:02:07 2026 +0000"
      },
      "message": "test: add unit tests for SortButtonComponent (#5578)\n\n### What changes were proposed in this PR?\n\nThis PR adds a comprehensive unit test suite\n(`sort-button.component.spec.ts`) for the `SortButtonComponent`.\n\nThe newly introduced test cases verify that:\n\n* The component instantiates successfully with the correct default\nsorting method.\n* The execution of `lastSort()`, `dateSort()`, `ascSort()`, and\n`dscSort()` updates the internal `sortMethod` state correctly and fires\nthe expected payload through the `sortMethodChange` event emitter.\n\n### Any related issues, documentation, discussions?\n\nCloses #5463\n\n### How was this PR tested?\n\nThis PR was tested by running the newly added unit test suite\n(`sort-button.component.spec.ts`) to ensure all test cases pass\nsuccessfully and cover both state updates and event emissions.\n\n### Was this PR authored or co-authored using generative AI tooling?\n\nNo"
    },
    {
      "commit": "961c9996ae7efcda486893ea6278d4faa46fac28",
      "tree": "7c4e3a27a1f526b86fec100d36734cf0f8d2ac87",
      "parents": [
        "96fa3f099c00687bffafae88249e78fbe1de516b"
      ],
      "author": {
        "name": "yangzhang75",
        "email": "yangz75@uci.edu",
        "time": "Tue Jun 09 14:57:46 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 09 21:57:46 2026 +0000"
      },
      "message": "test(frontend): add unit tests for DatasetVersionSelectorComponent (#5579)\n\n\u003c!--\nThanks for sending a pull request (PR)! Here are some tips for you:\n1. If this is your first time, please read our contributor guidelines:\n[Contributing to\nTexera](https://github.com/apache/texera/blob/main/CONTRIBUTING.md)\n  2. Ensure you have added or run the appropriate tests for your PR\n  3. If the PR is work in progress, mark it a draft on GitHub.\n  4. Please write your PR title to summarize what this PR proposes, we \n    are following Conventional Commits style for PR titles as well.\n  5. Be sure to keep the PR description updated to reflect all changes.\n--\u003e\n\n### What changes were proposed in this PR?\n\u003c!--\nPlease clarify what changes you are proposing. The purpose of this\nsection\nis to outline the changes. Here are some tips for you:\n  1. If you propose a new API, clarify the use case for a new API.\n  2. If you fix a bug, you can clarify why it is a bug.\n  3. If it is a refactoring, clarify what has been changed.\n  3. It would be helpful to include a before-and-after comparison using \n     screenshots or GIFs.\n  4. Please consider writing useful notes for better and faster reviews.\n--\u003e\nAdds a unit test spec for DatasetVersionSelectorComponent, which\npreviously had no *.spec.ts. The component is a Formly field type whose\nonClickOpenDatasetSelectionModal() opens a dataset-selection modal and\nwrites the chosen value back into the form control when the modal closes\nwith a value.\n\n### Any related issues, documentation, discussions?\n\u003c!--\nPlease use this section to link other resources if not mentioned\nalready.\n1. If this PR fixes an issue, please include `Fixes #1234`, `Resolves\n#1234`\nor `Closes #1234`. If it is only related, simply mention the issue\nnumber.\n  2. If there is design documentation, please add the link.\n  3. If there is a discussion in the mailing list, please add the link.\n--\u003e\nCloses #5470\n\n### How was this PR tested?\n\u003c!--\nIf tests were added, say they were added here. Or simply mention that if\nthe PR\nis tested with existing test cases. Make sure to include/update test\ncases that\ncheck the changes thoroughly including negative and positive cases if\npossible.\nIf it was tested in a way different from regular unit tests, please\nclarify how\nyou tested step by step, ideally copy and paste-able, so that other\nreviewers can\ntest and check, and descendants can verify in the future. If tests were\nnot added,\nplease describe why they were not added and/or why it was difficult to\nadd.\n--\u003e\nNew unit tests added in dataset-version-selector.component.spec.ts, run\nvia `ng test` (Vitest). They cover:\n- component creation\n- onClickOpenDatasetSelectionModal() opens the dataset selection modal\nexactly once\n- a selected value is written back into the form control\n- the form control is left unchanged when the modal is dismissed without\na value\n\nAll 4 tests pass; eslint and prettier checks are clean.\n\n### Was this PR authored or co-authored using generative AI tooling?\n\u003c!--\nIf generative AI tooling has been used in the process of authoring this\nPR,\nplease include the phrase: \u0027Generated-by: \u0027 followed by the name of the\ntool\nand its version. If no, write \u0027No\u0027. \nPlease refer to the [ASF Generative Tooling\nGuidance](https://www.apache.org/legal/generative-tooling.html) for\ndetails.\n--\u003e\nGenerated-by: Claude Code (Claude Opus 4.8)"
    },
    {
      "commit": "96fa3f099c00687bffafae88249e78fbe1de516b",
      "tree": "0eb8b80a731845471faceda95ce56c1c04ae7552",
      "parents": [
        "7b7a5c69b83c88caee17b34b9029c7575bebe143"
      ],
      "author": {
        "name": "EmilySun621",
        "email": "142070420+EmilySun621@users.noreply.github.com",
        "time": "Tue Jun 09 14:56:41 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 09 21:56:41 2026 +0000"
      },
      "message": "test(frontend): add spec for FlarumComponent (#5584)\n\n### What changes were proposed in this PR?\n\nAdds a behavior-focused unit test spec for `FlarumComponent`. Tests\ncover:\n- DomSanitizer call with \"forum\" URL at construction\n- `SafeResourceUrl` exposed as `flarumUrl`\n- iframe `[src]` binding\n\n### Any related issues, documentation, discussions?\n\nRelated to #5167\n\n### How was this PR tested?\n\nSpec verified with `npx ng test --watch\u003dfalse\n--include\u003d\u0027**/flarum.component.spec.ts\u0027`. 3 tests passing.\n\n### Was this PR authored or co-authored using generative AI tooling?\n\nGenerated-by: Claude Code (Anthropic)\n\nCo-authored-by: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "7b7a5c69b83c88caee17b34b9029c7575bebe143",
      "tree": "93ae9a5329aaf914414a16b21838323db16995ea",
      "parents": [
        "400f1cdaff960eedbb696a6501aee3dc84a9c453"
      ],
      "author": {
        "name": "Matthew B.",
        "email": "mgball@uci.edu",
        "time": "Tue Jun 09 14:13:47 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 09 21:13:47 2026 +0000"
      },
      "message": "fix(auth): enforce @RolesAllowed in file-service by registering RolesAllowedDynamicFeature (#5198)\n\n### What changes were proposed in this PR?\n\nRegisters Jersey\u0027s `RolesAllowedDynamicFeature` in `file-service`\u0027s\nJersey environment so the `@RolesAllowed` / `@PermitAll` annotations\nalready present on `DatasetResource` are actually enforced.\n\n`file-service` registered `JwtAuthFilter` (authentication) and the\n`AuthValueFactoryProvider.Binder` (so `@Auth user` injects), but never\n`RolesAllowedDynamicFeature` (authorization). The ~20\n`@RolesAllowed(Array(\"REGULAR\", \"ADMIN\"))` annotations on\n`DatasetResource` were therefore decorative: any valid JWT reached the\nresource method regardless of role. This adds the one missing\nregistration.\n\n```scala\n// Enforce @RolesAllowed annotations on resource methods\nenvironment.jersey.register(classOf[RolesAllowedDynamicFeature])\n```\n\nOnce enforcement is live, the six public-dataset endpoints\n(`getPublicPresignedUrl`, `getPublicPresignedUrlWithS3`,\n`getPublicDatasetVersionList`,\n`retrievePublicDatasetVersionRootFileNodes`, `getPublicDataset`,\n`getDatasetCover`) must stay reachable without a JWT for anonymous hub\nvisitors. They are already `@PermitAll` on `main`; the new spec pins\nthat so a future refactor cannot silently lock them out.\n\n### Scope note\n\nThis PR was originally \"complete @RolesAllowed enforcement across\nmicroservices.\" Since then the rest of that work has landed or is in\nflight on `main`, so this PR has been narrowed to the one remaining gap:\n\n- `config-service`, `computing-unit-managing-service`,\n`workflow-compiling-service`: done in #5049 / #5199.\n- `JwtAuthFilter` priority + eager-401 + `@PermitAll` opt-out: done in\n#5404.\n- `access-control-service` (LiteLLM proxy hardening + feature\nregistration): handled by #5421 (@Yicong-Huang).\n- **`file-service`: this PR.**\n\nWith this and #5421, every microservice that uses `@RolesAllowed`\nenforces it, closing out #4904.\n\n### Any related issues, documentation, or discussions?\n\nCloses #5433. Follow-up to #4904; companion to #5421.\n\n### How was this PR tested?\n\nAdded `DatasetResourcePermissionsSpec`, which verifies the six\npublic-dataset endpoints carry `@PermitAll` so they remain\nanonymous-accessible after enforcement is enabled. `file-service` and\nthe auth modules compile clean. Existing `DatasetResource`\n`@RolesAllowed` annotations are unchanged.\n\n### Was this PR authored or co-authored using generative AI tooling?\n\nCo-authored with Claude Opus 4.8 in compliance with ASF Generative\nTooling Guidance.\n\n---------\n\nCo-authored-by: Yicong Huang \u003c17627829+Yicong-Huang@users.noreply.github.com\u003e"
    },
    {
      "commit": "400f1cdaff960eedbb696a6501aee3dc84a9c453",
      "tree": "516512e0aa99a2186e76d10e842c204f5ef330db",
      "parents": [
        "ad10b7f2b3c8110ce36379e2f538a8f6554fb494"
      ],
      "author": {
        "name": "Jiadong Bai",
        "email": "43344272+bobbai00@users.noreply.github.com",
        "time": "Tue Jun 09 13:43:28 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 09 20:43:28 2026 +0000"
      },
      "message": "fix(build): download protoc matching target arch in image builds (#5573)\n\n### What changes were proposed in this PR?\n\nThe three service Dockerfiles (`texera-web-application`,\n`computing-unit-master`, `computing-unit-worker`) always downloaded the\n`linux-x86_64` `protoc` release, so the build-time Python proto\nregeneration failed on ARM64 image builds with `protoc: No such file or\ndirectory` (exit 127). This selects the `protoc` asset by architecture\nfrom `uname -m` (`x86_64`/`amd64` → `x86_64`, `aarch64`/`arm64` →\n`aarch_64`, unknown → fail fast), so both platforms build.\n\n### Any related issues, documentation, discussions?\n\nCloses #5571\n\n### How was this PR tested?\n\n- Confirmed protoc 3.19.4 publishes a `linux-aarch_64` asset and that\nthe URL the fix builds resolves (HTTP 200).\n- Confirmed the `case` selection under `/bin/sh` maps `x86_64`/`amd64` →\n`x86_64`, `aarch64`/`arm64` → `aarch_64`, and exits non-zero on an\nunknown architecture.\n- The original failure was isolated to this single download line (the\nAMD64 image already builds), so the targeted fix addresses the failing\nstep on ARM64.\n\n### Was this PR authored or co-authored using generative AI tooling?\n\nGenerated-by: Claude Opus 4.8 (1M context)\n\nCo-authored-by: Bob Bai \u003cbobbai0509@gmail.com\u003e"
    },
    {
      "commit": "ad10b7f2b3c8110ce36379e2f538a8f6554fb494",
      "tree": "36e529e9e5d536aa86da9732d4059e0b8c4d7c02",
      "parents": [
        "564ccdbfd51089f31dcfdcbdba9f5a872a2f8256"
      ],
      "author": {
        "name": "Kunwoo (Chris)",
        "email": "143021053+kunwp1@users.noreply.github.com",
        "time": "Tue Jun 09 04:15:13 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 09 11:15:13 2026 +0000"
      },
      "message": "fix(frontend): clean up websocket state when returning to the dashboard (#5565)\n\n### What changes were proposed in this PR?\n\nWebsocket-derived front-end state (the connection itself, plus the\nexecution status, console output, and results built from its events)\nlives in singletons outside the workspace. It was never torn down in two\ncases, so stale state carried over:\n\n1. **Returning to the dashboard** and re-entering a workflow reused the\nprevious socket. The connection-tracking fields (`currentConnectedWid` /\n`currentConnectedCuid`) also survived, so the reconnect guard saw them\nunchanged, skipped reconnecting, and reused the stale socket. (#3120 —\nthe case #3093 did not cover.)\n2. **Switching computing units** inside the workspace left the previous\nunit\u0027s console, results, and execution status on screen.\n\nThis PR clears that state at both points.\n\n**Workspace exit**: `WorkspaceComponent.ngOnDestroy()` now tears\neverything down:\n\n| Call *(new)* | Resets |\n| --- | --- |\n| `ComputingUnitStatusService.disconnect()` | closes the socket, clears\noperator status, stops the unit poll, resets the connection-tracking\nfields and the selected unit |\n| `ExecuteWorkflowService.resetExecutionAndWorkers()` | execution status\nand worker assignments |\n| `WorkflowConsoleService.clearConsoleMessages()` | console output |\n| `WorkflowResultService.clearResults()` | result caches and table stats\n|\n\n**Unit switch**: `ComputingUnitStatusService` emits a reset signal when\nit reconnects to a different unit, and `WorkspaceComponent` clears the\nsame execution / console / result state in response. As a result,\nswitching units now discards the previous unit\u0027s results and console\ninstead of leaving them on screen.\n\nThe remaining websocket-event consumers need no teardown:\n`OperatorReuseCacheStatusService` is stateless, and\n`udf-debug.service`\u0027s state lives in the `TexeraGraph`, already reset by\n`clearWorkflow()`.\n\n### Any related issues, documentation, discussions?\n\nCloses #3120. Related: #3093 (earlier partial fix for the in-canvas\nsocket re-open).\n\n### How was this PR tested?\n\nTest with this workflow\n[Untitled workflow\n(14).json](https://github.com/user-attachments/files/28696700/Untitled.workflow.14.json)\n\n\nhttps://github.com/user-attachments/assets/060fe1ac-39cf-45e5-b423-5aa27fe17aed\n\n\n\n### Was this PR authored or co-authored using generative AI tooling?\n\nGenerated-by: Claude Code (Claude Opus 4.8)\n\n---------\n\nCo-authored-by: Xinyuan Lin \u003cxinyual3@uci.edu\u003e"
    },
    {
      "commit": "564ccdbfd51089f31dcfdcbdba9f5a872a2f8256",
      "tree": "80096f4073cd867ebee072f27640d4c48c7f9ae2",
      "parents": [
        "48e800e4458a74cc7bac5c41d8ac3e5eb0e2c7ea"
      ],
      "author": {
        "name": "Meng Wang",
        "email": "mengw15@uci.edu",
        "time": "Mon Jun 08 13:42:02 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 08 20:42:02 2026 +0000"
      },
      "message": "test(frontend): add spec for GoogleAuthService (#5457)\n\n### What changes were proposed in this PR?\n\nAdds a unit spec for `GoogleAuthService`, which previously had none.\nCovers `getClientId()`:\n\n- request shape — a single `GET` to `/auth/google/clientid` with\n`responseType: \"text\"`\n- success path — a 200 emits the returned client id\n- error path — a 500 rejects with `HttpErrorResponse`\n\nFollows `frontend/TESTING.md` (Vitest, `HttpClientTestingModule` +\n`HttpTestingController`).\n\n### Any related issues, documentation, discussions?\n\nCloses #5454.\n\n### How was this PR tested?\n\n`yarn test --include\u003d\u0027**/google-auth.service.spec.ts\u0027` → 3 passed.\n`prettier --check` clean.\n\n### Was this PR authored or co-authored using generative AI tooling?\n\nGenerated-by: Claude Code (claude-opus-4-7)"
    },
    {
      "commit": "48e800e4458a74cc7bac5c41d8ac3e5eb0e2c7ea",
      "tree": "4b8b77970b76bb9050d9dfb1f4813d825d481dd1",
      "parents": [
        "75b46197d3584e0f211d5d3211bef571f5c61e9c"
      ],
      "author": {
        "name": "Kunwoo (Chris)",
        "email": "143021053+kunwp1@users.noreply.github.com",
        "time": "Sun Jun 07 21:43:57 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 08 04:43:57 2026 +0000"
      },
      "message": "fix: scope large binary storage and cleanup by execution id (#5280)\n\n### What changes were proposed in this PR?\n\nLarge binaries were stored in the shared `texera-large-binaries` bucket\nunder flat keys `objects/{timestamp}/{uuid}` with no execution id, and\n`clearExecutionResources(eid)` deleted all of them via\n`LargeBinaryManager.deleteAllObjects()`. Any cleanup for one execution\ntherefore erased every other execution\u0027s (and user\u0027s) large binaries.\n\nThis PR namespaces every large binary by its execution id and scopes\ndeletion:\n\n- Object keys are now `objects/{eid}/{uuid}` on both the JVM and Python\nworkers.\n- The execution-scoped location is named by the controller and handed to\nworkers as data on `WorkerConfig` — no protobuf change. The controller\ncomputes the base URI `s3://{bucket}/objects/{eid}/`, and `create()`\nappends a unique suffix; the JVM seeds the base URI onto the\ndata-processing thread at startup, and the Python worker receives it as\na startup argument. The user-facing `largebinary()` / `new\nLargeBinary()` APIs are unchanged.\n- Cleanup uses the new `LargeBinaryManager.deleteByExecution(eid)`\n(prefix delete of `objects/{eid}/`). Both JVM and Python engines share\nthe bucket and key shape, so this single JVM-side delete removes\nbinaries created by both.\n- The `deleteAllObjects()` is removed.\n\nPre-existing objects under the old `objects/{timestamp}/...` scheme are\nleft untouched.\n\n### Any related issues, documentation, discussions?\n\nCloses #4123.\n\n### How was this PR tested?\n\nImport the following json file to create two workflows (You can\nconfigure the source operator to use any kinds of files you have), run\nthem, and check if each execution creates 6 objects and one execution\ndoesn\u0027t remove the other execution\u0027s large binary objects.\n[Large.Binary.Python\n(1).json](https://github.com/user-attachments/files/28369502/Large.Binary.Python.1.json)\n\n### Was this PR authored or co-authored using generative AI tooling?\n\nGenerated-by: Claude Code (Anthropic), models Claude Opus 4.8, Claude\nOpus 4.7, and Claude Sonnet 4.6\n\n---------\n\nSigned-off-by: Kunwoo (Chris) \u003c143021053+kunwp1@users.noreply.github.com\u003e\nCo-authored-by: Xiaozhen Liu \u003cxiaozl3@uci.edu\u003e"
    },
    {
      "commit": "75b46197d3584e0f211d5d3211bef571f5c61e9c",
      "tree": "84ca907ab96c1f2f3ba62e6dcdb640c8f4c35cfb",
      "parents": [
        "dd8ab8ae946d2c062faf0e0494235169feeedd22"
      ],
      "author": {
        "name": "Xinyuan Lin",
        "email": "xinyual3@uci.edu",
        "time": "Sun Jun 07 16:32:10 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jun 07 23:32:10 2026 +0000"
      },
      "message": "test(amber): add unit test coverage for record-storage cluster (#5447)\n\n### What changes were proposed in this PR?\n\nPin behavior of three previously-uncovered modules in\n`engine/common/storage` that sit on the checkpoint / fault-tolerance hot\npath via `SequentialRecordStorage.getStorage(...)`. No production-code\nchanges.\n\n| Spec | Source class | Tests |\n| --- | --- | --- |\n| `EmptyRecordStorageSpec` | `EmptyRecordStorage` | 11 |\n| `VFSRecordStorageSpec` | `VFSRecordStorage` | 9 |\n| `SequentialRecordStorageSpec` | `SequentialRecordStorage` (abstract +\ncompanion) | 9 |\n\nAll three spec files follow the `\u003csrcClassName\u003eSpec.scala` one-to-one\nconvention.\n\n**Behavior pinned**\n\n| Surface | Contract |\n| --- | --- |\n| `SequentialRecordStorage.getStorage(None)` | dispatches to\n`EmptyRecordStorage` |\n| `SequentialRecordStorage.getStorage(Some(file://…))` | dispatches to\n`VFSRecordStorage` and the returned instance round-trips a record |\n| `SequentialRecordWriter` / `SequentialRecordReader` | round-trip a\nsequence of records through the size-prefixed binary frame; the reader\u0027s\n`inputStreamGen` thunk supports re-reading the same byte stream |\n| `SequentialRecordStorage.fetchAllRecords` | yields the underlying\niterator\u0027s records in order (and `Iterable.empty` when nothing was\nwritten) |\n| `VFSRecordStorage` constructor | auto-creates the target folder;\nleaves an existing folder + contents intact |\n| `VFSRecordStorage.getWriter` / `getReader` | round-trip records\nthrough a local `file://` URI; produce empty iterator when the file has\nno records; multiple files under the same folder do not cross-pollinate\n|\n| `VFSRecordStorage.deleteStorage` | removes the on-disk folder created\nby the constructor |\n| `VFSRecordStorage.containsFolder` | distinguishes existing folder vs.\nexisting file vs. missing entry |\n| `EmptyRecordStorage.containsFolder` | always returns `false`\nregardless of folder name |\n| `EmptyRecordStorage.deleteStorage` | is a safe no-op (idempotent) |\n| `EmptyRecordStorage.getReader` | yields zero records for any fileName;\nsuccessive `getReader` calls produce independent iterators |\n| `EmptyRecordStorage.getWriter` | returns a writer whose `flush()` /\n`close()` work without `writeRecord` having been called; a second writer\nis unaffected by closing the first |\n\n**Notes**\n\n- The `hdfs://` dispatch branch of `getStorage` is deliberately left out\n— `HDFSRecordStorage`\u0027s constructor calls `FileSystem.get`, which can\nblock on DNS / network and is unit-test-hostile. The branch is a single\nline and any regression there would surface immediately in higher-level\ncheckpoint / fault-tolerance suites that exercise `hdfs://` URIs.\n- The serde-touching paths (`SequentialRecordWriter.writeRecord` /\n`SequentialRecordReader`\u0027s iterator) hard-code `AmberRuntime.serde`. The\ntwo specs that exercise this path (`VFSRecordStorageSpec`,\n`SequentialRecordStorageSpec`) own a suite-local `ActorSystem` and\ninject it into `AmberRuntime` via reflection, tearing it down in\n`afterAll` — same pattern as `CheckpointSubsystemSpec` /\n`ClientEventSpec`. `EmptyRecordStorageSpec` deliberately avoids\n`writeRecord` so it does not need the harness.\n\n### Any related issues, documentation, discussions?\n\nCloses #5446.\n\n### How was this PR tested?\n\nPure unit-test additions; verified locally with:\n\n- `sbt \"WorkflowExecutionService/testOnly\norg.apache.texera.amber.engine.common.storage.EmptyRecordStorageSpec\norg.apache.texera.amber.engine.common.storage.SequentialRecordStorageSpec\norg.apache.texera.amber.engine.common.storage.VFSRecordStorageSpec\"` —\n29 tests, all green\n- `sbt scalafmtCheckAll` — clean\n- CI to confirm\n\n### Was this PR authored or co-authored using generative AI tooling?\n\nGenerated-by: Claude Code (Sonnet 4.5)"
    },
    {
      "commit": "dd8ab8ae946d2c062faf0e0494235169feeedd22",
      "tree": "9808f81f047dcb4fb2c53a82727f7c20e9a9426b",
      "parents": [
        "afc5f98c8e512c1e90f8fee86dd0a596e58d08d9"
      ],
      "author": {
        "name": "Xinyuan Lin",
        "email": "xinyual3@uci.edu",
        "time": "Sun Jun 07 16:32:03 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jun 07 23:32:03 2026 +0000"
      },
      "message": "test(amber): add unit test coverage for InputManager (#5451)\n\n### What changes were proposed in this PR?\n\nPin behavior of `InputManager` — the per-worker input broker that was\nthe only previously-uncovered module in the `messaginglayer` package\n(every sibling — `WorkerPort`, `OutputManager`, `AmberFIFOChannel`,\n`CongestionControl`, `FlowControl`, `NetworkInputGateway`,\n`OrderingEnforcer`, `RangeBasedShuffle` — already has a spec). No\nproduction-code changes.\n\n| Spec | Source class | Tests |\n| --- | --- | --- |\n| `InputManagerSpec` | `InputManager` | 15 |\n\nSpec file name follows the `\u003csrcClassName\u003eSpec.scala` one-to-one\nconvention.\n\n**Behavior pinned**\n\n| Surface | Contract |\n| --- | --- |\n| `getAllPorts` (fresh) | empty `Set` |\n| `addPort(portId, schema, Nil, Nil)` | registers a fresh `WorkerPort`\nwith the supplied schema; no reader threads attached |\n| second `addPort` for the same `portId` | silently no-ops (first call\nwins; the prior `WorkerPort` survives, including any mutation to\n`completed`) |\n| `addPort` with mismatched URI / partitioning sizes | throws\n`AssertionError` |\n| `getPort(portId)` | is a pure lookup — successive calls return the\nsame `WorkerPort` instance |\n| `getInputPortReaderThreads` | empty `Map` when every port was added\nwith `urisToRead \u003d List.empty` |\n| `hasUnfinishedInput` (fresh) | `false` (no batch initialized) |\n| `getCurrentTuple` (fresh) | `null` |\n| `getCurrentTuple` (empty batch) | `null` |\n| `hasUnfinishedInput` (empty batch) | `false` |\n| `initBatch(channelId, batch)` | replaces `inputBatch`, resets the\ncursor, surfaces the channel id via `currentChannelId` |\n| `getNextTuple` over a batch | yields each element in order;\n`getCurrentTuple` tracks the last yielded value; `hasUnfinishedInput`\nflips to `false` once the last element is consumed |\n| `initBatch` called a second time | replaces the prior batch entirely\nand restarts the cursor (proven by yielding the new batch\u0027s first\nelement fresh) |\n| `isPortCompleted` (non-materialized) | reads through to\n`WorkerPort.completed` — `false` initially, `true` once flipped |\n| `startInputPortReaderThreads` (no threads) | safe no-op |\n\n**Notes**\n\nMaterialization-reader-thread paths (non-empty `urisToRead`) are\ndeliberately left out of this characterization. Constructing an\n`InputPortMaterializationReaderThread` eagerly evaluates\n`toPartitioner(partitioning, workerActorId)` and pulls in\ndocument-factory plumbing that is out of scope for a unit spec — those\ncode paths are exercised in higher-level worker / replay tests.\n\n### Any related issues, documentation, discussions?\n\nCloses #5450.\n\n### How was this PR tested?\n\nPure unit-test addition; verified locally with:\n\n- `sbt \"WorkflowExecutionService/testOnly\norg.apache.texera.amber.engine.architecture.messaginglayer.InputManagerSpec\"`\n— 15 tests, all green\n- `sbt scalafmtCheckAll` — clean\n- CI to confirm\n\n### Was this PR authored or co-authored using generative AI tooling?\n\nGenerated-by: Claude Code (Sonnet 4.5)"
    },
    {
      "commit": "afc5f98c8e512c1e90f8fee86dd0a596e58d08d9",
      "tree": "a46eea33933b39565ac161e092093eb96c134ba9",
      "parents": [
        "0e35ac6de8fbb0e7ec2edd40fa07d0787afaca4f"
      ],
      "author": {
        "name": "Yicong Huang",
        "email": "17627829+Yicong-Huang@users.noreply.github.com",
        "time": "Sun Jun 07 11:57:30 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jun 07 18:57:30 2026 +0000"
      },
      "message": "fix(auth): require REGULAR/ADMIN role on LiteLLM proxy endpoints (#5421)\n\n### What changes were proposed in this PR?\n\n`LiteLLMProxyResource` (`/chat/*`) and `LiteLLMModelsResource`\n(`/models`) in `access-control-service` were `@PermitAll` — they contain\nno auth check beyond a `guiWorkflowWorkspaceCopilotEnabled` feature\nflag, so any anonymous caller could spend the deployment\u0027s LiteLLM\ncredits whenever Copilot was on. PR #5404 left the annotations in place\nto preserve pre-eager-filter behavior and deferred the hardening\ndecision; this picks it back up.\n\nBoth classes now use `@RolesAllowed(Array(\"REGULAR\", \"ADMIN\"))`. The\nJwtAuthFilter from #5404 runs at `Priorities.AUTHENTICATION`, so missing\ntokens fall to a 401 from the filter and bad-role tokens fall through to\na 403 from Jersey\u0027s role check.\n\n`access-control-service` was the one microservice that hadn\u0027t picked up\n`RolesAllowedDynamicFeature` when #5199 added it elsewhere, so this PR\nalso registers the feature in `AccessControlService.scala` — otherwise\nthe annotations would have been decorative.\n`AccessControlServiceRunSpec` is updated to pin the registration so a\nfuture refactor can\u0027t quietly drop it and send us back to\nanonymous-LLM-access.\n\n### Any related issues, documentation, discussions?\n\nCloses #5420. Follow-up hardening for #5404.\n\n### How was this PR tested?\n\n`sbt AccessControlService/test` (22 cases) and `sbt scalafmtCheckAll`\nclean. Manual verification against a running access-control-service:\nanonymous `curl http://localhost:8081/api/models` returns 401 with\n`WWW-Authenticate: Bearer realm\u003d\"texera\"` instead of the pre-PR 200; a\nREGULAR-role bearer token gets through to LiteLLM as expected.\n\n### Was this PR authored or co-authored using generative AI tooling?\n\nGenerated-by: Claude Code (Opus 4.7)"
    },
    {
      "commit": "0e35ac6de8fbb0e7ec2edd40fa07d0787afaca4f",
      "tree": "c6c75bc90902a27a6c24532b9210f284a68b1350",
      "parents": [
        "dc31aa2dc7a3a564e08f393985fcd5e1e898067b"
      ],
      "author": {
        "name": "Yicong Huang",
        "email": "17627829+Yicong-Huang@users.noreply.github.com",
        "time": "Sun Jun 07 11:07:30 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jun 07 18:07:30 2026 +0000"
      },
      "message": "test(amber): unit tests for web/resource pure-logic helpers (#5219)\n\n### What changes were proposed in this PR?\n\nAdd six ScalaTest specs covering a self-contained cluster of pure-logic\nhelpers under `amber/src/main/scala/org/apache/texera/web/resource/`\nthat ship without direct unit coverage.\n\n- `EmailTemplateSpec` — admin / user branches of\n`userRegistrationNotification`, optional-field fallbacks, role-change\ntemplate per `UserRoleEnum`.\n- `FulltextSearchQueryUtilsSpec` — pgroonga and fallback `to_tsvector`\npredicates, `getContainsFilter` OR + set dedup, `getDateFilter`\nopen-ended endpoints + end-of-day bump + `ParseException`,\n`getOperatorsFilter` case-insensitive LIKE.\n- `EntityTablesSpec` and `EntityTypeSpec` — hub dispatch tables for\n`Workflow` and `Dataset`, `CloneTable`\u0027s asymmetric IAE on `Dataset`,\nJackson `@JsonValue` / `@JsonCreator` round-trip.\n- `HealthCheckResourceSpec` and `SuccessExecutionResultSpec` — the\ntrivial contracts that deployment manifests and the frontend\nsuccess-handler rely on.\n\nPins one quirky edge case in\n`FulltextSearchQueryUtils.getFullTextSearchFilter`:\n`keywords.filter(_.nonEmpty)` is applied before `map(_.trim)`, so a\nwhitespace-only keyword survives and produces a degenerate\n`pgroonga_condition(\u0027\u0027, ...)` predicate. A future fix (move the trim\ninto the filter step) would break that pinned test deliberately.\n\n### Any related issues, documentation, discussions?\n\nCloses #5217.\n\n### How was this PR tested?\n\nAdded unit tests under\n`amber/src/test/scala/org/apache/texera/web/resource/`.\n\n### Was this PR authored or co-authored using generative AI tooling?\n\nGenerated-by: Claude Opus 4.7"
    },
    {
      "commit": "dc31aa2dc7a3a564e08f393985fcd5e1e898067b",
      "tree": "4f4f6f425f5312e45b258aa6c5d2b2d73ff31386",
      "parents": [
        "65ce1e52d10b657338b41f220f2326d3fad86a3e"
      ],
      "author": {
        "name": "Meng Wang",
        "email": "mengw15@uci.edu",
        "time": "Sun Jun 07 10:42:31 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jun 07 17:42:31 2026 +0000"
      },
      "message": "test(frontend): add spec for HighlightSearchTermsPipe (#5458)\n\n### What changes were proposed in this PR?\n\nAdds a unit spec for `HighlightSearchTermsPipe`, which previously had\nnone. Covers `transform()`:\n\n- short-circuit paths — `undefined` value returns `\"\"`, empty `terms`\nreturns the value unchanged\n- single- and multi-token wrapping in `\u003cspan\nclass\u003d\"highlight-search-terms\"\u003e`\n- case-insensitive matching (`gi`) with the original casing preserved\ninside the span\n- global wrapping of every occurrence\n\nFollows `frontend/TESTING.md` (Vitest; `DomSanitizer` provided via\n`TestBed`; the wrapped string is recovered through\n`changingThisBreaksApplicationSecurity`).\n\n### Any related issues, documentation, discussions?\n\nCloses #5452.\n\n### How was this PR tested?\n\n`yarn test --include\u003d\u0027**/highlight-search-terms.pipe.spec.ts\u0027` → 6\npassed. `prettier --check` clean.\n\n### Was this PR authored or co-authored using generative AI tooling?\n\nGenerated-by: Claude Code (claude-opus-4-7)"
    },
    {
      "commit": "65ce1e52d10b657338b41f220f2326d3fad86a3e",
      "tree": "0bda61a7f69ae899d0a37afd0999c813c02f5470",
      "parents": [
        "ce919243517c2e0654979ac5b4cdcc8e7f89afe4"
      ],
      "author": {
        "name": "Matthew B.",
        "email": "mgball@uci.edu",
        "time": "Sun Jun 07 01:40:02 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jun 07 08:40:02 2026 +0000"
      },
      "message": "test(amber): expand ExecutionResultService spec coverage (#5390)\n\n### What changes were proposed in this PR?\n- Pin the exact binary-preview formatting in `convertTuplesToJson`: the\nexisting spec asserted only byte size and the presence of an ellipsis,\nso this adds the 13-bits-or-fewer branch (a 1-byte field renders its\nfull bit string with no ellipsis) and the exact leading-10 + ellipsis +\ntrailing-3 format for larger fields.\n- Add serialization-contract tests for the `WebOutputMode` /\n`WebResultUpdate` ADTs the frontend dispatches on: the `type`\ndiscriminator for `PaginationMode`/`SetSnapshotMode`/`SetDeltaMode`,\nplus the shapes of `WebPaginationUpdate` and `WebDataUpdate`.\n- Pin `TIMESTAMP` field handling in `convertTuplesToJson`: timestamps\nfall through the default arm and are serialized by the shared\n`objectMapper`, asserted against the mapper\u0027s own output so the check is\ntime-zone independent.\n### Any related issues, documentation, or discussions?\nCloses: #5389\n### How was this PR tested?\n- Run `sbt \"WorkflowExecutionService/testOnly\n*ExecutionResultServiceSpec\"` and expect 17 examples to pass (11\noriginal, 6 added).\n- Local sbt runs are blocked on JDK 25 (JaCoCo 0.8.11 cannot instrument\nJava 25 bytecode, plus a project plugin load error), so the earlier\nadditions were exercised directly via ScalaTest off the dependency\nclasspath; the latest `TIMESTAMP` case was not run locally and relies on\nCI, which runs the suite on a supported JDK.\n### Was this PR authored or co-authored using generative AI tooling?\nCo-authored with Claude Opus 4.8 in compliance with ASF"
    },
    {
      "commit": "ce919243517c2e0654979ac5b4cdcc8e7f89afe4",
      "tree": "b90302df84cdeb1ba2d3bb11bc6fb770a9463c3b",
      "parents": [
        "e987f133f4a1d4be131add116cb3d8303a8acce6"
      ],
      "author": {
        "name": "Matthew B.",
        "email": "mgball@uci.edu",
        "time": "Sat Jun 06 22:45:37 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jun 07 05:45:37 2026 +0000"
      },
      "message": "fix(frontend): use default import for package.json version in dev build (#5444)\n\n### What changes were proposed in this PR?\n- Change `frontend/src/environments/version.ts` to import `package.json`\nwith a default import (`packageJson.version`) instead of a named import\n(`import { version }`).\n- Why it is a bug: Angular 21\u0027s webpack rejects named imports from JSON\nmodules, so `ng serve` (dev) fails to compile and the dev server serves\n\"Cannot GET /\" (HTTP 404). Production builds are unaffected because\n`angular.json` fileReplacements swaps in `version.prod.ts`.\n### Any related issues, documentation, discussions?\nCloses #5443 (regression introduced by #5153).\n### How was this PR tested?\n- From `frontend/` on Node \u003e\u003d24, run `yarn start` and confirm the dev\nserver compiles with no errors (previously failed on `version.ts` with\n`Failed to compile.`).\n- Open http://localhost:4200/ and confirm the app loads (HTTP 200, page\ntitle \"Texera\") instead of \"Cannot GET /\".\n- Confirm the UI footer still shows the version string from\n`package.json`.\n### Was this PR authored or co-authored using generative AI tooling?\nGenerated-by: Claude Code (Claude Opus 4.8)"
    },
    {
      "commit": "e987f133f4a1d4be131add116cb3d8303a8acce6",
      "tree": "b01133fba66100a06eb261aeac0660e5e3ee14fb",
      "parents": [
        "7cf37d040513b7205d705a18b9a79f742b96259c"
      ],
      "author": {
        "name": "Xinyuan Lin",
        "email": "xinyual3@uci.edu",
        "time": "Sat Jun 06 21:09:38 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jun 07 04:09:38 2026 +0000"
      },
      "message": "test(amber): add unit test coverage for StatisticsManager + SerializationManager (#5439)\n\n### What changes were proposed in this PR?\n\nAdds `WorkerManagersAdditionalSpec` covering the two stateful manager\nclasses in `worker/managers/` that previously had no unit coverage.\n\n| Surface | Pinned |\n| --- | --- |\n| `StatisticsManager` default state | All counters / time accumulators\ninitialize to zero; `getStatistics` returns empty input/output metrics.\n|\n| `StatisticsManager.increaseInputStatistics` /\n`increaseOutputStatistics` | Per-port count + size accumulation;\n`require(size \u003e\u003d 0)` rejects negative sizes. |\n| `StatisticsManager` time accumulators | `increaseDataProcessingTime` /\n`increaseControlProcessingTime` reject negative time;\n`initializeWorkerStartTime` + `updateTotalExecutionTime` compute elapsed\nsince start; `idleTime \u003d total − dataProcessing − controlProcessing`;\n`updateTotalExecutionTime` rejects times earlier than `workerStartTime`;\nzero-elapsed boundary accepted. |\n| `SerializationManager.restoreExecutorState` | `IllegalStateException`\nwhen `actorId` is a non-worker identity (controller id triggers the\nguard); `OpExecWithClassName` dispatches through\n`ExecFactory.newExecFromJavaClassName`; `OpExecInitInfo.Empty` raises\n`UnsupportedOperationException`; broken `OpExecWithCode` surfaces via\nthe `JavaRuntimeCompilation` diagnostic path; non-`CheckpointSupport`\nexecutor produces an empty restoration iterator; `CheckpointSupport`\nexecutor delegates to `deserializeState` (verified via a sentinel in the\nreturned iterator). |\n| `SerializationManager.registerSerialization` / `applySerialization` |\nCallback invoked exactly once; re-applying without re-registering is a\nsafe no-op; re-registering after applying honors the new callback\n(fire-once-then-clear contract). |\n\nNo production code changed; this is test-only.\n\n### Any related issues, documentation, discussions?\n\nCloses #5436\n\n### How was this PR tested?\n\n```\nsbt \"WorkflowExecutionService/Test/testOnly org.apache.texera.amber.engine.architecture.worker.managers.WorkerManagersAdditionalSpec\"\n# → 20 tests, all pass\n\nsbt \"WorkflowExecutionService/Test/scalafmtCheck\"\n# → clean\n```\n\n### Was this PR authored or co-authored using generative AI tooling?\n\nGenerated-by: Claude Code (Claude Opus 4.7)"
    },
    {
      "commit": "7cf37d040513b7205d705a18b9a79f742b96259c",
      "tree": "a56b23541479f933afe81d0b12d8f7afc08a4c32",
      "parents": [
        "f2f056455d850f6d4f99d81ac7e128fb74906a44"
      ],
      "author": {
        "name": "Xinyuan Lin",
        "email": "xinyual3@uci.edu",
        "time": "Sat Jun 06 21:09:35 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jun 07 04:09:35 2026 +0000"
      },
      "message": "test(amber): add unit test coverage for ClientEvent sealed-trait family (#5440)\n\n### What changes were proposed in this PR?\n\nAdds `ClientEventSpec` covering all nine subtypes of the\ncontroller→client `ClientEvent` family. The trait extends\n`WorkflowFIFOMessagePayload` and flows over Pekko, so the spec\nround-trips each subtype via the production wire path\n(`AmberRuntime.serde`).\n\n| Subtype | Pinned |\n| --- | --- |\n| `ExecutionStateUpdate` | Exposes `state`; round-trips via\n`AmberRuntime.serde`; case-class equality + hashCode distinguish\ndifferent states. |\n| `ExecutionStatsUpdate` | Exposes `operatorMetrics`; round-trip\npreserves both populated and empty metrics maps. |\n| `RuntimeStatisticsPersist` | Round-trips `operatorMetrics`. |\n| `ReportCurrentProcessingTuple` | Exposes `operatorID` and the\n`Array[(Tuple, AVI)]` tuple field; round-trip preserves operatorID and\narray length (Array equality is reference-based at the case-class level,\nso length is the right pin without over-constraining serializer choice).\n|\n| `WorkerAssignmentUpdate` | Exposes `workerMapping`; round-trip\npreserves both populated and empty mappings. |\n| `FatalError` | Defaults `fromActor` to `None`; explicit\n`Some(actorId)` round-trips; the carried `Throwable` survives by message\n+ class (Throwable equality is reference-based, so we don\u0027t pin the\ninstance). |\n| `UpdateExecutorCompleted` | Round-trips the actor id. |\n| `ReplayStatusUpdate` | Round-trips `status \u003d true` and `status \u003d\nfalse` independently. |\n| `WorkflowRecoveryStatus` | Round-trips `isRecovering \u003d true` and\n`isRecovering \u003d false` independently. |\n| Cross-subtype | `ExecutionStatsUpdate` and `RuntimeStatisticsPersist`\nshare the `Map[String, OperatorMetrics]` field shape; case-class\nequality still distinguishes them across types. |\n\nMembership in `ClientEvent` and (transitively)\n`WorkflowFIFOMessagePayload` is enforced at compile time by `:\nClientEvent` ascriptions plus a runtime\n`isInstanceOf[WorkflowFIFOMessagePayload]` sweep — a regression that\ndemoted the trait off `WorkflowFIFOMessagePayload` would surface\nimmediately.\n\nThe suite owns a suite-local Pekko `ActorSystem` injected into\n`AmberRuntime` via reflection, torn down via\n`TestKit.shutdownActorSystem` in `afterAll` (same pattern as\n`CheckpointSubsystemSpec`).\n\nNo production code changed; this is test-only.\n\n### Any related issues, documentation, discussions?\n\nCloses #5437\n\n### How was this PR tested?\n\n```\nsbt \"WorkflowExecutionService/Test/testOnly org.apache.texera.amber.engine.architecture.controller.ClientEventSpec\"\n# → 17 tests, all pass\n\nsbt \"WorkflowExecutionService/Test/scalafmtCheck\"\n# → clean\n```\n\n### Was this PR authored or co-authored using generative AI tooling?\n\nGenerated-by: Claude Code (Claude Opus 4.7)"
    },
    {
      "commit": "f2f056455d850f6d4f99d81ac7e128fb74906a44",
      "tree": "1766b546c7fbf8f81899b80d843458ae23662d8d",
      "parents": [
        "5f54275225f98cebfc646ec1cd549ae60aa804c8"
      ],
      "author": {
        "name": "Xinyuan Lin",
        "email": "xinyual3@uci.edu",
        "time": "Sat Jun 06 19:50:06 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jun 07 02:50:06 2026 +0000"
      },
      "message": "test(amber): add unit test coverage for dashboard/hub entity model (#5402)\n\n### What changes were proposed in this PR?\n\nAdds `HubEntityModelSpec` covering all three files in\n`amber/.../web/resource/dashboard/hub/` — the entity-kind dispatch types\nthe Hub dashboard uses and the jOOQ table lookups they drive. Bundled\nbecause the three files are a tight `apply(EntityType)` dispatch family.\n\n| File | Behavior pinned |\n| --- | --- |\n| `ActionType.scala` | Four subtypes (`View` / `Like` / `Clone` /\n`Unlike`) expose lowercase `value`; `toString \u003d value` override (what\nreaches log lines, not the case-object name); `fromString` exact-match +\ncase-insensitive; throws `IllegalArgumentException` with input in\nmessage on unknown / empty; `@JsonValue` + `@JsonCreator` Jackson\nround-trip via `JSONUtils.objectMapper` (emits lowercase string, accepts\ncase-insensitive). |\n| `EntityType.scala` | Same shape — `Workflow` / `Dataset` carry\n`\"workflow\"` / `\"dataset\"`; toString-equals-value override;\ncase-insensitive `fromString`; unknown-input error; Jackson round-trip.\n|\n| `EntityTables.scala` dispatch | `BaseEntityTable.apply`,\n`LikeTable.apply`, `CloneTable.apply`, `ViewCountTable.apply` each\ndispatched against both `EntityType` subtypes. Each `case object`\nexposes its `table` / `idColumn` / `isPublicColumn` / `uidColumn` /\n`viewCountColumn` from the production jOOQ generated tables — a\nregression that wired a column to the wrong jOOQ field would fail here.\n`CloneTable(Dataset)` throws `IllegalArgumentException` since clone is\nworkflow-only today; a future `DatasetCloneTable` should remove that\nassertion deliberately. |\n\nNo production code changed; this is test-only.\n\n### Any related issues, documentation, discussions?\n\nCloses #5397\n\n### How was this PR tested?\n\n```\nsbt \"WorkflowExecutionService/Test/testOnly org.apache.texera.web.resource.dashboard.hub.HubEntityModelSpec\"\n# → 24 tests, all pass\n\nsbt \"WorkflowExecutionService/Test/scalafmtCheck\"\n# → clean\n```\n\n### Was this PR authored or co-authored using generative AI tooling?\n\nGenerated-by: Claude Code (Claude Opus 4.7)"
    },
    {
      "commit": "5f54275225f98cebfc646ec1cd549ae60aa804c8",
      "tree": "99fa45f108f7e1e1537e52e6d8d7acbc53d54f52",
      "parents": [
        "2793fc7ff16a47e7057a9a9d0c198a76609d3032"
      ],
      "author": {
        "name": "Matthew B.",
        "email": "mgball@uci.edu",
        "time": "Sat Jun 06 19:48:51 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jun 07 02:48:51 2026 +0000"
      },
      "message": "fix(workflow-operator): prevent NPE when Sort operator is unconfigured (#5416)\n\n### What changes were proposed in this PR?\n- Default `SortOpDesc.attributes` to `List.empty` instead of `null`, so\na freshly dragged Sort operator no longer throws a NullPointerException\nwhen the compiler eagerly calls `generatePythonCode()` during schema\npropagation.\n- Add two `require` guards in `generatePythonCode()`: at least one sort\nkey must exist, and every key must have a non-empty attribute, so a\nmisconfigured operator surfaces a clear, actionable message instead of a\nraw NPE (the message is embedded into the generated code by the existing\n#3265 safety net).\n- Note for follow-up: `StableMergeSortOpDesc.keys` has the same `null`\ndefault but runs via `OpExecWithClassName` (no eager codegen), so it\ndoes not hit this compile-time NPE and is left unchanged here.\n### Any related issues, documentation, or discussions?\nCloses: #3191\n### How was this PR tested?\n- Build check: `sbt \"WorkflowOperator/compile\"`, expect a clean compile.\n- Manual: drag a Sort operator onto a workflow without adding any sort\nkey, confirm no NullPointerException and that schema propagation / the\nattribute dropdown still work.\n- Manual: add a sort key row but leave the attribute unselected, confirm\nthe operator reports \"Each sort key must have an attribute selected.\"\nrather than crashing.\n### Was this PR authored or co-authored using generative AI tooling?\nCo-authored with Claude Opus 4.8 in compliance with ASF"
    },
    {
      "commit": "2793fc7ff16a47e7057a9a9d0c198a76609d3032",
      "tree": "80ddf2349ead63bb93012eb3fd7083c1822193bc",
      "parents": [
        "09aac02a55d55c6ed026e1e372355aaaf33b63d3"
      ],
      "author": {
        "name": "Yicong Huang",
        "email": "17627829+Yicong-Huang@users.noreply.github.com",
        "time": "Sat Jun 06 19:44:49 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jun 07 02:44:49 2026 +0000"
      },
      "message": "chore(ci): add stale workflow to auto-close inactive PRs (#5419)\n\n### What changes were proposed in this PR?\n\nAdds `.github/workflows/stale.yml`, which marks open pull requests as\n`stale` after 60 days of inactivity and closes them after another 30\ndays. Issues are not affected. The workflow runs weekly on Mondays at\n01:00 UTC and can also be triggered manually via `workflow_dispatch`.\n\nThree escape hatches keep a PR alive: the `pinned` label, an attached\nmilestone, or draft state. Any push, comment, or review action\nautomatically removes the `stale` label.\n\nNote for maintainers: the `pinned` label does not exist in the\nrepository yet and should be created (any color) before the first\nscheduled run, otherwise the escape-hatch path is empty.\n\n### Any related issues, documentation, discussions?\n\nCloses #5418.\n\n### How was this PR tested?\n\nManually verified the YAML parses cleanly and the `actions/stale@v9`\ninput schema accepts every option used.\n\n### Was this PR authored or co-authored using generative AI tooling?\n\nGenerated-by: Claude Code (Opus 4.7)"
    },
    {
      "commit": "09aac02a55d55c6ed026e1e372355aaaf33b63d3",
      "tree": "9de673bb97d2cabd247b62a9670050461695c01c",
      "parents": [
        "38f5ac5fb249e19b40438c0bf2d711f7fb5068f4"
      ],
      "author": {
        "name": "Matthew B.",
        "email": "mgball@uci.edu",
        "time": "Sat Jun 06 18:29:47 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jun 07 01:29:47 2026 +0000"
      },
      "message": "fix: keep failed-upload cleanup inside the upload worker (#5249)\n\n### What changes were proposed in this PR?\n**What Caused the Issue:**\nLargeBinaryOutputStream looked up the S3 client twice: once in the\nupload worker (correct), and once again in close() during failed-upload\ncleanup. When a test left a stream unclosed, Python\u0027s GC eventually\ncalled __del__ → close() → the second lookup, but by then a different\ntest was active, so the cleanup hit the wrong test\u0027s mock_s3 and broke\nits assert_called_once_with.\n  \n**Proposed Fix**\n- Move `s3.delete_object(...)` from `_cleanup_failed_upload()` into the\nupload worker, reusing the `s3` client already captured by the closure\nthat did the upload.\n- Drop the `_cleanup_failed_upload()` method and the call to it from\n`close()`; the worker now handles cleanup before recording the\nexception.\n- `close()` and `__del__` no longer call back into\n`large_binary_manager`, so a finalizer firing under a later test\u0027s\nmonkey-patches cannot reach the wrong S3 client.\n### Any related issues, documentation, or discussions?\nCloses: #5245 Follow-up to #4707; surfaced on the 3.12 leg of\nhttps://github.com/apache/texera/actions/runs/26481776334/job/77980417021.\n### How was this PR tested?\n- Ran `ruff format` and `ruff check` over `amber/src/main/python` and\n`amber/src/test/python` (clean).\n- Existing tests in `test_large_binary_output_stream.py` still cover the\nrelevant paths: `test_close_handles_upload_error`,\n`test_delete_object_failure_is_swallowed`, and\n`test_write_after_upload_error_raises_error`.\n- Simplified `test_write_after_upload_error_raises_error` back to inline\nform and removed the `_drained` helper, both no longer needed once\ncleanup is structurally contained.\n### Was this PR authored or co-authored using generative AI tooling?\nCo-authored with Claude Opus 4.7 in compliance with ASF\n\n---------\n\nSigned-off-by: Matthew B. \u003cmgball@uci.edu\u003e"
    },
    {
      "commit": "38f5ac5fb249e19b40438c0bf2d711f7fb5068f4",
      "tree": "a99baf62653db359a08da923075ab03b01b08e5b",
      "parents": [
        "5c2eaa2ce612b2d31df2d751614d17a8a8b1a2cc"
      ],
      "author": {
        "name": "Matthew B.",
        "email": "mgball@uci.edu",
        "time": "Sat Jun 06 17:43:20 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jun 07 00:43:20 2026 +0000"
      },
      "message": "test(workflow-operator): add ReservoirSamplingOpExec spec (#5384)\n\n### What changes were proposed in this PR?\n- Add `ReservoirSamplingOpExecSpec`, the first dedicated spec for the\nstreaming reservoir-sampling executor.\n- Cover `processTuple` buffering (emits nothing per tuple), and\n`onFinish` returning all input tuples in order when input size equals k.\n- Cover keeping exactly k unique, input-drawn samples when input exceeds\nk, determinism of the seeded RNG (with a check that replacement actually\nhappens), multi-worker partitioning of k via `equallyPartitionGoal`\n(k\u003d10 across 3 workers yields 4,3,3), and `open` resetting state for\nexecutor reuse.\n- Characterize the input-size-below-k edge case, where the unfilled\nfixed-size reservoir emits null padding on finish (flagged in the spec\nas a likely bug for a follow-up fix).\n### Any related issues, documentation, or discussions?\nCloses: #5383\n### How was this PR tested?\n- Run `sbt \"WorkflowOperator/testOnly *ReservoirSamplingOpExecSpec\"` and\nexpect all 7 examples to pass.\n- This is a test-only PR (no production code changed), so the spec\nitself is the verification; the input-below-k example intentionally\nasserts the current null-padding behavior, so a green run confirms that\ncharacterization rather than a fix.\n### Was this PR authored or co-authored using generative AI tooling?\nCo-authored with Claude Opus 4.8 in compliance with ASF"
    },
    {
      "commit": "5c2eaa2ce612b2d31df2d751614d17a8a8b1a2cc",
      "tree": "59e5b8db98bae722f7c8c65e7e0910afd01a491c",
      "parents": [
        "ba963cfacff458e3489214e1987f1a031a0144b8"
      ],
      "author": {
        "name": "Yicong Huang",
        "email": "17627829+Yicong-Huang@users.noreply.github.com",
        "time": "Sat Jun 06 16:45:57 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jun 06 23:45:57 2026 +0000"
      },
      "message": "fix(auth): make JwtAuthFilter eager-401 with @PermitAll opt-out (#5404)\n\n### What changes were proposed in this PR?\n\nReplaces the lazy pass-through behavior in `common/auth/JwtAuthFilter`\nwith an RFC 6750 eager 401 + `WWW-Authenticate` challenge. Missing\n`Authorization` throws the bare `Bearer` challenge; an invalid token\nthrows `error\u003d\"invalid_token\"` so a well-behaved client can distinguish\n\"please log in\" from \"your stored token is invalid, discard it\". Valid\ntokens populate a `SecurityContext` exactly as before.\n\nEndpoints that need to serve anonymous traffic opt out with `@PermitAll`\n(JSR-250). This PR audits every resource method in the 5 microservices\nand applies `@PermitAll` where the lazy filter previously made it\nimplicit:\n\n- 5x `HealthCheckResource` (liveness probes)\n- `AccessControlResource` `/auth/*` (routing proxy that authenticates\nitself via `parseToken` in the resource body)\n- `LiteLLMProxyResource` `/chat/*`, `LiteLLMModelsResource` `/models`\n(preserve current \"gated only by `guiWorkflowWorkspaceCopilotEnabled`\"\nbehavior; whether these should require an authenticated user is a\nseparate hardening decision)\n- `DatasetResource`: 5 endpoints with `/public-*` or `/publicVersion`\npaths, plus `/{did}/cover` and `/{did}/cover-url` which already take\n`@Auth Optional[SessionUser]` for opt-in user context\n\n`UnauthorizedException` + `UnauthorizedExceptionMapper` carry the\n`WWW-Authenticate` challenge to the JAX-RS edge. The exception extends\n`RuntimeException` (not `WebApplicationException`) so unit tests can run\nwithout a Jersey `RuntimeDelegate` on the classpath, and is constructed\nwith `writableStackTrace\u003dfalse` to avoid `fillInStackTrace` cost on the\nauth hot path.\n\n### Any related issues, documentation, discussions?\n\nCloses #4901. The earlier attempt at this fix, #4903, was reverted in\n#5025 because expired tokens from `localStorage` were piggy-backed onto\n`/api/config/gui` and broke the login page (#5026). PR #5392 has since\nfixed the frontend to drop expired tokens client-side (`skipWhenExpired:\ntrue`) and clear the session reactively on 401, so this PR can now ship\nsafely.\n\n### How was this PR tested?\n\nAdded `JwtAuthFilterSpec` (header-missing / non-Bearer / invalid-token /\nvalid-token; method- and class-level `@PermitAll`; resource-info-absent\nfallback) and `UnauthorizedExceptionMapperSpec`. Updated existing\nservice specs to expect 401 (from the filter) instead of 403 (from the\nrole filter) for missing-Authorization scenarios, and `*ServiceRunSpec`\nmocks verify the new `UnauthorizedExceptionMapper` registration. `sbt\nAuth/test` + 4 service specs all green; `sbt scalafmtCheckAll` clean.\nManually tested end-to-end against a running `config-service` build with\n`curl` (missing / bad / valid tokens, `@PermitAll` healthcheck and\npre-login) and in the browser with a forged JWT in localStorage to\nconfirm the eager 401 path interoperates cleanly with PR #5392\u0027s 401\ninterceptor.\n\n### Was this PR authored or co-authored using generative AI tooling?\n\nGenerated-by: Claude Code (Opus 4.7)"
    },
    {
      "commit": "ba963cfacff458e3489214e1987f1a031a0144b8",
      "tree": "f063b54c9ffc01876140e3bee43c5e4b59635018",
      "parents": [
        "65aca57507a51582da6b264d27aa5984ef727904"
      ],
      "author": {
        "name": "Xuan Gu",
        "email": "162244362+xuang7@users.noreply.github.com",
        "time": "Sat Jun 06 16:01:05 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jun 06 23:01:05 2026 +0000"
      },
      "message": "chore: add 1.2.0-incubating and 1.3.0-incubating-SNAPSHOT to bug-report options (#5415)\n\n\u003c!--\nThanks for sending a pull request (PR)! Here are some tips for you:\n1. If this is your first time, please read our contributor guidelines:\n[Contributing to\nTexera](https://github.com/apache/texera/blob/main/CONTRIBUTING.md)\n  2. Ensure you have added or run the appropriate tests for your PR\n  3. If the PR is work in progress, mark it a draft on GitHub.\n  4. Please write your PR title to summarize what this PR proposes, we \n    are following Conventional Commits style for PR titles as well.\n  5. Be sure to keep the PR description updated to reflect all changes.\n--\u003e\n\n### What changes were proposed in this PR?\n\u003c!--\nPlease clarify what changes you are proposing. The purpose of this\nsection\nis to outline the changes. Here are some tips for you:\n  1. If you propose a new API, clarify the use case for a new API.\n  2. If you fix a bug, you can clarify why it is a bug.\n  3. If it is a refactoring, clarify what has been changed.\n  3. It would be helpful to include a before-and-after comparison using \n     screenshots or GIFs.\n  4. Please consider writing useful notes for better and faster reviews.\n--\u003e\nThis PR updates the version dropdown in\n`.github/ISSUE_TEMPLATE/bug-template.yaml` so bug\nreporters can select the current versions:\n\n- `1.3.0-incubating-SNAPSHOT (main)` — current development\n- `1.2.0-incubating (release/v1.2)` — release/v1.2 line\n\n### Any related issues, documentation, discussions?\n\u003c!--\nPlease use this section to link other resources if not mentioned\nalready.\n1. If this PR fixes an issue, please include `Fixes #1234`, `Resolves\n#1234`\nor `Closes #1234`. If it is only related, simply mention the issue\nnumber.\n  2. If there is design documentation, please add the link.\n  3. If there is a discussion in the mailing list, please add the link.\n--\u003e\nCloses #5414 \n\n### How was this PR tested?\n\u003c!--\nIf tests were added, say they were added here. Or simply mention that if\nthe PR\nis tested with existing test cases. Make sure to include/update test\ncases that\ncheck the changes thoroughly including negative and positive cases if\npossible.\nIf it was tested in a way different from regular unit tests, please\nclarify how\nyou tested step by step, ideally copy and paste-able, so that other\nreviewers can\ntest and check, and descendants can verify in the future. If tests were\nnot added,\nplease describe why they were not added and/or why it was difficult to\nadd.\n--\u003e\nConfig-only change to a GitHub issue template.\n\n### Was this PR authored or co-authored using generative AI tooling?\n\u003c!--\nIf generative AI tooling has been used in the process of authoring this\nPR,\nplease include the phrase: \u0027Generated-by: \u0027 followed by the name of the\ntool\nand its version. If no, write \u0027No\u0027. \nPlease refer to the [ASF Generative Tooling\nGuidance](https://www.apache.org/legal/generative-tooling.html) for\ndetails.\n--\u003e\nGenerated-by: Claude Code\n\n---------\n\nCo-authored-by: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "65aca57507a51582da6b264d27aa5984ef727904",
      "tree": "2d9010a89da4802b495dd8ac891776eef97e5757",
      "parents": [
        "57640a74a333d0ba01b723704becac5d7e73238d"
      ],
      "author": {
        "name": "Yicong Huang",
        "email": "17627829+Yicong-Huang@users.noreply.github.com",
        "time": "Sat Jun 06 15:56:54 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jun 06 22:56:54 2026 +0000"
      },
      "message": "fix(frontend): exclude /api/config/pre-login from JwtModule (#5408)\n\n### What changes were proposed in this PR?\n\nAdds `api/config/pre-login` to `JwtModule.forRoot`\u0027s `disallowedRoutes`\nso the anonymous pre-login config fetch is no longer auto-attached with\n`Authorization: Bearer …`. Before this change a stored JWT whose\nsignature can\u0027t be verified server-side (key rotation, manual tampering,\ncross-deployment bleed) would make the eager `JwtAuthFilter` return 401\nto the pre-login request, leaving `GuiConfigService` in an unrecoverable\nerror state and the login form blank until a manual reload.\n\n### Any related issues, documentation, discussions?\n\nCloses #5407. Companion to #5404 — without this change, the eager filter\nintroduced there exposes the regression described above.\n\n### How was this PR tested?\n\nManually tested in the browser against #5404\u0027s backend with a forged JWT\nin localStorage; confirmed `/api/config/pre-login` no longer carries\n`Authorization` and the login form renders without a manual reload.\n\n### Was this PR authored or co-authored using generative AI tooling?\n\nGenerated-by: Claude Code (Opus 4.7)"
    },
    {
      "commit": "57640a74a333d0ba01b723704becac5d7e73238d",
      "tree": "a3581bb0cf06a0200f7e0d5469a02615ce5c560e",
      "parents": [
        "d9676a732a03e97962fca0d7537bbf79cfd51dc4"
      ],
      "author": {
        "name": "Xinyuan Lin",
        "email": "xinyual3@uci.edu",
        "time": "Sat Jun 06 15:40:08 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jun 06 22:40:08 2026 +0000"
      },
      "message": "test(workflow-core): add unit test coverage for core executor traits + factory (#5400)\n\n### What changes were proposed in this PR?\n\n`CoreExecutorReflectionSpec` (same package) already covered the basic\ndefaults of `OperatorExecutor` / `SourceOperatorExecutor` and the\n`ExecFactory.newExecFromJavaClassName` happy paths +\n`JavaRuntimeCompilation` failure path. This PR extends the existing spec\nwith five additional regression pins, without duplicating any existing\nassertion.\n\n| Surface | Pinned (new in this PR) |\n| --- | --- |\n| `OperatorExecutor.open` / `close` | A subclass override is reachable\nfrom every call site that invokes `open` / `close` on the trait\n(counter-based pin; a direct no-op-stub regression that bypassed\ndispatch wouldn\u0027t fail the existing default-stays-no-op tests). |\n| `OperatorExecutor.processTupleMultiPort` | The default wrapper hands\nthe input `port` verbatim to the subclass override (a regression that\nhard-coded `port \u003d 0` would be invisible to the basic delegation test).\nZero-emission and many-emission fan-out from the underlying\n`processTuple` both pass through with `Option.empty` port. |\n| `SourceOperatorExecutor.processTupleMultiPort` | The input-side path\nnever invokes `produceTuple` (counter-based pin; an accidental drain\nthat discarded results wouldn\u0027t fail an empty-iterator check). |\n| `ExecFactory.newExecFromJavaClassName` | `NoSuchMethodException`\npropagates when neither factory branch matches a fixture with only a\n`(Long)` constructor (the existing tests pin the success paths and\n`ClassNotFoundException`, not the \"no constructor matches\" branch). |\n\nThe PR body\u0027s earlier claim that \"this package has no unit tests today\"\nwas inaccurate; the existing spec was missed during my initial coverage\ncheck because its `Reflection` suffix doesn\u0027t match any source-class\nname pattern. Consolidated per Copilot review.\n\nNo production code changed; this is test-only.\n\n### Any related issues, documentation, discussions?\n\nCloses #5396\n\n### How was this PR tested?\n\n```\nsbt \"WorkflowCore/Test/testOnly org.apache.texera.amber.core.executor.CoreExecutorReflectionSpec\"\n# → 23 tests (18 pre-existing + 5 new), all pass\n\nsbt \"WorkflowCore/Test/scalafmtCheck\"\n# → clean\n```\n\n### Was this PR authored or co-authored using generative AI tooling?\n\nGenerated-by: Claude Code (Claude Opus 4.7)"
    },
    {
      "commit": "d9676a732a03e97962fca0d7537bbf79cfd51dc4",
      "tree": "91e18814afa5fbd8bd2c1b62e0d85aae75349971",
      "parents": [
        "e02756113e9b9f9713c7acc3702eeaf30f18587b"
      ],
      "author": {
        "name": "Yicong Huang",
        "email": "17627829+Yicong-Huang@users.noreply.github.com",
        "time": "Sat Jun 06 15:08:34 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jun 06 22:08:34 2026 +0000"
      },
      "message": "chore(asf): use raw payload bypass_actors for branch protection (#5413)\n\n### What changes were proposed in this PR?\n\nConvert the `Default Branch Protection` ruleset in `.asf.yaml` from\nconvenience syntax to raw payload so individual users can actually be\nregistered as bypass actors — the convenience parser resolves\n`bypass_teams` via `get_team_by_slug(...)`, leaving a username\nunresolved (live `bypass_actors` on the ruleset is currently `null`).\nRaw payload also skips the parser\u0027s `_to_ref()` prefix step, so branch\ninclude patterns are spelled out in full (`refs/heads/release/*`,\n`refs/heads/rel/*`).\n\n### Any related issues, documentation, discussions?\n\nCloses #5412. Follow-up to #5354 and INFRA-27977\n(https://issues.apache.org/jira/browse/INFRA-27977).\n\n### How was this PR tested?\n\nNormalized `.asf.yaml` through `apache/infrastructure-asfyaml`\u0027s real\n`normalize_rulesets` and `configure_rulesets` (FakeRequester harness\nfrom its own test suite); the resulting POST payload matches the live\nruleset shape on `apache/texera`.\n\n### Was this PR authored or co-authored using generative AI tooling?\n\nGenerated-by: Claude Opus 4.7"
    },
    {
      "commit": "e02756113e9b9f9713c7acc3702eeaf30f18587b",
      "tree": "862364853f5e04912ebe583aeccb34339021bd39",
      "parents": [
        "e9f2b8ed35679d2fa0338f7bbf74865b9a1f4246"
      ],
      "author": {
        "name": "Xuan Gu",
        "email": "162244362+xuang7@users.noreply.github.com",
        "time": "Sat Jun 06 14:46:41 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jun 06 21:46:41 2026 +0000"
      },
      "message": "chore: bump main version to 1.3.0-incubating-SNAPSHOT (#5410)\n\n### What changes were proposed in this PR?\nThis PR bumps the project version on main from 1.1.0-incubating to\n1.3.0-incubating. Since release/v1.2 has already been cut from main,\nmain should now advance to the next version line.\n\nUpdated version references:\n- build.sbt: ThisBuild / version → 1.3.0-incubating-SNAPSHOT\n- bin/k8s/values.yaml: imageTag → 1.3.0-incubating-SNAPSHOT\n- frontend/package.json: version → 1.3.0-incubating-SNAPSHOT\n\n### Any related issues, documentation, or discussions?\nPer the discussion in #5385, version bumps should target main and then\nbe backported if needed. release/v1.2 is already at 1.2.0-incubating via\n#5386, so main now moves to 1.3.0-incubating.\n\nCloses #5385\n\n### How was this PR tested?\nVersion-string-only change. \n\n### Was this PR authored or co-authored using generative AI tooling?\n\nCo-authored with Claude Code (Opus 4.8) in compliance with ASF policy.\n\n---------\n\nSigned-off-by: Xuan Gu \u003c162244362+xuang7@users.noreply.github.com\u003e\nCo-authored-by: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "e9f2b8ed35679d2fa0338f7bbf74865b9a1f4246",
      "tree": "26a5fc7865f491d36d551dffba2b570975009e1f",
      "parents": [
        "d46d623fdf871bd3af3684975fbf3ed1985d9818"
      ],
      "author": {
        "name": "Matthew B.",
        "email": "mgball@uci.edu",
        "time": "Sat Jun 06 14:05:29 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jun 06 21:05:29 2026 +0000"
      },
      "message": "fix: replace git hash with build number in UI footer (#5153)\n\n### What changes were proposed in this PR?\n- Replaced `frontend/git-version.js` with `frontend/build-version.js`,\nwhich uses `build-number-generator` to stamp a version + timestamp build\nnumber instead of shelling out to `git describe`.\n- Swapped the `git-describe` devDependency for `build-number-generator`,\nand pointed the `postinstall` script at the new file.\n- Simplified `src/environments/version.ts` schema to `{ buildNumber,\nversion }`, since the old `git-describe` output fields had a single\nconsumer.\n- Renamed `DashboardComponent.gitCommitHash` to `buildNumber`, updated\nthe footer label to `Build:`, and renamed the `#git-commit-id` CSS id to\n`#build-number`.\n  \n#### Old Design\n\u003cimg width\u003d\"865\" height\u003d\"312\" alt\u003d\"image\"\nsrc\u003d\"https://github.com/user-attachments/assets/88bbc91a-e682-4b5e-889a-0b233034db6e\"\n/\u003e\n\n  #### New Design\n\n\u003cimg width\u003d\"1070\" height\u003d\"425\" alt\u003d\"Screenshot From 2026-05-30 23-40-28\"\nsrc\u003d\"https://github.com/user-attachments/assets/8b0cfc0d-c827-4707-935c-7c75ad3f6664\"\n/\u003e\n  \n  ### Any related issues, documentation, or discussions?\n  closes: #3613\n  ### How was this PR tested?\n- Ran `node build-version.js` directly and confirmed it wrote a valid\n`version.ts` with the new `buildNumber` field.\n  ### Was this PR authored or co-authored using generative AI tooling?\n  Co-authored with Claude Opus 4.7 in compliance with ASF\n\n---------\n\nSigned-off-by: Matthew B. \u003cmgball@uci.edu\u003e"
    },
    {
      "commit": "d46d623fdf871bd3af3684975fbf3ed1985d9818",
      "tree": "dc9b6efd97182d5ebb2df42e9e17d4b2d213943c",
      "parents": [
        "eac23d2101569ddc7efb20a35c4d366fef32a789"
      ],
      "author": {
        "name": "Jiadong Bai",
        "email": "43344272+bobbai00@users.noreply.github.com",
        "time": "Sat Jun 06 09:15:02 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jun 06 16:15:02 2026 +0000"
      },
      "message": "chore(ci): run LICENSE-binary drift check weekly (#5406)\n\n### What changes were proposed in this PR?\n\nChange the scheduled LICENSE-binary drift checker from daily to weekly.\nThe workflow still runs at 11:00 UTC and still supports manual\n`workflow_dispatch` runs.\n\n### Any related issues, documentation, discussions?\n\nCloses #5405.\n\n### How was this PR tested?\n\n```bash\ngit diff --check\n```\n\n### Was this PR authored or co-authored using generative AI tooling?\n\nGenerated-by: OpenAI Codex (GPT-5).\n\nCo-authored-by: Bob Bai \u003cbobbai0509@gmail.com\u003e"
    },
    {
      "commit": "eac23d2101569ddc7efb20a35c4d366fef32a789",
      "tree": "340c136bfd55ddb6a56d21cde9d13924312ca62d",
      "parents": [
        "cf273e8f74aaa52dd88f1129c90ed27571f6db93"
      ],
      "author": {
        "name": "Ryan Zhang",
        "email": "97552093+zyratlo@users.noreply.github.com",
        "time": "Sat Jun 06 03:09:31 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jun 06 10:09:31 2026 +0000"
      },
      "message": "feat(python-notebook-migration, config): add python-notebook-migration-enabled feature flag (#5254)\n\n### What changes were proposed in this PR?\nIntroduces a feature flag `python-notebook-migration-enabled` (default\n`false`) that will gate the upcoming Python-notebook to Texera-workflow\nmigration tool. No user-visible behavior changes, the flag controls\nfeatures that don\u0027t exist on `main` yet.\n\n- `common/config/src/main/resources/gui.conf` — declare\n`gui.workflow.workspace.python-notebook-migration-enabled \u003d false`, with\nenv-var override\n`GUI_WORKFLOW_WORKSPACE_PYTHON_NOTEBOOK_MIGRATION_ENABLED`.\n-\n`common/config/src/main/scala/org/apache/texera/config/GuiConfig.scala`\n— Scala accessor for the new field.\n- `…/service/resource/ConfigResource.scala` — include the flag in the\nruntime config payload served to the frontend.\n- `frontend/src/app/common/type/gui-config.ts` — add the typed field on\nthe frontend `GuiConfig` interface.\n- `frontend/src/app/workspace/component/menu/menu.component.ts` — expose\na `pythonNotebookMigrationEnabled` getter for downstream migration-tool\nUI to consume.\n\n### Any related issues, documentation, discussions?\nCloses #5253 \nParent issue #4301 \n\n### How was this PR tested?\n  - Verified the new field appears in the `/api/config` payload\n  - Verified `MenuComponent.pythonNotebookMigrationEnabled` resolves\n  - No new UI in this PR, existing behavior is unchanged\n\n### Was this PR authored or co-authored using generative AI tooling?\nGenerated-by: Claude Code (Claude Opus 4.7)"
    },
    {
      "commit": "cf273e8f74aaa52dd88f1129c90ed27571f6db93",
      "tree": "a82fe0075cf6d322a56f54e1253b363ed749560b",
      "parents": [
        "749798d8214a5999b2870ebcf3f62fefd609edfa"
      ],
      "author": {
        "name": "Xinyuan Lin",
        "email": "xinyual3@uci.edu",
        "time": "Sat Jun 06 01:20:12 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jun 06 08:20:12 2026 +0000"
      },
      "message": "ci: match system-requirements-lock.txt in labeler globs (#5399)\n\n### What changes were proposed in this PR?\n\nA Dependabot bump that touches **only**\n`amber/system-requirements-lock.txt` silently skips all CI — surfaced on\n#5364 (\"There was no CI ran for this PR\").\n\n**Root cause.** The `pyamber` and `dependencies` labeler globs match pip\nmanifests with `**/requirements.txt` + `**/*-requirements.txt`. The\nlockfile ends in `-lock.txt`, so it matches *neither*:\n\n```\namber/requirements.txt              match   (**/requirements.txt, **/*-requirements.txt)\namber/dev-requirements.txt          match   (**/*-requirements.txt)\namber/operator-requirements.txt     match   (**/*-requirements.txt)\namber/system-requirements-lock.txt  MISS    (ends in -lock.txt, not -requirements.txt)\n```\n\nWith no `pyamber` label, `required-checks` computes an empty stack union\nand skips every build stack:\n\n```\ndiff -\u003e labeler -\u003e (no pyamber/dependencies label) -\u003e empty LABEL_STACKS union -\u003e 0 build stacks\n```\n\n(The green checks on #5364\u0027s merge commit are from the post-merge push\nto `main`, which runs all stacks unconditionally — not PR validation.)\n\n**Fix.** Collapse the two requirement globs into a single\n`**/*requirements*.txt` in both the `pyamber` and `dependencies`\nsections.\n\n| Changed file | Labels before | Labels after |\n| --- | --- | --- |\n| `amber/system-requirements-lock.txt` | _(none)_ → no CI | `pyamber`,\n`dependencies` |\n| `amber/requirements.txt` | `pyamber`, `dependencies` | `pyamber`,\n`dependencies` |\n| `frontend/package.json` | `frontend`, `dependencies` | `frontend`,\n`dependencies` |\n\n`pyamber` maps to the `pyamber` + `amber-integration` stacks\n(`LABEL_STACKS` in `required-checks.yml`), so a future lockfile-only\nbump now runs the Python CI that actually exercises the changed deps.\n\n### Any related issues, documentation, discussions?\n\nCloses #5401. Follows up on the review comment by @Yicong-Huang on\n#5364. The four `amber/` manifests above are the repo\u0027s only\n`*requirements*.txt`/`*-lock.txt` files, so the broadened glob cannot\nwiden label scope unexpectedly.\n\n### How was this PR tested?\n\nSimulated `actions/labeler`\u0027s minimatch matching against the **edited**\nconfig for the changed file plus controls:\n\n```\namber/system-requirements-lock.txt  \u003d\u003e pyamber, dependencies   (was: none)\namber/requirements.txt              \u003d\u003e pyamber, dependencies   (unchanged)\nfrontend/package.json               \u003d\u003e frontend, dependencies  (unchanged)\ndocs/foo.md                         \u003d\u003e docs                    (unchanged)\n```\n\nYAML validated with `yaml.safe_load`. CI config only — no source or test\ncode paths are affected.\n\n### Was this PR authored or co-authored using generative AI tooling?\n\nGenerated-by: Claude Opus 4.8 (1M context)"
    },
    {
      "commit": "749798d8214a5999b2870ebcf3f62fefd609edfa",
      "tree": "6eca00037d58d5ac418b1d61210874968f578aca",
      "parents": [
        "6a9437ed6e46599044f4f7762dc23e4065624262"
      ],
      "author": {
        "name": "Yicong Huang",
        "email": "17627829+Yicong-Huang@users.noreply.github.com",
        "time": "Sat Jun 06 00:15:12 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jun 06 07:15:12 2026 +0000"
      },
      "message": "fix(frontend): handle 401 by clearing session, skip sending expired JWTs (#5392)\n\n### What changes were proposed in this PR?\n\nAdds `UnauthorizedHttpInterceptor` that watches every HTTP response:\nwhen the server returns 401 to a request that carried an `Authorization`\nheader, it routes the logout through `UserService.logout()` (which\nclears the JWT and broadcasts `userChanged(undefined)` so header /\ndashboard / in-memory state stay in sync), surfaces a \"session expired\"\nnotification, and routes to `/about` with `returnUrl`. 401 responses to\nanonymous or auth-endpoint requests pass through unchanged so a 401 on a\npublic endpoint never wipes a freshly-stored token, and a wrong-password\n401 on `/auth/login` cannot kick an already-authenticated user out.\n\nTwo adversarial-review findings (caught during self-review, fixed in\ncommit 2):\n\n1. **Auth-endpoint allowlist.** `JwtModule` blanket-attaches\n`Authorization` to every request, including `POST /api/auth/login`. A\nwrong-password 401 there carries the user\u0027s existing token and would be\nmisread as \"session invalid\", kicking an already-authenticated user out\nthe moment they fat-finger a re-login. Allowlist regex\n`\\/auth\\/(login|register|refresh|google\\/login)` short-circuits the\ninterceptor for these URLs.\n\n2. **Concurrent 401 dedup.** A burst of 8-10 parallel dashboard\nrequests, all 401\u0027d by a server-side revoke, would fire 8 toasts and 8\n`router.navigate` calls. Routing the logout through\n`UserService.logout()` (which flips `isLogin()` from true to false)\ngives natural dedup: only the first 401 sees `isLogin() \u003d\u003d\u003d true` and\nfires side effects; the rest of the burst short-circuits. The flag\nre-arms automatically after a successful re-login.\n\nFlips `JwtModule.forRoot`\u0027s `skipWhenExpired` from `false` to `true`, so\na stale `localStorage` token is no longer auto-appended to public\npre-login endpoints (`/api/config/gui`, `/api/config/user-system`). That\nauto-append is the exact mechanism that caused the revert of #4903 in\n#5025 — without it, an expired token reaches public endpoints, gets\nrejected, and breaks the login page before the user can re-authenticate.\n\n`UserService` is resolved lazily via `Injector` inside `catchError`\nbecause it transitively depends on `HttpClient`, and direct injection\nwould form a DI cycle through the interceptor chain.\n\n### Any related issues, documentation, discussions?\n\nCloses #5391. Prerequisite for a re-attempt of #4901 (whose first try,\n#4903, was reverted by #5025 because of #5026). Discussion:\nhttps://lists.apache.org/thread/w5jmczrffxd5doc5hnss2zm7dbhnbhyy\n\n### How was this PR tested?\n\nAdded `unauthorized-http-interceptor.service.spec.ts` with 12 cases\ncovering: 401 with Authorization → logout + notify + navigate; 401\nwithout Authorization → no-op; non-401 with Authorization → no-op; root\npath → omits `returnUrl`; auth-endpoint URLs (login / register / refresh\n/ google/login, with and without query strings) → no-op; over-broad URL\nmatch guard (`recent-logins` still logs out); concurrent 401 burst →\nexactly one side-effect set; re-arms after re-login.\nTested manually as well.\n\n### Was this PR authored or co-authored using generative AI tooling?\n\nGenerated-by: Claude Code (Opus 4.7)"
    },
    {
      "commit": "6a9437ed6e46599044f4f7762dc23e4065624262",
      "tree": "209f1d86b097855f8272db83c3ef945e2e3570ee",
      "parents": [
        "76f116f5e0f7b29c2e6b18cdf1688e448d2ddee3"
      ],
      "author": {
        "name": "Matthew B.",
        "email": "mgball@uci.edu",
        "time": "Fri Jun 05 17:46:29 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jun 06 00:46:29 2026 +0000"
      },
      "message": "refactor(frontend): standardize menu.component subscription cleanup (#5324)\n\n### What changes were proposed in this PR?\n- Removed the redundant `computingUnitStatusSubscription` field (and its\n`.add()` wrapper and `ngOnDestroy` unsubscribe) in `menu.component.ts`:\nthe inner stream is already piped through `untilDestroyed(this)`, so the\nmanual aggregator did nothing.\n- Replaced the manually managed `durationUpdateSubscription` with a\ndeclarative `switchMap` pipe, so each `ExecutionDurationUpdateEvent`\ncancels the previous 1s timer and starts a new one only while running,\ninstead of imperatively unsubscribing and reassigning a field.\n- Dropped the now-unused `Subscription` import, leaving the component on\na single consistent cleanup style (`untilDestroyed`).\n### Any related issues, documentation, or discussions?\nCloses: #5323\n### How was this PR tested?\n- Ran `ng test\n--include\u003d\u0027src/app/workspace/component/menu/menu.component.spec.ts\u0027`:\nall 42 tests pass.\n- Behavior-preserving refactor: same elapsed-timer cadence, same\nbase-duration updates, same teardown on destroy.\n### Was this PR authored or co-authored using generative AI tooling?\nCo-authored with Claude Opus 4.7 in compliance with ASF"
    },
    {
      "commit": "76f116f5e0f7b29c2e6b18cdf1688e448d2ddee3",
      "tree": "2c0f65c3e6f58b9ffb1e9f6212968d5af2a3cee3",
      "parents": [
        "6dd16b5de8901de99cd0b96ab3d964a1348e8488"
      ],
      "author": {
        "name": "Matthew B.",
        "email": "mgball@uci.edu",
        "time": "Fri Jun 05 17:38:38 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jun 06 00:38:38 2026 +0000"
      },
      "message": "test(amber): add AmberKryoInitializer spec (#5387)\n\n### What changes were proposed in this PR?\n- Add `AmberKryoInitializerSpec`, the first test for the Kryo\nclosure-serialization setup that lets Pekko move Scala closures between\nworkers.\n- Assert `preInit` registers `SerializedLambda` and binds\n`ClosureSerializer.Closure` to a `ClosureSerializer`, with a negative\ncontrol proving a bare `ScalaKryo` has neither.\n- Add behavioral round-trips: a Scala closure serializes and\ndeserializes back to a working function, and two closures capturing\ndifferent locals stay independent.\n### Any related issues, documentation, or discussions?\nCloses: #5388\n### How was this PR tested?\n- Run `sbt \"WorkflowExecutionService/testOnly\n*AmberKryoInitializerSpec\"` and expect 4 examples to pass.\n- Local sbt test runs are blocked by JaCoCo 0.8.11 (cannot instrument\nJava 25 bytecode, major version 69), so the suite was run directly via\nScalaTest off the dependency classpath (`java -cp ...\norg.scalatest.tools.Runner -s ...AmberKryoInitializerSpec` with\n`--add-opens java.base/java.lang.invoke\u003dALL-UNNAMED`); all 4 passed. CI\nruns it on a supported JDK.\n### Was this PR authored or co-authored using generative AI tooling?\nCo-authored with Claude Opus 4.8 in compliance with ASF"
    },
    {
      "commit": "6dd16b5de8901de99cd0b96ab3d964a1348e8488",
      "tree": "3dd5d49f1c1ae3bcc675c811f12e491d86fb8d6a",
      "parents": [
        "4f73e952555aa7ae4d146c7a08ef0381e873d18b"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Jun 05 23:34:11 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jun 05 23:34:11 2026 +0000"
      },
      "message": "chore(deps): bump idna from 3.14 to 3.15 in /amber (#5364)\n\nBumps [idna](https://github.com/kjd/idna) from 3.14 to 3.15.\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca\nhref\u003d\"https://github.com/kjd/idna/blob/master/HISTORY.md\"\u003eidna\u0027s\nchangelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e3.15 (2026-05-12)\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eEnforce DNS-length cap on individual labels early in\n\u003ccode\u003echeck_label\u003c/code\u003e,\nshort-circuiting contextual-rule processing for oversized input\nwhile staying compatible with UTS 46 usage.\u003c/li\u003e\n\u003cli\u003eTidy core helpers: hoist bidi category sets to module-level\nfrozensets (avoiding per-codepoint list construction), simplify\nlength checks, and reuse the shared \u003ccode\u003e_unicode_dots_re\u003c/code\u003e from\n\u003ccode\u003eidna.core\u003c/code\u003e in the codec module.\u003c/li\u003e\n\u003cli\u003eUse \u003ccode\u003eraise ... from err\u003c/code\u003e for proper exception chaining\nand\nswitch internal string formatting to f-strings.\u003c/li\u003e\n\u003cli\u003eAllow \u003ccode\u003eflit_core\u003c/code\u003e 4.x in the build backend.\u003c/li\u003e\n\u003cli\u003eExpand the ruff lint set (flake8-bugbear, flake8-simplify,\npyupgrade, perflint) and apply the surfaced fixes; pin lint CI\nto Python 3.14.\u003c/li\u003e\n\u003cli\u003eAdd Dependabot configuration for GitHub Actions.\u003c/li\u003e\n\u003cli\u003eConvert README and HISTORY from reStructuredText to Markdown.\u003c/li\u003e\n\u003cli\u003eReference CVE-2026-45409 for the 3.14 advisory in place of the\ninitial GHSA identifier.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThanks to Felix Yan, Stan Ulbrych, and metsw24-max for\ncontributions to this release.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/kjd/idna/commit/af30a092e158181d0b35ac66dfa813788126bdd8\"\u003e\u003ccode\u003eaf30a09\u003c/code\u003e\u003c/a\u003e\nRelease 3.15\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/kjd/idna/commit/30314d4628744ca14cf2b5820564e5127a9f86f2\"\u003e\u003ccode\u003e30314d4\u003c/code\u003e\u003c/a\u003e\nPre-release 3.15rc0\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/kjd/idna/commit/05d4b219aa9eddc47371fcbd2000f0301016f3e9\"\u003e\u003ccode\u003e05d4b21\u003c/code\u003e\u003c/a\u003e\nMerge pull request \u003ca\nhref\u003d\"https://redirect.github.com/kjd/idna/issues/237\"\u003e#237\u003c/a\u003e from\nkjd/convert-docs-to-markdown\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/kjd/idna/commit/2987fdba1962bbb2358399e0084ba062b98a0bee\"\u003e\u003ccode\u003e2987fdb\u003c/code\u003e\u003c/a\u003e\nConvert README and HISTORY from reStructuredText to Markdown\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/kjd/idna/commit/59fa8002d514bf4a5ce7b58f67b9ec587d53fa9c\"\u003e\u003ccode\u003e59fa800\u003c/code\u003e\u003c/a\u003e\nMerge pull request \u003ca\nhref\u003d\"https://redirect.github.com/kjd/idna/issues/236\"\u003e#236\u003c/a\u003e from\nkjd/dependabot/github_actions/actions-f3e34333ea\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/kjd/idna/commit/def69834ced5d4b3c50439d8b99c4c856ec19ca2\"\u003e\u003ccode\u003edef6983\u003c/code\u003e\u003c/a\u003e\nMerge branch \u0027master\u0027 into\ndependabot/github_actions/actions-f3e34333ea\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/kjd/idna/commit/bbd8004a797185d8c56bb555cd5c88fde05e0631\"\u003e\u003ccode\u003ebbd8004\u003c/code\u003e\u003c/a\u003e\nMerge pull request \u003ca\nhref\u003d\"https://redirect.github.com/kjd/idna/issues/234\"\u003e#234\u003c/a\u003e from\nStanFromIreland/patch-1\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/kjd/idna/commit/edd07c05024344a6ccb517414ccb36683aee99fc\"\u003e\u003ccode\u003eedd07c0\u003c/code\u003e\u003c/a\u003e\nBump github/codeql-action from 3.35.2 to 4.35.2 in the actions\ngroup\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/kjd/idna/commit/5557db030c11bdec50d62aa5f631d705d33ba123\"\u003e\u003ccode\u003e5557db0\u003c/code\u003e\u003c/a\u003e\nMerge branch \u0027master\u0027 into patch-1\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/kjd/idna/commit/f11746cf4981d25123ef7830d3ee60f07de8ae3d\"\u003e\u003ccode\u003ef11746c\u003c/code\u003e\u003c/a\u003e\nMerge pull request \u003ca\nhref\u003d\"https://redirect.github.com/kjd/idna/issues/235\"\u003e#235\u003c/a\u003e from\nStanFromIreland/patch-2\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca\nhref\u003d\"https://github.com/kjd/idna/compare/v3.14...v3.15\"\u003ecompare\nview\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility\nscore](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name\u003didna\u0026package-manager\u003dpip\u0026previous-version\u003d3.14\u0026new-version\u003d3.15)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don\u0027t\nalter it yourself. You can also trigger a rebase manually by commenting\n`@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits\nthat have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all\nof the ignore conditions of the specified dependency\n- `@dependabot ignore this major version` will close this PR and stop\nDependabot creating any more for this major version (unless you reopen\nthe PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop\nDependabot creating any more for this minor version (unless you reopen\nthe PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop\nDependabot creating any more for this dependency (unless you reopen the\nPR or upgrade to it yourself)\nYou can disable automated security fix PRs for this repo from the\n[Security Alerts page](https://github.com/apache/texera/network/alerts).\n\n\u003c/details\u003e\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e\nCo-authored-by: Xinyuan Lin \u003cxinyual3@uci.edu\u003e"
    },
    {
      "commit": "4f73e952555aa7ae4d146c7a08ef0381e873d18b",
      "tree": "a69dae220d25b193ff4de9c0314d4fc5d0de239a",
      "parents": [
        "8a4cb29e1045f18cbfaf5f143473e0f05b25d4ea"
      ],
      "author": {
        "name": "Kunwoo (Chris)",
        "email": "143021053+kunwp1@users.noreply.github.com",
        "time": "Fri Jun 05 16:09:34 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jun 05 23:09:34 2026 +0000"
      },
      "message": "fix: clear red change-line brackets when restoring a workflow version (#5285)\n\n### What changes were proposed in this PR?\n\nWhen restoring a previous workflow version that displays a **red change\nline** (the bracket highlight drawn around the neighbors of deleted\noperators), the red line stayed visible after the version was restored.\nVersions whose diff only contained green/orange operator highlights\ncleared correctly.\n\nWhy it\u0027s a bug: `highlightOpVersionDiff()` applies three kinds of\nhighlight when previewing a version:\n- orange boundary **fill** on modified operators\n- green boundary **fill** on added operators\n- **red bracket strokes** (`path.left-boundary/stroke` /\n`path.right-boundary/stroke`) on the neighbors of *deleted* operators\n\n`unhighlightOpVersionDiff()` only reset the boundary fills — it never\nreset the bracket strokes. `closeParticularVersionDisplay()` masked the\nissue because it calls `reloadWorkflow()`, which rebuilds the JointJS\npaper elements and incidentally wipes the leftover brackets.\n`revertToVersion()` does **not** reload the paper, so the orphaned red\nbrackets persisted after restore.\n\nThis PR makes `unhighlightOpVersionDiff()` symmetric with\n`highlightOpVersionDiff()`: it now also resets the deleted-operators\u0027\nneighbor brackets back to the default transparent `rgba(0,0,0,0)`, so\nthe red change line is cleared on restore.\n\n### Any related issues, documentation, discussions?\n\nFixes #3043\nFixes #3828\n\n### How was this PR tested?\n\n- Manually verified in the UI that the red change line clears after\nrestoring a version.\n\n\nhttps://github.com/user-attachments/assets/6417c52c-4f6e-47eb-82d4-0ac95f55ac5f\n\n\n### Was this PR authored or co-authored using generative AI tooling?\n\nGenerated-by: Claude Code (Claude Opus 4.7)"
    },
    {
      "commit": "8a4cb29e1045f18cbfaf5f143473e0f05b25d4ea",
      "tree": "e09be67d6a3801eb5483e8a65fb9f2dfee5698b0",
      "parents": [
        "7deed35fddf58bc910991af920f0cf4d16c46f9b"
      ],
      "author": {
        "name": "Ryan Zhang",
        "email": "97552093+zyratlo@users.noreply.github.com",
        "time": "Fri Jun 05 03:44:20 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jun 05 10:44:20 2026 +0000"
      },
      "message": "feat(python-notebook-migration): add database tables for Notebook Migration tool (#5055)\n\n\u003c!--\nThanks for sending a pull request (PR)! Here are some tips for you:\n1. If this is your first time, please read our contributor guidelines:\n[Contributing to\nTexera](https://github.com/apache/texera/blob/main/CONTRIBUTING.md)\n  2. Ensure you have added or run the appropriate tests for your PR\n  3. If the PR is work in progress, mark it a draft on GitHub.\n  4. Please write your PR title to summarize what this PR proposes, we \n    are following Conventional Commits style for PR titles as well.\n  5. Be sure to keep the PR description updated to reflect all changes.\n--\u003e\n\n### What changes were proposed in this PR?\n\u003c!--\nPlease clarify what changes you are proposing. The purpose of this\nsection\nis to outline the changes. Here are some tips for you:\n  1. If you propose a new API, clarify the use case for a new API.\n  2. If you fix a bug, you can clarify why it is a bug.\n  3. If it is a refactoring, clarify what has been changed.\n  3. It would be helpful to include a before-and-after comparison using \n     screenshots or GIFs.\n  4. Please consider writing useful notes for better and faster reviews.\n--\u003e\nThis PR adds two new tables to the database, `notebook` and\n`workflow_notebook_mapping`. These tables will be used in the new Python\nNotebook Migration tool to store the user-uploaded notebook and the\ngenerated mapping between the notebook and workflow.\n\n\n### Any related issues, documentation, discussions?\n\u003c!--\nPlease use this section to link other resources if not mentioned\nalready.\n1. If this PR fixes an issue, please include `Fixes #1234`, `Resolves\n#1234`\nor `Closes #1234`. If it is only related, simply mention the issue\nnumber.\n  2. If there is design documentation, please add the link.\n  3. If there is a discussion in the mailing list, please add the link.\n--\u003e\nCloses #5054\nThe parent issue is #4301\n\n#### Schema\n\u003cimg width\u003d\"1580\" height\u003d\"838\" alt\u003d\"image\"\nsrc\u003d\"https://github.com/user-attachments/assets/33896320-56c5-45d6-bbd4-6d74fc365a49\"\n/\u003e\n\n\n### How was this PR tested?\n\u003c!--\nIf tests were added, say they were added here. Or simply mention that if\nthe PR\nis tested with existing test cases. Make sure to include/update test\ncases that\ncheck the changes thoroughly including negative and positive cases if\npossible.\nIf it was tested in a way different from regular unit tests, please\nclarify how\nyou tested step by step, ideally copy and paste-able, so that other\nreviewers can\ntest and check, and descendants can verify in the future. If tests were\nnot added,\nplease describe why they were not added and/or why it was difficult to\nadd.\n--\u003e\nNew tables were manually confirmed to be created successfully and\nusable.\n\n### Was this PR authored or co-authored using generative AI tooling?\n\u003c!--\nIf generative AI tooling has been used in the process of authoring this\nPR,\nplease include the phrase: \u0027Generated-by: \u0027 followed by the name of the\ntool\nand its version. If no, write \u0027No\u0027. \nPlease refer to the [ASF Generative Tooling\nGuidance](https://www.apache.org/legal/generative-tooling.html) for\ndetails.\n--\u003e\nNo\n\n---------\n\nCo-authored-by: Meng Wang \u003cmengw15@uci.edu\u003e"
    },
    {
      "commit": "7deed35fddf58bc910991af920f0cf4d16c46f9b",
      "tree": "6ee7919a3478dc28d3bafcf98b69a4d445a6b7fa",
      "parents": [
        "7a6c22a09b0efd60cee35e106dbbc66de2a73a55"
      ],
      "author": {
        "name": "carloea2",
        "email": "carloea2@uci.edu",
        "time": "Thu Jun 04 11:49:59 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 04 18:49:59 2026 +0000"
      },
      "message": "feat(workflow-operator): add Python UDF UI parameter injection model (#5141)\n\n### What changes were proposed in this PR?\n\nThis PR adds the Scala backend foundation for Python UDF UI parameters.\n\nIt introduces:\n\n| Area | Change |\n| --- | --- |\n| UI parameter model | Adds `UiUDFParameter`, containing\nbackend-compatible `attribute` metadata and an editable `value`. |\n| Python UDF injector | Adds `PythonUdfUiParameterInjector`, which\nvalidates UI parameters and injects a reserved hook method into\nsupported Python UDF classes. |\n| Safe string encoding | Marks `Attribute.getName()` as encodable so UI\nparameter names are safely rendered through the Python template builder.\n|\n| Test coverage | Adds Scala tests for hook injection, validation,\nunsupported types, reserved method conflicts, and unchanged behavior\nwhen no UI parameters exist. |\n\nThis PR is stacked after the merged frontend foundation PR #5043. It\ndoes not yet wire the injector into operator execution; that wiring is\nhandled by later PRs in the stack.\n\nExisting Python UDF workflow execution remains unchanged in this PR\nbecause `PythonUDFOpDescV2`, `PythonUDFSourceOpDescV2`, and\n`DualInputPortsPythonUDFOpDescV2` are not modified here.\n\n### Any related issues, documentation, discussions?\n\nPart of the Python UDF UI parameter feature split from\n`feat/ui-parameter`.\n\nRelated tracking issue / stack: #5044\n\nStack order:\n\n1. Frontend UI parameter building blocks: #5043\n2. Scala backend injection model: this PR\n3. Python runtime support\n4. End-to-end integration\n\n### How was this PR tested?\n\nCommands run:\n\n```bash\nsbt \"WorkflowOperator / Test / testOnly org.apache.texera.amber.operator.udf.python.PythonUdfUiParameterInjectorSpec\"\nsbt scalafmtAll\nsbt scalafmtCheckAll \"scalafixAll --check\"\n```\n\nResults:\n\n- `PythonUdfUiParameterInjectorSpec`: 10 tests passed.\n- `scalafmtAll`: no file changes.\n- `scalafmtCheckAll` and `scalafixAll --check`: passed.\n\n### Was this PR authored or co-authored using generative AI tooling?\n\nNo\n\n---------\n\nCo-authored-by: Xiaozhen Liu \u003cxiaozl3@uci.edu\u003e"
    },
    {
      "commit": "7a6c22a09b0efd60cee35e106dbbc66de2a73a55",
      "tree": "ec8d9775d777f39ff66972b8f2d6555a37472166",
      "parents": [
        "12d1d60fbd5e5954f2606e56b57587eca1e41973"
      ],
      "author": {
        "name": "Matthew B.",
        "email": "mgball@uci.edu",
        "time": "Wed Jun 03 16:05:38 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 03 23:05:38 2026 +0000"
      },
      "message": "test(frontend): cover HubWorkflowDetailComponent (#5236)\n\n### What changes were proposed in this PR?\n- Add `hub-workflow-detail.component.spec.ts` covering constructor wid\nresolution (NZ_MODAL_DATA vs route), role-based `isActivatedUser`, and\nthe `disableWorkflowModification` call.\n- Exercise `ngOnInit` count/view/isLiked branches including\ndefault-to-0, current-user fallback, and the empty-`isLiked` response\ncase.\n- Cover `loadWorkflowWithId` (hub vs non-hub fork, success reloads +\ncenter event, error path leaves graph untouched), `ngOnDestroy →\nclearWorkflow`, `goBack` success and error, `cloneWorkflow` early-return\nand success, `toggleLike` (short-circuits, like/unlike, refresh, no-op\nwhen service returns false), `formatCount`, and\n`changeViewDisplayStyle`.\n- Use Recipe F (`overrideComponent` remove/add) to swap\n`WorkflowEditorComponent`, `MiniMapComponent`, and\n`MarkdownDescriptionComponent` for selector-equivalent stubs so the real\ntemplate still renders under jsdom.\n### Any related issues, documentation, or discussions?\nCloses: #5227\n### How was this PR tested?\n- `yarn ng test --watch\u003dfalse\n--include\u003dsrc/app/hub/component/workflow/detail/hub-workflow-detail.component.spec.ts`\n(32 passed).\n### Was this PR authored or co-authored using generative AI tooling?\nCo-authored with Claude Opus 4.7 in compliance with ASF"
    },
    {
      "commit": "12d1d60fbd5e5954f2606e56b57587eca1e41973",
      "tree": "2c11edf12b7a9dfaffea7d02d6f7b1371ec10026",
      "parents": [
        "af664995e78e1cef5b9c727998cd335d98f0d92c"
      ],
      "author": {
        "name": "Matthew B.",
        "email": "mgball@uci.edu",
        "time": "Wed Jun 03 16:05:19 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 03 23:05:19 2026 +0000"
      },
      "message": "ci: auto-sync docs/ to the website on doc changes (#5308)\n\n### What changes were proposed in this PR?\n- Adds a GitHub Actions workflow that keeps the website docs in sync\nwith this repository, which is the single source of truth for\ndocumentation.\n- How it works: when any file under `docs/` changes on `main`, the\nworkflow copies each Markdown page body into the website repo\n(apache/incubator-texera-site) and pushes it, which triggers the site\u0027s\nexisting publish build.\n- It preserves the website\u0027s own front matter (page redirects and menu\nsettings) and only replaces the body, so site navigation and aliases are\nnever clobbered; new pages are copied and removed pages are deleted, so\nthe site stays a faithful mirror.\n- The job runs only on `apache/texera` (forks are skipped) and can also\nbe triggered manually from the Actions tab.\n### Any related issues, documentation, or discussions?\nRelated to: #5001\n### How was this PR tested?\n- Need a token from the incubator GitHub to test\n### Was this PR authored or co-authored using generative AI tooling?\nCo-authored with Claude Opus 4.8 in compliance with ASF\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "af664995e78e1cef5b9c727998cd335d98f0d92c",
      "tree": "6d6a7f4193809d1072e5e77b3b189d1afccb8d9a",
      "parents": [
        "6d604f340911153995c15bae5071723127b852e6"
      ],
      "author": {
        "name": "Matthew B.",
        "email": "mgball@uci.edu",
        "time": "Wed Jun 03 16:04:55 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 03 23:04:55 2026 +0000"
      },
      "message": "fix(frontend): stop forum login from looping when Flarum auth fails (#5311)\n\n### What changes were proposed in this PR?\n- Add an `attemptRegister` flag to `DashboardComponent.forumLogin` so a\nFlarum registration is attempted at most once, breaking the infinite\n`auth -\u003e register -\u003e auth` cycle that occurred when `auth()` kept\nfailing with a non-404/500 status.\n- After registering, the recursive call now passes `forumLogin(false)`;\nif auth still fails on that pass it falls through to `displayForum \u003d\nfalse` instead of looping.\n- Add an error handler to the `register()` subscription so a failed\nregistration hides the forum rather than being silently dropped.\n### Any related issues, documentation, or discussions?\nCloses: #5310\n### How was this PR tested?\n- Ran `yarn format:fix` (clean, no files changed).\n- Manually traced the control flow: auth fail (non-404/500) now does\nauth, register, auth, then stop, instead of recursing without bound.\n### Was this PR authored or co-authored using generative AI tooling?\nCo-authored with Claude Opus 4.8 in compliance with ASF\n\n---------\n\nSigned-off-by: Matthew B. \u003cmgball@uci.edu\u003e"
    },
    {
      "commit": "6d604f340911153995c15bae5071723127b852e6",
      "tree": "771da86bff9bd8823b61862b818d7e3524e680fa",
      "parents": [
        "8aa81af74f1e687ccbe57951ee70f01e15b5eca7"
      ],
      "author": {
        "name": "Matthew B.",
        "email": "mgball@uci.edu",
        "time": "Wed Jun 03 00:47:45 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 03 07:47:45 2026 +0000"
      },
      "message": "fix(amber): regenerate Python proto bindings on local sbt build (#5358)\n\n### What changes were proposed in this PR?\n- Restore the `genPythonProto` sbt task and wire it to `Compile /\ncompile`, so a local `sbt` build regenerates the Python betterproto\nbindings (`amber/src/main/python/proto/`) via `bin/python-proto-gen.sh`.\n- Guard the task: if `protoc` or `protoc-gen-python_betterproto` is not\non PATH it logs a warning and skips, so JDK-only and docker stages\n(which already run the script out-of-band) are unaffected.\n- Make the Python worker entrypoint exit with an actionable message when\nthe `proto` package is missing, instead of a raw `ModuleNotFoundError`.\n### Any related issues, documentation, or discussions?\nCloses: #5357\n### How was this PR tested?\n- Verified the worker entrypoint exits with the actionable message when\nthe `proto` package is absent (simulated a missing `proto` import).\n- Confirmed `bin/python-proto-gen.sh` regenerates a complete, importable\n`proto/` tree (protoc 3.19.x, `betterproto[compiler]\u003d\u003d2.0.0b7`).\n- Confirmed the PR diff is limited to the two intended files\n(`amber/build.sbt`, `texera_run_python_worker.py`).\n### Was this PR authored or co-authored using generative AI tooling?\nCo-authored with Claude Opus 4.8 in compliance with ASF"
    },
    {
      "commit": "8aa81af74f1e687ccbe57951ee70f01e15b5eca7",
      "tree": "b6b5a45f00ebbce8323d2283f527f80ca72f9990",
      "parents": [
        "23c5fd2c13936e43c5094c041650c7c041fe9b22"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Jun 03 07:39:56 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 03 07:39:56 2026 +0000"
      },
      "message": "chore(deps-dev): bump @vitest/browser from 4.1.5 to 4.1.6 in /frontend (#5356)\n\nBumps\n[@vitest/browser](https://github.com/vitest-dev/vitest/tree/HEAD/packages/browser)\nfrom 4.1.5 to 4.1.6.\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca\nhref\u003d\"https://github.com/vitest-dev/vitest/releases\"\u003e@​vitest/browser\u0027s\nreleases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev4.1.6\u003c/h2\u003e\n\u003ch3\u003e   🐞 Bug Fixes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003ebrowser\u003c/strong\u003e: Provide project reference in\n\u003ccode\u003eToMatchScreenshotResolvePath\u003c/code\u003e  -  by \u003ca\nhref\u003d\"https://github.com/macarie\"\u003e\u003ccode\u003e@​macarie\u003c/code\u003e\u003c/a\u003e and \u003ca\nhref\u003d\"https://github.com/sheremet-va\"\u003e\u003ccode\u003e@​sheremet-va\u003c/code\u003e\u003c/a\u003e in\n\u003ca\nhref\u003d\"https://redirect.github.com/vitest-dev/vitest/issues/10138\"\u003evitest-dev/vitest#10138\u003c/a\u003e\n\u003ca href\u003d\"https://github.com/vitest-dev/vitest/commit/31882607c\"\u003e\u003c!-- raw\nHTML omitted --\u003e(31882)\u003c!-- raw HTML omitted --\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eGlobal \u003ccode\u003esequence.concurrent: true\u003c/code\u003e with top-level\n\u003ccode\u003etest(..., { concurrent: false })\u003c/code\u003e + depreacte\n\u003ccode\u003esequential\u003c/code\u003e test API and options  -  by \u003ca\nhref\u003d\"https://github.com/hi-ogawa\"\u003e\u003ccode\u003e@​hi-ogawa\u003c/code\u003e\u003c/a\u003e,\n\u003cstrong\u003eCodex\u003c/strong\u003e and \u003ca\nhref\u003d\"https://github.com/sheremet-va\"\u003e\u003ccode\u003e@​sheremet-va\u003c/code\u003e\u003c/a\u003e in\n\u003ca\nhref\u003d\"https://redirect.github.com/vitest-dev/vitest/issues/10196\"\u003evitest-dev/vitest#10196\u003c/a\u003e\n\u003ca href\u003d\"https://github.com/vitest-dev/vitest/commit/2847dfa2a\"\u003e\u003c!-- raw\nHTML omitted --\u003e(2847d)\u003c!-- raw HTML omitted --\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ebrowser\u003c/strong\u003e: Simplify orchestrator otel carrier  -  by\n\u003ca href\u003d\"https://github.com/hi-ogawa\"\u003e\u003ccode\u003e@​hi-ogawa\u003c/code\u003e\u003c/a\u003e in \u003ca\nhref\u003d\"https://redirect.github.com/vitest-dev/vitest/issues/10285\"\u003evitest-dev/vitest#10285\u003c/a\u003e\n\u003ca href\u003d\"https://github.com/vitest-dev/vitest/commit/18af98cee\"\u003e\u003c!-- raw\nHTML omitted --\u003e(18af9)\u003c!-- raw HTML omitted --\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003e   🏎 Performance\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eStringify diff objects only once  -  by \u003ca\nhref\u003d\"https://github.com/sheremet-va\"\u003e\u003ccode\u003e@​sheremet-va\u003c/code\u003e\u003c/a\u003e in\n\u003ca\nhref\u003d\"https://redirect.github.com/vitest-dev/vitest/issues/10276\"\u003evitest-dev/vitest#10276\u003c/a\u003e\n\u003ca href\u003d\"https://github.com/vitest-dev/vitest/commit/9f7b1528c\"\u003e\u003c!-- raw\nHTML omitted --\u003e(9f7b1)\u003c!-- raw HTML omitted --\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch5\u003e    \u003ca\nhref\u003d\"https://github.com/vitest-dev/vitest/compare/v4.1.5...v4.1.6\"\u003eView\nchanges on GitHub\u003c/a\u003e\u003c/h5\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/vitest-dev/vitest/commit/a8fd24c1cad2320b19fcc651413c7d928423bdc1\"\u003e\u003ccode\u003ea8fd24c\u003c/code\u003e\u003c/a\u003e\nchore: release v4.1.6\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/vitest-dev/vitest/commit/18af98cee1830604d57f6a02bf28f8067cdffc06\"\u003e\u003ccode\u003e18af98c\u003c/code\u003e\u003c/a\u003e\nfix(browser): simplify orchestrator otel carrier (\u003ca\nhref\u003d\"https://github.com/vitest-dev/vitest/tree/HEAD/packages/browser/issues/10285\"\u003e#10285\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/vitest-dev/vitest/commit/31882607cc67c7bf52ead13a606321ffdb06a857\"\u003e\u003ccode\u003e3188260\u003c/code\u003e\u003c/a\u003e\nfeat(browser): provide project reference in\n\u003ccode\u003eToMatchScreenshotResolvePath\u003c/code\u003e (#...\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca\nhref\u003d\"https://github.com/vitest-dev/vitest/commits/v4.1.6/packages/browser\"\u003ecompare\nview\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility\nscore](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name\u003d@vitest/browser\u0026package-manager\u003dnpm_and_yarn\u0026previous-version\u003d4.1.5\u0026new-version\u003d4.1.6)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don\u0027t\nalter it yourself. You can also trigger a rebase manually by commenting\n`@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits\nthat have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all\nof the ignore conditions of the specified dependency\n- `@dependabot ignore this major version` will close this PR and stop\nDependabot creating any more for this major version (unless you reopen\nthe PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop\nDependabot creating any more for this minor version (unless you reopen\nthe PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop\nDependabot creating any more for this dependency (unless you reopen the\nPR or upgrade to it yourself)\nYou can disable automated security fix PRs for this repo from the\n[Security Alerts page](https://github.com/apache/texera/network/alerts).\n\n\u003c/details\u003e\n\n---------\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e\nCo-authored-by: Xinyuan Lin \u003cxinyual3@uci.edu\u003e"
    },
    {
      "commit": "23c5fd2c13936e43c5094c041650c7c041fe9b22",
      "tree": "8b1b7f77f5e540a0faea5d19f34ec25c58e00107",
      "parents": [
        "aa3a1179864d5271773917a0baf36df95ed33ef4"
      ],
      "author": {
        "name": "Yicong Huang",
        "email": "17627829+Yicong-Huang@users.noreply.github.com",
        "time": "Tue Jun 02 23:21:24 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 03 06:21:24 2026 +0000"
      },
      "message": "chore(asf): remove non-public team from bypass and grant v1.2 release manager (#5354)\n\n### What changes were proposed in this PR?\n\nDrop `texera-committers` from the `Default Branch Protection` ruleset\u0027s\n`bypass_teams` list —\n[INFRA-27977](https://issues.apache.org/jira/browse/INFRA-27977) flagged\nit as not a public team. Add `xuang7` (Xuan Gu, v1.2 release manager) to\nthe same list per INFRA\u0027s suggestion to put individual GitHub users\ndirectly in `bypass_teams`.\n\nInvestigation note: the open-source [asfyaml\nparser](https://github.com/apache/infrastructure-asfyaml/blob/HEAD/asfyaml/feature/github/rulesets.py)\nonly documents team slugs for `bypass_teams` and resolves each entry via\n`get_team_by_slug(...)` — a username would raise\n`UnknownObjectException`. If ASF Infra\u0027s production path also rejects\nit, the post-merge ruleset will end up with empty `bypass_actors` (the\nsame null state the repo has today), at which point we\u0027ll follow up\nseparately. Worst case is no behavior change from main.\n\n### Any related issues, documentation, discussions?\n\nCloses #5353. Driven by\n[INFRA-27977](https://issues.apache.org/jira/browse/INFRA-27977).\n\nEmail thread\nhttps://lists.apache.org/thread/6qt853kj96t7kcr09h38h0zj927rbxcl\n\n### How was this PR tested?\n\n`ruby -e \u0027require \"yaml\"; YAML.load_file(\".asf.yaml\"); puts \"yaml ok\"\u0027`\n— file still parses. Runtime validation will come from ASF Infra after\nmerge; if `xuang7` is rejected as a non-team slug we\u0027ll get an email and\nfollow up with a separate ticket.\n\n### Was this PR authored or co-authored using generative AI tooling?\n\nGenerated-by: Claude Opus 4.7"
    },
    {
      "commit": "aa3a1179864d5271773917a0baf36df95ed33ef4",
      "tree": "81f4b8c2c38e83cc839cdc912d6be267a01e37f5",
      "parents": [
        "0bfe9055e4285eb336abf7d62c08275fac79d4b7"
      ],
      "author": {
        "name": "Matthew B.",
        "email": "mgball@uci.edu",
        "time": "Tue Jun 02 16:38:15 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 02 23:38:15 2026 +0000"
      },
      "message": "test: cover hub.component sidebar gating and routerLinks (#5232)\n\n### What changes were proposed in this PR?\n- Replace the hub.component.spec.ts smoke test with nine tests covering\ndefault-input render, GuiConfigService injection, per-flag\n`sidebarTabs.*_enabled` gating, all-enabled rendering, exclusion of\ndisabled tabs, `routerLink` bindings to the three routing constants, and\n`isLogin` input passthrough.\n- Wrap `HubComponent` in a test host `\u003cul nz-menu\u003e` so `nz-menu-item`\ndirectives resolve their DI tokens the same way they do under the\ndashboard at runtime.\n- Read `routerLink` via the directive\u0027s `routerLinkInput` signal since\nthe `routerLink` input is a write-only setter and\n`ng-reflect-router-link` is not populated in the Vitest environment.\n### Any related issues, documentation, or discussions?\nCloses: #5224\n### How was this PR tested?\n- `yarn test --include\u003d\u0027src/app/hub/component/hub.component.spec.ts\u0027`: 9\npassed, 0 failed.\n- `yarn format:fix`: 506 files unchanged.\n### Was this PR authored or co-authored using generative AI tooling?\nCo-authored with Claude Opus 4.7 in compliance with ASF\n\n---------\n\nCo-authored-by: Meng Wang \u003cmengw15@uci.edu\u003e\nCo-authored-by: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "0bfe9055e4285eb336abf7d62c08275fac79d4b7",
      "tree": "2d9856234980a5bcad658d028184d82fe2fae972",
      "parents": [
        "251a845f79aac57157859cba6622e277c440bf3e"
      ],
      "author": {
        "name": "Matthew B.",
        "email": "mgball@uci.edu",
        "time": "Tue Jun 02 15:21:21 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 02 22:21:21 2026 +0000"
      },
      "message": "test: unit tests for LocalLoginComponent (#5235)\n\n### What changes were proposed in this PR?\n- Add `local-login.component.spec.ts` to cover form construction,\nvalidators, default-user prefill, and the login/register flows that were\npreviously untested.\n- Tests assert that `allForms` exposes the five expected controls with\n`required`, `minLength(6)`, and the custom `confirmationValidator`, that\n`confirmationValidator` returns `{ confirm: true }` on mismatch and `{}`\non match, and that `updateConfirmValidator` schedules\n`updateValueAndValidity` on the confirmation control via `setTimeout`.\n- Tests assert that `ngOnInit` patches `loginUsername`/`loginPassword`\nonly when `GuiConfigService.env.defaultLocalUser` is populated, that\n`login` short-circuits via `loginErrorMessage` on validation failure and\notherwise calls `UserService.login` with the trimmed username and\nnavigates to `queryParams.returnUrl` or `DASHBOARD_USER_WORKFLOW`, and\nthat error paths surface the error\u0027s message (or the fallback\n`\"Incorrect username or password\"`) through `NotificationService.error`.\n- Tests assert that `register` enforces password length, password match,\nand `UserService.validateUsername`, calls `UserService.register` with\nthe trimmed username on success and surfaces the account-created\nnotification, and on error notifies with the error\u0027s message (or the\nfallback `\"Registration failed\"`).\n### Any related issues, documentation, or discussions?\nCloses: #5226\n### How was this PR tested?\n- `yarn test\n--include\u003d\"src/app/hub/component/about/local-login/local-login.component.spec.ts\"`,\n22 tests passing.\n- `yarn format:fix`, 506 files unchanged.\n### Was this PR authored or co-authored using generative AI tooling?\nCo-authored with Claude Opus 4.7 in compliance with ASF\n\n---------\n\nCo-authored-by: Xiaozhen Liu \u003cxiaozl3@uci.edu\u003e\nCo-authored-by: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "251a845f79aac57157859cba6622e277c440bf3e",
      "tree": "4a9a606617365173a6182ec3153a8228c1c7834d",
      "parents": [
        "223a27b2929cff6b164030eea385fe143ba51791"
      ],
      "author": {
        "name": "Prateek Ganigi",
        "email": "91584519+PG1204@users.noreply.github.com",
        "time": "Tue Jun 02 14:55:53 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 02 21:55:53 2026 +0000"
      },
      "message": "fix(frontend): preserve operator state border on workflow page return (#5146)\n\n### What changes were proposed in this PR?\nFixes a visual regression where an operator\u0027s border, state text, port\nrow counts, and worker count reset to default after navigating away from\na workflow page and returning, even though the execution state is still\ncached in WorkflowStatusService.\n\nRoot cause: WorkspaceComponent clears the workflow on destroy and calls\nreloadWorkflow() on re-init, recreating every operator from the workflow\nJSON with default JointJS attributes. The cached execution status was\nnever reapplied, and the validation pass that runs on operator-add\ncalled changeOperatorColor(..., true) for valid operators, overwriting\nrect.body/stroke and forcing the border back to gray.\n\nFix (two changes, both in workflow-editor.component.ts):\n\nSubscribe to getOperatorAddStream() inside\nhandleOperatorStatisticsUpdate. When an operator is added (drag-drop,\nreloadWorkflow, undo/redo, collaborative add via Yjs - all routed\nthrough a single emission point), look up the cached OperatorStatistics.\nIf present, call changeOperatorStatistics(...) to restore the state\ncolor, port labels, worker count, and state text. New operators with no\ncached entry early-return and get default coloring.\n\nMake handleOperatorValidation status-aware. Invalid operators still get\na red border (priority preserved). For valid operators, the handler now\nchecks the cached status - if one exists, it repaints via\nchangeOperatorState(...) instead of overwriting with default gray. Valid\noperators with no cached status continue to get the default gray border.\n\nBefore fix:\n\n\nhttps://github.com/user-attachments/assets/c0feadeb-2310-486b-93b2-39389635c67f\n\nAfter fix:\n\n\nhttps://github.com/user-attachments/assets/a709aff5-0376-4bb8-8053-185f9d5d790d\n\n### Any related issues, documentation, discussions?\nFixes #3614.\n\n### How was this PR tested?\nUnit tests: Three tests added to workflow-editor.component.spec.ts under\na new describe(\"operator border restoration after navigation\") block:\n\nValid operator + cached Completed -\u003e changeOperatorState(..., Completed)\nis called.\nValid operator + empty cache -\u003e default changeOperatorColor(..., true)\nis called (existing behavior preserved).\nInvalid operator + cached Completed -\u003e changeOperatorColor(..., false)\nis called, red wins (existing behavior preserved).\nAll three pass under Vitest (ng test).\n\nManual UI testing: Reproduced the issue\u0027s recording locally:\n\nOpen a workflow (e.g., CSV File Scan → Radar Chart) and run it; both\noperators turn green with port row counts.\nNavigate to a different page, then back.\nBefore fix: operators reset to default gray borders, row counts blank.\nAfter fix: green borders, row counts, worker counts, and \"Completed\"\nstate label all persist.\nEdge cases manually verified: fresh workflow (default coloring), new\noperator dragged in after a completed run (default for new, cached for\nexisting), re-running (resetStatus repaints Uninitialized, live updates\nflow normally), invalid operator with cached Completed (red border,\nvalidation priority).\n\nNote: workflow-editor.component.spec.ts was previously excluded from the\ndefault jsdom test target in angular.json. This PR removes that\nexclusion (so the new tests run in CI and contribute to Codecov\ncoverage) and comments out six pre-existing mouse-event tests that fail\nunder jsdom (they continue to pass in the ng run gui:test-browser\ntarget, marked with TODO(#3614) in place). A follow-up PR will revive\nthose commented-out tests.\n\n### Was this PR authored or co-authored using generative AI tooling?\nCo-authored-by: Claude Code (Anthropic Claude Opus 4.7)\n\n---------\n\nSigned-off-by: Prateek Ganigi \u003c91584519+PG1204@users.noreply.github.com\u003e"
    },
    {
      "commit": "223a27b2929cff6b164030eea385fe143ba51791",
      "tree": "24c31e97cfe012cf3b573521e15984dcdd98b001",
      "parents": [
        "d08645529119db0d12cf4f1466f6b5a2db6d5eb5"
      ],
      "author": {
        "name": "Xuan Gu",
        "email": "162244362+xuang7@users.noreply.github.com",
        "time": "Mon Jun 01 19:50:24 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 02 02:50:24 2026 +0000"
      },
      "message": "feat(dashboard): add public dataset card view (#5215)\n\n\u003c!--\nThanks for sending a pull request (PR)! Here are some tips for you:\n1. If this is your first time, please read our contributor guidelines:\n[Contributing to\nTexera](https://github.com/apache/texera/blob/main/CONTRIBUTING.md)\n  2. Ensure you have added or run the appropriate tests for your PR\n  3. If the PR is work in progress, mark it a draft on GitHub.\n  4. Please write your PR title to summarize what this PR proposes, we \n    are following Conventional Commits style for PR titles as well.\n  5. Be sure to keep the PR description updated to reflect all changes.\n--\u003e\n\n### What changes were proposed in this PR?\n\u003c!--\nPlease clarify what changes you are proposing. The purpose of this\nsection\nis to outline the changes. Here are some tips for you:\n  1. If you propose a new API, clarify the use case for a new API.\n  2. If you fix a bug, you can clarify why it is a bug.\n  3. If it is a refactoring, clarify what has been changed.\n  3. It would be helpful to include a before-and-after comparison using \n     screenshots or GIFs.\n  4. Please consider writing useful notes for better and faster reviews.\n--\u003e\nThis PR adds a card view to the dataset listing, with a toggle to switch\nbetween the existing list view and the new card view for public dataset.\nApplied to the public dataset listing (/dashboard/hub/dataset/result).\n\n Changes:\n- Added DatasetCardItemComponent (frontend/.../user/dataset-card-item/,\nrenders a dataset card with cover image, title, owner avatar + name,\nlast-updated time, size, view count, and a like button. View mode\npersists per-user via localStorage.\n- Decoupled SearchResultsComponent from any specific card component. It\nnow accepts a cardTemplate: TemplateRef input, allowing each consumer to\nprovide its own card via \u003cng-template\u003e projection. The\n  card branch is gated on viewMode \u003d\u003d\u003d \u0027card\u0027 \u0026\u0026 cardTemplate.\n- The card loads cover images through the existing presigned-URL\nendpoint GET /dataset/{did}/cover-url, so covers render via a plain \u003cimg\nsrc\u003e without attaching a JWT header (works for public datasets and for\nprivate datasets the requester has access to).\n- Reused the shared formatCount (\"1.5k\" style) and formatRelativeTime\n(\"5 minutes ago\" style) utilities.\n- Added HubService.toggleLike helper, encapsulating the like/unlike +\nrefresh-count flow.\n- Projected DATASET.COVER_IMAGE through UnifiedResourceSchema and\nDatasetSearchQueryBuilder so search responses include the cover path\nneeded by the card.\n  \n\u003cimg width\u003d\"1561\" height\u003d\"775\" alt\u003d\"public-dataset\"\nsrc\u003d\"https://github.com/user-attachments/assets/23b84f3f-a39e-4ffa-98a5-67f39d48a626\"\n/\u003e\n\n\n### Any related issues, documentation, discussions?\n\u003c!--\nPlease use this section to link other resources if not mentioned\nalready.\n1. If this PR fixes an issue, please include `Fixes #1234`, `Resolves\n#1234`\nor `Closes #1234`. If it is only related, simply mention the issue\nnumber.\n  3. If there is design documentation, please add the link.\n  4. If there is a discussion in the mailing list, please add the link.\n--\u003e\nDiscussion #5130\nRelated to #4216 (workflow card view; same framework can later be\napplied).\nCloses #5243\n\n### How was this PR tested?\n\u003c!--\nIf tests were added, say they were added here. Or simply mention that if\nthe PR\nis tested with existing test cases. Make sure to include/update test\ncases that\ncheck the changes thoroughly including negative and positive cases if\npossible.\nIf it was tested in a way different from regular unit tests, please\nclarify how\nyou tested step by step, ideally copy and paste-able, so that other\nreviewers can\ntest and check, and descendants can verify in the future. If tests were\nnot added,\nplease describe why they were not added and/or why it was difficult to\nadd.\n--\u003e\nAdded test cases and manually tested.\n\n### Was this PR authored or co-authored using generative AI tooling?\n\u003c!--\nIf generative AI tooling has been used in the process of authoring this\nPR,\nplease include the phrase: \u0027Generated-by: \u0027 followed by the name of the\ntool\nand its version. If no, write \u0027No\u0027. \nPlease refer to the [ASF Generative Tooling\nGuidance](https://www.apache.org/legal/generative-tooling.html) for\ndetails.\n--\u003e\n Generated-by: Claude Opus 4.7\n\n---------\n\nSigned-off-by: Xuan Gu \u003c162244362+xuang7@users.noreply.github.com\u003e\nCo-authored-by: Matthew B. \u003cmgball@uci.edu\u003e"
    },
    {
      "commit": "d08645529119db0d12cf4f1466f6b5a2db6d5eb5",
      "tree": "02c8db3d20420a782661bb21feea00cc6d6e6a3a",
      "parents": [
        "531d79ff226acba9d5f8d1d13d57564359ba0cec"
      ],
      "author": {
        "name": "Jiadong Bai",
        "email": "43344272+bobbai00@users.noreply.github.com",
        "time": "Mon Jun 01 17:34:37 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 02 00:34:37 2026 +0000"
      },
      "message": "feat(k8s): add agent service and LiteLLM to the Helm chart (#5272)\n\n### What changes were proposed in this PR?\n\nThe agent-service image is built and runs under single-node compose but\nhad no Helm deployment, and the chart had no in-cluster LLM gateway.\nThis adds both, mirroring the proven preview/production chart while\naligning the agent service\u0027s env to what the code on `main` actually\nreads.\n\n**Agent service** (gated on `agentService.enabled`)\n- `agent-service-deployment.yaml` + `agent-service-service.yaml`, wired\nto in-cluster service DNS using the env names from\n`agent-service/src/config/env.ts`: `TEXERA_DASHBOARD_SERVICE_ENDPOINT`\n(webserver), `LLM_ENDPOINT` (access-control-service),\n`WORKFLOW_COMPILING_SERVICE_ENDPOINT`, and a per-CU\n`EXECUTION_ENDPOINT_TEMPLATE`.\n- A dedicated `/api/agents` HTTPRoute (REST + the\n`/api/agents/:id/react` WebSocket) plus a **`BackendTrafficPolicy` that\nconsistent-hashes on `X-Agent-Workflow-Id`** — agents are held in memory\nper pod, so a workflow\u0027s requests must always reach the same replica\n(the client already stamps that header).\n- Readiness/liveness on `/api/healthcheck`.\n\n**LiteLLM — in-cluster LLM gateway** (gated on `litellm.enabled`)\n- `litellm-deployment.yaml` + `litellm-service.yaml` +\n`litellm-config.yaml` (ConfigMap).\n- **Postgres persistence on by default**: a `texera_litellm` database is\ncreated by the Postgres init script, and the deployment sets\n`DATABASE_URL` + `STORE_MODEL_IN_DB\u003dtrue` so keys, spend, and model\nconfig survive restarts.\n- `access-control-service` wired to LiteLLM (`LITELLM_BASE_URL`,\n`LITELLM_MASTER_KEY`, copilot enabled).\n\nA shared Opaque `Secret` holds the agent gateway key, the LiteLLM master\nkey, and the provider API keys (supply via `--set`/override; none\ncommitted).\n\n### Any related issues, documentation, discussions?\n\nCloses #5269\n\n### How was this PR tested?\n\nTested locally by `helm install`. Worked end 2 end.\n\n`helm lint` and `helm template` against the chart (subchart\n`dependencies:` stripped locally so the render needs no remote charts):\n\n```\nhelm lint .                                        # 1 chart(s) linted, 0 chart(s) failed\nhelm template texera . -f values-development.yaml  # RC\u003d0, 50 objects, no errors\n```\n\n### Was this PR authored or co-authored using generative AI tooling?\n\nGenerated-by: Claude Opus 4.8 (1M context)\n\n---------\n\nCo-authored-by: Bob Bai \u003cbobbai0509@gmail.com\u003e\nCo-authored-by: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\nCo-authored-by: ali risheh \u003cali.risheh876@gmail.com\u003e"
    },
    {
      "commit": "531d79ff226acba9d5f8d1d13d57564359ba0cec",
      "tree": "7a9199687cd68a86139d813a1e6c8f23c337f304",
      "parents": [
        "d26bff669e0e253da451be3e64567a353036e00d"
      ],
      "author": {
        "name": "Matthew B.",
        "email": "mgball@uci.edu",
        "time": "Mon Jun 01 16:32:17 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 01 23:32:17 2026 +0000"
      },
      "message": "fix: require non-null uid in   insertNewExecution (#5300)\n\n### What changes were proposed in this PR?\n- `ExecutionsMetadataPersistService.insertNewExecution` kept its `uid:\nOption[Integer]` signature but replaced `setUid(uid.orNull)` with\n`setUid(uid.getOrElse(throw new IllegalArgumentException(...)))`, so a\nmissing uid is rejected with a clear error instead of writing null into\nthe NOT NULL `workflow_executions.uid` column (which produced a cryptic\njOOQ DataAccessException).\n- No `.orNull` is used; the caller\n(`WorkflowService.initExecutionService`) passes the `Option` through\nunchanged.\n- Updated `ExecutionsMetadataPersistServiceSpec`: the missing-uid case\nnow passes `None` and asserts an `IllegalArgumentException` is raised.\n### Any related issues, documentation, or discussions?\nCloses: #5212\n### How was this PR tested?\n- Compiled amber main + test sources under JDK 17 (clean).\n- Ran `WorkflowExecutionService/testOnly\n...ExecutionsMetadataPersistServiceSpec`: all 9 tests pass.\n- Ran `sbt scalafmtAll` (clean).\n### Was this PR authored or co-authored using generative AI tooling?\nCo-authored with Claude Opus 4.8 in compliance with ASF\n\n---------\n\nSigned-off-by: Matthew B. \u003cmgball@uci.edu\u003e"
    },
    {
      "commit": "d26bff669e0e253da451be3e64567a353036e00d",
      "tree": "da1c0ea8d18136bdca7229badc59895865e7ad85",
      "parents": [
        "eb287f3fc2cbba5416d851078affc10537123e68"
      ],
      "author": {
        "name": "Matthew B.",
        "email": "mgball@uci.edu",
        "time": "Mon Jun 01 16:31:36 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 01 23:31:36 2026 +0000"
      },
      "message": "refactor: Drop /dashboard prefix from user-facing URLs (#5151)\n\n### What changes were proposed in this PR?\n- Shortens user-facing URLs by dropping the `/dashboard` segment:\n`/dashboard/user/workflow/2358` becomes `/user/workflow/2358`.\n- Mounts `DashboardComponent` at `path: \"\"` (with a child `redirectTo:\n\"about\"`) instead of `\"dashboard\"`, and renames every route constant in\n`app-routing.constant.ts` to drop the `DASHBOARD`/`DASHBOARD_*` prefix\n(e.g. `DASHBOARD_USER_WORKFLOW` → `USER_WORKFLOW`). The standalone\n`DASHBOARD` prefix constant is removed; each constant is now an absolute\npath that already excludes the segment.\n- Removes a dead top-level `WorkspaceComponent` root route whose guard\nalways redirected to `/about`; `WorkspaceComponent` stays reachable via\n`/user/workflow/:id`.\n- Updates the hardcoded `/dashboard/...` references (admin execution\nlink, share-access message, navbar-hiding regex) and the Scala\nemail-link path. Backend API endpoints under `@Path(\"/dashboard\")`\n(`DashboardResource.scala`) and their corresponding `dashboard/...`\nservice URLs are intentionally left unchanged — they are REST endpoints,\nnot user-facing routes.\n\n\u003e [!NOTE]\n\u003e This only changes front-end routes. Pre-existing `/dashboard/...` deep\nlinks (bookmarks, the example links in\n`docs/tutorials/migrate-jupyter-notebook.md`) no longer resolve and fall\nthrough the `**` wildcard to `/user/workflow`.\n\n### Any related issues, documentation, or discussions?\n  Closes: #4407\n### How was this PR tested?\n- Ran `yarn format:fix` (clean) and `sbt scalafmtAll` (clean).\n- Ran `tsc --noEmit` against the branch merged with `main` (no type\nerrors).\n- Added/updated unit tests covering the new paths:\n`app-routing.constant` values, the navbar-hiding regex, sidebar\n`routerLink`s (`dashboard.component`), admin execution link,\n`list-item`/`browse-section` entry routing, logout redirect\n(`user-icon`), new-workflow navigation (`user-workflow`), share-access\nmessage paths, owner-revoked-access redirect (`menu`), and the\n`location.go` URL update (`workspace`).\n- Ran the affected suites locally via `ng test` — all pass.\n\n#### Before\n\u003cimg width\u003d\"2560\" height\u003d\"245\" alt\u003d\"Screenshot From 2026-05-23 04-11-22\"\nsrc\u003d\"https://github.com/user-attachments/assets/937c92bf-45e8-43de-ba17-482f63ee7c9d\"\n/\u003e\n\n#### After\n\u003cimg width\u003d\"2560\" height\u003d\"245\" alt\u003d\"Screenshot From 2026-05-23 04-11-04\"\nsrc\u003d\"https://github.com/user-attachments/assets/ca53ba20-e794-472e-a8cf-fd1e24ae544a\"\n/\u003e\n\n### Was this PR authored or co-authored using generative AI tooling?\nCo-authored with Claude Opus 4.7 and Claude Opus 4.8 in compliance with\nASF\n\n---------\n\nSigned-off-by: Matthew B. \u003cmgball@uci.edu\u003e\nCo-authored-by: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "eb287f3fc2cbba5416d851078affc10537123e68",
      "tree": "e522272ed7f8039ad2705a453238b04904f744b6",
      "parents": [
        "0e5686ec2fff54a9b1a9b44840c5de3ceb7dd178"
      ],
      "author": {
        "name": "Yicong Huang",
        "email": "17627829+Yicong-Huang@users.noreply.github.com",
        "time": "Mon Jun 01 00:22:31 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 01 07:22:31 2026 +0000"
      },
      "message": "feat(config-service): split /config/pre-login from authenticated endpoints (#5305)\n\n### What changes were proposed in this PR?\n\n`config-service` no longer broadcasts the full GUI configuration to\nanonymous callers. The four fields the frontend actually needs before\nlogin (`localLogin`, `googleLogin`, `defaultLocalUser`,\n`attributionEnabled`) move to a new `GET /api/config/pre-login`\n(`@PermitAll`). `GET /api/config/gui` and `GET /api/config/user-system`\nare now `@RolesAllowed(\"REGULAR\", \"ADMIN\")` and only answer\nauthenticated traffic.\n\nOn the frontend, `GuiConfigService.load()` always fetches\n`/config/pre-login` at `APP_INITIALIZER`. When a JWT is already in\n`localStorage` (browser reload while logged in), it chains `/config/gui`\n+ `/config/user-system` in the same await so the full config is in\nmemory before any post-login component mounts.\n`UserService.handleAccessToken` does the same chaining on a fresh login\nso `loginWithExistingToken` (which reads `config.env.inviteOnly`) runs\nonly after the authenticated config has resolved. Expired-token 403s on\nthe post-login fetch are caught so a stale `localStorage` token cannot\nblock bootstrap — that was the exact failure mode that caused #5025 to\nrevert the earlier eager-401 lockdown.\n\n### Any related issues, documentation, discussions?\n\nCloses #5304.\n\nRelated: #4901 (eager-401 from `JwtAuthFilter`), #5025 (revert that\nbroke `ConfigService` bootstrap last time we attempted a similar\nlockdown), #5199 (re-applied `@RolesAllowed` enforcement on the\nmicroservices, with `@PermitAll` opt-out for the two pre-login\nendpoints).\n\n### How was this PR tested?\n\nAdded unit tests covering pre-login / gui / user-system access with and\nwithout a valid Bearer token, the orchestrator\u0027s branching on a stored\ntoken, the 403 fallback, and the `UserService.handleAccessToken`\nordering guarantee.\n\n### Was this PR authored or co-authored using generative AI tooling?\n\nGenerated-by: Claude Opus 4.7\n\n---------\n\nCo-authored-by: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "0e5686ec2fff54a9b1a9b44840c5de3ceb7dd178",
      "tree": "7cb64eeeeed43d4d07b78663f8858575bb822d64",
      "parents": [
        "a8afdc487aaa8a1befca3cc4db61584b21d5a848"
      ],
      "author": {
        "name": "Yicong Huang",
        "email": "17627829+Yicong-Huang@users.noreply.github.com",
        "time": "Mon Jun 01 00:22:16 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 01 07:22:16 2026 +0000"
      },
      "message": "chore(ci): rename python job/flag/label to pyamber (#5307)\n\n### What changes were proposed in this PR?\n\nRename the Python worker CI identifier from `python` to `pyamber` so it\nmatches the module name and no longer collides with the actual Python\nlanguage used elsewhere in the same workflows (`actions/setup-python`,\n`matrix.python-version`, real `.py` paths, the `check_binary_deps.py\npython` CLI category). The rename touches the labeler entry, the\n`run_python` workflow input/output and its JS plumbing in `Precheck`,\nthe GHA job key (and its `python-state-materialization-mac` companion),\nand the Codecov `flags:` argument.\n\n**Pre-merge step:** `actions/labeler@v6` does not auto-create labels, so\nthe `pyamber` label must be created on the repo before this is merged,\notherwise the labeler will 404 when it tries to apply it. The old\n`python` label can be deleted afterwards.\n\n### Any related issues, documentation, discussions?\n\nCloses #5306.\n\n### How was this PR tested?\n\nValidated YAML parses for all four touched files; grep confirms no\n`python` stack/flag/input identifier remains.\n\n### Was this PR authored or co-authored using generative AI tooling?\n\nGenerated-by: Claude Opus 4.7 (1M context)\n\nCo-authored-by: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "a8afdc487aaa8a1befca3cc4db61584b21d5a848",
      "tree": "3b48a37d46175dd1cd7812d18578f33ce09db140",
      "parents": [
        "e25c28225f25990a4c149b85fa48f8090900cf85"
      ],
      "author": {
        "name": "Yicong Huang",
        "email": "17627829+Yicong-Huang@users.noreply.github.com",
        "time": "Sun May 31 16:59:08 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 31 23:59:08 2026 +0000"
      },
      "message": "test(compiling-service): add direct unit tests for WorkflowCompiler (#5022)\n\n### What changes were proposed in this PR?\n\nAdd direct unit coverage for `workflow-compiling-service`\u0027s\n`WorkflowCompiler` lenient-mode contract: `compile` never throws,\nper-operator failures accumulate into `operatorIdToError`, and\n`physicalPlan` is `None` whenever any error occurred. Only the REST\nhappy path is covered today.\n\nThe spec invokes the compiler directly rather than the REST resource,\nsidestepping a separate response-serialization NPE surfaced while\nwriting these tests (apache/texera#5021). The contract tests stay green\nonce that bug is fixed.\n\n### Any related issues, documentation, discussions?\n\nCloses #5020. References #5021.\n\n### How was this PR tested?\n\n`sbt \"WorkflowCompilingService/testOnly\norg.apache.texera.amber.compiler.WorkflowCompilerSpec\"` — all green.\n`scalafmtCheck` and `compile` clean.\n\n### Was this PR authored or co-authored using generative AI tooling?\n\nGenerated-by: Claude Opus 4.7 (1M context)\n\n---------\n\nSigned-off-by: Yicong Huang \u003c17627829+Yicong-Huang@users.noreply.github.com\u003e\nCo-authored-by: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e"
    },
    {
      "commit": "e25c28225f25990a4c149b85fa48f8090900cf85",
      "tree": "eb8eb163459d5faca2216d6b3ecbba5aaca40632",
      "parents": [
        "2ebef323605b156bcaaeb9eb02454797059758a2"
      ],
      "author": {
        "name": "Matthew B.",
        "email": "mgball@uci.edu",
        "time": "Sun May 31 16:48:20 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 31 23:48:20 2026 +0000"
      },
      "message": "test(frontend): browser-mode spec for code-editor.component (#5241)\n\n### What changes were proposed in this PR?\n- Adds a browser-mode companion spec,\ncode-editor.component.browser.spec.ts, that covers the four paths the\njsdom spec cannot reach: the initializeMonacoEditor subscribe body\n(readOnly toggle, MonacoBinding wiring, AI-action registration),\ninitializeDiffEditor\u0027s diff config path, the OpenAI gate in\nsetupAIAssistantActions, the type-annotation action\u0027s\ngetScrolledVisiblePosition branch, and the onWindowResize -\u003e\neditor.layout() handler. y-monaco\u0027s MonacoBinding is mocked via\nvi.hoisted so the constructor records its args without needing a real\nY.Text + monaco TextModel.\n- Adds src/browser-buffer-polyfill.ts and wires it as the first\nsetupFile in vitest.browser.config.ts so monaco-editor-wrapper and\nmonaco-vscode-files-service-override can be imported under package by\nlisting it in optimizeDeps.include so Vite\u0027s import-scan picks it up\ndespite the setup-file indirection.\n- Broadens the gui:test-browser target\u0027s include glob to\n**/*.browser.spec.ts in angular.json, and adds the same pattern to\ngui:test\u0027s exclude list so the two runners do not double-execute.\n### Any related issues, documentation, or discussions?\nCloses: #5192\n### How was this PR tested?\n- yarn nx run gui:test-browser: 29/29 passing (7 new code-editor + 22\nexisting workflow-editor).\n- yarn nx run gui:test: 623 passed, 2 skipped, 1 todo (no regression\nfrom the exclude change).\n### Was this PR authored or co-authored using generative AI tooling?\nCo-authored with Claude Opus 4.7 in compliance with ASF"
    },
    {
      "commit": "2ebef323605b156bcaaeb9eb02454797059758a2",
      "tree": "cd98ea9c1023cb8944ecf7f952225d6e613ff02e",
      "parents": [
        "ab79ea44d0e6d12097fcb11674b092341af01761"
      ],
      "author": {
        "name": "Yicong Huang",
        "email": "17627829+Yicong-Huang@users.noreply.github.com",
        "time": "Sun May 31 16:47:20 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 31 23:47:20 2026 +0000"
      },
      "message": "fix: enforce @RolesAllowed on microservice resources (#5199)\n\n### What changes were proposed in this PR?\n\nRe-applies #5049 (Jersey `@RolesAllowed` enforcement on\n`config-service`, `computing-unit-managing-service`, and\n`workflow-compiling-service`) and additionally marks the two pre-login\n`ConfigResource` endpoints — `/api/config/gui` and\n`/api/config/user-system` — as `@PermitAll`. Those endpoints are loaded\nby `GuiConfigService.load()` in the Angular `APP_INITIALIZER` before any\nlogin, so once role enforcement is on they must keep returning `200` to\nunauthenticated callers; missing this was what broke bootstrap and got\n#5049 reverted in #5173. Everything outside `config-service` matches\n#5049 byte-for-byte.\n\n### Any related issues, documentation, or discussions?\n\nCloses: #4904\nPrior attempt: #5049, reverted by #5173. The bootstrap root cause was\ndiagnosed inline at\nhttps://github.com/apache/texera/pull/5049#issuecomment-4527214062.\n\n### How was this PR tested?\n\nAdded `ConfigResourceAuthSpec`: wires `ConfigResource` through the same\n`JwtAuthFilter` + `RolesAllowedDynamicFeature` pipeline production uses\n(via Dropwizard\u0027s `ResourceExtension`) and fires HTTP requests with no\n`Authorization` header.\n\n- `GET /config/gui` → expects `200`\n- `GET /config/user-system` → expects `200`\n- `GET /auth-probe` (an in-test `@RolesAllowed` resource) → expects\n`403`\n\nManually tested. The `403` sanity guard ensures the feature is actually\nenforcing, so a future \"200 everywhere\" regression cannot silently slip\nthrough. Kept the three `*ServiceRunSpec` structural tests from #5049\nverifying that `RolesAllowedDynamicFeature` is registered. Manual\nreproduction with `curl` against a local dev server confirmed the\nunauthenticated bootstrap path returns `200` while a low-role JWT\nagainst an annotated endpoint returns `403`.\n\n### Was this PR authored or co-authored using generative AI tooling?\n\nCo-authored with Claude Opus 4.7 in compliance with ASF.\n\n---------\n\nSigned-off-by: Yicong Huang \u003c17627829+Yicong-Huang@users.noreply.github.com\u003e\nCo-authored-by: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\nCo-authored-by: Matthew B. \u003cmgball@uci.edu\u003e"
    },
    {
      "commit": "ab79ea44d0e6d12097fcb11674b092341af01761",
      "tree": "169555c86358d15e0a2cdf033ac5db489f446dfd",
      "parents": [
        "1b0ec78aa954bb1eab07e79d684a94c0e5a450b5"
      ],
      "author": {
        "name": "Matthew B.",
        "email": "mgball@uci.edu",
        "time": "Sun May 31 16:38:39 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 31 23:38:39 2026 +0000"
      },
      "message": "fix: remove duplicate NOTICE file under bin/single-node (#5303)\n\n### What changes were proposed in this PR?\n- Removed the duplicate `NOTICE` file under `bin/single-node/`, which\nwas identical to the project root `NOTICE`, to avoid the two-copy drift\nproblem.\n- Updated `.github/workflows/create-release-candidate.yml` so the Docker\nCompose release bundle still includes a `NOTICE`, now sourced from the\nroot copy (added `NOTICE` to the `git archive` paths and repointed the\n`cp`).\n### Any related issues, documentation, or discussions?\nCloses: #5296\n### How was this PR tested?\n- Verified the root `NOTICE` and removed `bin/single-node/NOTICE` were\nbyte-for-byte identical before deletion.\n- Grepped the repo to confirm the release workflow was the only\nreference, and updated it so the bundle copy still resolves.\n### Was this PR authored or co-authored using generative AI tooling?\nCo-authored with Claude Opus 4.7 in compliance with ASF"
    },
    {
      "commit": "1b0ec78aa954bb1eab07e79d684a94c0e5a450b5",
      "tree": "6a6371efc456e0a157aafc97956d1403211185d7",
      "parents": [
        "34be37d60f0931db692cb70a0d002178f9ce44d3"
      ],
      "author": {
        "name": "Prateek Ganigi",
        "email": "91584519+PG1204@users.noreply.github.com",
        "time": "Sun May 31 13:48:02 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 31 20:48:02 2026 +0000"
      },
      "message": "feat(huggingFace): add HuggingFaceModelResource for model browsing and media proxy (#5124)\n\n### What changes were proposed in this PR?\n\nIntroduces `HuggingFaceModelResource` - a Jersey REST resource at\n`/api/huggingface/*` that backs the upcoming HuggingFace operator\u0027s\nmodel picker, audio upload, and media preview UI. Five endpoints:\n\n| Endpoint | Purpose |\n|---|---|\n| `GET /api/huggingface/models?task\u003d…[\u0026search\u003d…]` | Browse or search HF\nmodels |\n| `GET /api/huggingface/tasks` | List HF pipeline tags with hosted\ninference |\n| `POST /api/huggingface/upload-audio?filename\u003d…` | Stream-upload audio\nfiles |\n| `GET /api/huggingface/audio-preview?path\u003d…` | Stream uploaded audio\nback |\n| `GET /api/huggingface/media-proxy?url\u003d…` | Proxy allowlisted remote\nmedia URLs (CORS bypass) |\n\nPlus a single-line registration of the resource in\n`TexeraWebApplication`.\n\n**Architectural notes:**\n- **Token sourcing:** the user\u0027s HF token arrives via the `X-HF-Token`\nrequest header (forwarded by the frontend from the operator\u0027s property\npanel in a follow-up PR). When absent, requests go to HF Hub\nanonymously. There is no server-side env-var token.\n- **Caching:** bounded Guava `Cache` (size + TTL) for `/models` and\n`/tasks` results. User-token requests bypass the cache to avoid serving\none user\u0027s token-scoped list to another.\n- **Streaming upload:** `/upload-audio` reads `InputStream` straight to\ndisk in 8 KB chunks with a 25 MiB cap (returns 413 on exceedance) - the\nrequest body is never buffered in memory. Extension allowlist rejects\nnon-audio types up front.\n- **SSRF protection:** `/media-proxy` requires the URL\u0027s host to be in\nan allowlist (HF, fal.media, replicate.delivery/com) with a leading-dot\nsuffix guard against lookalike domains.\n- **Bounded fan-out:** `/tasks` uses a dedicated `ForkJoinPool(4)` for\nits per-task probe instead of the JVM\u0027s global common pool, with\nexplicit 429/503 detection that logs at WARN.\n- **Truncation visibility:** browse and search responses carry an\n`X-Texera-Truncated: true` header when results were capped, so the\nfrontend can show \"list incomplete\" hints.\n- **Error responses:** generic Jackson-built JSON bodies (no exception\ninternals leak to clients); details are logged server-side.\n\n### Any related issues, documentation, or discussions?\n\nTracked in #5134 \u0026 #5041(umbrella issue for the HuggingFace operator\nend-to-end implementation). This PR is the backend foundation;\nsubsequent PRs will add the operator class, frontend property panel,\nresult-panel media rendering, and developer documentation.\n\nCloses #5134 \n\n### How was this PR tested?\n\n- Unit tests:\n`amber/src/test/scala/.../HuggingFaceModelResourceSpec.scala` - 86\nScalaTest cases covering token sanitization, SSRF allowlist (including\nlookalike-domain rejection), JSON error escaping, MIME type inference,\nthe audio-upload validation/size-cap/extension paths, audio-preview path\nvalidation and traversal rejection, media-proxy rejection paths, cache\nhit/bypass semantics, and the temp-dir sweep. Run with `sbt\n\u0027WorkflowExecutionService/testOnly\norg.apache.texera.web.resource.HuggingFaceModelResourceSpec\u0027` - all 86\npass in ~6 seconds, no external network required.\n- Manual smoke tests against a local backend:\n  - `GET /api/huggingface/tasks` returns the expected JSON task list.\n- `GET /api/huggingface/models?task\u003dtext-generation` returns the\npaginated model list; `text-generation` shows the `X-Texera-Truncated:\ntrue` header when `MAX_PAGES\u003d50` is hit.\n  - `POST /upload-audio?filename\u003devil.sh` → 400 (extension allowlist).\n  - `POST /upload-audio` with a 30 MiB body → 413 (size cap).\n- `GET /media-proxy?url\u003dhttp://localhost:8080/` → 403 (SSRF allowlist).\n\n### Was this PR authored or co-authored using generative AI tooling?\n\nCo-authored with Claude Opus 4.7 in compliance with ASF\n\n---------\n\nCo-authored-by: Elliot Lin \u003c36275109+ELin2025@users.noreply.github.com\u003e\nCo-authored-by: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\nCo-authored-by: Xuan Gu \u003c162244362+xuang7@users.noreply.github.com\u003e"
    },
    {
      "commit": "34be37d60f0931db692cb70a0d002178f9ce44d3",
      "tree": "00a6cfe7e8d9b3f83c1f78d43b4a6ddb45ed023c",
      "parents": [
        "e6509191d21a4df280bd98b3b73d6dca9f84a761"
      ],
      "author": {
        "name": "Matthew B.",
        "email": "mgball@uci.edu",
        "time": "Sat May 30 21:33:05 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 31 04:33:05 2026 +0000"
      },
      "message": "test: cover ShareAccessComponent behaviors in spec (#5233)\n\n### What changes were proposed in this PR?\n- Expand `share-access.component.spec.ts` from 4 routing-only tests to\n44 tests grouped by behavior: `ngOnInit`, `handleInputConfirm`,\n`onPaste`, `grantAccess`, `hasWriteAccess`,\n`verifyRevokeAccess`/`revokeAccess`, `changeAccessLevel`,\n`verifyPublish`/`verifyUnpublish`, and the individual publish/unpublish\nmethods.\n- Drive modal-confirmation flows by capturing the config passed to\n`NzModalService.create` and invoking the relevant `nzFooter` button\u0027s\n`onClick`, so each test asserts against the specific Confirm/Cancel path\nit cares about.\n- Parameterize the `setupComponent` helper with `type`, `id`,\n`inWorkspace`, and `currentEmail` overrides, and reset the TestBed in\n`beforeEach` so each test reconfigures providers (e.g., a WRITE access\nentry for `hasWriteAccess`, an already-published item for\n`verifyPublish`) without bleed-over.\n### Any related issues, documentation, or discussions?\nCloses: #5223\n### How was this PR tested?\n- Ran `yarn format:fix` (touched the new spec only).\n- Ran `yarn test\n--include\u003d\"src/app/dashboard/component/user/share-access/share-access.component.spec.ts\"`:\n44/44 passing.\n### Was this PR authored or co-authored using generative AI tooling?\nCo-authored with Claude Opus 4.7 in compliance with ASF"
    },
    {
      "commit": "e6509191d21a4df280bd98b3b73d6dca9f84a761",
      "tree": "1d229d6b166301178ca00b3bd28b69e7f0668021",
      "parents": [
        "a1045ce55e9169deb94f8ae3bf195692ef994ec5"
      ],
      "author": {
        "name": "Jiadong Bai",
        "email": "43344272+bobbai00@users.noreply.github.com",
        "time": "Sat May 30 18:34:24 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 31 01:34:24 2026 +0000"
      },
      "message": "fix(frontend): restore Regions and Status canvas toggles (#5160)\n\n### What changes were proposed in this PR?\n\nRestores the **Regions** and **Status** toggles under View, both of\nwhich broke after #4495 switched these elements from JointJS\n`visibility` attributes to CSS classes.\n\n- **Regions**: region visibility is now a shared, persistent flag on\n`JointGraphWrapper` (`setRegionsDisplayed` / `getRegionsDisplayed` /\nstream). The editor applies it to the shared JointJS model both when the\nflag changes and whenever regions are recreated on a\n`RegionUpdateEvent`. Because the model is shared, the toggle drives both\nthe main canvas (#5120) and the mini-map (#4027), and it survives the\nregion elements being recreated during execution (previously regions\nwent hidden mid-run even with the toggle on). The menu toggle just sets\nthe flag; the editor owns applying it. The `hide-region` CSS class/SCSS\nrule are removed.\n- **Status** (`workflow-editor.component.scss`,\n`workflow-editor.component.ts`, `menu.component.ts`): re-added the\n`hide-operator-status` SCSS rule (retargeted to the renamed\n`.texera-operator-state` element), added the default class so Status\nstarts hidden, and fixed the stale `.operator-status` selector in\n`applyOperatorStatusPosition()`.\n\nUnit tests added for the toggle delegation, status repositioning, the\ndefault `hide-operator-status` class, and region visibility across\ncreation / recreation / toggling.\n\nHere is a demo of the style after fix:\n\u003cimg width\u003d\"1707\" height\u003d\"1162\" alt\u003d\"2026-05-30 11 35 33\"\nsrc\u003d\"https://github.com/user-attachments/assets/ae5fc0d3-76f1-4bf8-914e-2644f89b46c2\"\n/\u003e\n\n\n### Any related issues, documentation, discussions?\n\nCloses #5120\n\nRegression from #4495.\n\n### How was this PR tested?\nManual + unit tests.\n\n\n### Was this PR authored or co-authored using generative AI tooling?\n\nGenerated-by: Claude Opus 4.8 (1M context)\n\n---------\n\nCo-authored-by: Bob Bai \u003cbobbai0509@gmail.com\u003e"
    },
    {
      "commit": "a1045ce55e9169deb94f8ae3bf195692ef994ec5",
      "tree": "f7716f849c77945a4f202ef441ccfa6b3e402c4f",
      "parents": [
        "a8548128615ca5e9402384bf0752328c7e39ab12"
      ],
      "author": {
        "name": "Kunwoo (Chris)",
        "email": "143021053+kunwp1@users.noreply.github.com",
        "time": "Sat May 30 12:31:06 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat May 30 19:31:06 2026 +0000"
      },
      "message": "fix(frontend): drop stale attribute references when an operator\u0027s input schema changes (#5294)\n\n### What changes were proposed in this PR?\n\nFixes a bug where copy-pasting a schema-propagated Aggregate operator\nand connecting it to a different upstream operator caused a compile\nerror that persisted even after clearing all properties.\n\n**Why it is a bug**: An Aggregate stores property values that reference\ninput column names — `groupByKeys` and `aggregations[].attribute`.\nCopy-paste clones `operatorProperties`, so the pasted operator keeps\nreferences to the *old* source\u0027s columns. When it is wired to a\ndifferent operator, the backend `AggregateOpDesc` schema propagation\ncalls `inputSchema.getAttribute(\"\u003cold col\u003e\")`, which throws. These old\ncolumn values were never removed.\n`DynamicSchemaService.setDynamicSchema` is documented to drop properties\ninvalidated by a new schema, but the code never actually did it.\n\n**What changed:** When schema propagation produces an input-attribute\nlist, `WorkflowCompilingService` now drops property values that the new\nschema invalidates via a new pure helper `dropInvalidAttributeValues`:\n- `autofill: \"attributeName\"` -\u003e reset to `\"\"` if not in the enum\n- `autofill: \"attributeNameList\"` -\u003e filter out entries not in the enum\n- recurses through nested objects/arrays (so `aggregations[].attribute`\nis handled) and never mutates the input\n\nThe misleading doc comment on `setDynamicSchema` now points to where the\ncontract is fulfilled.\n\n### Any related issues, documentation, discussions?\n\nResolves #3070.\n\n### How was this PR tested?\nManually tested:\n\n\nhttps://github.com/user-attachments/assets/d46e6198-10de-4efe-8c34-71981374cde8\n\n### Was this PR authored or co-authored using generative AI tooling?\n\nGenerated-by: Claude Code (Claude Opus 4.8)"
    },
    {
      "commit": "a8548128615ca5e9402384bf0752328c7e39ab12",
      "tree": "e7a3b609d65d6590bd7e0799bff469b991748c8e",
      "parents": [
        "e2bd47337f04e1260b6e7cc6ce0a6c5387d12705"
      ],
      "author": {
        "name": "nathant27",
        "email": "nathan.tam27@gmail.com",
        "time": "Sat May 30 11:24:00 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat May 30 18:24:00 2026 +0000"
      },
      "message": "fix(amber): avoids false negative on _check_heartbeat when connection is established but close raises exception (#5027)\n\n\u003c!--\nThanks for sending a pull request (PR)! Here are some tips for you:\n1. If this is your first time, please read our contributor guidelines:\n[Contributing to\nTexera](https://github.com/apache/texera/blob/main/CONTRIBUTING.md)\n  2. Ensure you have added or run the appropriate tests for your PR\n  3. If the PR is work in progress, mark it a draft on GitHub.\n  4. Please write your PR title to summarize what this PR proposes, we \n    are following Conventional Commits style for PR titles as well.\n  5. Be sure to keep the PR description updated to reflect all changes.\n--\u003e\n\n### What changes were proposed in this PR?\n\u003c!--\nPlease clarify what changes you are proposing. The purpose of this\nsection\nis to outline the changes. Here are some tips for you:\n  1. If you propose a new API, clarify the use case for a new API.\n  2. If you fix a bug, you can clarify why it is a bug.\n  3. If it is a refactoring, clarify what has been changed.\n  3. It would be helpful to include a before-and-after comparison using \n     screenshots or GIFs.\n  4. Please consider writing useful notes for better and faster reviews.\n--\u003e\nOld version of Heartbeat._check_heartbeat(self) wraps the socket\nconnection and socket close in a single try except, and handles with the\nsame try except. The issue is that if close raises after a successful\nconnection, there is a false negative since it will handle it as if\nsocket connection had failed. In Heartbeat.run(self), this could cause\nthe server to shutdown on close raising exception since _check_heartbeat\nwill return False in this case.\nNew version separates the connection handling and the close in two\nadjacent try except blocks, and returns true as long as connection is\nsuccessfully established as well, getting rid of the false negative.\n\nAs per discussed in the issue, will keep the double check for\n_check_heartbeat in Heartbeat.run.\n\nOld Version:\n```\n    def _check_heartbeat(self) -\u003e bool:\n        \"\"\"\n        Attempt to connect to JVM on the specific port. If succeeds, it means the\n        socket is still available and the JVM is still alive. Otherwise, the JVM\n        might have been gone.\n\n        :return: bool, indicating if the socket is available.\n        \"\"\"\n        try:\n            temp_socket \u003d socket.create_connection(\n                (self._parsed_server_host, self._parsed_server_port), timeout\u003d1\n            )\n            temp_socket.close()\n            return True\n        except Exception as e:\n            logger.warning(f\"Server is down with exception: {e}\")\n            return False\n```\n\nNew Version:\n```\n    def _check_heartbeat(self) -\u003e bool:\n        \"\"\"\n        Attempt to connect to the JVM port. If connection failure, then JVM is dead, or if connection success \n        then JVM is alive even if close() raises. Logs on connection failure and on close error.\n\n        :return: bool, True if connect succeeded, False if connect failed.\n        \"\"\"\n        try:\n            temp_socket \u003d socket.create_connection(\n                (self._parsed_server_host, self._parsed_server_port), timeout\u003d1\n            )\n        except Exception as e:\n            logger.warning(f\"Server is down with exception: {e}\")\n            return False\n\n        try:\n            temp_socket.close()\n        except Exception as e:\n            logger.warning(f\"Failed to close socket: {e}\")\n        \n        return True\n```\n\n### Any related issues, documentation, discussions?\nCloses #4726 \n\n### How was this PR tested?\nChanged old test to reflect new behavior(True on connection succeeds but\nsocket close rasises)\nOLD TEST(REMOVED):\n```\n    def test_returns_false_when_socket_close_raises(self):\n        # Pins the false-negative path: connect succeeds but the subsequent\n        # close() throws (e.g. broken pipe on a half-open socket). The bare\n        # `except Exception` in _check_heartbeat() catches it and reports\n        # \"server down\", and a regression that narrows that handler would be\n        # caught here.\n        hb \u003d make_heartbeat()\n        fake_sock \u003d MagicMock()\n        fake_sock.close.side_effect \u003d OSError(\"close failed\")\n        with patch(\n            \"core.runnables.heartbeat.socket.create_connection\",\n            return_value\u003dfake_sock,\n        ):\n            assert hb._check_heartbeat() is False\n```\nNEW TEST:\n```\n    def test_returns_true_when_connection_succeeds_but_socket_close_raises(self):\n        hb \u003d make_heartbeat()\n        fake_sock \u003d MagicMock()\n        fake_sock.close.side_effect \u003d OSError(\"close failed\")\n        with patch(\n            \"core.runnables.heartbeat.socket.create_connection\",\n            return_value\u003dfake_sock,\n        ):\n            assert hb._check_heartbeat() is True\n```\nPasses on existing old tests\n\n### Was this PR authored or co-authored using generative AI tooling?\nNo"
    },
    {
      "commit": "e2bd47337f04e1260b6e7cc6ce0a6c5387d12705",
      "tree": "2e76ca4344376e227bc4e722a401058a47eeebe5",
      "parents": [
        "5b09ca1eb14b8e04daa1a83de39ba99078e826f0"
      ],
      "author": {
        "name": "Jiadong Bai",
        "email": "43344272+bobbai00@users.noreply.github.com",
        "time": "Sat May 30 00:57:22 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat May 30 07:57:22 2026 +0000"
      },
      "message": "docs: update NOTICE copyright to \"2025 and onwards\" (#5158)\n\n### What changes were proposed in this PR?\n\nUpdates the copyright line in `NOTICE` (and the duplicate at\n`bin/single-node/NOTICE`) from `Copyright 2025 The Apache Software\nFoundation` to `Copyright 2025 and onwards The Apache Software\nFoundation`.\n\nFollowing Apache Spark\u0027s practice — avoids needing to bump the year on\nevery release.\n\n### Any related issues, documentation, discussions?\n\nCloses #5157\n\n### How was this PR tested?\n\nDoc-only change; no tests required.\n\n### Was this PR authored or co-authored using generative AI tooling?\n\nGenerated-by: Claude Opus 4.7 (1M context)\n\nCo-authored-by: Bob Bai \u003cbobbai0509@gmail.com\u003e"
    },
    {
      "commit": "5b09ca1eb14b8e04daa1a83de39ba99078e826f0",
      "tree": "310267c092a98c6be2b004f089cb8b1076616447",
      "parents": [
        "b90e76d04a44413d70017e64c17204a92d357dd4"
      ],
      "author": {
        "name": "Jiadong Bai",
        "email": "43344272+bobbai00@users.noreply.github.com",
        "time": "Sat May 30 00:30:28 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat May 30 07:30:28 2026 +0000"
      },
      "message": "chore(licensing): refresh transitive versions in LICENSE-binary-python (#5159)\n\n### What changes were proposed in this PR?\n\nRefreshes 14 transitive Python package versions in\n`amber/LICENSE-binary-python` to match the versions currently bundled,\nfixing the drift reported by the nightly `license-binary-checker`\nworkflow on `bf2f92c`:\n\n- `aiohappyeyeballs` 2.6.1 → 2.6.2 (PSF)\n- `certifi` 2026.4.22 → 2026.5.20 (MPL 2.0)\n- `click` 8.3.3 → 8.4.1 (BSD 3-Clause)\n- `fonttools` 4.62.1 → 4.63.0 (MIT)\n- `greenlet` 3.5.0 → 3.5.1 (MIT)\n- `huggingface-hub` 0.36.2 → 1.16.1 (Apache 2.0)\n- `idna` 3.13 → 3.16 (BSD 3-Clause)\n- `markdown-it-py` 4.1.0 → 4.2.0 (MIT)\n- `propcache` 0.4.1 → 0.5.2 (Apache 2.0)\n- `regex` 2026.4.4 → 2026.5.9 (Apache 2.0)\n- `requests` 2.33.1 → 2.34.2 (Apache 2.0)\n- `tifffile` 2026.5.2 → 2026.5.15 (BSD 3-Clause)\n- `urllib3` 2.6.3 → 2.7.0 (MIT)\n- `yarl` 1.23.0 → 1.24.2 (Apache 2.0)\n\nVersion-only updates — no license category changes.\n\n### Any related issues, documentation, discussions?\n\nCloses #5002\n\n### How was this PR tested?\n\nRelies on the existing `build / python (ubuntu-latest, 3.12)` job that\nruns \"Check installed Python packages against per-module LICENSE-binary\nfiles\" in strict (`nightly`) mode. The drift entries listed above were\ntaken directly from that job\u0027s [failure\nlog](https://github.com/apache/texera/actions/runs/26286240053/job/77374475119).\n\n### Was this PR authored or co-authored using generative AI tooling?\n\nGenerated-by: Claude Opus 4.7 (1M context)\n\nCo-authored-by: Bob Bai \u003cbobbai0509@gmail.com\u003e"
    },
    {
      "commit": "b90e76d04a44413d70017e64c17204a92d357dd4",
      "tree": "b30a0df3e587d7c59c51694eafc4f6330c0093e0",
      "parents": [
        "953e2c4b775f66ebbbb3a6464aa896dcb6134d65"
      ],
      "author": {
        "name": "Yicong Huang",
        "email": "17627829+Yicong-Huang@users.noreply.github.com",
        "time": "Fri May 29 21:28:59 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat May 30 04:28:59 2026 +0000"
      },
      "message": "fix(asf): restore root bypass team (#5290)\n\n### What changes were proposed in this PR?\n\nRestore the ASF `root` team in `.asf.yaml` branch protection bypasses\nwhile keeping `texera-committers` from #5287. Quote both team names for\nconsistency.\n\n### Any related issues, documentation, discussions?\n\nCloses #5289\nFollow-up to #5287\n\n### How was this PR tested?\n\n```bash\nruby -e \u0027require \"yaml\"; YAML.load_file(\".asf.yaml\"); puts \"YAML OK\"\u0027\ngit diff --check\n```\n\n### Was this PR authored or co-authored using generative AI tooling?\n\nYes. Used OpenAI Codex."
    },
    {
      "commit": "953e2c4b775f66ebbbb3a6464aa896dcb6134d65",
      "tree": "3152b3983e74f4e10aca610d6621c7eda7db86bc",
      "parents": [
        "59f776c853d3b18a6e385ed9b27b7d4aafc835de"
      ],
      "author": {
        "name": "Yicong Huang",
        "email": "17627829+Yicong-Huang@users.noreply.github.com",
        "time": "Thu May 28 23:41:32 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 29 06:41:32 2026 +0000"
      },
      "message": "chore(asf): Allow texera committers to bypass branch protection (#5287)\n\n### What changes were proposed in this PR?\nChange bypass team for protected branch to `texera-committers` so that\nselected committers can operate on branches.\n\n### Any related issues, documentation, discussions?\nCloses #5286 \n\n### How was this PR tested?\nThis is related to asf change, unfortunately cannot be tested without\nmerging into main.\n\n### Was this PR authored or co-authored using generative AI tooling?\nNo.\n\nSigned-off-by: Yicong Huang \u003c17627829+Yicong-Huang@users.noreply.github.com\u003e"
    },
    {
      "commit": "59f776c853d3b18a6e385ed9b27b7d4aafc835de",
      "tree": "53c8cb2138e780a32000a69d39005b44282b44c3",
      "parents": [
        "4cc7539ee163fdfafa429ad390fc806137758381"
      ],
      "author": {
        "name": "Meng Wang",
        "email": "mengw15@uci.edu",
        "time": "Thu May 28 17:10:36 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 29 00:10:36 2026 +0000"
      },
      "message": "fix(workflow-operator): auto-rename empty CSV column headers (#5282)\n\n### What changes were proposed in this PR?\n\nA CSV with an empty column header (e.g. a trailing comma `id,name,,age`)\nproduced an `Attribute` with an empty name. After #3295 every output\nport writes via `IcebergTableWriter → Parquet`, where Avro rejects empty\nnames with `IllegalArgumentException: Empty name` at flush time — losing\nthe operator port\u0027s entire result.\n\nRename blank header positions to `column-\u003cindex\u003e` (the convention used\nby pandas, Spark, R, and DuckDB) in all three CSV scan operators:\n`CSVScanSourceOpDesc`, `ParallelCSVScanSourceOpDesc`, and\n`CSVOldScanSourceOpDesc`. The issue named the first two; the legacy\n`csvOld` variant is still registered in `LogicalOp` and had the same\nlatent bug.\n\nNote: `ParallelCSVScanSourceOpDesc` is currently commented out of\n`LogicalOp`\u0027s operator registry (so it is not reachable from the UI),\nbut it is fixed here for consistency and so the bug does not resurface\nif it is re-enabled for experiments.\n\n### Any related issues, documentation, discussions?\n\nCloses #5279.\n\n### How was this PR tested?\n\nAdded three cases to `CSVScanSourceOpDescSpec` — one per operator —\nfeeding a CSV with an empty third header (`id,name,,age`) and asserting\nthe inferred schema is `[\"id\", \"name\", \"column-3\", \"age\"]`.\n`WorkflowOperator` suite is green (13 passed); scalafmt clean.\n\n### Was this PR authored or co-authored using generative AI tooling?\n\nGenerated-by: Claude Code (claude-opus-4-7)"
    },
    {
      "commit": "4cc7539ee163fdfafa429ad390fc806137758381",
      "tree": "c3b75fecedf81fac6cfbcc957336384d8f00db07",
      "parents": [
        "ec12c8886003bd890d341949d8e53b838d712a57"
      ],
      "author": {
        "name": "Xuan Gu",
        "email": "162244362+xuang7@users.noreply.github.com",
        "time": "Thu May 28 16:49:45 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 28 23:49:45 2026 +0000"
      },
      "message": "fix(dataset): load cover image on detail page for private datasets (#5284)\n\n\u003c!--\nThanks for sending a pull request (PR)! Here are some tips for you:\n1. If this is your first time, please read our contributor guidelines:\n[Contributing to\nTexera](https://github.com/apache/texera/blob/main/CONTRIBUTING.md)\n  2. Ensure you have added or run the appropriate tests for your PR\n  3. If the PR is work in progress, mark it a draft on GitHub.\n  4. Please write your PR title to summarize what this PR proposes, we \n    are following Conventional Commits style for PR titles as well.\n  5. Be sure to keep the PR description updated to reflect all changes.\n--\u003e\n\n### What changes were proposed in this PR?\n\u003c!--\nPlease clarify what changes you are proposing. The purpose of this\nsection\nis to outline the changes. Here are some tips for you:\n  1. If you propose a new API, clarify the use case for a new API.\n  2. If you fix a bug, you can clarify why it is a bug.\n  3. If it is a refactoring, clarify what has been changed.\n  3. It would be helpful to include a before-and-after comparison using \n     screenshots or GIFs.\n  4. Please consider writing useful notes for better and faster reviews.\n--\u003e\nThis PR fixes the cover image failing to load on the dataset detail page\nfor private datasets, and removes the default placeholder shown when no\ncover image is set.\n\nChanges:\n- Adds a JWT-aware endpoint `GET /dataset/{did}/cover-url` that returns\nthe presigned S3 URL as JSON. The detail page calls it via Angular\n`HttpClient` (which carries the JWT), then sets the returned URL on\n`\u003cimg src\u003e` (presigned URL needs no auth).\n- Removes the meaningless default blue placeholder on the detail page:\nif no cover image is set, nothing is rendered.\n- The existing 307-redirect endpoint `/cover` is preserved for the hub\nbrowse page, which serves only public datasets and consumes the redirect\ndirectly. Both endpoints now have doc comments cross-referencing each\nother.\n\nDemo:\nWith cover image:\n\u003cimg width\u003d\"1340\" height\u003d\"265\" alt\u003d\"with-cover\"\nsrc\u003d\"https://github.com/user-attachments/assets/d84f63ee-870e-43bf-8f44-c46b9e06b741\"\n/\u003e\n\nWithout cover image:\n\u003cimg width\u003d\"1352\" height\u003d\"253\" alt\u003d\"without-cover\"\nsrc\u003d\"https://github.com/user-attachments/assets/9ca89b09-4e73-4546-adb5-3233c1247468\"\n/\u003e\n\n### Any related issues, documentation, discussions?\n\u003c!--\nPlease use this section to link other resources if not mentioned\nalready.\n1. If this PR fixes an issue, please include `Fixes #1234`, `Resolves\n#1234`\nor `Closes #1234`. If it is only related, simply mention the issue\nnumber.\n  2. If there is design documentation, please add the link.\n  3. If there is a discussion in the mailing list, please add the link.\n--\u003e\nCloses #5283 \n\n### How was this PR tested?\n\u003c!--\nIf tests were added, say they were added here. Or simply mention that if\nthe PR\nis tested with existing test cases. Make sure to include/update test\ncases that\ncheck the changes thoroughly including negative and positive cases if\npossible.\nIf it was tested in a way different from regular unit tests, please\nclarify how\nyou tested step by step, ideally copy and paste-able, so that other\nreviewers can\ntest and check, and descendants can verify in the future. If tests were\nnot added,\nplease describe why they were not added and/or why it was difficult to\nadd.\n--\u003e\nAdded test cases for the new endpoint.\nManually verified on a local instance.\n\n### Was this PR authored or co-authored using generative AI tooling?\n\u003c!--\nIf generative AI tooling has been used in the process of authoring this\nPR,\nplease include the phrase: \u0027Generated-by: \u0027 followed by the name of the\ntool\nand its version. If no, write \u0027No\u0027. \nPlease refer to the [ASF Generative Tooling\nGuidance](https://www.apache.org/legal/generative-tooling.html) for\ndetails.\n--\u003e\nGenerated-by: Claude Opus 4.7"
    },
    {
      "commit": "ec12c8886003bd890d341949d8e53b838d712a57",
      "tree": "e63f5da5144cfdd9d5759500a3bffabfeb72f29b",
      "parents": [
        "85c4b0ca5d6fc0b79275df9e1756b05303bba76c"
      ],
      "author": {
        "name": "Sarah Asad",
        "email": "sarah_asad@live.com",
        "time": "Thu May 28 15:27:21 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 28 22:27:21 2026 +0000"
      },
      "message": "feat: Add Python Virtual Environment Support: Add k8s Gateway Configuration (#5138)\n\n\u003c!--\nThanks for sending a pull request (PR)! Here are some tips for you:\n1. If this is your first time, please read our contributor guidelines:\n[Contributing to\nTexera](https://github.com/apache/texera/blob/main/CONTRIBUTING.md)\n  2. Ensure you have added or run the appropriate tests for your PR\n  3. If the PR is work in progress, mark it a draft on GitHub.\n  4. Please write your PR title to summarize what this PR proposes, we \n    are following Conventional Commits style for PR titles as well.\n  5. Be sure to keep the PR description updated to reflect all changes.\n--\u003e\n\n### What changes were proposed in this PR?\n\u003c!--\nPlease clarify what changes you are proposing. The purpose of this\nsection\nis to outline the changes. Here are some tips for you:\n  1. If you propose a new API, clarify the use case for a new API.\n  2. If you fix a bug, you can clarify why it is a bug.\n  3. If it is a refactoring, clarify what has been changed.\n  3. It would be helpful to include a before-and-after comparison using \n     screenshots or GIFs.\n  4. Please consider writing useful notes for better and faster reviews.\n--\u003e\n\nThis PR is an extension of PR\nhttps://github.com/apache/texera/pull/4484,\nhttps://github.com/apache/texera/pull/4902,\nhttps://github.com/apache/texera/pull/5035, and #5069. It adds\nKubernetes gateway routing and access control configurations.\n\n### Any related issues, documentation, discussions?\n\u003c!--\nPlease use this section to link other resources if not mentioned\nalready.\n1. If this PR fixes an issue, please include `Fixes #1234`, `Resolves\n#1234`\nor `Closes #1234`. If it is only related, simply mention the issue\nnumber.\n  2. If there is design documentation, please add the link.\n  3. If there is a discussion in the mailing list, please add the link.\n--\u003e\n\nThis change is part of ongoing efforts to support environment isolation\nand reproducibility within Texera. Related issue includes\nhttps://github.com/apache/texera/issues/4296. This PR closes sub-issue\n#5137.\n\n### How was this PR tested?\n\u003c!--\nIf tests were added, say they were added here. Or simply mention that if\nthe PR\nis tested with existing test cases. Make sure to include/update test\ncases that\ncheck the changes thoroughly including negative and positive cases if\npossible.\nIf it was tested in a way different from regular unit tests, please\nclarify how\nyou tested step by step, ideally copy and paste-able, so that other\nreviewers can\ntest and check, and descendants can verify in the future. If tests were\nnot added,\nplease describe why they were not added and/or why it was difficult to\nadd.\n--\u003e\n\nTested manually and test added to AccessControlResourceSpec.\n\n\n### Was this PR authored or co-authored using generative AI tooling?\n\u003c!--\nIf generative AI tooling has been used in the process of authoring this\nPR,\nplease include the phrase: \u0027Generated-by: \u0027 followed by the name of the\ntool\nand its version. If no, write \u0027No\u0027. \nPlease refer to the [ASF Generative Tooling\nGuidance](https://www.apache.org/legal/generative-tooling.html) for\ndetails.\n--\u003e\n\nCo-authored using: Claude Code (claude-opus-4-7)\n\n---------\n\nCo-authored-by: Kunwoo (Chris) \u003c143021053+kunwp1@users.noreply.github.com\u003e"
    },
    {
      "commit": "85c4b0ca5d6fc0b79275df9e1756b05303bba76c",
      "tree": "f00450a2e784576a3269aab52f22f72a552bd554",
      "parents": [
        "ca829ec086ec61b11cce84463e66b855e2d46189"
      ],
      "author": {
        "name": "Xuan Gu",
        "email": "162244362+xuang7@users.noreply.github.com",
        "time": "Thu May 28 13:45:22 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 28 20:45:22 2026 +0000"
      },
      "message": "feat: show MiB unit label next to size-based admin settings inputs (#5066)\n\n\u003c!--\nThanks for sending a pull request (PR)! Here are some tips for you:\n1. If this is your first time, please read our contributor guidelines:\n[Contributing to\nTexera](https://github.com/apache/texera/blob/main/CONTRIBUTING.md)\n  2. Ensure you have added or run the appropriate tests for your PR\n  3. If the PR is work in progress, mark it a draft on GitHub.\n  4. Please write your PR title to summarize what this PR proposes, we \n    are following Conventional Commits style for PR titles as well.\n  5. Be sure to keep the PR description updated to reflect all changes.\n--\u003e\n\n### What changes were proposed in this PR?\n\u003c!--\nPlease clarify what changes you are proposing. The purpose of this\nsection\nis to outline the changes. Here are some tips for you:\n  1. If you propose a new API, clarify the use case for a new API.\n  2. If you fix a bug, you can clarify why it is a bug.\n  3. If it is a refactoring, clarify what has been changed.\n  3. It would be helpful to include a before-and-after comparison using \n     screenshots or GIFs.\n  4. Please consider writing useful notes for better and faster reviews.\n--\u003e\nThis PR adds an inline `MiB` unit label next to the size-based input\nboxes in the Admin Settings page, so the unit is visible at a glance\nwithout reading the help text below.\n\nDemo:\n\u003cimg width\u003d\"985\" height\u003d\"440\" alt\u003d\"unit-added\"\nsrc\u003d\"https://github.com/user-attachments/assets/71dd3629-8389-4e23-867f-89d9b21f9c09\"\n/\u003e\n\n\n### Any related issues, documentation, discussions?\n\u003c!--\nPlease use this section to link other resources if not mentioned\nalready.\n1. If this PR fixes an issue, please include `Fixes #1234`, `Resolves\n#1234`\nor `Closes #1234`. If it is only related, simply mention the issue\nnumber.\n  2. If there is design documentation, please add the link.\n  3. If there is a discussion in the mailing list, please add the link.\n--\u003e\nCloses #5065 \n\n### How was this PR tested?\n\u003c!--\nIf tests were added, say they were added here. Or simply mention that if\nthe PR\nis tested with existing test cases. Make sure to include/update test\ncases that\ncheck the changes thoroughly including negative and positive cases if\npossible.\nIf it was tested in a way different from regular unit tests, please\nclarify how\nyou tested step by step, ideally copy and paste-able, so that other\nreviewers can\ntest and check, and descendants can verify in the future. If tests were\nnot added,\nplease describe why they were not added and/or why it was difficult to\nadd.\n--\u003e\nManually tested.\n\n### Was this PR authored or co-authored using generative AI tooling?\n\u003c!--\nIf generative AI tooling has been used in the process of authoring this\nPR,\nplease include the phrase: \u0027Generated-by: \u0027 followed by the name of the\ntool\nand its version. If no, write \u0027No\u0027. \nPlease refer to the [ASF Generative Tooling\nGuidance](https://www.apache.org/legal/generative-tooling.html) for\ndetails.\n--\u003e\nGenerated-by: Claude Opus 4.7\n\n---------\n\nCo-authored-by: Meng Wang \u003cmengw15@uci.edu\u003e"
    },
    {
      "commit": "ca829ec086ec61b11cce84463e66b855e2d46189",
      "tree": "f3438f7d7d259c1f261355c1d829af745229c664",
      "parents": [
        "7bd65500562724eced01d87c254fdab1e9474e7b"
      ],
      "author": {
        "name": "Xuan Gu",
        "email": "162244362+xuang7@users.noreply.github.com",
        "time": "Thu May 28 11:23:41 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 28 18:23:41 2026 +0000"
      },
      "message": "refactor: consolidate count and relative-time formatting utilities (#5220)\n\n\u003c!--\nThanks for sending a pull request (PR)! Here are some tips for you:\n1. If this is your first time, please read our contributor guidelines:\n[Contributing to\nTexera](https://github.com/apache/texera/blob/main/CONTRIBUTING.md)\n  2. Ensure you have added or run the appropriate tests for your PR\n  3. If the PR is work in progress, mark it a draft on GitHub.\n  4. Please write your PR title to summarize what this PR proposes, we \n    are following Conventional Commits style for PR titles as well.\n  5. Be sure to keep the PR description updated to reflect all changes.\n--\u003e\n\n### What changes were proposed in this PR?\n\u003c!--\nPlease clarify what changes you are proposing. The purpose of this\nsection\nis to outline the changes. Here are some tips for you:\n  1. If you propose a new API, clarify the use case for a new API.\n  2. If you fix a bug, you can clarify why it is a bug.\n  3. If it is a refactoring, clarify what has been changed.\n  3. It would be helpful to include a before-and-after comparison using \n     screenshots or GIFs.\n  4. Please consider writing useful notes for better and faster reviews.\n--\u003e\nThis PR extracts duplicated `formatCount` and relative-time formatting\nlogic into the shared `format.util.ts` utility file, and updates inline\nusages to use the shared utilities. No behavior change.\n\n### Any related issues, documentation, discussions?\n\u003c!--\nPlease use this section to link other resources if not mentioned\nalready.\n1. If this PR fixes an issue, please include `Fixes #1234`, `Resolves\n#1234`\nor `Closes #1234`. If it is only related, simply mention the issue\nnumber.\n  2. If there is design documentation, please add the link.\n  3. If there is a discussion in the mailing list, please add the link.\n--\u003e\nCloses #5218\n\n### How was this PR tested?\n\u003c!--\nIf tests were added, say they were added here. Or simply mention that if\nthe PR\nis tested with existing test cases. Make sure to include/update test\ncases that\ncheck the changes thoroughly including negative and positive cases if\npossible.\nIf it was tested in a way different from regular unit tests, please\nclarify how\nyou tested step by step, ideally copy and paste-able, so that other\nreviewers can\ntest and check, and descendants can verify in the future. If tests were\nnot added,\nplease describe why they were not added and/or why it was difficult to\nadd.\n--\u003e\nExisting automated tests passed.\n\n### Was this PR authored or co-authored using generative AI tooling?\n\u003c!--\nIf generative AI tooling has been used in the process of authoring this\nPR,\nplease include the phrase: \u0027Generated-by: \u0027 followed by the name of the\ntool\nand its version. If no, write \u0027No\u0027. \nPlease refer to the [ASF Generative Tooling\nGuidance](https://www.apache.org/legal/generative-tooling.html) for\ndetails.\n--\u003e\nGenerated-by: Claude Opus 4.7"
    },
    {
      "commit": "7bd65500562724eced01d87c254fdab1e9474e7b",
      "tree": "fea3c3766470fac947fdd10232d5117a161f28cd",
      "parents": [
        "a4a3df5af33ef4b67ca5ebb3d4be52efd00d4254"
      ],
      "author": {
        "name": "Matthew B.",
        "email": "mgball@uci.edu",
        "time": "Wed May 27 23:48:09 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 28 06:48:09 2026 +0000"
      },
      "message": "feat: Welcome first-time contributors with comment commands guide (#5222)\n\n### What changes were proposed in this PR?\n- Add `.github/workflows/welcome-first-time-contributor.yml`, which\nposts a single welcome comment listing the `/take`, `/untake`,\n`/sub-issue`, `/unsub-issue`, `/parent-issue`, `/unparent-issue`,\n`/request-review`, and `/unrequest-review` commands when a new\ncontributor opens their first issue or PR.\n- Detect first-time status with the GitHub search API\n(`repo:\u003cowner\u003e/\u003crepo\u003e is:issue|pr author:\u003clogin\u003e`, treating `total_count\n\u003c\u003d 1` as first time). This works uniformly for issues and PRs, whereas\n`author_association` reports `NONE` for someone opening their first\nissue, and would miss them.\n- Trigger on `pull_request_target` (not `pull_request`) so PRs from\nforks still receive the welcome with a write-capable token; restrict\npermissions to `issues: write` and `pull-requests: write`.\n- Make the workflow idempotent via a hidden HTML marker (`\u003c!--\ntexera:welcome-first-time-contributor --\u003e`) embedded in the welcome body\nand checked against existing comments before posting, so workflow\nre-runs and reopen races do not duplicate the welcome.\n  ### Any related issues, documentation, or discussions?\n  Closes: #5166\n  ### How was this PR tested?\n- Validated the workflow YAML parses cleanly with `python3 -c \"import\nyaml;\nyaml.safe_load(open(\u0027.github/workflows/welcome-first-time-contributor.yml\u0027))\"`.\n- Reviewed logic for the known edge cases: search indexing delay (the\n`\u003c\u003d 1` check tolerates both 0, not yet indexed, and 1, only the new\nitem), transient `listComments` failure (falls open rather than dropping\na genuine first-timer\u0027s welcome), and Bot guard at the job-level `if`.\n- Runtime behavior cannot be exercised end-to-end locally; will be\nobservable on the next first-time issue or PR after merge.\n  ### Was this PR authored or co-authored using generative AI tooling?\n  Co-Authored with Claude Opus 4.7 in compliance with ASF Guidelines"
    },
    {
      "commit": "a4a3df5af33ef4b67ca5ebb3d4be52efd00d4254",
      "tree": "426e7325c8b4d8bde159b4d68dda899e64163f24",
      "parents": [
        "d8c254c75a024f00106528dfb66f4ccc4084f012"
      ],
      "author": {
        "name": "Matthew B.",
        "email": "mgball@uci.edu",
        "time": "Wed May 27 23:47:49 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 28 06:47:49 2026 +0000"
      },
      "message": "test: unit tests for LandingPageComponent (#5234)\n\n### What changes were proposed in this PR?\n- Add `landing-page.component.spec.ts` covering creation, the\nconstructor\u0027s `userChanged()` subscription (login/logout transitions\nupdate `isLogin` and `currentUid`), `ngOnInit` calling both\n`getWorkflowCount` and `loadTops`, count population from\n`HubService.getCount`, the three top-loved buckets populated by\n`loadTops`, the `loadTops` error path logging via `console.error`,\n`getTopLovedEntries` enriching items via\n`SearchService.extendSearchResultsWithHubActivityInfo(items, true,\n[\"access\"])` per action and returning a map keyed by action, and\n`navigateToSearch` routing for `\"workflow\"`, `\"dataset\"`, and unknown\ntypes.\n- Stub `HubService`, `SearchService`, `WorkflowPersistService`, and\n`DatasetService`; reuse `StubUserService` for a real `userChanged()`\nsubject; replace `Router.navigate` with a vitest spy.\n### Any related issues, documentation, or discussions?\nCloses: #5225\n### How was this PR tested?\n- Ran `yarn ng test --watch\u003dfalse\n--include\u003d\u0027src/app/hub/component/landing-page/landing-page.component.spec.ts\u0027`,\n10/10 tests pass.\n- Ran `yarn format:fix` (1 file formatted, 505 unchanged).\n### Was this PR authored or co-authored using generative AI tooling?\nCo-authored with Claude Opus 4.7 in compliance with ASF"
    },
    {
      "commit": "d8c254c75a024f00106528dfb66f4ccc4084f012",
      "tree": "c212c396b84c697334a7781689560847fc636838",
      "parents": [
        "f967080e387f78f0fcf71025ccca1e20ba33ad57"
      ],
      "author": {
        "name": "Matthew B.",
        "email": "mgball@uci.edu",
        "time": "Wed May 27 00:00:23 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 27 07:00:23 2026 +0000"
      },
      "message": "test: add unit spec for UserDatasetComponent (#5238)\n\n### What changes were proposed in this PR?\n- Adds `user-dataset.component.spec.ts` covering `UserDatasetComponent`\n(previously uncovered apart from its file-renderer child).\n- Verifies user-state tracking via `UserService.userChanged()`,\n`ngAfterViewInit` re-search behavior, `search()` filterScope variants\n(`private` / `public` / `all`), the full 8-argument\n`SearchService.executeSearch` call shape, the LakeFS mismatch warning\n(text + 4000ms duration), the `UserDatasetVersionCreatorComponent` modal\nconfig and post-close navigation, and `deleteDataset` (undefined-`did`\nno-op plus filtering of the deleted entry).\n- Uses direct component instantiation with `vi.fn()` mocks rather than\nthe heavier TestBed pattern, so assertions can target exact positional\nargument shapes without bootstrapping the modal content component or the\nng-zorro module graph.\n### Any related issues, documentation, or discussions?\nCloses: #5229\n### How was this PR tested?\n- `yarn test --include\u003d\u0027**/user-dataset/user-dataset.component.spec.ts\u0027\n--watch\u003dfalse` (14 tests passed, ~12ms).\n### Was this PR authored or co-authored using generative AI tooling?\nCo-authored with Claude Opus 4.7 in compliance with ASF"
    },
    {
      "commit": "f967080e387f78f0fcf71025ccca1e20ba33ad57",
      "tree": "ae113d09b39f525aedf3f11ab3d0f84a09642e6f",
      "parents": [
        "e27d4d05273624355537bab2897e92d7d22c647b"
      ],
      "author": {
        "name": "Matthew B.",
        "email": "mgball@uci.edu",
        "time": "Tue May 26 23:59:14 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 27 06:59:14 2026 +0000"
      },
      "message": "test: add spec for UserDatasetListItemComponent (#5239)\n\n### What changes were proposed in this PR?\n- Add `user-dataset-list-item.component.spec.ts` covering the previously\nuntested `UserDatasetListItemComponent`.\n- Tests use a `TestHostComponent` wrapper inside `\u003cnz-list\u003e` (the\ncomponent is rooted at `\u003cnz-list-item\u003e` and otherwise fails DI),\nmirroring the sibling `UserWorkflowListItemComponent` and\n`UserProjectListItemComponent` specs.\n- Coverage: `entry` getter (throws when unset, returns when set),\n`dataset` getter (returns `entry.dataset`, throws when missing),\n`confirmUpdateDatasetCustomName` and\n`confirmUpdateDatasetCustomDescription` (no-op when unchanged, success\npath updates the field and resets the editing flag, error path raises a\n`NotificationService.error` and still resets the flag),\n`onClickOpenShareAccess` (opens `ShareAccessComponent` with the expected\n`nzData` payload, footer, title, centered options, and toggles\n`writeAccess` based on `accessPrivilege`), the default value of the\n`editable` input, and the `deleted` / `duplicated` / `refresh` outputs\nas `EventEmitter`s.\n### Any related issues, documentation, or discussions?\nCloses: #5230\n### How was this PR tested?\n- Ran `yarn ng test --watch\u003dfalse\n--include\u003d\"src/app/dashboard/component/user/user-dataset/user-dataset-list-item/user-dataset-list-item.component.spec.ts\"`:\n15 tests pass.\n### Was this PR authored or co-authored using generative AI tooling?\nCo-authored with Claude Opus 4.7 in compliance with ASF"
    },
    {
      "commit": "e27d4d05273624355537bab2897e92d7d22c647b",
      "tree": "d8bfda904df27a68dd9bdf979af1f6416e8be3eb",
      "parents": [
        "968144bdfa9eb96df1024c3c4f5ba34afdcf8122"
      ],
      "author": {
        "name": "Matthew B.",
        "email": "mgball@uci.edu",
        "time": "Tue May 26 23:53:56 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 27 06:53:56 2026 +0000"
      },
      "message": "test: close stream in upload-error test to prevent finalizer leak across tests (#5246)\n\n### What changes were proposed in this PR?\nThe pyamber test\nTestCleanupFailedUpload::test_delete_object_failure_is_swallowed fails\nintermittently on CI. It is timing/GC-dependent, so it passes locally\nbut trips on CI runners under load.\nThe test expects delete_object to be called once after a simulated\nupload failure, but on the failing run it\u0027s called twice:\n- Wrap the body of `test_write_after_upload_error_raises_error` in\n`try/finally` and call `stream.close()` inside the `with\npatch.object(...)` scope so the failed-upload stream cannot survive as a\nzombie past the test boundary.\n- No production code change. `large_binary_output_stream.py` is\nunchanged.\n\n\u003e [!WARNING]\n\u003e This is a temporary fix to stop the intermittent CI failures until we\ncan diagnose the underlying problem. It addresses the test-level symptom\n(the zombie stream surviving past the test boundary) rather than the\nroot cause of why the failed-upload stream is being finalized late.\n\n\u003e [!NOTE]\n\u003e To reproduce deterministically locally, force GC between the two tests\nso the leaked stream finalizes while the next test\u0027s patches are active:\n\n### Any related issues, documentation, or discussions?\nRelated Issue: #5245\n\n### How was this PR tested?\n- Reproduced the CI failure deterministically on Python 3.12.13 by\nrunning the leaky test followed by\n`test_delete_object_failure_is_swallowed` with a forced `gc.collect()`\nbetween them, confirming the duplicate `delete_object` call.\n- Re-ran the same scenario after the fix: both tests pass, no duplicate\n`delete_object` call.\n- Ran the full `test_large_binary_output_stream.py` file on Python\n3.12.13 and 3.13.11 (26 tests pass on each).\n- `ruff check` and `ruff format --check` clean over `src/main/python`\nand `src/test/python`.\n\n### Was this PR authored or co-authored using generative AI tooling?\nCo-authored with Claude Opus 4.7 in compliance with ASF"
    },
    {
      "commit": "968144bdfa9eb96df1024c3c4f5ba34afdcf8122",
      "tree": "db7a2bd45a5d0c2f7f1ca3b50d3a32a0dacd1b99",
      "parents": [
        "d5bc8b7cf8d2e515280934a9c3e52c305fe3c002"
      ],
      "author": {
        "name": "Matthew B.",
        "email": "mgball@uci.edu",
        "time": "Tue May 26 21:53:49 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 27 04:53:49 2026 +0000"
      },
      "message": "test: cover SearchBarComponent debounce, cache, and routing (#5237)\n\n### What changes were proposed in this PR?\n- Added `search-bar.component.spec.ts` next to `search-bar.component.ts`\nwith 11 cases covering every documented behavior of the component.\n- Covered `isLogin` initialization plus live updates from\n`UserService.userChanged()`, the empty-query clear path in\n`onSearchInputChange`, `searchSubject` debounce via `fakeAsync` +\n`tick(200)`, the full `SearchService.search` argument list, per-query\nresult caching, 20-entry cache eviction in `addToCache`, type dispatch\nin `convertToName` (workflow, project, file, dataset, plus the throw\npath), and `performSearch` navigation to `DASHBOARD_SEARCH`.\n- No production code changes.\n### Any related issues, documentation, or discussions?\nCloses: #5228\n### How was this PR tested?\n- `yarn ng test --watch\u003dfalse --include\n\"src/app/dashboard/component/user/search-bar/search-bar.component.spec.ts\"`:\n11 passed.\n### Was this PR authored or co-authored using generative AI tooling?\nCo-authored with Claude Opus 4.7 in compliance with ASF"
    },
    {
      "commit": "d5bc8b7cf8d2e515280934a9c3e52c305fe3c002",
      "tree": "d0bd14dbc0489a528c1bd2e543afbe6f360d9ed2",
      "parents": [
        "8a7366f3b1ec18fc118a92b76326c06b92be1ff3"
      ],
      "author": {
        "name": "Matthew B.",
        "email": "mgball@uci.edu",
        "time": "Tue May 26 20:39:27 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 27 03:39:27 2026 +0000"
      },
      "message": "refactor: untrack generated python proto, regenerate in build (#5077)\n\n### What changes were proposed in this PR?\nStop version-tracking the betterproto-generated Python files under\n`amber/src/main/python/proto/`. Add a `genPythonProto` sbt task that\nruns `bin/python-proto-gen.sh` as a dependency of\n`WorkflowExecutionService/Compile/compile`, with a graceful skip when\n`protoc` is missing. Wire `protoc` 3.19.4 (matching `PB.protocVersion`)\nand `betterproto[compiler]\u003d\u003d2.0.0b7` into the three image build stages\n(worker,master, web-app) and the three CI jobs that touch Python proto\n(`python`, `python-state-materialization-mac`, `amber-integration`). The\n14th tracked file (`proto/org/apache/texera/web/__init__.py`) had no\ncorresponding `.proto` source and is gone after regen; grep confirms no\ncallers.\n  ### Any related issues, documentation, or discussions?\n  Closes: #4102\n  ### How was this PR tested?\nlocally: sbt clean WorkflowExecutionService/compile regenerates the tree\nand pytest -m \"not integration\" passes; skip path verified with protoc\nabsent. All three Docker images build end-to-end. CI covers the workflow\nYAML on\n  push.\n  ### Was this PR authored or co-authored using generative AI tooling?\n  Co-authored with Claude Opus 4.7 in compliance with ASF"
    },
    {
      "commit": "8a7366f3b1ec18fc118a92b76326c06b92be1ff3",
      "tree": "b484cb43434efe9c29b5029527762612b4af795e",
      "parents": [
        "24f7702714800152004b98f7b01ba53244cd2eb7"
      ],
      "author": {
        "name": "Matthew B.",
        "email": "mgball@uci.edu",
        "time": "Tue May 26 01:06:23 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 26 08:06:23 2026 +0000"
      },
      "message": "fix: honor Option contract on tryGetExistingExecution miss (#5221)\n\n### What changes were proposed in this PR?\n- Change `tryGetExistingExecution` in `ExecutionsMetadataPersistService`\nto wrap the DAO call with `Option(...)` instead of `Some(...)`, so a\nmissing row (jOOQ returns `null`) collapses to `None` rather than\n`Some(null)`.\n- Keep the existing `catch Throwable` block, which still earns its keep\nfor hard DB errors (e.g. closed connection); the `Option` wrap only\naddresses the no-row miss path.\n- Update `ExecutionsMetadataPersistServiceSpec` (added in #5213):\nreplace the two paired pin tests (the `Some(null)` pin and the inverted\n`intercept[TestFailedException]` xfail-strict) with a single positive\n`shouldBe None` test.\n  ### Any related issues, documentation, or discussions?\nCloses: #5211. Depends on #5213 (test scaffolding); rebase after it\nlands.\n  ### How was this PR tested?\n  - Ran `sbt scalafmtAll` (no rewrites needed).\n- `ExecutionsMetadataPersistServiceSpec.tryGetExistingExecution` now has\npositive tests for both the hit (`Some(row)`) and the miss (`None`)\ncases.\n  ### Was this PR authored or co-authored using generative AI tooling?\n  Co-authored with Claude Opus 4.7 in compliance with ASF"
    },
    {
      "commit": "24f7702714800152004b98f7b01ba53244cd2eb7",
      "tree": "5454299584ae48a898fabd8f46218e683e89e040",
      "parents": [
        "1cdfc457c00ad60dc4f01e8161a23af0a092f2dc"
      ],
      "author": {
        "name": "Xuan Gu",
        "email": "162244362+xuang7@users.noreply.github.com",
        "time": "Mon May 25 20:59:14 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 26 03:59:14 2026 +0000"
      },
      "message": "fix: skip datasets with missing LakeFS repos in public listing (#5171)\n\n\u003c!--\nThanks for sending a pull request (PR)! Here are some tips for you:\n1. If this is your first time, please read our contributor guidelines:\n[Contributing to\nTexera](https://github.com/apache/texera/blob/main/CONTRIBUTING.md)\n  2. Ensure you have added or run the appropriate tests for your PR\n  3. If the PR is work in progress, mark it a draft on GitHub.\n  4. Please write your PR title to summarize what this PR proposes, we \n    are following Conventional Commits style for PR titles as well.\n  5. Be sure to keep the PR description updated to reflect all changes.\n--\u003e\n\n### What changes were proposed in this PR?\n\u003c!--\nPlease clarify what changes you are proposing. The purpose of this\nsection\nis to outline the changes. Here are some tips for you:\n  1. If you propose a new API, clarify the use case for a new API.\n  2. If you fix a bug, you can clarify why it is a bug.\n  3. If it is a refactoring, clarify what has been changed.\n  3. It would be helpful to include a before-and-after comparison using \n     screenshots or GIFs.\n  4. Please consider writing useful notes for better and faster reviews.\n--\u003e\nThis PR fixes an issue where dataset listings fail when dataset records\nin the database and LakeFS repositories are inconsistent. This breaks\nthe workflow dataset picker and can also affect Hub dataset listings.\nThe fix wraps the per-row retrieveRepositorySize call in a try/catch for\nApiException, logs the orphan, and drops it from the response.\n\nDemo:\n\n| Before | After |\n|--------|-------|\n| \u003cimg width\u003d\"525\" height\u003d\"194\" alt\u003d\"Before: dataset listing error\"\nsrc\u003d\"https://github.com/user-attachments/assets/ae72e08f-64e0-4bce-866c-a9570b4c4591\"\n/\u003e | \u003cimg width\u003d\"655\" height\u003d\"395\" alt\u003d\"After: dataset picker loads\nvalid datasets\"\nsrc\u003d\"https://github.com/user-attachments/assets/cf3e4679-bc09-4cff-853a-2080c92cc35b\"\n/\u003e |\n\n### Any related issues, documentation, discussions?\n\u003c!--\nPlease use this section to link other resources if not mentioned\nalready.\n1. If this PR fixes an issue, please include `Fixes #1234`, `Resolves\n#1234`\nor `Closes #1234`. If it is only related, simply mention the issue\nnumber.\n  2. If there is design documentation, please add the link.\n  3. If there is a discussion in the mailing list, please add the link.\n--\u003e\nCloses #5106\n\n### How was this PR tested?\n\u003c!--\nIf tests were added, say they were added here. Or simply mention that if\nthe PR\nis tested with existing test cases. Make sure to include/update test\ncases that\ncheck the changes thoroughly including negative and positive cases if\npossible.\nIf it was tested in a way different from regular unit tests, please\nclarify how\nyou tested step by step, ideally copy and paste-able, so that other\nreviewers can\ntest and check, and descendants can verify in the future. If tests were\nnot added,\nplease describe why they were not added and/or why it was difficult to\nadd.\n--\u003e\nAdded tests for `DatasetResource.listDatasets`, covering healthy\ndatasets, orphan DB rows with missing LakeFS repositories, and\ndeduplication for datasets accessible through both explicit access and\npublic visibility.\n\n### Was this PR authored or co-authored using generative AI tooling?\n\u003c!--\nIf generative AI tooling has been used in the process of authoring this\nPR,\nplease include the phrase: \u0027Generated-by: \u0027 followed by the name of the\ntool\nand its version. If no, write \u0027No\u0027. \nPlease refer to the [ASF Generative Tooling\nGuidance](https://www.apache.org/legal/generative-tooling.html) for\ndetails.\n--\u003e\nGenerated-by: Claude Opus 4.7\n\n---------\n\nCo-authored-by: Meng Wang \u003cmengw15@uci.edu\u003e"
    },
    {
      "commit": "1cdfc457c00ad60dc4f01e8161a23af0a092f2dc",
      "tree": "e025ed2ec74a8915b01ef8df2fe811504b135922",
      "parents": [
        "69bee152f4285410799d196d5e21884663527a74"
      ],
      "author": {
        "name": "Yicong Huang",
        "email": "17627829+Yicong-Huang@users.noreply.github.com",
        "time": "Mon May 25 20:54:24 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 26 03:54:24 2026 +0000"
      },
      "message": "test(amber): unit tests for web state stores and websocket plumbing (#5209)\n\n### What changes were proposed in this PR?\n\nAdd six ScalaTest specs under\n`amber/src/test/scala/org/apache/texera/web/` covering pure-logic\nhelpers that ship without direct unit coverage today.\n\n- `StateStoreSpec` — observable diff filter, multi-handler fan-out,\nregistration-order delivery, Disposable removal, double-dispose\ntolerance.\n- `WorkflowStateStoreSpec` and `ExecutionStateStoreSpec` — default\nchild-store identities and `getAllStores` enumeration order.\n- `SubscriptionManagerSpec` — bulk dispose semantics on the trait,\nincluding repeat-call no-op and post-clear reuse.\n- `WebsocketInputSpec` — type-discriminated request routing, `uidOpt`\npass-through, callback-exception routing through `errorHandler`, and\nsubscriber isolation across throwing callbacks.\n- `UserRoleAuthorizerSpec` — accept matching role, reject mismatching\nrole, IAE on unknown / case-mismatched enum string (covers the surface\nthat #5049 was meant to guard).\n\n### Any related issues, documentation, discussions?\n\nCloses #5208.\n\n### How was this PR tested?\n\nAdded unit tests under `amber/src/test/scala/org/apache/texera/web/`.\n\n### Was this PR authored or co-authored using generative AI tooling?\n\nGenerated-by: Claude Opus 4.7"
    },
    {
      "commit": "69bee152f4285410799d196d5e21884663527a74",
      "tree": "34385fb220e88e907e8f69783a59bd54ae435f3f",
      "parents": [
        "c40f7f51735353c7edaae59ddc3cec19ea49494d"
      ],
      "author": {
        "name": "Yicong Huang",
        "email": "17627829+Yicong-Huang@users.noreply.github.com",
        "time": "Mon May 25 20:53:06 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 26 03:53:06 2026 +0000"
      },
      "message": "test(amber): DB-backed unit tests for ExecutionsMetadataPersistService and updateWorkflowState (#5213)\n\n### What changes were proposed in this PR?\n\nAdds `ExecutionsMetadataPersistServiceSpec`, a `MockTexeraDB`-backed\nunit spec covering the three methods on\n`ExecutionsMetadataPersistService` plus the\n`ExecutionStateStore.updateWorkflowState` wrapper that sits on top of\n`tryUpdateExistingExecution`. The MockTexeraDB trait (already used by\n`WorkflowExecutionsResourceSpec` and peers) spins up an EmbeddedPostgres\nin `beforeAll`, loads `sql/texera_ddl.sql`, and tears down in\n`afterAll`.\n\nTwo latent silent-failure patterns are pinned with explanatory comments\nand filed as follow-up bugs: `tryGetExistingExecution` returns\n`Some(null)` instead of `None` for unknown eids, and\n`insertNewExecution` propagates a NOT NULL violation when `uid\u003dNone`\ndespite the `Option[Integer]` signature. The pinned `Some(null)` test is\npaired with an `intercept[TestFailedException]`-based xfail-strict test\nasserting the intended `None` contract — it flips red the day the bug is\nfixed.\n\n### Any related issues, documentation, discussions?\n\nCloses #5210. Surfaces #5211 and #5212.\n\n### How was this PR tested?\n\nAdded unit tests under\n`amber/src/test/scala/org/apache/texera/web/service/`.\n\n### Was this PR authored or co-authored using generative AI tooling?\n\nGenerated-by: Claude Opus 4.7"
    },
    {
      "commit": "c40f7f51735353c7edaae59ddc3cec19ea49494d",
      "tree": "65cf70ba0433f406e5c35d7595baf23672b2ff93",
      "parents": [
        "f89c07cffe88eff6f88fcce89f6a4ac41ede239e"
      ],
      "author": {
        "name": "Kunwoo (Chris)",
        "email": "143021053+kunwp1@users.noreply.github.com",
        "time": "Mon May 25 19:53:28 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 26 02:53:28 2026 +0000"
      },
      "message": "chore: clean up sbt clean compile warnings (#5201)\n\n### What changes were proposed in this PR?\n\nFixes the six tractable `[warn]`/deprecation messages emitted by `sbt\nclean compile` on JDK 17, and hardens the build so the cleaned-up Java\npattern can\u0027t be reintroduced.\n\n| File | Warning | Fix |\n| --- | --- | --- |\n| `common/pybuilder/.../BoundaryValidator.scala` | outer reference in\nthis type test (×2) | Move nested `CompileTimeContext` /\n`RuntimeContext` case classes to the companion object; the\npath-dependent macro `Position` becomes a `Pos` type parameter. Call\nsites in `PythonTemplateBuilder.scala` switch from `validator.X(...)` to\n`BoundaryValidator.X(...)`. |\n| `file-service/.../DatasetFileNodeSerializer.java` | uses deprecated\nAPI | Swap `scala.collection.JavaConverters.seqAsJavaList` for\n`scala.jdk.javaapi.CollectionConverters.asJava`. |\n| `common/workflow-operator/.../TestOperators.scala` |\n`MySQLSourceOpDesc` deprecated (×2) | Delete the unused\n`inMemoryMySQLSourceOpDesc` helper and its import (no callers; MySQL\nsource dead since 1.1.0-incubating). |\n| `amber/.../ExecutionResultService.scala` | inferred existential type |\nAdd `import scala.language.existentials`. |\n\n`build.sbt` — add `ThisBuild / Compile / javacOptions ++\u003d\nSeq(\"-Xlint:deprecation\", \"-Werror\")` so any future Java caller of a\ndeprecated API (e.g. re-introducing `scala.collection.JavaConverters` in\nJava) fails the build rather than emitting an `[info]` line.\n\n**Intentionally out of scope**: the `JwtAuth object deprecated (×2)`\nwarnings in `ComputingUnitMaster.scala` and\n`TexeraWebApplication.scala`. The `@Deprecated` on\n`amber/web/auth/JwtAuth.scala` is a real signal — the migration to\n`common/auth` is non-trivial (common/auth doesn\u0027t depend on Dropwizard),\nso the cleanup belongs in a separate PR rather than silencing the\nwarning here. Per review discussion on the JwtAuth thread.\n\n### Any related issues, documentation, discussions?\n\nCloses #5200\n\n### How was this PR tested?\n\n`sbt clean compile` on Eclipse Adoptium JDK 17.0.19.\n\n**Before** — eight warning lines:\n```\n[warn] BoundaryValidator.scala:78:20: The outer reference in this type test cannot be checked at run time.\n[warn] BoundaryValidator.scala:86:20: The outer reference in this type test cannot be checked at run time.\n[info] DatasetFileNodeSerializer.java uses or overrides a deprecated API.\n[warn] TestOperators.scala:150:6: class MySQLSourceOpDesc in package mysql is deprecated\n[warn] TestOperators.scala:151:41: class MySQLSourceOpDesc in package mysql is deprecated\n[warn] ExecutionResultService.scala:441:13: inferred existential type ... should be enabled by making the implicit value scala.language.existentials visible.\n[warn] ComputingUnitMaster.scala:166:5: object JwtAuth in package auth is deprecated\n[warn] TexeraWebApplication.scala:137:5: object JwtAuth in package auth is deprecated\n```\n\n**After** — only the two intentionally-deferred JwtAuth warnings remain:\n```\n[warn] ComputingUnitMaster.scala:166:5: object JwtAuth in package auth is deprecated\n[warn] TexeraWebApplication.scala:137:5: object JwtAuth in package auth is deprecated\n[warn] two warnings found\n[success] Total time: 36 s\n```\n\n**Build-hardening check** — temporarily reintroduced\n`JavaConverters.seqAsJavaList` in `DatasetFileNodeSerializer.java` and\nran `sbt \"FileService / compile\"`:\n```\n[warn] DatasetFileNodeSerializer.java:56:56: \u003cA\u003eseqAsJavaList(scala.collection.Seq\u003cA\u003e) in scala.collection.JavaConverters has been deprecated\n[error] DatasetFileNodeSerializer.java: warnings found and -Werror specified\n[error] (FileService / Compile / compileIncremental) javac returned non-zero exit code\n```\nReverted before commit. All 224 main Java sources in the repo compile\nclean under the new flags.\n\n**New unit tests** added to keep Jacoco honest about the touched lines\n(codecov patch-coverage feedback):\n- `file-service/.../DatasetFileNodeSerializerSpec.scala` — file,\nrecursive directory (covers the swapped `asJava` call), empty directory.\n- `common/pybuilder/.../BoundaryValidatorSpec.scala` — `RuntimeContext`\nand `CompileTimeContext` construction, field access, structural\nequality, `copy`. These case classes only run during macro expansion in\nproduction, so runtime instrumentation never saw them; the spec pins the\ndata-class contract and gives codecov real coverage hits.\n\nTest commands:\n```\nsbt \"FileService / testOnly org.apache.texera.service.type.serde.DatasetFileNodeSerializerSpec\"\nsbt \"PyBuilder / testOnly org.apache.texera.amber.pybuilder.BoundaryValidatorSpec\"\n```\n\n### Was this PR authored or co-authored using generative AI tooling?\n\nGenerated-by: Claude Code (Opus 4.7)\n\n---------\n\nSigned-off-by: Kunwoo (Chris) \u003c143021053+kunwp1@users.noreply.github.com\u003e"
    },
    {
      "commit": "f89c07cffe88eff6f88fcce89f6a4ac41ede239e",
      "tree": "db6cec6116f90e321da860206a1a25486e977150",
      "parents": [
        "79a1d170b7bcf803f606f81fdc93d15bbc64fb99"
      ],
      "author": {
        "name": "Meng Wang",
        "email": "mengw15@uci.edu",
        "time": "Mon May 25 16:52:36 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 25 23:52:36 2026 +0000"
      },
      "message": "fix(pyamber): allow worker state to transit READY -\u003e COMPLETED (#5214)\n\n### What changes were proposed in this PR?\n\nA Python UDF worker whose upstream produces zero tuples receives an\n`EndChannel` marker before any data, so it never visits `RUNNING`. When\n`_process_end_channel` calls `complete()`, the state machine in\n`Context` rejected `READY → COMPLETED` and the worker died with\n`InvalidTransitionException`, leaving the downstream operator stuck and\nthe workflow hung.\n\nThe Scala-side `WorkerStateManager` already lists `COMPLETED` in\n`READY`\u0027s allowed targets — this is a Python ↔ Scala parity drift. Add\n`WorkerState.COMPLETED` to the Python `READY` set.\n\nAlso lift the state-transition graph out of `Context.__init__` into a\nmodule-level `WORKER_STATE_TRANSITIONS` constant so the test fixture can\nimport it (single source of truth — the previous fixture independently\nduplicated the graph, which is what masked the parity gap from existing\ntests).\n\n### Any related issues, documentation, discussions?\n\nCloses #5197.\n\n### How was this PR tested?\n\nAdded a regression test in `test_state_manager.py` covering `READY →\nCOMPLETED`. Also manually verified the issue\u0027s reproducer workflow now\ncompletes; previously hung with the worker stuck in `READY`.\n\n### Was this PR authored or co-authored using generative AI tooling?\n\nGenerated-by: Claude Code (claude-opus-4-7)"
    },
    {
      "commit": "79a1d170b7bcf803f606f81fdc93d15bbc64fb99",
      "tree": "69a16fba0ab53f046e5619fd2f3fb2d7d749523f",
      "parents": [
        "9b850e2ed8927a28cf4842d8534d4cb3f0ab01b7"
      ],
      "author": {
        "name": "Yicong Huang",
        "email": "17627829+Yicong-Huang@users.noreply.github.com",
        "time": "Mon May 25 16:27:30 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 25 23:27:30 2026 +0000"
      },
      "message": "test(amber): cover WorkflowExecutionsResource static helpers (#5205)\n\n### What changes were proposed in this PR?\n\nExtends `WorkflowExecutionsResourceSpec` to cover the companion-object\nhelpers that the JAX-RS endpoints lean on. The existing spec covered two\nof them; this PR adds cases for status-filtered execution listing,\nlatest-execution lookup by `(wid, cuid)`, the expired-execution scan,\n`insertOperatorExecutions`, `updateRuntimeStatsUri` (including the\nno-match branch), the per-eid URI fetchers\n(`getResultUrisByExecutionId`, `getConsoleMessagesUriByExecutionId`,\n`getRuntimeStatsUriByExecutionId`) with their null/empty filtering,\n`deleteConsoleMessageAndExecutionResultUris`, the DB-delete branch of\n`removeAllExecutionFiles`, `updateResultSize`, the VFS-decoding logic in\n`getResultUriByLogicalPortId`, and the private BFS-based\n`getNonDownloadableOperatorMap` (via `PrivateMethodTester`).\n\nCleanup is extended to `OPERATOR_PORT_EXECUTIONS`,\n`OPERATOR_EXECUTIONS`, `DATASET`, and `WORKFLOW_COMPUTING_UNIT` so\nseeded rows don\u0027t leak between cases.\n\nNo production code is touched.\n\n### Any related issues, documentation, discussions?\n\nCloses #5204.\n\n### How was this PR tested?\n\nAdded unit tests for the helpers listed above.\n\n### Was this PR authored or co-authored using generative AI tooling?\n\nGenerated-by: Claude Opus 4.7\n\nCo-authored-by: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "9b850e2ed8927a28cf4842d8534d4cb3f0ab01b7",
      "tree": "1b744afaa01a8eade1f8e537154a0b68084eeacd",
      "parents": [
        "767219abe30851cd5754dd10b93d467c9c90e4ec"
      ],
      "author": {
        "name": "Yicong Huang",
        "email": "17627829+Yicong-Huang@users.noreply.github.com",
        "time": "Mon May 25 15:49:33 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 25 22:49:33 2026 +0000"
      },
      "message": "ci: enable Codecov Test Analytics across all test jobs (#5207)\n\n### What changes were proposed in this PR?\n\nEnable Codecov Test Analytics for every stack we already upload coverage\nfrom. Each stack now emits JUnit-XML alongside its existing coverage\nreport, and a second `codecov/codecov-action` step per job uploads it\nwith `report_type: test_results`.\n\n- ScalaTest: `ThisBuild / Test / testOptions +\u003d -u target/test-reports`\nin the root `build.sbt`.\n- Vitest unit + browser configs: `reporters: [\"default\", [\"junit\", {\noutputFile: ... }]]`.\n- pytest (`python` job + `amber-integration` Python step):\n`--junit-xml\u003d...`.\n- `bun test` (`agent-service`): `--reporter\u003djunit\n--reporter-outfile\u003djunit.xml`.\n\nTest Analytics ingestion is independent of coverage and shares the same\n`CODECOV_TOKEN`. Once landed, Codecov will start posting failing-test\nstack traces on PRs, flagging tests that have gone flaky on `main`, and\ntracking per-test runtime / failure-rate over time.\n\n### Any related issues, documentation, discussions?\n\nCloses #5206.\n\n### How was this PR tested?\n\nRan `sbt scalafmtCheckAll` and `prettier --check` on the two modified\n`vitest.*.config.ts` files locally; both pass.\n\n### Was this PR authored or co-authored using generative AI tooling?\n\nGenerated-by: Claude Opus 4.7"
    },
    {
      "commit": "767219abe30851cd5754dd10b93d467c9c90e4ec",
      "tree": "3dcfbb8131ad32fb8948088675e29ae2184cd17a",
      "parents": [
        "2153c17879ca4504da09d4d7dc9648d17f364aa0"
      ],
      "author": {
        "name": "Yicong Huang",
        "email": "17627829+Yicong-Huang@users.noreply.github.com",
        "time": "Mon May 25 15:35:29 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 25 22:35:29 2026 +0000"
      },
      "message": "test(frontend): cover three dashboard services (#5203)\n\n### What changes were proposed in this PR?\n\nAdds `HttpClientTestingModule`-based specs for three dashboard services\nthat previously had no (or near-empty) tests:\n\n- `dataset.service.ts` — pins the URL, HTTP method, body / query string,\nand response mapping for every public method, including the\nauthenticated / anonymous endpoint splits, the presigned-URL chain on\n`retrieveDatasetVersionSingleFile`, and the file-node attaching that\n`createDatasetVersion` / `retrieveDatasetLatestVersion` perform.\n- `workflow-version.service.ts` — replaces a 2-test stub with coverage\nof the readonly-display lifecycle (snapshot, swap, restore), joint-paper\nhighlight helpers, the forward-diff classification in\n`getWorkflowsDifference` / `getOperatorsDifference`, and the three\nversion-API HTTP endpoints.\n- `search.service.ts` — covers the authenticated vs public search\nrouting (with the forced `includePublic\u003dtrue` on the anonymous path),\nthe dataset `hasMismatch` filtering inside `executeSearch`, and the\nbranchy enrich pipeline in `extendSearchResultsWithHubActivityInfo`\n(Workflow / Project / Dataset entity routing, activity-list narrowing,\nand the workflow-only size-lookup gating).\n\nNo production code is touched.\n\n### Any related issues, documentation, discussions?\n\nCloses #5202.\n\n### How was this PR tested?\n\nAdded unit tests for the three services listed above.\n\n### Was this PR authored or co-authored using generative AI tooling?\n\nGenerated-by: Claude Opus 4.7\n\nCo-authored-by: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "2153c17879ca4504da09d4d7dc9648d17f364aa0",
      "tree": "dab30defe45b1f746fa4b3eacc2c4d2a8d6032e0",
      "parents": [
        "c435aa73434f64fbffe82d5242ded17b56952aab"
      ],
      "author": {
        "name": "Yicong Huang",
        "email": "17627829+Yicong-Huang@users.noreply.github.com",
        "time": "Mon May 25 15:35:02 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 25 22:35:02 2026 +0000"
      },
      "message": "test(frontend): cover joint-ui.service surface and remove dead code (#5196)\n\n### What changes were proposed in this PR?\n\n`joint-ui.service.spec.ts` had ~60 commented test lines plus an\n`it.todo` placeholder; the commented tests called methods that have\nsince been removed from `JointUIService`, so they\u0027re unrevivable. Drop\nthem and add real tests for the public surface the spec was leaving\nunverified — static helpers, the joint-paper-bound\nstate/color/visibility setters, the port-iteration loops,\n`getJointOperatorElement`, and `changeOperatorStatistics`.\n\nWriting those tests made four pieces of stale `joint-ui.service.ts`\nitself obvious: a static tooltip-style helper with zero callers (its\npaired element was removed years ago), two dead `originalName` chains\ninside `changeOperatorStatistics` (computed, never read), and a `if\n(!element) return` guard at the very end of `unfoldOperatorDetails`\n(no-op — nothing follows it). Removed.\n\n### Any related issues, documentation, discussions?\n\nCloses #5195. Same shape as #5194.\n\n### How was this PR tested?\n\n`yarn ng test --watch\u003dfalse --include\u003d…` runs 56 tests, all green. `yarn\nlint` and `yarn format:ci` both clean.\n\n### Was this PR authored or co-authored using generative AI tooling?\n\nGenerated-by: Claude Opus 4.7"
    },
    {
      "commit": "c435aa73434f64fbffe82d5242ded17b56952aab",
      "tree": "f4c8a576f631b3fbdbe383b509b84da306c8906b",
      "parents": [
        "8633188757e255f29cf43a9122aaef4dc7b8085a"
      ],
      "author": {
        "name": "Asish Kumar",
        "email": "87874775+officialasishkumar@users.noreply.github.com",
        "time": "Mon May 25 11:42:30 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 25 06:12:30 2026 +0000"
      },
      "message": "fix(workflow-operator): default boolean metadata fields (#5177)\n\n### What changes were proposed in this PR?\n\nSome operator boolean properties initialized to `false` did not declare\na JSON-schema default value, so the frontend form could render them as\nneutral checkboxes instead of unchecked checkboxes.\n\nThis PR adds explicit `defaultValue \u003d \"false\"` metadata for:\n\n- `FilledAreaPlotOpDesc.facetColumn`\n- `DumbbellPlotOpDesc.showLegends`\n- `JSONLScanSourceOpDesc.flatten`\n\nIt also adds a focused metadata-generation spec that asserts these\nboolean schemas include a `false` default.\n\n### Any related issues, documentation, discussions?\n\nCloses #4015.\n\n### How was this PR tested?\n\nValidated locally with a temporary Postgres container loaded with the\nsame DDL files used by CI for JOOQ generation.\n\n```\nJAVA_HOME\u003d/usr/lib/jvm/java-17-openjdk-amd64 COURSIER_CACHE\u003d/tmp/texera-coursier-cache /usr/lib/jvm/java-17-openjdk-amd64/bin/java -Dsbt.ivy.home\u003d/tmp/texera-ivy-cache -Dsbt.boot.directory\u003d/tmp/texera-sbt-boot -Dsbt.global.base\u003d/tmp/texera-sbt-global -jar /tmp/sbt-launch-1.12.9.jar \"WorkflowOperator/testOnly org.apache.texera.amber.operator.metadata.OperatorBooleanDefaultSpec\"\n```\n\nResult: 2 passed.\n\n```\nJAVA_HOME\u003d/usr/lib/jvm/java-17-openjdk-amd64 COURSIER_CACHE\u003d/tmp/texera-coursier-cache /usr/lib/jvm/java-17-openjdk-amd64/bin/java -Dsbt.ivy.home\u003d/tmp/texera-ivy-cache -Dsbt.boot.directory\u003d/tmp/texera-sbt-boot -Dsbt.global.base\u003d/tmp/texera-sbt-global -jar /tmp/sbt-launch-1.12.9.jar scalafmtCheckAll\n```\n\nResult: passed.\n\n### Was this PR authored or co-authored using generative AI tooling?\n\nGenerated-by: OpenAI Codex (GPT-5)"
    }
  ],
  "next": "8633188757e255f29cf43a9122aaef4dc7b8085a"
}
