Skip to content

feat(signals): expose PUT API for suggested-reviewer artefacts#59357

Merged
Twixes merged 5 commits into
masterfrom
posthog-code/expose-suggested-reviewers-api
May 27, 2026
Merged

feat(signals): expose PUT API for suggested-reviewer artefacts#59357
Twixes merged 5 commits into
masterfrom
posthog-code/expose-suggested-reviewers-api

Conversation

@oliverb123
Copy link
Copy Markdown
Contributor

Problem

Signal report artefacts are produced server-side only — the agentic Temporal pipeline writes suggested_reviewers, priority_judgment, dismissal, and friends, and the artefact serializer was read-only. There was no way for a client to fix a mis-resolved reviewer, drop the wrong person, or add a teammate the agent missed.

This PR exposes a narrow API to modify the suggested reviewers for a report. Mutation is locked to that single artefact type so other types (which are part of the agentic pipeline contract) cannot be hand-edited.

Changes

  • New nested SignalReportArtefactViewSet at /api/projects/<team>/signals/reports/<report_id>/artefacts/ supporting GET list, GET retrieve, and PUT update. Replaces the previous read-only @action(artefacts) on SignalReportViewSet.
  • PUT body is a full replacement: { "content": [{ "github_login"?: str, "user_uuid"?: uuid, "github_name"?: str }, ...] }. Entries identify reviewers by github_login, user_uuid, or both — the server canonicalizes to a lowercase github_login via the existing org-member resolution helpers used by the ?suggested_reviewers= filter.
  • Generic shape, single-type allow-list: a 400 is returned if the target artefact is anything other than suggested_reviewers (covered by a parameterized test across every other type).
  • relevant_commits is preserved across the replace for reviewers that survive; new entries get [].
  • Standard task:write scope. Team / report scoping enforced via TeamAndOrgViewSetMixin.
  • Added help_text on artefact serializer fields and new SignalReportArtefactWriteSerializer so the OpenAPI spec → TypeScript / Zod / MCP pipeline picks the endpoint up cleanly.
  • Regenerated products/signals/frontend/generated/* and services/mcp/src/api/generated.ts.

Out of scope for this PR:

  • Creation of a new suggested_reviewers artefact from scratch (PUT requires an existing one).
  • Activity-log audit trail for these edits.
  • Frontend UI (typed client is in place for follow-up).

How did you test this code?

I am an agent (Claude / PostHog Code). I did not perform manual UI testing.

  • Added 31 unit tests in products/signals/backend/test/test_signal_report_artefact_api.py covering full-replace, identity resolution (login / uuid / both), relevant_commits preservation, dedupe, idempotency, empty-list clear, validation errors, 400 on every non-suggested-reviewers artefact type, team scoping, method restrictions, and a round-trip against the existing ?suggested_reviewers= filter.
  • ruff check + ruff format clean across changed files.
  • uv run ty check clean.
  • pytest --collect-only discovers all 31 tests.
  • bin/hogli build:openapi runs end-to-end and emits the expected SignalReportArtefactWriteApi / SuggestedReviewerEntryWriteApi types into the signals generated client and MCP generated types.
  • The full Django test suite was not run locally — no Postgres available in this sandbox. CI will exercise it.

Behaviour note worth flagging in review: the artefacts list endpoint is now standard DRF-paginated ({count, next, previous, results}) rather than the bespoke {count, results} envelope the old @action returned. There are no existing consumers of the generated client for this URL.

Publish to changelog?

do not publish to changelog

Docs update

skip-inkeep-docs

🤖 Agent context

  • Authored by PostHog Code (Claude Code, Opus 4.7) following a plan-mode design pass.
  • Approach: started by mapping the existing artefact surface — model, read serializer, nested viewset patterns (SignalReportTaskViewSet), and the ?suggested_reviewers= filter's UUID-to-GitHub-login resolution path. Reused those helpers (get_org_member_github_logins_by_user_uuid, resolve_org_github_login_to_users, normalized_github_logins_from_suggested_reviewer_artefacts, enrich_reviewer_dicts_with_org_members) rather than introducing a new resolution code path.
  • Decisions:
    • PUT (full replace) rather than PATCH ops — chosen for idempotency and to keep the validation surface small.
    • Generic endpoint with a runtime type guard rather than a suggested_reviewers-specific URL — leaves headroom to whitelist additional artefact types later without restructuring routes, while still failing closed today.
    • Accept either github_login or user_uuid per entry, with user_uuid winning when both are supplied — mirrors how the existing list-filter already maps PostHog users to artefact content.
    • Storage shape unchanged from what the agentic pipeline writes, so the existing is_suggested_reviewer annotation and ?suggested_reviewers= jsonb-containment filter keep working without modification.
    • Replaced the old read-only @action(artefacts) with the new viewset's list/retrieve to avoid URL collision; this incidentally surfaces the read endpoints in the OpenAPI spec for the first time. List response shape is now standard DRF pagination, which matches the generated client types.

Generated-By: PostHog Code
Task-Id: 4b273054-e446-41d6-b4c0-bac3bd4cb309
Copilot AI review requested due to automatic review settings May 21, 2026 09:11
@assign-reviewers-posthog assign-reviewers-posthog Bot requested a review from a team May 21, 2026 09:12
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 21, 2026

🎭 Playwright didn't run on this PR — your changes touch code that could affect E2E behavior, but Playwright is opt-in via label now to keep CI cost down.

Add the run-playwright label if you want an E2E sweep before merging — CI will pick it up automatically.

Most PRs don't need this. Real regressions still get caught on master and fix-forward.

@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps Bot commented May 21, 2026

Prompt To Fix All With AI
Fix the following 1 code review issue. Work through them one at a time, proposing concise fixes.

---

### Issue 1 of 1
products/signals/backend/test/test_signal_report_artefact_api.py:258-260
Dead method reference — `other_org` is assigned `self._create_org_member` (the bound method object itself, not a call result). The variable is never used, and the `# noqa: F841` confirms the linter already flagged it. As written, the test exercises a random UUID that doesn't belong to any org, which is fine, but the misleading name + dead assignment violates "no superfluous parts." Either call the helper to actually create an out-of-org user (which would require a second organization) or drop the dead line entirely and rename the test to match what it actually verifies.

```suggestion
    def test_put_user_uuid_not_in_org_returns_400(self):
        # Random UUID not tied to anyone in this org.
```

Reviews (1): Last reviewed commit: "feat(signals): expose PUT API for sugges..." | Re-trigger Greptile

Comment thread products/signals/backend/test/test_signal_report_artefact_api.py Outdated
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 21, 2026

Size Change: +12.4 kB (+0.01%)

Total Size: 116 MB

📦 View Changed
Filename Size Change
frontend/dist/CustomerAnalyticsScene 28.1 kB +1.3 kB (+4.87%) 🔍
frontend/dist/TransformationsScene 6.4 kB +4.24 kB (+196.34%) 🆘
frontend/dist/WorkflowScene 110 kB +6.82 kB (+6.58%) 🔍
ℹ️ View Unchanged
Filename Size Change
frontend/dist/368Hedgehogs 5.47 kB -34 B (-0.62%)
frontend/dist/abap 14.2 kB 0 B
frontend/dist/AccountConnected 2.99 kB 0 B
frontend/dist/Action 24.8 kB -106 B (-0.43%)
frontend/dist/Actions 1.2 kB 0 B
frontend/dist/AdvancedActivityLogsScene 39.9 kB 0 B
frontend/dist/AgenticAuthorize 5.74 kB 0 B
frontend/dist/apex 3.99 kB 0 B
frontend/dist/ApprovalDetail 16.5 kB 0 B
frontend/dist/architecture-7EHR7CIX 372 B 0 B
frontend/dist/architectureDiagram-3BPJPVTR 151 kB 0 B
frontend/dist/array.full.es5.js 347 kB 0 B
frontend/dist/array.full.js 427 kB 0 B
frontend/dist/array.js 191 kB 0 B
frontend/dist/AsyncMigrations 13.4 kB 0 B
frontend/dist/AuthenticatedShell 175 kB 0 B
frontend/dist/AuthorizationStatus 968 B 0 B
frontend/dist/azcli 885 B 0 B
frontend/dist/bat 1.88 kB 0 B
frontend/dist/BatchExportScene 60.8 kB 0 B
frontend/dist/bicep 2.59 kB 0 B
frontend/dist/Billing 731 B 0 B
frontend/dist/BillingSection 21 kB 0 B
frontend/dist/blockDiagram-GPEHLZMM 72.5 kB 0 B
frontend/dist/BoxPlot 5.28 kB 0 B
frontend/dist/browserAll-0QZMN1W2 37.4 kB 0 B
frontend/dist/BusinessKnowledgeScene 18.9 kB 0 B
frontend/dist/ButtonPrimitives 796 B 0 B
frontend/dist/c4Diagram-AAUBKEIU 70.8 kB 0 B
frontend/dist/CalendarHeatMap 9 kB 0 B
frontend/dist/cameligo 2.23 kB 0 B
frontend/dist/changeRequestsLogic 782 B 0 B
frontend/dist/classDiagram-4FO5ZUOK 1.28 kB 0 B
frontend/dist/classDiagram-v2-Q7XG4LA2 1.28 kB 0 B
frontend/dist/CLIAuthorize 11.6 kB 0 B
frontend/dist/CLILive 4.26 kB 0 B
frontend/dist/clojure 9.68 kB 0 B
frontend/dist/CodeEditorInline 696 B 0 B
frontend/dist/coffee 3.63 kB 0 B
frontend/dist/Cohort 28.2 kB 0 B
frontend/dist/CohortCalculationHistory 6.47 kB 0 B
frontend/dist/Cohorts 9.67 kB 0 B
frontend/dist/ConfirmOrganization 4.76 kB 0 B
frontend/dist/conversations.js 67.3 kB 0 B
frontend/dist/cose-bilkent-S5V4N54A 82.8 kB 0 B
frontend/dist/Coupons 963 B 0 B
frontend/dist/cpp 5.33 kB 0 B
frontend/dist/Create 1.08 kB +178 B (+19.82%) 🚨
frontend/dist/crisp-chat-integration.js 1.97 kB 0 B
frontend/dist/csharp 4.56 kB 0 B
frontend/dist/csp 1.45 kB 0 B
frontend/dist/css 4.54 kB 0 B
frontend/dist/cssMode 4.2 kB 0 B
frontend/dist/CustomCssScene 3.8 kB 0 B
frontend/dist/CustomerAnalyticsConfigurationScene 2.34 kB +35 B (+1.52%)
frontend/dist/CustomerJourneyBuilderScene 2.04 kB 0 B
frontend/dist/CustomerJourneyTemplatesScene 7.72 kB -35 B (-0.45%)
frontend/dist/customizations.full.js 18 kB 0 B
frontend/dist/CyclotronJobInputAssignee 1.54 kB -34 B (-2.16%)
frontend/dist/CyclotronJobInputBusinessHours 2.92 kB 0 B
frontend/dist/CyclotronJobInputTicketTags 954 B 0 B
frontend/dist/cypher 3.42 kB 0 B
frontend/dist/dagre-BM42HDAG 11.9 kB 0 B
frontend/dist/dart 4.29 kB 0 B
frontend/dist/Dashboard 1.34 kB 0 B
frontend/dist/Dashboards 19.6 kB 0 B
frontend/dist/DashboardTemplateCopyScene 5.95 kB 0 B
frontend/dist/DataManagementScene 884 B 0 B
frontend/dist/DataPipelinesNewScene 2.55 kB 0 B
frontend/dist/DataWarehouseScene 46.5 kB 0 B
frontend/dist/Deactivated 1.37 kB 0 B
frontend/dist/dead-clicks-autocapture.js 14.3 kB 0 B
frontend/dist/DeadLetterQueue 5.63 kB 0 B
frontend/dist/DebugScene 20.2 kB 0 B
frontend/dist/decompressionWorker 2.85 kB 0 B
frontend/dist/decompressionWorker.js 2.85 kB 0 B
frontend/dist/DecompressionWorkerManager 329 B 0 B
frontend/dist/DefinitionEdit 17.1 kB 0 B
frontend/dist/DefinitionView 24.3 kB 0 B
frontend/dist/Deployment 3.9 kB -34 B (-0.86%)
frontend/dist/DeploymentProject 5.47 kB 0 B
frontend/dist/Deployments 9.2 kB +35 B (+0.38%)
frontend/dist/DestinationsScene 2.92 kB 0 B
frontend/dist/diagram-2AECGRRQ 6.66 kB 0 B
frontend/dist/diagram-5GNKFQAL 3.61 kB 0 B
frontend/dist/diagram-KO2AKTUF 11.5 kB 0 B
frontend/dist/diagram-LMA3HP47 5.02 kB 0 B
frontend/dist/diagram-OG6HWLK6 11.8 kB 0 B
frontend/dist/dist 643 B 0 B
frontend/dist/dockerfile 1.91 kB 0 B
frontend/dist/EarlyAccessFeature 991 B 0 B
frontend/dist/EarlyAccessFeatures 3.1 kB 0 B
frontend/dist/ecl 5.38 kB 0 B
frontend/dist/EditorScene 1.38 kB 0 B
frontend/dist/elixir 10.3 kB 0 B
frontend/dist/elk.bundled 1.44 MB 0 B
frontend/dist/EmailMFAVerify 3.26 kB 0 B
frontend/dist/EndpointScene 39.9 kB -34 B (-0.09%)
frontend/dist/EndpointsScene 21.8 kB 0 B
frontend/dist/erDiagram-TEJ5UH35 27.7 kB 0 B
frontend/dist/ErrorTrackingIssueFingerprintsScene 7.26 kB 0 B
frontend/dist/ErrorTrackingIssueScene 100 kB 0 B
frontend/dist/ErrorTrackingScene 27.1 kB +72 B (+0.27%)
frontend/dist/EvaluationTemplates 779 B 0 B
frontend/dist/eventmodeling-FCH6USID 375 B 0 B
frontend/dist/EventsScene 2.81 kB 0 B
frontend/dist/exception-autocapture.js 11.8 kB 0 B
frontend/dist/Experiment 205 kB 0 B
frontend/dist/Experiments 19.8 kB 0 B
frontend/dist/exporter 19 kB 0 B
frontend/dist/exporter.js 19 kB 0 B
frontend/dist/ExporterDashboardScene 1.75 kB 0 B
frontend/dist/ExporterHeatmapScene 19.5 kB 0 B
frontend/dist/ExporterInsightScene 2.88 kB 0 B
frontend/dist/ExporterInterviewScene 309 kB 0 B
frontend/dist/ExporterNotebookScene 2.71 MB 0 B
frontend/dist/ExporterRecordingScene 995 B 0 B
frontend/dist/exporterSharedChunkAnchors 1.16 kB 0 B
frontend/dist/exporterSharedChunkAnchors.js 1.16 kB 0 B
frontend/dist/ExportsScene 4.22 kB 0 B
frontend/dist/FeatureFlag 134 kB 0 B
frontend/dist/FeatureFlags 844 B 0 B
frontend/dist/FeatureFlagTemplatesScene 7.24 kB 0 B
frontend/dist/FlappyHog 6.02 kB 0 B
frontend/dist/flow9 1.85 kB 0 B
frontend/dist/flowDiagram-I6XJVG4X 61.6 kB 0 B
frontend/dist/freemarker2 16.7 kB 0 B
frontend/dist/fsharp 3.02 kB 0 B
frontend/dist/ganttDiagram-6RSMTGT7 50.9 kB 0 B
frontend/dist/gitGraph-WXDBUCRP 360 B 0 B
frontend/dist/gitGraphDiagram-PVQCEYII 30.2 kB 0 B
frontend/dist/go 2.69 kB 0 B
frontend/dist/graphql 2.3 kB 0 B
frontend/dist/Group 15.1 kB 0 B
frontend/dist/Groups 4.15 kB 0 B
frontend/dist/GroupsNew 7.58 kB 0 B
frontend/dist/handlebars 7.38 kB 0 B
frontend/dist/hcl 3.63 kB 0 B
frontend/dist/HealthCategoryDetailScene 7.48 kB 0 B
frontend/dist/HealthScene 12.4 kB 0 B
frontend/dist/HeatmapNewScene 5.27 kB 0 B
frontend/dist/HeatmapRecordingScene 4.17 kB 0 B
frontend/dist/HeatmapScene 6.8 kB 0 B
frontend/dist/HeatmapsScene 4.13 kB 0 B
frontend/dist/hls 394 kB 0 B
frontend/dist/HogFunctionScene 59.5 kB 0 B
frontend/dist/hogql_parser_wasm_browser 1.53 MB 0 B
frontend/dist/HogRepl 7.61 kB 0 B
frontend/dist/html 5.62 kB 0 B
frontend/dist/htmlMode 4.65 kB 0 B
frontend/dist/image-blob-reduce.esm 49.5 kB 0 B
frontend/dist/InboxScene 63.1 kB 0 B
frontend/dist/index 60.7 kB 0 B
frontend/dist/index.js 60.7 kB 0 B
frontend/dist/info-J43DQDTF 348 B 0 B
frontend/dist/infoDiagram-5YYISTIA 1.32 kB 0 B
frontend/dist/ini 1.14 kB 0 B
frontend/dist/InsightQuickStart 5.67 kB 0 B
frontend/dist/InsightScene 34.6 kB 0 B
frontend/dist/IntegrationsRedirect 976 B 0 B
frontend/dist/intercom-integration.js 2.03 kB 0 B
frontend/dist/InviteSignup 15.2 kB 0 B
frontend/dist/ishikawaDiagram-YF4QCWOH 18 kB 0 B
frontend/dist/java 3.26 kB 0 B
frontend/dist/javascript 1.02 kB 0 B
frontend/dist/journeyDiagram-JHISSGLW 24 kB 0 B
frontend/dist/jsonMode 13.9 kB 0 B
frontend/dist/julia 7.26 kB 0 B
frontend/dist/kanban-definition-UN3LZRKU 21.2 kB 0 B
frontend/dist/katex 266 kB 0 B
frontend/dist/kotlin 3.44 kB 0 B
frontend/dist/lazy 146 kB 0 B
frontend/dist/LegacyPluginScene 20.9 kB 0 B
frontend/dist/LegalDocumentNewScene 59.6 kB 0 B
frontend/dist/LegalDocumentsScene 5.21 kB +34 B (+0.66%)
frontend/dist/LemonTextAreaMarkdown 740 B +34 B (+4.82%) 🔍
frontend/dist/less 3.93 kB 0 B
frontend/dist/lexon 2.47 kB 0 B
frontend/dist/lib 2.25 kB 0 B
frontend/dist/Link 733 B 0 B
frontend/dist/LinkScene 25.1 kB 0 B
frontend/dist/LinksScene 4.4 kB 0 B
frontend/dist/liquid 4.57 kB 0 B
frontend/dist/LiveDebugger 19.3 kB -36 B (-0.19%)
frontend/dist/LiveEventsTable 5.47 kB 0 B
frontend/dist/LLMAnalyticsClusterScene 21.5 kB 0 B
frontend/dist/LLMAnalyticsClustersScene 54.7 kB -35 B (-0.06%)
frontend/dist/LLMAnalyticsDatasetScene 20.7 kB 0 B
frontend/dist/LLMAnalyticsDatasetsScene 3.52 kB 0 B
frontend/dist/LLMAnalyticsEvaluation 59.7 kB 0 B
frontend/dist/LLMAnalyticsEvaluationsScene 28 kB +33 B (+0.12%)
frontend/dist/LLMAnalyticsPlaygroundScene 37.5 kB 0 B
frontend/dist/LLMAnalyticsScene 117 kB 0 B
frontend/dist/LLMAnalyticsSessionScene 13.6 kB -40 B (-0.29%)
frontend/dist/LLMAnalyticsTag 27.3 kB +35 B (+0.13%)
frontend/dist/LLMAnalyticsTagsScene 7.15 kB 0 B
frontend/dist/LLMAnalyticsTraceScene 130 kB +36 B (+0.03%)
frontend/dist/LLMAnalyticsUsers 730 B -34 B (-4.45%)
frontend/dist/LLMASessionFeedbackDisplay 5.08 kB 0 B
frontend/dist/LLMPromptScene 29 kB 0 B
frontend/dist/LLMPromptsScene 4.72 kB 0 B
frontend/dist/LLMSkillScene 793 B 0 B
frontend/dist/LLMSkillsScene 810 B 0 B
frontend/dist/Login 10.1 kB 0 B
frontend/dist/Login2FA 4.49 kB 0 B
frontend/dist/logs.js 38.9 kB 0 B
frontend/dist/LogsAlertDetailScene 17.2 kB +37 B (+0.22%)
frontend/dist/LogsSamplingDetailScene 5.04 kB 0 B
frontend/dist/LogsSamplingNewScene 2.15 kB 0 B
frontend/dist/LogsScene 17.7 kB 0 B
frontend/dist/lua 2.16 kB 0 B
frontend/dist/m3 2.85 kB 0 B
frontend/dist/main 819 kB 0 B
frontend/dist/ManagedMigration 14.8 kB 0 B
frontend/dist/markdown 3.83 kB 0 B
frontend/dist/MarketingAnalyticsScene 40.3 kB 0 B
frontend/dist/MaterializedColumns 11.8 kB 0 B
frontend/dist/Max 888 B 0 B
frontend/dist/mdx 5.43 kB 0 B
frontend/dist/memlens.lib.bundle 27.9 kB 0 B
frontend/dist/mermaid.core 28.5 kB 0 B
frontend/dist/MermaidDiagram 2.15 kB 0 B
frontend/dist/MessageTemplate 16.5 kB 0 B
frontend/dist/MetricsScene 1.08 kB 0 B
frontend/dist/mindmap-definition-RKZ34NQL 24.8 kB 0 B
frontend/dist/mips 2.62 kB 0 B
frontend/dist/ModelsScene 18.9 kB -35 B (-0.18%)
frontend/dist/MonacoDiffEditor 471 B 0 B
frontend/dist/monacoEditorWorker 288 kB 0 B
frontend/dist/monacoEditorWorker.js 288 kB 0 B
frontend/dist/monacoJsonWorker 419 kB 0 B
frontend/dist/monacoJsonWorker.js 419 kB 0 B
frontend/dist/monacoTsWorker 7.02 MB 0 B
frontend/dist/monacoTsWorker.js 7.02 MB 0 B
frontend/dist/MoveToPostHogCloud 4.7 kB 0 B
frontend/dist/msdax 4.95 kB 0 B
frontend/dist/mysql 11.3 kB 0 B
frontend/dist/NavTabChat 7.39 kB 0 B
frontend/dist/NewSourceScene 980 B 0 B
frontend/dist/NewTabScene 1.71 kB 0 B
frontend/dist/NodeDetailScene 16.9 kB +32 B (+0.19%)
frontend/dist/NotebookCanvasScene 3.54 kB 0 B
frontend/dist/NotebookPanel 5.51 kB 0 B
frontend/dist/NotebookScene 8.75 kB 0 B
frontend/dist/NotebooksScene 7.83 kB 0 B
frontend/dist/OAuthAuthorize 878 B 0 B
frontend/dist/objective-c 2.44 kB 0 B
frontend/dist/Onboarding 790 kB 0 B
frontend/dist/OnboardingCouponRedemption 1.44 kB 0 B
frontend/dist/packet-YPE3B663 354 B 0 B
frontend/dist/pascal 3.03 kB 0 B
frontend/dist/pascaligo 2.04 kB 0 B
frontend/dist/passkeyLogic 688 B 0 B
frontend/dist/PasswordReset 4.6 kB 0 B
frontend/dist/PasswordResetComplete 3.23 kB 0 B
frontend/dist/PendingDeletion 2.35 kB 0 B
frontend/dist/perl 8.29 kB 0 B
frontend/dist/PersonScene 18.5 kB 0 B
frontend/dist/PersonsScene 5.91 kB 0 B
frontend/dist/pgsql 13.5 kB 0 B
frontend/dist/php 8.06 kB 0 B
frontend/dist/pie-LRSECV5Y 345 B 0 B
frontend/dist/pieDiagram-4H26LBE5 4.92 kB 0 B
frontend/dist/PipelineStatusScene 9.34 kB 0 B
frontend/dist/pla 1.72 kB 0 B
frontend/dist/posthog 146 kB 0 B
frontend/dist/postiats 7.9 kB 0 B
frontend/dist/powerquery 17 kB 0 B
frontend/dist/powershell 3.31 kB 0 B
frontend/dist/PreflightCheck 5.81 kB 0 B
frontend/dist/product-tours.js 115 kB 0 B
frontend/dist/ProductTour 275 kB 0 B
frontend/dist/ProductTours 4.92 kB 0 B
frontend/dist/ProjectHomepage 19.9 kB 0 B
frontend/dist/protobuf 9.09 kB 0 B
frontend/dist/pug 4.86 kB 0 B
frontend/dist/python 4.8 kB 0 B
frontend/dist/qsharp 3.23 kB 0 B
frontend/dist/quadrantDiagram-W4KKPZXB 34.4 kB 0 B
frontend/dist/QueryPerformance 8.86 kB 0 B
frontend/dist/r 3.16 kB 0 B
frontend/dist/radar-GUYGQ44K 351 B 0 B
frontend/dist/razor 9.38 kB 0 B
frontend/dist/react-json-view 121 kB 0 B
frontend/dist/recorder-v2.js 98.6 kB 0 B
frontend/dist/recorder.js 98.6 kB 0 B
frontend/dist/redis 3.59 kB 0 B
frontend/dist/redshift 11.8 kB 0 B
frontend/dist/RegionMap 29.6 kB -34 B (-0.11%)
frontend/dist/render-query 26.5 MB 0 B
frontend/dist/render-query.js 26.5 MB 0 B
frontend/dist/ReplayLens 21.7 kB 0 B
frontend/dist/ReplayLensesScene 12.1 kB 0 B
frontend/dist/requirementDiagram-4Y6WPE33 31.9 kB 0 B
frontend/dist/ResourceTransfer 9.42 kB 0 B
frontend/dist/restructuredtext 3.94 kB 0 B
frontend/dist/RevenueAnalyticsScene 25.8 kB 0 B
frontend/dist/ruby 8.54 kB 0 B
frontend/dist/rust 4.2 kB 0 B
frontend/dist/sankeyDiagram-5OEKKPKP 24 kB 0 B
frontend/dist/SavedInsights 902 B 0 B
frontend/dist/sb 1.86 kB 0 B
frontend/dist/scala 7.36 kB 0 B
frontend/dist/schema 722 kB 0 B
frontend/dist/SchemaScene 23.8 kB 0 B
frontend/dist/scheme 1.8 kB 0 B
frontend/dist/scss 6.45 kB 0 B
frontend/dist/SdkDoctorScene 9.66 kB 0 B
frontend/dist/sequenceDiagram-3UESZ5HK 117 kB 0 B
frontend/dist/SessionAttributionExplorerScene 6.87 kB 0 B
frontend/dist/SessionGroupSummariesTable 4.87 kB 0 B
frontend/dist/SessionGroupSummaryScene 19.1 kB -29 B (-0.15%)
frontend/dist/SessionProfileScene 15.3 kB 0 B
frontend/dist/SessionRecordingDetail 2 kB 0 B
frontend/dist/SessionRecordingFilePlaybackScene 4.71 kB 0 B
frontend/dist/SessionRecordings 980 B 0 B
frontend/dist/SessionRecordingsKiosk 10.2 kB 0 B
frontend/dist/SessionRecordingsPlaylistScene 5.28 kB 0 B
frontend/dist/SessionRecordingsSettingsScene 2.17 kB 0 B
frontend/dist/SessionsScene 4.22 kB 0 B
frontend/dist/SettingsScene 3.36 kB 0 B
frontend/dist/sharedChunkAnchors 1.15 kB 0 B
frontend/dist/sharedChunkAnchors.js 1.15 kB 0 B
frontend/dist/SharedMetric 6.03 kB 0 B
frontend/dist/SharedMetrics 787 B 0 B
frontend/dist/shell 3.11 kB 0 B
frontend/dist/SignupContainer 28.4 kB 0 B
frontend/dist/Site 1.43 kB 0 B
frontend/dist/solidity 18.6 kB 0 B
frontend/dist/sophia 2.8 kB 0 B
frontend/dist/SourceScene 928 B 0 B
frontend/dist/SourcesScene 6.17 kB 0 B
frontend/dist/sparql 2.59 kB 0 B
frontend/dist/sql 10.3 kB 0 B
frontend/dist/SqlVariableEditScene 7.49 kB 0 B
frontend/dist/st 7.44 kB 0 B
frontend/dist/StartupProgram 21.4 kB 0 B
frontend/dist/stateDiagram-AJRCARHV 11.3 kB 0 B
frontend/dist/stateDiagram-v2-BHNVJYJU 1.18 kB 0 B
frontend/dist/StripeConfirmInstall 3.78 kB 0 B
frontend/dist/SubscriptionScene 14.4 kB 0 B
frontend/dist/SubscriptionsScene 5.42 kB 0 B
frontend/dist/SupportSettingsScene 1.68 kB -35 B (-2.05%)
frontend/dist/SupportTicketScene 33.8 kB 0 B
frontend/dist/SupportTicketsScene 971 B +34 B (+3.63%)
frontend/dist/Survey 1.12 kB 0 B
frontend/dist/SurveyFormBuilder 1.78 kB 0 B
frontend/dist/Surveys 26.5 kB 0 B
frontend/dist/surveys.js 94.7 kB 0 B
frontend/dist/SurveyWizard 73 kB 0 B
frontend/dist/swift 5.3 kB 0 B
frontend/dist/SystemStatus 17.3 kB 0 B
frontend/dist/systemverilog 7.65 kB 0 B
frontend/dist/TaskDetailScene 23.3 kB +35 B (+0.15%)
frontend/dist/TaskTracker 14.5 kB +37 B (+0.26%)
frontend/dist/tcl 3.61 kB 0 B
frontend/dist/TextCardMarkdownEditor 11.2 kB 0 B
frontend/dist/timeline-definition-PNZ67QCA 31.3 kB 0 B
frontend/dist/toolbar 14.9 MB 0 B
frontend/dist/toolbar.js 14.9 MB 0 B
frontend/dist/ToolbarLaunch 2.71 kB 0 B
frontend/dist/tracing-headers.js 1.74 kB 0 B
frontend/dist/TracingScene 53.9 kB 0 B
frontend/dist/treemap-LRROVOQU 357 B 0 B
frontend/dist/treeView-BLDUP644 360 B 0 B
frontend/dist/TrendsBarChart 6.84 kB 0 B
frontend/dist/TrendsLineChart 6.8 kB 0 B
frontend/dist/tsMode 24 kB 0 B
frontend/dist/twig 6.01 kB 0 B
frontend/dist/TwoFactorReset 4.26 kB 0 B
frontend/dist/typescript 274 B 0 B
frontend/dist/typespec 2.86 kB 0 B
frontend/dist/Unsubscribe 1.9 kB 0 B
frontend/dist/UserInterview 6.25 kB 0 B
frontend/dist/UserInterviewResponse 5.57 kB 0 B
frontend/dist/UserInterviews 4.04 kB 0 B
frontend/dist/vb 5.83 kB 0 B
frontend/dist/vennDiagram-CIIHVFJN 41.6 kB 0 B
frontend/dist/VercelConnect 5.23 kB 0 B
frontend/dist/VercelLinkError 2.5 kB 0 B
frontend/dist/VerifyEmail 5.02 kB 0 B
frontend/dist/vimMode 211 kB 0 B
frontend/dist/VisualReviewIndexScene 2.41 kB -35 B (-1.43%)
frontend/dist/VisualReviewRunScene 44.6 kB 0 B
frontend/dist/VisualReviewRunsScene 7.21 kB +37 B (+0.52%)
frontend/dist/VisualReviewSettingsScene 11 kB -34 B (-0.31%)
frontend/dist/VisualReviewSnapshotHistoryScene 13.8 kB 0 B
frontend/dist/VisualReviewSnapshotOverviewScene 19.4 kB 0 B
frontend/dist/wardley-L42UT6IY 352 B 0 B
frontend/dist/wardleyDiagram-YWT4CUSO 26.2 kB 0 B
frontend/dist/web-vitals-with-attribution.js 11.8 kB 0 B
frontend/dist/web-vitals.js 6.39 kB 0 B
frontend/dist/WebAnalyticsScene 9.79 kB 0 B
frontend/dist/WebGLRenderer-DYjOwNoG 60.4 kB 0 B
frontend/dist/WebGPURenderer-B_wkl_Ja 36.3 kB 0 B
frontend/dist/WebScriptsScene 2.78 kB 0 B
frontend/dist/WebVitals 7.41 kB +34 B (+0.46%)
frontend/dist/WebVitalsPathBreakdown 3.86 kB 0 B
frontend/dist/webworkerAll-puPV1rBA 397 B 0 B
frontend/dist/wgsl 7.38 kB 0 B
frontend/dist/Wizard 4.7 kB 0 B
frontend/dist/WorkflowsScene 60 kB 0 B
frontend/dist/WorldMap 1.04 MB 0 B
frontend/dist/xml 3.02 kB 0 B
frontend/dist/xychartDiagram-2RQKCTM6 39.6 kB 0 B
frontend/dist/yaml 4.64 kB 0 B

compressed-size-action

Comment thread products/signals/backend/views.py Outdated
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adds a project-nested DRF viewset to list/retrieve signal report artefacts and to allow PUT full-replacement edits of only the suggested_reviewers artefact type (keeping other artefact types immutable to preserve the agentic pipeline contract). It also regenerates the OpenAPI-derived frontend/MCP clients and introduces a comprehensive backend test suite for the new endpoint behavior.

Changes:

  • Added SignalReportArtefactViewSet under /api/projects/<team>/signals/reports/<report_id>/artefacts/ with GET list/retrieve and PUT update (type-guarded to suggested_reviewers only).
  • Introduced write serializers for suggested reviewer entries + PUT body, and enriched OpenAPI help text for generated clients.
  • Added a new backend test module covering replacement semantics, identity resolution, dedupe/idempotency, scoping, and method restrictions; regenerated TS/Zod/MCP API types.

Reviewed changes

Copilot reviewed 5 out of 8 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
services/mcp/src/api/generated.ts Regenerated MCP API types to include artefact schemas and list params.
products/signals/frontend/generated/api.zod.ts Added Zod schemas for the new PUT body.
products/signals/frontend/generated/api.ts Added generated client functions for artefacts list/retrieve/update.
products/signals/frontend/generated/api.schemas.ts Added generated TS types for artefacts + paginated list response + write payload.
products/signals/backend/views.py Replaced the old report artefacts action with a nested artefact viewset and implemented PUT update logic.
products/signals/backend/test/test_signal_report_artefact_api.py New unit tests validating new endpoint behavior and invariants.
products/signals/backend/serializers.py Added help_text to read serializer + new write serializers for PUT.
posthog/api/init.py Registered the new nested artefacts viewset under signal reports routing.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread products/signals/backend/views.py Outdated
@github-actions
Copy link
Copy Markdown
Contributor

MCP UI Apps size report

App JS CSS
debug 474.9 KB 139.1 KB
action 349.4 KB 139.1 KB
action-list 357.2 KB 139.1 KB
cohort 348.5 KB 139.1 KB
cohort-list 356.2 KB 139.1 KB
error-details 369.9 KB 139.1 KB
error-issue 349.2 KB 139.1 KB
error-issue-list 357.2 KB 139.1 KB
experiment 353.7 KB 139.1 KB
experiment-list 358.0 KB 139.1 KB
experiment-results 355.8 KB 139.1 KB
feature-flag 434.3 KB 139.1 KB
feature-flag-list 438.8 KB 139.1 KB
feature-flag-testing 427.2 KB 139.1 KB
insight-actors 352.3 KB 139.1 KB
llm-costs 351.9 KB 139.1 KB
session-recording 350.2 KB 139.1 KB
session-summary 356.2 KB 139.1 KB
survey 350.0 KB 139.1 KB
survey-global-stats 354.8 KB 139.1 KB
survey-list 357.9 KB 139.1 KB
survey-stats 354.8 KB 139.1 KB
trace-span 348.8 KB 139.1 KB
trace-span-list 357.1 KB 139.1 KB
workflow 348.8 KB 139.1 KB
workflow-list 356.6 KB 139.1 KB
query-results 370.6 KB 139.1 KB

Match the surrounding signals viewset pattern: exclude=True per-method
rather than per-method schema overrides. Drop the redundant retrieve()
override and get_serializer_class() — the inherited mixin handles
retrieve, and update() instantiates the write serializer locally.
Regenerated frontend/MCP types accordingly.

Generated-By: PostHog Code
Task-Id: 4b273054-e446-41d6-b4c0-bac3bd4cb309
The bot added these when the viewset's update/list/retrieve were in
the OpenAPI spec. After the simplification commit they no longer are,
so the references are dangling. Removing them keeps the yaml honest.

Generated-By: PostHog Code
Task-Id: 4b273054-e446-41d6-b4c0-bac3bd4cb309
@veria-ai
Copy link
Copy Markdown

veria-ai Bot commented May 21, 2026

PR overview

Suggested-reviewer artefact API added

This PR moves report artefacts onto a nested viewset and adds a PUT path for replacing suggested-reviewer content. I checked the new route registration, queryset scoping, API-scope enforcement, deleted-report handling, and user/GitHub identity resolution; the endpoint stays team-scoped and limits writes to the intended artefact type.

Security review

  • No new security issues were flagged in the latest review.
  • 1 previously flagged issue(s) appear fixed in the latest changes.
  • No review issues remain open on this pull request.

Risk: 2/10

Comment thread products/signals/backend/views.py Outdated
- Exclude artefacts whose parent report is deleted: SignalReportViewSet
  filters DELETED reports from its queryset, so the old @action-based
  artefacts endpoint 404'd on deleted reports. The new nested viewset
  has to mirror that, otherwise a known UUID would bypass deletion.
- Preserve the distinction between "github_name omitted" and
  "github_name explicitly empty" in PUT, so clients can clear a
  previously stored name. Previously `or None` collapsed both cases
  and silently carried over the prior value.
- Drop dead `other_org` test variable and rename the test to match
  what it actually verifies (random UUID not in any org).

Generated-By: PostHog Code
Task-Id: 4b273054-e446-41d6-b4c0-bac3bd4cb309
Copy link
Copy Markdown
Member

@Twixes Twixes left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Did not take a hard look at the tests… but PUT mechanism and API implementation all rock solid.

Where's the Code PR?

@Twixes Twixes merged commit 810b6ea into master May 27, 2026
216 checks passed
@Twixes Twixes deleted the posthog-code/expose-suggested-reviewers-api branch May 27, 2026 08:28
@deployment-status-posthog
Copy link
Copy Markdown

deployment-status-posthog Bot commented May 27, 2026

Deploy status

Environment Status Deployed At Workflow
dev ✅ Deployed 2026-05-27 08:59 UTC Run
prod-us ✅ Deployed 2026-05-27 09:22 UTC Run
prod-eu ✅ Deployed 2026-05-27 09:26 UTC Run

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