Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
b805b90
feat(hogql): add a useNewEventsSchema query modifier
aspicer Sep 24, 2026
f9a588d
chore: update OpenAPI generated types
tests-posthog[bot] Sep 24, 2026
f92303c
chore(tests): prove event queries read native-only fixtures
aspicer Sep 24, 2026
0656288
fix(hogql): use the source funnel's modifiers in correlation queries
aspicer Sep 28, 2026
46ed044
chore(hogql): document the project fallback for useNewEventsSchema
aspicer Sep 28, 2026
40d296f
fix(hogql): give the actors options runner an explicit signature
aspicer Sep 28, 2026
a13bfc2
Merge remote-tracking branch 'origin/master' into aspicer/new-events-…
aspicer Sep 28, 2026
8e6dc05
chore(hogql): move the wrapper modifier test into product analytics
aspicer Sep 28, 2026
e510bb0
Merge remote-tracking branch 'origin/master' into aspicer/new-events-…
aspicer Sep 29, 2026
2d6d49b
fix(hogql): keep the useNewEventsSchema project value staff-only
aspicer Sep 29, 2026
117f1a1
feat(canvas): let canvas comments work without a task
puemos Sep 29, 2026
160d814
chore: update OpenAPI generated types
puemos Sep 29, 2026
b96b13f
fix(canvas): fix types in the canvas comment listing
puemos Sep 29, 2026
369ab18
test(mcp): count the canvas comments tool flag
puemos Sep 29, 2026
79ab58e
fix(canvas): address review findings on canvas comments
puemos Sep 29, 2026
7de41c2
feat(canvas): rename the canvas comment scope to canvas
puemos Sep 29, 2026
8f3bdb0
refactor(canvas): drop redundant canvas scope conversions
puemos Sep 29, 2026
1193dc4
fix(canvas): keep canvas comments behind their space during the rename
puemos Sep 29, 2026
bedb9c7
fix(canvas): check the task link when a canvas comment is edited
puemos Sep 29, 2026
ed6076c
fix(canvas): find canvas Slack mirrors under either scope name
puemos Sep 29, 2026
8306395
fix(canvas): apply the canvas space check to task comment reads
puemos Sep 29, 2026
8477a90
chore: update OpenAPI generated types
puemos Sep 29, 2026
10d83f9
fix(canvas): limit sandbox tokens to the canvases the canvas API allows
puemos Sep 29, 2026
cd1f172
feat(desktop): enable canvas comments without a task
puemos Sep 29, 2026
a8fe1e9
refactor(desktop): share the canvas comments rule in one hook
puemos Sep 29, 2026
6998839
feat(desktop): use the canvas comment scope
puemos Sep 29, 2026
3bf0b11
fix(desktop): focus canvas comments where each activity path opens them
puemos Sep 29, 2026
0274e4d
fix(desktop): focus a canvas thread opened from the task view
puemos Sep 29, 2026
10ed089
fix(desktop): offer send-to-agent only when a canvas thread has a task
puemos Sep 29, 2026
4e6e1a5
Merge remote-tracking branch 'origin/master' into aspicer/native-only…
aspicer Sep 29, 2026
810b2ac
chore(tests): drop the hogql query cases from native-only coverage
aspicer Sep 29, 2026
b1201af
test(backend): update query snapshots
tests-posthog[bot] Sep 29, 2026
7e27d81
feat(web-analytics): add content autopilot llm client and prompts
jordanm-posthog Sep 29, 2026
3c4735b
fix(web-analytics): address content autopilot review comments
jordanm-posthog Sep 29, 2026
6023929
Merge remote-tracking branch 'origin/master' into aspicer/native-only…
aspicer Sep 29, 2026
a6ea07e
fix(web-analytics): follow commonmark fence rules in content autopilo…
jordanm-posthog Sep 29, 2026
89e5bcb
feat(replay-vision): explain why the what to watch feed is empty
ksvat Sep 29, 2026
96261fe
feat(replay-vision): fade the example clips into the page
ksvat Sep 30, 2026
2b36aeb
fix(web-analytics): recognize indented markdown headings in content a…
jordanm-posthog Sep 30, 2026
b99ae97
Merge remote-tracking branch 'origin/master' into aspicer/native-only…
aspicer Sep 30, 2026
a1501df
fix(replay-vision): give the empty-state stories a width to snapshot at
ksvat Sep 30, 2026
ae9ddd7
feat(today): add pinned, recent and spaces sections to the spaces pane
puemos Sep 30, 2026
1ccacc6
chore(replay-vision): say what the feed does with the moments it finds
ksvat Sep 30, 2026
3a827b4
fix(today): sync kea typegen and show recent load errors
puemos Sep 30, 2026
706bb0b
chore(today): move the space star to a later pr
puemos Sep 30, 2026
ff4d1ac
chore(visual): update storybook baselines
posthog[bot] Sep 30, 2026
964a69c
Merge remote-tracking branch 'origin/master' into aspicer/native-only…
aspicer Sep 30, 2026
e6ff199
Merging ff4d1ac2143adb61868925dd7622fda5b5b5e7f7 into trunk-temp/pr-1…
trunk-io[bot] Sep 30, 2026
696803e
Merging 706bb0b6eff381ddced8c8b5290ade2bda351757 into trunk-temp/pr-1…
trunk-io[bot] Sep 30, 2026
e8e82f0
Merging 696803e34efae9bc94a65546853c69934ae5c004 into trunk-temp/pr-1…
trunk-io[bot] Sep 30, 2026
a2f5ce7
Merging 2b36aebebc1123a942c5410f9f3392cf7c273efb into trunk-temp/pr-1…
trunk-io[bot] Sep 30, 2026
ab58cf6
Merging 10ed0890ca4ffd6da46acb6674e3350b3c2beb63 into trunk-temp/pr-1…
trunk-io[bot] Sep 30, 2026
cf6ece1
Merging ab58cf6fdb723f40c840d29357a818aa9978c653 into trunk-temp/pr-1…
trunk-io[bot] Sep 30, 2026
3edf555
Merging 964a69c3d9aba124e3ab66183a64b2378c2384d6 into trunk-temp/pr-1…
trunk-io[bot] Sep 30, 2026
c106cfd
Merging 2d6d49b42bbf591512aa55b33a6d85b84bc59cf3 into trunk-temp/pr-1…
trunk-io[bot] Sep 30, 2026
904b412
chore: update OpenAPI generated types
tests-posthog[bot] Sep 30, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,11 @@ A good test should:

#### Integration tests

For event-query regressions, decorate the test with `events_only_in_active_schema()` from `posthog.models.event.util`.
In native mode, both event fixture helpers omit the legacy copy; legacy mode still inserts legacy events.
Keep deferred fixture flushing inside the scope, assert that legacy events are empty in native mode, and check expected query results.
Use this only for paths intended to read native events; exports and historical person properties can deliberately depend on legacy storage.

- Integration tests should ensure that the feature works in the running system
- They give greater confidence (because you avoid the mistake of just testing a mock) but they're slower
- They are generally less brittle in response to changes because they test at a higher level than developer tests (e.g. they test a Django API not a class used inside it)
Expand Down
28 changes: 26 additions & 2 deletions frontend/snapshots.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11311,9 +11311,9 @@ snapshots:
scenes-app-replay-vision--home-watch-feed--light:
hash: v1.k794b7964.d891003a18f40fdfd7a5c7acb16fd69a7432917c0758c9d751ce9848e0e817a6.MU9DRlLvjCioaMuOgSbAL0Tfrcx9SNFVPVWgKfQ8pKc
scenes-app-replay-vision--home-watch-feed-empty--dark:
hash: v1.k794b7964.c8b63e7c03105a6a22c7dfecc5fa98afb410af14180977eeb9907c2e57f43e29.9d0B-LDyKHrQ75wpveOo913SMTZvi2fe4RTJOrFtDM0
hash: v1.k794b7964.926bab41fb78cabf70493f52b629520842bcdb6fd7e0a838babb178ad948c67f.6Q9grGAgt0DLOh0YWKUgIOuHlFvn0gDCeHHOrqdav7g
scenes-app-replay-vision--home-watch-feed-empty--light:
hash: v1.k794b7964.33393d260f0654e59dbc209d6052c2b0730dfc6e8f59925406cd3a9349569980.63xRgoQrVu1PM7n1sBaVx6QV7Otc_rKCusdfHhsGuBU
hash: v1.k794b7964.71ae84e0d38203d5860ee8feb2a633a339e79de59b03b514807c7493517486fb.3NLgnN7g1YbjscaN_XzQhxSoqltm99utfh3_1E_29J8
scenes-app-replay-vision--home-watch-feed-only-newest--dark:
hash: v1.k794b7964.f64a7c7bb16de8d589664ccb6e0bce38eba82a63d1375d348c3a44628445a98f.LWCEsvlNc28TTOiiwI7-GrLQm165fAPCjY3oBQWKVVs
scenes-app-replay-vision--home-watch-feed-only-newest--light:
Expand Down Expand Up @@ -11542,6 +11542,30 @@ snapshots:
hash: v1.k794b7964.57289f977a42e43a6b70a0718959bc995a7a45245b20fda636e880beec7cc2e8.2CONzn8joR8LZgN9VOcNokIFUUJmtzE-TJTbprVGmt8
scenes-app-replay-vision-test-account-filter-settings-dialog--default--light:
hash: v1.k794b7964.8276936411550e5ab99aa3d216a442c6328a55434a4bcf273cbef46a39d940b4.asrT7Nd6P9HVchxOoJPfMOOttbQVP6XFXptRAtnXC3k
scenes-app-replay-vision-watchfeedemptystate--all-capped--dark:
hash: v1.k794b7964.2044f64f59724a250003d8be462529ad61a07e05f5a7104879a7b00980c17b1e.2ec-AsxkwzKRLGbe4NJhCFYTVZhBBS-G4PowHISQAK0
scenes-app-replay-vision-watchfeedemptystate--all-capped--light:
hash: v1.k794b7964.827951eedc4b27a19c51943be56de5e66332fe2af13d258a5020c5f9e02d90ef.fnVEjjQoWjIJ-A4NO1HbAOmf1QkPjatVvl56ecWn5-o
scenes-app-replay-vision-watchfeedemptystate--all-disabled--dark:
hash: v1.k794b7964.95f5488d9be93532b070280e334d24ebc7ea4216b3fd91e317c60ba3a4c6bb37.wX3TVVh7pA_u9ZeTvQFT7quClJdoO-mzd_EKzQqTXJw
scenes-app-replay-vision-watchfeedemptystate--all-disabled--light:
hash: v1.k794b7964.87641562db015731f2de39e04591e3efd4e136db74a726b4e7a8835f6b608be6._VX6C8s2D6xBgXcwhyxW47DDLTNUg90321xZZc0enxE
scenes-app-replay-vision-watchfeedemptystate--filtered--dark:
hash: v1.k794b7964.417933f4f0dbd89798575f302a173ac5780705a8533c42e7196c8922a5b9d0ec.zAKPjkDiU74sZwyCufk7XKxwAmu-of86YMX-TTIcUSE
scenes-app-replay-vision-watchfeedemptystate--filtered--light:
hash: v1.k794b7964.b4dbcfa2372545ec4218a5974345864dc01908f4682afe32b05e7cc968747a71.jSaF9RqYy5QMC4Jj0ilFjfNhRm0TEPaCeXIfPg33eSc
scenes-app-replay-vision-watchfeedemptystate--no-scanners--dark:
hash: v1.k794b7964.f2bd16f47816e1a9d2fd314270daa72223c37a8946af17765b3f3c43df966cfe.3wSlppAgHktz_NPXbdFqdb0d4SxmdQ4_lBtKTji20e0
scenes-app-replay-vision-watchfeedemptystate--no-scanners--light:
hash: v1.k794b7964.5de8b483a01bf5f9ed595e900d6b6f26180f901bcfb9c8bb2729fbf46f847264.nqlSLSEafSpbB7kI11PSDxLlU-YmYfwC5oDLC1QLVbw
scenes-app-replay-vision-watchfeedemptystate--quiet-window--dark:
hash: v1.k794b7964.50cd583401f3e45ec47f476cc0d9fb3208294202af2aa1cb0856fb7c1fd3fb83.EKR4ZZU6vyZ6xxUv4dX_f5telnfevtft2rV7R8wv_mY
scenes-app-replay-vision-watchfeedemptystate--quiet-window--light:
hash: v1.k794b7964.e0ed64d8967f7b29fdc9503d95da3f8ce8936a49c15a861c276355f27282e2a9.8J-XaVdJjUsBXNVxy_GjYq-5lQn3RpH3QAEce7x34lU
scenes-app-replay-vision-watchfeedemptystate--quota-exhausted--dark:
hash: v1.k794b7964.156b681d8c3026279523eae78298898334fecd340a168a93c2b1f27e8b87c477.2RIkQGbqyk33Exg6GczARiEZpZowlwCUPXbukhOSki0
scenes-app-replay-vision-watchfeedemptystate--quota-exhausted--light:
hash: v1.k794b7964.955908541d73f6f32bd758cdd758724f10e201e3fea481b91294b284a489fe96.3buIiPKIIBer22g58o_OW3nkOAcV0uHmNfUFXn8ldnI
scenes-app-saved-insights--empty-state--dark:
hash: v1.k794b7964.8186a1849accab762928456f98db977a9b097cf28199d7e1eb6c1e841500852c.SXNRf2LgiH3DkvhwUukZcGqDXngv1kGiEhGYUAhlKC8
scenes-app-saved-insights--empty-state--light:
Expand Down
48 changes: 48 additions & 0 deletions frontend/src/layout/today/TodayPaneSection.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import { ReactNode } from 'react'

import { IconChevronDown, IconChevronRight } from '@posthog/icons'

import { cn } from 'lib/utils/css-classes'

interface TodayPaneSectionProps {
label: string
open: boolean
count: number
onToggle: () => void
actions?: JSX.Element | null
divider?: boolean
dataAttr: string
children: ReactNode
}

export function TodayPaneSection({
label,
open,
count,
onToggle,
actions,
divider = false,
dataAttr,
children,
}: TodayPaneSectionProps): JSX.Element {
const Caret = open ? IconChevronDown : IconChevronRight
return (
<section aria-label={label} className={cn('TodayPaneSection', divider && 'TodayPaneSection--divider')}>
<div className="TodayPaneSection__header">
<button
type="button"
className="TodayPaneSection__toggle Today__label"
aria-expanded={open}
data-attr={dataAttr}
onClick={onToggle}
>
<span>{label}</span>
<Caret className="TodayPaneSection__caret" />
{!open && count > 0 && <span className="TodayPaneSection__count">{count}</span>}
</button>
{open && actions && <div className="TodayPaneSection__actions">{actions}</div>}
</div>
{open && <div className="TodayPaneSection__body">{children}</div>}
</section>
)
}
101 changes: 101 additions & 0 deletions frontend/src/layout/today/TodayShell.scss
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,107 @@
letter-spacing: 0.08em;
}

.TodayPaneSection {
display: flex;
flex-direction: column;
padding-bottom: 8px;

&:first-child {
margin-top: 12px;
}

&--divider {
border-top: 1px solid var(--today-line);
}
}

.TodayPaneSection__header {
display: flex;
gap: 4px;
align-items: center;
height: 32px;
margin-top: 4px;
}

.TodayPaneSection__toggle {
display: flex;
flex: 1 1 auto;
gap: 4px;
align-items: center;
min-width: 0;
padding: 4px 8px;
text-align: left;
border-radius: 6px;
transition: color 0.16s;

@media (hover: hover) and (pointer: fine) {
&:hover {
color: var(--today-ink);
}
}
}

.TodayPaneSection__caret {
flex: 0 0 11px;
width: 11px;
height: 11px;
opacity: 0.7;
}

.TodayPaneSection__count {
margin-left: 2px;
font-variant-numeric: tabular-nums;
color: var(--today-muted);
}

.TodayPaneSection__actions {
display: flex;
flex: 0 0 auto;
align-items: center;
}

.TodayPaneSection__body {
display: flex;
flex-direction: column;
gap: 1px;
}

.TodayPane__group {
padding: 12px 8px 4px;
font-size: 11px;
font-weight: 500;
color: var(--today-muted);

&--first {
padding-top: 4px;
}
}

.TodayPane__dot {
width: 6px;
height: 6px;
background: var(--today-faint);
border-radius: 50%;

&[data-status='queued'],
&[data-status='in_progress'] {
background: var(--warning);
}

&[data-status='completed'] {
background: var(--success);
}

&[data-status='failed'] {
background: var(--danger);
}

&[data-kind='chat'] {
background: transparent;
border: 1px solid var(--today-faint);
}
}

.TodayPane__state {
display: flex;
flex-direction: column;
Expand Down
Loading
Loading