Skip to content

trunk-merge/pr-119223/232f83c1-5d1e-4bf0-8adc-8e3736e63f44 - #123590

Closed
trunk-io[bot] wants to merge 310 commits into
masterfrom
trunk-merge/pr-119223/232f83c1-5d1e-4bf0-8adc-8e3736e63f44
Closed

trunk-io[bot] wants to merge 310 commits into
masterfrom
trunk-merge/pr-119223/232f83c1-5d1e-4bf0-8adc-8e3736e63f44

Conversation

@trunk-io

@trunk-io trunk-io Bot commented Oct 26, 2026

Copy link
Copy Markdown
Trunk Merge Pull Request Banner

This pull request was created and is being managed by Trunk Merge.

This pull request is based on the master branch at SHA 22e6bddb84b22be24dd2631a9bbb6b1fe5edcc8e.

See more details here.

When CI completes, this pull request will be closed automatically.

Pull Requests Being Tested

This pull request is testing the changes from pull request 119223.

Dependencies

This pull request depends on the changes from pull requests 122674, 123578, 122787, 123356, 121616, and 123393.

pauldambra and others added 30 commits October 23, 2026 11:22
Generated-By: PostHog Desktop
Task-Id: fce9f1ec-a08a-41ee-ae3b-2ec268596156
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
A team whose query slots stay full past the limiter's retry budget got
a 429 with no wait hint, so API clients and the MCP server retried
blind. Every concurrency 429 now carries Retry-After and names the wait
in its message.
10 updated
Run: e2c0db41-90d7-468a-bb48-ee365e1f4f2a

Co-authored-by: Radu-Raicea <15457029+Radu-Raicea@users.noreply.github.com>
Marketing analytics conversion recordings, data catalog metric runs and endpoint runs raised the same 429 without a wait, so clients on those paths still retried blind. Each site's 429 test now asserts the header.
The support-reply coordinator dropped ineligible tickets without a trace,
so a ticket the team started (for example one created through the compose
API) looked identical to one still waiting for its AI draft.

For teams that pass every team-level gate, the coordinator now writes
ai_triage {status: done, result: skipped_team_replied |
skipped_channel_excluded} into tickets whose ai_triage is still empty, in
one bulk update per result per tick. The channel gate moves below the AI
data approval and knowledge readiness gates so the channel reason is only
recorded on teams that would otherwise draft. The global dispatch cap now
skips instead of breaking out of the loop, so team-replied tickets past
the cap are still recorded.

Rejected: recording team-level reasons (flag off, approval missing) | those are settings, not per-ticket facts
Rejected: backfilling existing tickets | out of scope, only new tickets in the lookback get a reason
Confidence: high
Scope-risk: narrow
Ticket: ai-triage-skip-visibility/U1
Tickets the AI support agent skipped now carry a result, so the panel tag,
list column, and AI triage filter need labels for skipped_team_replied and
skipped_channel_excluded. The empty-state copy said "AI has not processed
this ticket yet", which read as pending even for tickets the agent will
never draft; it now explains when the agent drafts and that it skips
tickets the team already replied to.

Generated OpenAPI clients and MCP tool-schema snapshots are regenerated
from the new AI_TRIAGE_FILTER_VALUES. The desktop api-client is left for
CI to regenerate.

Confidence: high
Scope-risk: narrow
Not-tested: desktop api-client regeneration (generator not installed locally)
Ticket: ai-triage-skip-visibility/U2
The two-sentence explanation was long for a collapsed side panel. The
new copy keeps the one rule support teams hit most: AI skips tickets
the team already replied to.

Confidence: high
Scope-risk: narrow
A first-draft ticket counts as engaged when it has any non-customer
comment, including private AI notes such as the signals report
writeback. Labeling those tickets "Skipped, team replied" claimed the
team answered when nobody did. The label now needs a comment that is
neither customer nor AI; the skip itself is unchanged.

Confidence: high
Scope-risk: narrow
8 updated
Run: 94b4da69-eff3-44a7-8c75-2f7ba9d2376d

Co-authored-by: Radu-Raicea <15457029+Radu-Raicea@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

Generated-By: PostHog Desktop
Task-Id: 3c795feb-ff55-4f59-b65a-a28d95757261
Add the slack-app-interview-recruitment flag. Its variant is the campaign and its payload holds the message and the booking link. The Home tab shows a "Book a chat" button, and the bad-rating modal adds one under the reason field at most once in 30 days. The link carries the campaign, surface and invitation id as cal.com metadata, and clicks are captured.

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

Generated-By: PostHog Desktop
Task-Id: 3f610b01-67f3-4926-a0dc-4d623f01e77c
trunk-io Bot and others added 26 commits October 26, 2026 17:02
…g as an error

Bing Webmaster Tools returns an "ERROR!!! ThrottleIP" fault when the caller's egress address hits its rate limit, the sibling of the already-handled "ERROR!!! ThrottleUser" fault. Only ThrottleUser was listed in get_retryable_errors(), so a ThrottleIP fault fell through unclassified and was reported to error tracking on every attempt instead of retrying quietly.

Add "ERROR!!! ThrottleIP" to BingWebmasterToolsSource.get_retryable_errors(), alongside the existing ThrottleUser entry. The activity already retries unmatched errors via Temporal's default policy; this only stops it from being logged as an exception on each attempt.

Generated-By: PostHog Desktop
Task-Id: 6f4864cc-5cd8-4c61-8612-6d50c551572c
@tests-posthog

tests-posthog Bot commented Oct 26, 2026 •

Copy link
Copy Markdown
Contributor

🤖 CI report

⚠️ Django migration SQL — 1 new migration to review

We've detected new migrations on this PR. Review the SQL output for each migration:

products/ai_observability/backend/migrations/0068_offline_item_model_version.py

/home/runner/work/tmp/tool_cache/Python/3.14.7/x64/lib/python3.14/site-packages/anyio/from_thread.py:119: SyntaxWarning: 'return' in a 'finally' block
  return result
2026-10-26T18:11:01.703130Z [error    ] Path must be a valid database or directory containing databases. [posthog.exceptions_capture] pid=6709 tid=140662500817792
Traceback (most recent call last):
  File "/home/runner/work/posthog/posthog/posthog/geoip.py", line 15, in <module>
    geoip: Optional[GeoIP2] = GeoIP2(cache=8)
                              ~~~~~~^^^^^^^^^
  File "/home/runner/work/tmp/tool_cache/Python/3.14.7/x64/lib/python3.14/site-packages/django/contrib/gis/geoip2.py", line 116, in __init__
    raise GeoIP2Exception(
        "Path must be a valid database or directory containing databases."
    )
django.contrib.gis.geoip2.GeoIP2Exception: Path must be a valid database or directory containing databases.
/home/runner/work/tmp/tool_cache/Python/3.14.7/x64/lib/python3.14/site-packages/sshtunnel.py:1040: SyntaxWarning: 'return' in a 'finally' block
  return (ssh_host,
/home/runner/work/tmp/tool_cache/Python/3.14.7/x64/lib/python3.14/site-packages/langchain_core/_api/deprecation.py:27: UserWarning: Core Pydantic V1 functionality isn't compatible with Python 3.14 or greater.
  from pydantic.v1.fields import FieldInfo as FieldInfoV1
System check identified some issues:

WARNINGS:
?: (axes.W001) You are using the django-axes cache handler for login attempt tracking. Your cache configuration is however invalid and will not work correctly with django-axes. This can leave security holes in your login systems as attempts are not tracked correctly. Reconfigure settings.AXES_CACHE and settings.CACHES per django-axes configuration documentation.
?: (staticfiles.W004) The directory '/home/runner/work/posthog/posthog/frontend/dist' in the STATICFILES_DIRS setting does not exist.
BEGIN;
--
-- Add field model_version to offlineexperimentitem
--
ALTER TABLE "llm_analytics_offlineexperimentitem" ADD COLUMN "model_version" varchar(255) NULL;
COMMIT;

Last updated: 2026-10-26 18:11 UTC (d16bd8c)

✅ Django migration risk — migration analysis complete

We've analyzed your migrations for potential risks.

Summary: 1 Safe | 0 Needs Review | 0 Blocked

✅ Safe

Brief or no lock, backwards compatible

ai_observability.0068_offline_item_model_version
  └─ #1 ✅ AddField
     Adding nullable field requires brief lock
     model: offlineexperimentitem, field: model_version

📚 How to Deploy These Changes Safely

AddField:

This operation acquires a brief lock but doesn't rewrite the table.

Deployment uses lock timeouts with automatic retries, so lock contention will cause retries rather than connection pile-up.

Last updated: 2026-10-26 18:12 UTC (d16bd8c)

@trunk-io

trunk-io Bot commented Oct 26, 2026 •

Copy link
Copy Markdown
Author

Static Badge   Static Badge   Static Badge

Failed Test Failure Summary Logs
Scenes-App/Experiments ExperimentWithHealthFindings play-test The Storybook test could not find the expected text “Why?” because the story remained on a loading spinner. Logs ↗︎
SQL Editor › Basic flow › Save view The test failed because the expected element was not visible. Logs ↗︎
Auth › Logout in another tab results in logout in the current tab too The page reload was aborted, possibly because the frame was detached. Logs ↗︎
personalAPIKeysLogic clamps a group write to what each row can take The personal API keys test exceeded Jest’s 5-second timeout. Logs ↗︎

... and 2 more

View Full Report ↗︎ ⋅ Docs

@trunk-io trunk-io Bot closed this Oct 26, 2026
@trunk-io
trunk-io Bot deleted the trunk-merge/pr-119223/232f83c1-5d1e-4bf0-8adc-8e3736e63f44 branch October 26, 2026 18:33
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.