Skip to content

feat(tasks): add artifact comments and mention activity - #76407

Draft
puemos wants to merge 7 commits into
masterfrom
posthog-code/merge-artifact-comments
Draft

feat(tasks): add artifact comments and mention activity#76407
puemos wants to merge 7 commits into
masterfrom
posthog-code/merge-artifact-comments

Conversation

@puemos

@puemos puemos commented Aug 2, 2026

Copy link
Copy Markdown
Contributor

Problem

Agent output is reviewed in its artifacts, but feedback without a precise attachment point loses the context needed to act on it. Reviewers need to comment on exact text, image regions, or a whole artifact/canvas, discuss that feedback in threads, resolve it, and bring mentioned teammates directly back to the discussion.

Changes

  • Adds inline text comments, image pins, and document-level comments across task artifacts, plus document-level comments on task-generated canvases.
  • Provides threaded replies, mentions, open/resolved filtering, resolve/reopen actions, comment counts, and anchor navigation.
  • Surfaces artifact-comment mentions in task activity and navigates to the exact source thread.
  • Reuses the generic Django Comment API, generated OpenAPI client, existing task activity model, mention composer/renderer, task thread APIs, and Quill primitives.
  • Enforces task visibility and verifies that each artifact or canvas belongs to the named task on comment reads, writes, and activity projection. Task-owned comments are excluded from unscoped generic queries.
  • Keeps HTML artifacts isolated in an opaque-origin iframe and preserves forwarded-content delimiter hardening.
  • Bounds task-wide polling to four concurrent requests every 30 seconds.

Artifact anchors and thread state remain in item_context; existing resource IDs remain the comment identity. No separate comment persistence model, forwarding endpoint, or notification system is introduced.

How did you test this code?

  • 63 focused desktop and backend tests pass locally.
  • Desktop shared, API client, core, and UI typechecks pass.
  • Desktop host-boundary and Biome checks pass.
  • Ruff lint and format checks pass.
  • git diff --check passes.
  • Database-backed authorization and activity tests are included but require CI's PostgreSQL service.

Not in this PR

Comment-specific web/email notification destinations are unchanged.

👉 Stay up-to-date with PostHog coding conventions for a smoother review.

Automatic notifications

  • Publish to changelog?
  • Alert Sales and Marketing teams?

Docs update

No user-facing docs are affected.

🤖 Agent context

Autonomy: Human-driven (agent-assisted)

This combines artifact commenting and task-activity mention handling into one complete flow in the PostHog monorepo.


Created with PostHog Code

Combine task artifact commenting in the desktop app with backend activity-feed delivery for comment mentions.

Generated-By: PostHog Code
Task-Id: 49201d1f-5d24-4117-b923-cc1d240c8ebc
@trunk-io

trunk-io Bot commented Aug 2, 2026

Copy link
Copy Markdown

Merging to master in this repository is managed by Trunk.

  • To merge this pull request, check the box to the left or comment /trunk merge below.

After your PR is submitted to the merge queue, this comment will be automatically updated with its status. If the PR fails, failure details will also be posted here

@github-actions

github-actions Bot commented Aug 2, 2026

Copy link
Copy Markdown
Contributor

🤖 CI report

Bundle size — no change

Uncompressed size of every built .js bundle, compared against the base branch.

Total: 65.51 MiB · no change

No file changed by more than 1000 B.

Posted automatically by build-bundle-size-report · uncompressed bytes from dist-report

Eager graph — within budget

How much code each root ships on the eager path — downloaded and parsed before the surface is interactive. Measured from the esbuild output chunks (post-tree-shake, static imports only); lazy import() / React.lazy chunks are not counted.

Root Eager (shipped) Δ vs base Budget
entry (logged-out pages, app bootstrap)
src/index.tsx
1.25 MiB · 22 files no change ███░░░░░░░ 27.7% of 4.51 MiB
authenticated shell (every logged-in page)
src/scenes/AuthenticatedShell.tsx
8.13 MiB · 3,035 files no change ████████░░ 83.8% of 9.71 MiB

🟢 node_modules/monaco-editor/ stays out of src/index.tsx
🟢 src/lib/components/ActivityLog/describers stays out of src/index.tsx
🟢 [object Object] stays out of src/index.tsx
🟢 [object Object] stays out of src/index.tsx
🟢 node_modules/monaco-editor/ stays out of src/scenes/AuthenticatedShell.tsx
🟢 src/lib/components/ActivityLog/describers stays out of src/scenes/AuthenticatedShell.tsx
🟢 [object Object] stays out of src/scenes/AuthenticatedShell.tsx
🟢 [object Object] stays out of src/scenes/AuthenticatedShell.tsx

Largest files eagerly shipped from src/index.tsx
Size File
126.8 KiB ../node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.production.min.js
24.6 KiB ../node_modules/.pnpm/buffer@6.0.3/node_modules/buffer/index.js
6.3 KiB ../node_modules/.pnpm/react@18.3.1/node_modules/react/cjs/react.production.min.js
4.5 KiB ../node_modules/.pnpm/@jspm+core@2.1.0/node_modules/@jspm/core/nodelibs/browser/process.js
3.9 KiB ../node_modules/.pnpm/scheduler@0.23.2/node_modules/scheduler/cjs/scheduler.production.min.js
1.4 KiB ../node_modules/.pnpm/base64-js@1.5.1/node_modules/base64-js/index.js
1.3 KiB src/RootErrorBoundary.tsx
912 B ../node_modules/.pnpm/ieee754@1.2.1/node_modules/ieee754/index.js
789 B src/scenes/ChunkLoadErrorBoundary.tsx
762 B src/index.tsx
Largest files eagerly shipped from src/scenes/AuthenticatedShell.tsx
Size File
285.6 KiB ../node_modules/.pnpm/posthog-js@1.409.5/node_modules/posthog-js/dist/rrweb.js
267.7 KiB ../node_modules/.pnpm/@posthog+icons@0.38.0_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/icons/dist/posthog-icons.es.js
235.5 KiB src/taxonomy/core-filter-definitions-by-group.json
231.5 KiB ../node_modules/.pnpm/posthog-js@1.409.5/node_modules/posthog-js/dist/module.js
154.3 KiB ../node_modules/.pnpm/re2js@0.4.1/node_modules/re2js/build/index.esm.js
126.8 KiB ../node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.production.min.js
105.3 KiB src/lib/api.ts
94.7 KiB ../packages/quill/packages/quill/dist/index.js
93.3 KiB ../node_modules/.pnpm/prosemirror-view@1.40.1/node_modules/prosemirror-view/dist/index.js
90.6 KiB ../node_modules/.pnpm/@tiptap+core@3.20.6_@tiptap+pm@3.20.6/node_modules/@tiptap/core/dist/index.js

Posted automatically by check-eager-graph · sizes are eager output bytes (shipped, post-tree-shake) from the esbuild metafile · part of #32479

Toolbar bundle — eager 2.19 MiB within budget

What the toolbar ships to customer pages, measured from the esbuild output (minified, post-tree-shake). The eager set is the entry plus everything statically imported from it — fetched before any feature runs; deferred chunks load lazily. The eager guardrail is 5.72 MiB. Each output file must also stay below 10 MB, where CloudFront stops compressing it. The module boundary is enforced separately by check-toolbar-graph.

Metric Size Δ vs base Budget
Eager (shipped)
entry + static imports
2.19 MiB · 17 files no change ████░░░░░░ 38.3% of 5.72 MiB
Deferred (lazy) 2.08 MiB · 33 files no change n/a — loads on demand
Loader dist/toolbar.js 1.1 KiB no change █░░░░░░░░░ 5.8% of 19.5 KiB
Largest eagerly-shipped chunks
Size File
718.3 KiB dist/toolbar/toolbar-app-FT4UJ3IP.css
551.4 KiB dist/toolbar/chunk-chunk-AGSGCCBT.js
484.6 KiB dist/toolbar/chunk-chunk-T44C2V5C.js
133.6 KiB dist/toolbar/chunk-chunk-KBLX73CM.js
131.8 KiB dist/toolbar/chunk-chunk-T5KY5WYR.js
71.0 KiB dist/toolbar/toolbar-app-FKUW2FOM.js
69.0 KiB dist/toolbar/chunk-chunk-27JL52RE.js
35.6 KiB dist/toolbar/chunk-chunk-3JVI3ZTF.js
20.9 KiB dist/toolbar/chunk-chunk-HJ3ZJMTU.js
12.2 KiB dist/toolbar/chunk-chunk-PIK3PADE.js

Posted automatically by check-toolbar-size · sizes are toolbar output bytes (shipped, post-tree-shake) from the esbuild metafile

Dist folder size — 🔺 +1.3 KiB (+0.0%)

Total size of the built frontend/dist folder (all assets), compared against the base branch.

Total: 1381.30 MiB · 🔺 +1.3 KiB (+0.0%)

⚠️ Django migration SQL — 1 new migration to review

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

products/tasks/backend/migrations/0078_taskactivity_comment.py

BEGIN;
--
-- Add field comment to taskactivity
--
ALTER TABLE "posthog_task_activity" ADD COLUMN "comment_id" uuid NULL;
COMMIT;

Last updated: 2026-08-02 10:54 UTC (875f8a0)

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

tasks.0078_taskactivity_comment
  └─ #1 ✅ AddField
     Adding nullable field requires brief lock
     model: taskactivity, field: comment

📚 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-08-02 10:54 UTC (875f8a0)

@trunk-io

trunk-io Bot commented Aug 2, 2026

Copy link
Copy Markdown

Static BadgeStatic BadgeStatic Badge

View Full Report ↗︎Docs

puemos and others added 6 commits August 2, 2026 11:56
Validate task ownership for comment reads and writes, add whole-document and canvas comments, deep-link activity mentions to their exact thread, and bound task-wide comment polling.

Generated-By: PostHog Code
Task-Id: 49201d1f-5d24-4117-b923-cc1d240c8ebc
Avoid private cross-product model imports in comments API tests and prevent a task-run fixture from shadowing TestCase.run.

Generated-By: PostHog Code
Task-Id: 49201d1f-5d24-4117-b923-cc1d240c8ebc
Give the mutable nested API payload an explicit dictionary type so mypy accepts updating its task context.

Generated-By: PostHog Code
Task-Id: 49201d1f-5d24-4117-b923-cc1d240c8ebc
Run task-comment ownership validation through TeamAndOrgViewSetMixin.safely_get_object so standard permission checks remain intact and API schema generation can import the viewset.

Generated-By: PostHog Code
Task-Id: 49201d1f-5d24-4117-b923-cc1d240c8ebc
Record the task_id query parameter added to task-owned comment reads in the generated MCP tool schema snapshot.

Generated-By: PostHog Code
Task-Id: 49201d1f-5d24-4117-b923-cc1d240c8ebc
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feature/desktop Feature Tag: Desktop

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant