Skip to content

Release 14.0.83 (CI gate - do not merge) - #5146

Merged
simlarsen merged 87 commits into
releasefrom
release-14.0.83
Oct 21, 2026
Merged

simlarsen merged 87 commits into
releasefrom
release-14.0.83

Conversation

@simlarsen

@simlarsen simlarsen commented Oct 21, 2026 •

Copy link
Copy Markdown
Contributor

Do not merge this PR. It is the CI gate for release 14.0.83. Its checks run on exactly the tree the release merge will build: this PR's merge ref is release plus the 14.0.83 bump. They run in a concurrency group that master pushes can't cancel. The release merge is pushed straight to release once these checks are green (14.0.82 published at 12:54Z). GitHub then marks this PR merged.

  • Bump: chore: bump version to 14.0.83 (f478584). It changes only VERSION and the package.json / package-lock.json files the hook keeps in step, the same 55 files as every bump.
  • Base: master at ab82c77 (Session Replay: the list's header works and looks like every table's, and so do 14 more lists #5135) plus four master fixes, cherry-picked (below). This PR merges into release (22f0124, the 14.0.82 release merge) to exactly the bump's tree (df6d9f07b1). Anything merged after ab82c77 ships in 14.0.84.
  • Recut: this is the third cut, on the same base. The first (1f8e7f7) finished with 68 checks passing and two failing, both tests only; the second (38154c9) carried those two fixes and found two things outside the tests, both fixed on master and cherry-picked here, plus an App Test job whose ClickHouse service image could not be pulled (mirror.gcr.io answered 'Quota exceeded' - infrastructure, no test ran). Each fix, its master commit and its commit here:
    • App Test (3/3): IntroductionDocsFacts and RulesSmtpFormsDocsFacts read the '/' search shortcut and the rule that picks a table's main button from BaseModelTable.tsx, where Session Replay: the list's header works and looks like every table's, and so do 14 more lists #5135 had moved them into the shared table header (TableHeaderControls.tsx). What the docs say still holds; the tests now read the new file (955e73d, here eb8c9ac).
    • Dashboard Offline UI (5): a Security Operations browser test went from Unassigned to Assigned to Me - both two cases, so the same footer - and read the rows while the new table loaded. It now waits for that page's own rows (f20a1fb, here 43852a5).
    • MobileApp Test's expo-doctor: Expo published expo 57.0.31 on 2026-10-21 at 14:28 UTC, and the job checks the lockfile against Expo's live SDK 57 versions. The mobile app takes it (expo install --fix after npm ci; expo-doctor 21/21, its unit tests and its 76 browser tests pass) (3b51e38, here 780beda).
    • Dashboard Offline UI (5) ran past the job's 30 minutes (every suite that ran passed; the job was cancelled in Code): Security Operations, Code and Public Addresses moved to group 8, the lightest (d962824, here 7b4cb11).
  • Ships since 14.0.82:
    • Twilio SMS Phone Numbers name no country: global help, example list and docs #5133: The Twilio SMS Phone Numbers field (a project's Twilio config and the Admin Dashboard's Call and SMS settings) no longer names one country: its help reads 'Numbers to send SMS from if yours can only make calls. Each SMS uses the one in the recipient's country, or the first.' in every language, its placeholder and list errors use one neutral example, and the Twilio docs explain the case in general terms in 17 languages. The Admin Dashboard's '(Optional)' marker is translated in every language.
    • feat(security): side-menu sections and a page for every tab and view #5134: Security Events has no tabs: the side menu has six sections (Overview, Security Cases, Events, Detections, Playbooks, Connections), and every former tab is its own page with its own address, breadcrumb and Search entry. Security Cases: Open Cases, Assigned to Me, Unassigned (with each case's team), Closed Cases and All Cases; Playbooks: Playbooks, Waiting for Approval and Playbook Runs. Every Security list uses the table's own header.
    • Security events page: present SIEM + SOAR as shipped; BYO LLM off the Free plan #5144: The website's /product/security-events page covers what ships (the eight managed connectors, the 40-rule library, Security Cases and Playbooks), and the pricing table no longer ticks Bring Your Own LLM on the Free plan (Growth and up, as the product enforces).
    • feat(cloud): connect AWS, Azure and Google Cloud in a few clicks, and see their resources #5136: Cloud > Connect: connect an AWS account, an Azure subscription or a Google Cloud project from a tile - one read-only setup command in the cloud's own shell, paste what it prints, and the form tests the connection. OneUptime reads CloudWatch, Azure Monitor and Cloud Monitoring on a schedule and writes the metrics into the regular ingest, so resources appear under Cloud > All Resources and work with monitors, pipelines and retention; a resource also sent by your own collector stays one resource. Credentials are encrypted and never shown again.
    • Website: a page for air-gapped installs (/enterprise/air-gapped), and every Helm pod takes imagePullSecrets #5143: The website has a page for air-gapped installs at /enterprise/air-gapped (with an install values.yaml the Helm chart's own tests render, every connection out of your network and what to use instead, AI on a model you run), and every pod of the Helm chart now takes the chart's imagePullSecrets.
    • Session Replay: the list's header works and looks like every table's, and so do 14 more lists #5135: The Session Replay list's header is the same as every other table's (Search, time range, a ... with Sort, Refresh and Filter; chips OS and Trigger), and every table draws its header from one shared set of controls: fourteen hand-built lists, the status timelines and table cards moved their loose Refresh and Filter icons into the ... menu; a table's search no longer grows when you type, and the header's time range no longer opens off-screen.
    • Master fix dd307a9: the remediation rules browser suite presses Create/Edit again until its dialog opens (test only).
    • Master fixes 955e73d, f20a1fb (tests), 3b51e38 (the mobile app's Expo patch release) and d962824 (App Test's browser groups); see Recut.
  • Upgrade notes:
  • Migrations: 1805400000000-AddCloudConnection and 1805450000000-AddCloudResourceCloudConnectionIndexAndKey (feat(cloud): connect AWS, Azure and Google Cloud in a few clicks, and see their resources #5136).
  • CodeQL: 6 alerts not on release (Mob app monitors #2359-chore: npm audit fix #2364), all js/missing-rate-limiting on Cloud Connect's three routes (/test, /:connectionId/read-now, /aws-role-setup), which only a signed-in project owner or admin can call - the class release already carries about 490 of; /test is a connection check like the LLM provider and MCP server tests (TestSendRoutesAskTheRule). A follow-up adds one per-project throttle for every such check.
  • Checks: green on this cut (f478584): 70 passed, 1 skipped; CodeQL is red only on the six alerts above, which release lacks and this PR accepts. Released as 7f3dbe7 at 19:10Z; the bump is merged into master as a7c48d4 (versions only; master's own App Test workflow file kept).

🤖 Generated with Claude Code

valeriamustafaeva and others added 30 commits October 21, 2026 06:57
…grations, connectors, read loop

Cloud connections read a cloud account the way an OpenTelemetry Collector's
cloud receivers would, with nothing to run: read-only access the customer
creates with one command, an hourly inventory (Azure) or a sweep of where
resources report (AWS, Google Cloud), and the key metrics of each resource
through the metrics ingest in the receivers' own shape, so resources land
under Cloud > All Resources with their metrics.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Security Events carried its pages as tabs across the top of the page
(Events, Entities, Correlate; Detection Rules, Rule Library, Threat Intel,
ATT&CK Coverage; Playbooks, Playbook Runs; Connections, Setup Guide), and
the case queue and the runs page switched views with buttons along their
tops. The side menu is now six sections - Overview, Security Cases,
Events, Detections, Playbooks, Connections - and every tab and view is a
page of its own in its section:

- Security Cases: Open Cases, Assigned to Me, Unassigned, Closed Cases and
  All Cases, each a list fitted to its question (Closed Cases by verdict
  and when it closed; no Assignee column on Assigned to Me; an open list's
  Status filter offers only open statuses), with counts beside Open Cases
  and Assigned to Me and an empty state that says what empty means.
- Playbooks: Playbooks, Waiting for Approval (counted) and Playbook Runs.
- Detections and Connections fold until opened; each opens on its pages.

The queue and runs pages keep their old addresses on what they opened on
(cases = Open Cases, playbook-runs = Waiting for Approval); the other pages
sit one level down. The Overview's counts open the exact page they count,
breadcrumbs name the section and the page as the menu does, and Search
finds every page under its section.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… the connector tests

The Connect page offers AWS, Azure and Google Cloud as tiles; each opens a
guided form: run one command in the cloud's own browser terminal, paste
what it printed, test, connect. Connected accounts are listed with their
status and their resources by service. Tests cover the catalog, the paste
reader, the setup commands, costs, key metrics, each cloud's connector
against a fake API, the service and the read loop.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…mple and the docs are global

The help under Twilio SMS Phone Numbers - on a project's Twilio config and
on the Admin Dashboard's Call and SMS settings - read "Numbers to send SMS
from if yours can't (Singapore's national ones are voice-only)", with a
Singapore mobile number as the field's example. The maintainer: "Please
remove the Singapore warning or Singapore text from this. We need to make
the product global."

Everywhere a reader meets the list it now says when it is needed without
naming a country, and its example is no one country's numbers:

- the help: "Numbers to send SMS from if yours can only make calls. Each
  SMS uses the one in the recipient's country, or the first." (118
  characters, was 147), renamed in place in all 17 Dashboard and 17 Admin
  Dashboard locales, each with its translation (the Admin's Spanish keeps
  usted);
- the empty field's example, on both forms: PHONE_NUMBER_LIST_EXAMPLE,
  "+14155550123, +447700900123" - two numbers in two countries, both from
  ranges kept for fiction, the list the error below the field gives;
- the error that refuses a list: the server's example instead of
  +6581234567, and the forms' key takes it as {{example}}, so no locale
  repeats numbers;
- the API's description of ProjectCallSMSConfig.twilioSmsPhoneNumbers: as
  GlobalConfig's already said it, and the example list;
- the docs page self-hosted/twilio-integration in all 17 languages: the
  voice-only case and what to do explained in general terms, and the
  Singapore-only note (SGNIC, Likely-SCAM) now says that some countries ask
  senders to register, linking Twilio's SMS guidelines for every country.

The number-purchase country picker and the time zone lists keep
Singapore: there it is one country among all the others.

Tests: TwilioSmsNumbersNameNoCountry (App) holds every surface - help,
examples, error, API description, test-send copy, the refused-SMS hint -
in all 34 locales; InstallIntegrationsDocsFacts holds the docs page in all
17 languages; TwilioPhoneNumbers, PhoneNumberListError,
TwilioConfigSmsNumbers and AdminSettingsFormsOnePage pin the example, the
rendered placeholder and the new words.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s list

- Breadcrumbs: each crumb opens what it names - Security Events the
  Overview (where the Products menu opens it), a section its first page
  (Playbooks the playbooks, not the runs that share their address).
- Correlate gets a connected-points icon everywhere: Graph drew the same
  bars as the Overview's ChartBar.
- Common tests: the side menu (sections, entries, folds, the lit entry on
  all 18 pages, icons drawn differently, the three counts and their
  queries, the phone summary); every address through the real route
  table (the old ones included, a case id never taken for a page, a page
  drawn afresh between case pages); breadcrumbs on every page; each case
  page's query, columns, filters, sort, create button, bulk actions and
  empty state through the production table; the runs pages; the
  Overview's counts opening their pages.
- Guards: Security Cases, Events and Playbooks are everyday sections.
- The offline Security Operations suite walks the menu, the case and run
  pages, the old addresses and the counts, and shoots them at 1280 and
  390 in both themes; the empty-states fixture stubs the new pages.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Security Events pages table lists the menu as it now draws: the
Security Cases section with Open Cases, Assigned to Me, Unassigned,
Closed Cases and All Cases, and Waiting for Approval beside Playbook
Runs. The cases and getting-started pages name the pages where they
used to name tabs. All 17 languages change line for line with the
English, each drawing the labels its Dashboard draws, and the docs
facts suites hold the table to the menu.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ment for both placeholders

The Korean docs line that tells what to do with a number that can only
make calls now says "your number" (보유한 번호로), as the Korean help under
the field does. The two forms' placeholder comments read the same.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The library's category filter was a row of eight buttons - All,
Recommended, Identity, Endpoint, Cloud, Network, Web, Kubernetes - lit
like tabs across the card, the one row of tabs left in the product. It
is now one select beside Search rules, the way the template pickers
narrow theirs: All categories, Recommended, then each category. On a
phone the two stack, each the card's width.

"All categories" and the select's label, "Rule categories", are in all
16 languages. The page test and the offline browser suite pick from
the select, hold that no button sits in the filter row, and measure the
row at 1280 (light and dark) and 390. The offline suite's polls take
block bodies, as the lint rules ask.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The list's toolbar had controls of every size: a tall sort select with a
clear x, a small time chip, a text Advanced filters button, a lone refresh
icon and a Search help link. Its header is now the one every table has:
the Search... / pill that opens into the search bar, the time range at the
header's height, and a ⋯ holding the sort order (ticked choices, as a
feed's), Filter and Refresh. The chips sit in the shared Filter row.

The pieces come from shared modules every table now draws with:
Table/TableHeaderControls (search slot, main button and ⋯ split, the /
shortcut), which BaseModelTable now uses too, and ResourceOwners/
FacetFilterBar, which useResourceOwners now uses too.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Formatting only, as prettier writes it, for the route map, the Playbook
Runs page, the empty-states fixture and the new pages' tests. The
empty-states suite's Setup Guide test is named for the page it opens,
which is no longer a tab.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e shared header controls

- SessionReplaySearchBar: chips are never written into the box, a typed
  chip token narrows at once and moves into its chip on Enter, deleting it
  gives the chip back, syntax help and hints drop down while focused,
  Escape and the clear button, folding.
- SessionReplayTable: the toolbar header (search, time range, ⋯ at one
  height), the ⋯'s sort / Filter / Refresh, the folded search and /, Clear
  all, the applied filters box, Show ID on every row.
- Users page header; facets row; grammar helpers and help rows (App);
  TableHeaderControls; the time picker's Header size.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ler, sync and migration tests

Counts are plurals in the reader's language, numbers are written their way,
and the catalog's access note is extracted with the rest of its words.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…header's ⋯

Fourteen more lists drew loose header icons - a refresh icon, and on some
a filter funnel - with no border, a size smaller than their neighbours,
nudged into place with a hand-tuned class: the infrastructure resource
tables, a host's processes, services and systemd units, Docker and
Podman containers, Ceph daemons and cluster log, Kubernetes events, the
two Kubernetes cost pages and right-sizing, on-call readiness, the state
timeline cards, and the session list's two Session Replay siblings
(Replay Users, User Flows). They now hand their buttons through
getTableHeaderButtons - the main button in sight, the rest in the ⋯, the
toolbar header - as every model table does. User Flows and Replay Users
keep their time range in the header at the header's height.

TableHeaderButtonsGuard holds every list built on Common's Table to the
shared header, bans the nudge class anywhere, and keeps an icon-only
Refresh out of a card header on its own.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… card

Both tables were wider than their card at 1280 (the session list still at
1600): every column kept the table's 10rem floor, and lines that never
wrap - a device, the session's id and start with its absolute date from
2xl - set the width, so Recording and Signals went under the sticky
Actions column. The short columns now take a 7rem floor and the Session
column 8rem; the Session and person cells are one-column grids whose
lines end in an ellipsis instead of widening the table, and a session's
id and start wrap as whole pieces where the column is narrow. Both now
fit at 1280, 1440 and 1600.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e shared example list

ProjectCallSMSConfig.twilioSmsPhoneNumbers wrote the example list as its own
literal. It now reads PHONE_NUMBER_LIST_EXAMPLE, the list both forms show in
the empty field and the error that refuses a list gives, so the four can
never drift apart.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- The routes test's mocks cast jest.requireActual to the module's type,
  as Common's other tests do; compile-tests read it as unknown.
- The offline suite's open() takes theme: undefined for light, so the
  loops over both themes compile with exactOptionalPropertyTypes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e settings; worker, ingest and Dashboard tests

A page per cloud's one command, what OneUptime reads and what it costs,
held to the code by CloudConnectDocsFacts. Cloud Resources points to it.
cloudConnect.aws in the chart (and CLOUD_CONNECT_AWS_* in config.env) give
a self-hosted OneUptime the AWS identity that signs in to customers' roles.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The / key hint inherited a 15px line for its 10px text and stood 21px
tall, so every table's search drew 39px beside its 38px buttons. The hint
is one shared class now, on a 12px line, and the ModelTable's opened
search takes the header's control height (42px on a phone, 38px from md).

In the dark theme a focused search's gray-400 border had no rule of its
own and kept its light colour; it now draws the strong border the hover
rule draws. A scan holds every class of a table's header to Theme.css.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ListHeader.spec.ts drives the offline fixture at 1280 and 390, light and
dark: the header is three controls of one height (38px, 42px on a phone)
with the shared gaps, the chips row ends in Clear all, the ⋯ holds Sort,
Filter and Refresh, the search opens in place and Escape folds it, a chip
token moves into its chip on Enter, and the list and Replay Users tables
fit their cards at 1280, 1440 and 1600.

The fixture specs and the real-stack helper sort from the ⋯ and focus the
search before typing, as a person does.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The page names the list's header as it now draws: the Search… field that
/ opens and that lists its tokens while empty, the chip tokens that move
into their chips on Enter, Sort, Filter and Refresh in the ⋯, Clear all at
the end of the chips row, and Show ID in a row's ⋯. The Users button and
Advanced filters are gone. All 16 translations name each label as their
Dashboard draws it, and RumReplayDocsFacts holds the page to the code.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The search syntax rows, the Enter hint and the ignored-user-filter warning
are new keys; every Dashboard language translates them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…idth, dark and Japanese; dark theme guard; formatting

The offline suite (packages/E2E/CloudConnect, npm run test-cloud-connect-ui)
renders the real page against an in-page API: the tiles, a cloud connected
from its tile with its command, one paste and a test, an AWS role or an
access key, the list's status and actions. It runs in the UI regressions'
group 8. Each tile's Connect now sits on one line.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Admin Dashboard's Call and SMS form folds its two optional numbers -
Twilio SMS Phone Numbers and Twilio Secondary Phone Numbers - under More
fields, and in every language but English the titles were translated while
the marker after them was not: 'Twilio SMS 電話番号 (Optional)'. FieldLabel
looks the marker up by its English text in the app's own locale, and only
the Dashboard's (and Accounts') locales had the entry.

Each of the 17 Admin locales now words '(Optional)' as the same language's
Dashboard locale does, next to 'More fields'. Every optional field of an
Admin form gains it.

Tests: App AdminOptionalLabelLocales holds the entry in all 17 languages to
the Dashboard's, and to the key FieldLabel reads; Common
AdminSettingsFormsOnePage renders the Call and SMS form in Japanese and
reads '(任意)' after both titles, the Japanese help and the example list.
Both fail with the Japanese entry taken out.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Twilio SMS Phone Numbers name no country: global help, example list and docs
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
valeriamustafaeva and others added 13 commits October 21, 2026 12:09
…ad runs

A locked action gives up the row's button to the first usable one, so a read in progress handed its place to Test and the next tap could open a test. View error and Read now are the row's button by placement: View error while the connection fails, else Read now, locked with 'Reading now...' while its read runs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Security events page: present SIEM + SOAR as shipped; BYO LLM off the Free plan
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…oks reach private addresses, and reads cleaner

UI review of the air-gapped page (/enterprise/air-gapped):

- Step 3 and its values.yaml now let probes and webhooks reach private
  addresses (probes.one.allowPrivateNetworkMonitors, webhooks.allowPrivateNetwork).
  On a network with no route out every website a monitor checks and every
  tool a webhook posts to is on a private address, and both are refused by
  default - the four steps left an install whose Website and API monitors,
  webhooks and Mattermost posts were all refused. The chart's air-gapped
  suite renders the new values and checks both switches (and that a stock
  install refuses both).
- The hero's picture draws the probes and datastores inside OneUptime and the
  customer's own registry, mail server, identity provider and AI model beside
  it ("Uses your own"); two columns on a phone instead of eight stacked rows.
- Connections out: two tables, "On by default" and "Only once you set them
  up", instead of badges on one table; settings, values and addresses drawn
  as code (backticks in Utils/AirGapped.ts, kept as code in the .md variant,
  dropped for the FAQ's structured data).
- values.yaml and the AI env block colour each value apart from its key, in
  monospace: the site's * { font-family } rule had drawn spans inside code
  (and the signing key's fingerprint) in the sans-serif font.
- Steps: settings chips first, then the fingerprint; no code chip for the
  offline license token; a long setting wraps instead of running off a 320px
  phone. The upgrades note no longer reads "Upgrades. Upgrades work...".
- The sticky section bar carries "Plan your install" from a tablet up; a
  section the bar jumps to starts right under it.
- Shorter hero paragraph, a clearer link label (SMTP), no "When: When..." on
  phones, and a readable "What we cover" label on the dark section.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… bar slides over the menus

- The phone menu's link grid gains Enterprise and Air-Gapped, in pairs
  (Enterprise beside Request Demo, Air-Gapped beside Self-Hosted), so the
  Enterprise menu's pages are there on a phone too and the two columns stay
  even.
- The air-gapped and self-hosted pages' sticky section bars sit at z-10, under
  the site's menus (z-20). A phone's menu is taller than the screen, and
  scrolling down to its links slid the bar (same z-index, later in the page)
  over them.
- "air-gapped" on the Enterprise overview's data residency card no longer
  breaks at its hyphen.

Tests: the phone menu's pairs and even count, and both bars under all three
menus (mutation-checked: each break is caught).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
feat(cloud): connect AWS, Azure and Google Cloud in a few clicks, and see their resources
Locale conflicts resolved with npm run i18n:extract (both sides' keys kept).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Website: a page for air-gapped installs (/enterprise/air-gapped), and every Helm pod takes imagePullSecrets
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Session Replay: the list's header works and looks like every table's, and so do 14 more lists
@simlarsen

simlarsen commented Oct 21, 2026 •

Copy link
Copy Markdown
Contributor Author

✅ Snyk checks have passed. No issues have been found so far.

Status Scan Engine Critical High Medium Low Total (0)
✅ Open Source Security 0 0 0 0 0 issues

💻 Catch issues earlier using the plugins for VS Code, JetBrains IDEs, Visual Studio, and Eclipse.

simlarsen pushed a commit that referenced this pull request Oct 21, 2026
…table header

App Test (3/3) failed on master after #5135 (and on the 14.0.83 gate #5146):
IntroductionDocsFacts looked for the "/" search shortcut in BaseModelTable.tsx,
and RulesSmtpFormsDocsFacts for the rule that picks a table's main button there.
#5135 moved both into the shared table header,
Common/UI/Components/Table/TableHeaderControls.tsx: useTableHeaderSearchShortcut
and splitTableHeaderButtons, which BaseModelTable calls. What the docs say is
unchanged - / opens a list's search unless you are typing (now also not in an
editable region), and an outlined button such as Export JSON or Import JSON never
takes the header's button, so it sits in the More options menu.

Both facts now read TableHeaderControls.tsx and check that BaseModelTable uses it.
Dropping the Alt check from the shortcut, or letting an outlined button be the
main one, fails each test; the 29 App suites that read BaseModelTable pass.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
simlarsen pushed a commit that referenced this pull request Oct 21, 2026
Dashboard Offline UI (5) failed on the 14.0.83 gate #5146: SecurityOperations'
"each case page lists what its name says, from the side menu" went from
Unassigned to Assigned to Me, waited for 'Showing 1-2 of 2 security cases' and
read the rows - but Unassigned holds two cases as well, so that footer was still
the last page's, and the rows were read while the new page's table loaded (empty).

It now waits until the rows themselves show CASE-142. The test passes 5 of 5 and
the suite 39 of 39 locally; a race under a busy runner, not a product change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
simlarsen pushed a commit that referenced this pull request Oct 21, 2026
…table header

App Test (3/3) failed on master after #5135 (and on the 14.0.83 gate #5146):
IntroductionDocsFacts looked for the "/" search shortcut in BaseModelTable.tsx,
and RulesSmtpFormsDocsFacts for the rule that picks a table's main button there.
#5135 moved both into the shared table header,
Common/UI/Components/Table/TableHeaderControls.tsx: useTableHeaderSearchShortcut
and splitTableHeaderButtons, which BaseModelTable calls. What the docs say is
unchanged - / opens a list's search unless you are typing (now also not in an
editable region), and an outlined button such as Export JSON or Import JSON never
takes the header's button, so it sits in the More options menu.

Both facts now read TableHeaderControls.tsx and check that BaseModelTable uses it.
Dropping the Alt check from the shortcut, or letting an outlined button be the
main one, fails each test; the 29 App suites that read BaseModelTable pass.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
simlarsen pushed a commit that referenced this pull request Oct 21, 2026
Dashboard Offline UI (5) failed on the 14.0.83 gate #5146: SecurityOperations'
"each case page lists what its name says, from the side menu" went from
Unassigned to Assigned to Me, waited for 'Showing 1-2 of 2 security cases' and
read the rows - but Unassigned holds two cases as well, so that footer was still
the last page's, and the rows were read while the new page's table loaded (empty).

It now waits until the rows themselves show CASE-142. The test passes 5 of 5 and
the suite 39 of 39 locally; a race under a busy runner, not a product change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
simlarsen pushed a commit that referenced this pull request Oct 21, 2026
MobileApp Test's expo-doctor job failed on the 14.0.83 gate #5146 (and fails on
master with no code change): it checks the lockfile against Expo's live SDK 57
versions, and expo 57.0.31 was published 2026-10-21 14:28 UTC - 'expo expected
~57.0.31, found 57.0.30'.

npx expo install --fix after npm ci: expo 57.0.31 with its patch dependencies
(expo-modules-core 57.0.24, expo-modules-jsi 57.1.3, @expo/config-plugins 57.0.11,
which needs xcode 4.0.0, so uuid 11.1.1 is no longer used), postcss 8.5.31, and
@expo/cli 57.0.32 now nested under expo. From a clean npm ci of the new lockfile:
expo-doctor 21/21, npm test 418 suites (10777 tests), npm run test-ui 76 of 76.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

this.router.post(
`${basePath}/test`,
UserMiddleware.getUserMiddleware,
Comment on lines +69 to +147
async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
try {
const props: DatabaseCommonInteractionProps =
await CommonAPI.getDatabaseCommonInteractionProps(req);
const projectId: ObjectID =
CommonAPI.assertAuthenticatedProjectMember(props);
this.assertCanOperate(props);

const body: JSONObject =
req.body && typeof req.body === "object" && !Array.isArray(req.body)
? (req.body as JSONObject)
: {};

let settings: CloudConnectionSettings;

try {
settings = await this.readSettingsToTest({
body,
projectId,
props,
});
} catch (error) {
/*
* Settings the form could still fix (a role ARN of the wrong
* shape, a tenant that is not a GUID) are the test's answer,
* shown next to the field, not a failed request.
*/
if (!(error instanceof BadDataException)) {
throw error;
}

const result: CloudConnectionTestResult = {
provider: String(body["provider"] || ""),
status: "fail",
message: error.message,
failureKind:
"settings" as CloudConnectionTestResult["failureKind"],
durationMs: 0,
};

return Response.sendJsonObjectResponse(
req,
res,
result as unknown as JSONObject,
);
}

const result: CloudConnectionTestResult =
await CloudConnectorRegistry.getConnector(settings.provider)
.testConnection(settings, {
transport: DataSourceHttpFetch.fetch.bind(DataSourceHttpFetch),
})
.catch((error: unknown): CloudConnectionTestResult => {
// testConnection never throws; this is the belt to its braces.
const failure: LlmProviderError = LlmProviderError.from({
error,
step: "test",
providerTitle: settings.provider,
secretValues: getCloudSecretValues(settings),
});

return {
provider: settings.provider,
status: "fail",
message: failure.message,
failureKind: failure.kind,
durationMs: 0,
};
});

return Response.sendJsonObjectResponse(
req,
res,
result as unknown as JSONObject,
);
} catch (error) {
next(error);
}
},

this.router.post(
`${basePath}/:connectionId/read-now`,
UserMiddleware.getUserMiddleware,
Comment on lines +154 to +194
async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
try {
const props: DatabaseCommonInteractionProps =
await CommonAPI.getDatabaseCommonInteractionProps(req);
const projectId: ObjectID =
CommonAPI.assertAuthenticatedProjectMember(props);
this.assertCanOperate(props);

const connectionId: string | undefined = req.params["connectionId"];

if (!connectionId || !ObjectID.isValidUUID(connectionId)) {
throw new BadDataException("A valid connection ID is required.");
}

const connection: CloudConnection | null =
await this.service.findOneBy({
query: { _id: connectionId, projectId },
select: { _id: true, projectId: true, isEnabled: true },
props,
});
CommonAPI.assertResourceBelongsToProject({
resourceProjectId: connection?.projectId,
projectId,
});

if (!connection?.isEnabled) {
throw new BadDataException(
"This connection is turned off. Turn it on to read it.",
);
}

await CloudConnectionScheduler.enqueue(
new ObjectID(connectionId),
new Date(),
);

return Response.sendJsonObjectResponse(req, res, { queued: true });
} catch (error) {
next(error);
}
},

this.router.get(
`${basePath}/aws-role-setup`,
UserMiddleware.getUserMiddleware,
Comment on lines +201 to +223
async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
try {
const props: DatabaseCommonInteractionProps =
await CommonAPI.getDatabaseCommonInteractionProps(req);
const projectId: ObjectID =
CommonAPI.assertAuthenticatedProjectMember(props);
this.assertCanOperate(props);

const setup: CloudConnectionAwsRoleSetup =
await AwsServerIdentity.getRoleSetup({
projectId: projectId.toString(),
transport: DataSourceHttpFetch.fetch.bind(DataSourceHttpFetch),
});

return Response.sendJsonObjectResponse(
req,
res,
setup as unknown as JSONObject,
);
} catch (error) {
next(error);
}
},
simlarsen pushed a commit that referenced this pull request Oct 21, 2026
…group 8

Group 5 ran past the job's 30 minutes on the 14.0.83 gate #5146 (second cut):
its 16 suites took 29.5 minutes after setup - Security Operations had grown with
the Security pages (#5134) to about 3.5 minutes - and the job was cancelled in
Code, with Public Addresses never run. Every suite that ran passed.

Security Operations, Code and Public Addresses (about 10 minutes together, all
Chromium) move to group 8, the lightest (about 9 minutes): about 20 and 19
minutes for the two groups, near the 22 the groups are kept to. The upload step
already lists every suite's output, and Tests/Ops (E2ESuitesRunInCi and the
other workflow readers) pass.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
valeriamustafaeva and others added 5 commits October 21, 2026 16:35
…table header

App Test (3/3) failed on master after #5135 (and on the 14.0.83 gate #5146):
IntroductionDocsFacts looked for the "/" search shortcut in BaseModelTable.tsx,
and RulesSmtpFormsDocsFacts for the rule that picks a table's main button there.
#5135 moved both into the shared table header,
Common/UI/Components/Table/TableHeaderControls.tsx: useTableHeaderSearchShortcut
and splitTableHeaderButtons, which BaseModelTable calls. What the docs say is
unchanged - / opens a list's search unless you are typing (now also not in an
editable region), and an outlined button such as Export JSON or Import JSON never
takes the header's button, so it sits in the More options menu.

Both facts now read TableHeaderControls.tsx and check that BaseModelTable uses it.
Dropping the Alt check from the shortcut, or letting an outlined button be the
main one, fails each test; the 29 App suites that read BaseModelTable pass.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Dashboard Offline UI (5) failed on the 14.0.83 gate #5146: SecurityOperations'
"each case page lists what its name says, from the side menu" went from
Unassigned to Assigned to Me, waited for 'Showing 1-2 of 2 security cases' and
read the rows - but Unassigned holds two cases as well, so that footer was still
the last page's, and the rows were read while the new page's table loaded (empty).

It now waits until the rows themselves show CASE-142. The test passes 5 of 5 and
the suite 39 of 39 locally; a race under a busy runner, not a product change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MobileApp Test's expo-doctor job failed on the 14.0.83 gate #5146 (and fails on
master with no code change): it checks the lockfile against Expo's live SDK 57
versions, and expo 57.0.31 was published 2026-10-21 14:28 UTC - 'expo expected
~57.0.31, found 57.0.30'.

npx expo install --fix after npm ci: expo 57.0.31 with its patch dependencies
(expo-modules-core 57.0.24, expo-modules-jsi 57.1.3, @expo/config-plugins 57.0.11,
which needs xcode 4.0.0, so uuid 11.1.1 is no longer used), postcss 8.5.31, and
@expo/cli 57.0.32 now nested under expo. From a clean npm ci of the new lockfile:
expo-doctor 21/21, npm test 418 suites (10777 tests), npm run test-ui 76 of 76.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…group 8

Group 5 ran past the job's 30 minutes on the 14.0.83 gate #5146 (second cut):
its 16 suites took 29.5 minutes after setup - Security Operations had grown with
the Security pages (#5134) to about 3.5 minutes - and the job was cancelled in
Code, with Public Addresses never run. Every suite that ran passed.

Security Operations, Code and Public Addresses (about 10 minutes together, all
Chromium) move to group 8, the lightest (about 9 minutes): about 20 and 19
minutes for the two groups, near the 22 the groups are kept to. The upload step
already lists every suite's output, and Tests/Ops (E2ESuitesRunInCi and the
other workflow readers) pass.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@simlarsen
simlarsen merged commit 7f3dbe7 into release Oct 21, 2026
71 of 72 checks passed
@simlarsen
simlarsen deleted the release-14.0.83 branch October 21, 2026 19:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants