Skip to content

feat(tasks): expose resume-chain presigned log urls on run detail - #71394

Closed
charlesvien wants to merge 3 commits into
masterfrom
feat/task-run-chain-log-urls
Closed

feat(tasks): expose resume-chain presigned log urls on run detail#71394
charlesvien wants to merge 3 commits into
masterfrom
feat/task-run-chain-log-urls

Conversation

@charlesvien

@charlesvien charlesvien commented Jul 16, 2026

Copy link
Copy Markdown
Member

Problem

Clients bootstrap a task run's session history through the paginated session_logs/ endpoint. Every page re-downloads the run's entire log chain from S3 and re-parses every JSONL line just to slice out ~2 MB, so one cold load of a run with N bytes of history costs O(N²). Once a single page crosses the client's fetch timeout, the run becomes unloadable: retry restarts at offset 0 and dies the same way.

The run detail response already exposes a presigned log_url, but only for the run's own log, not its resume ancestors, so clients can't fetch the full history from object storage directly.

Changes

  • Add log_urls to the run detail response: presigned S3 URLs for every JSONL log in the run's resume chain, oldest first, cached the same way as log_url.
  • Returns an empty list when presigning is unavailable so clients can fall back to session_logs/.
  • Regenerated OpenAPI types.

The PostHog Code client prefers downloading history straight from these URLs and keeps the paginated endpoint as fallback (PostHog/code#3489), which also preserves compatibility for old clients.

How did you test this code?

Added API tests to TestTaskRunAPI: a chainless run returns exactly its own presigned log URL, a resumed run returns the chain oldest first, and presigning being unavailable yields an empty list instead of a 500. All three pass locally via hogli test. ruff and hogli ci:preflight --fix are clean. I did not test against a live deployment.

Automatic notifications

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

Docs update

N/A

🤖 Agent context

Autonomy: Human-driven (agent-assisted)

Authored by Claude Code (directed by @charlesvien) while debugging why very long-running cloud task runs fail to load their history in PostHog Code. The investigation traced the failure to session_logs doing a full chain read and full JSONL parse per page. We chose presigned chain URLs over byte-cursor ranged pagination in the endpoint because the presigned log_url pattern already exists on run detail and this removes Django from the history byte path entirely. A follow-up should address the append_log full read-modify-write on the write path. Skills used: /improving-drf-endpoints and /writing-tests (read as repo skill files).

@charlesvien charlesvien self-assigned this Jul 16, 2026
@github-actions

github-actions Bot commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

🤖 CI report

⚠️ Bundle size — 🔺 +90 B (+0.0%)

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

Total: 64.77 MiB · 🔺 +90 B (+0.0%)

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.22 MiB · 22 files no change ███░░░░░░░ 28.4% of 4.29 MiB
authenticated shell (every logged-in page)
src/scenes/AuthenticatedShell.tsx
8.13 MiB · 2,978 files 🔺 +30 B (+0.0%) █████████░ 87.9% of 9.25 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
281.3 KiB ../node_modules/.pnpm/posthog-js@1.402.3/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
222.9 KiB ../node_modules/.pnpm/posthog-js@1.402.3/node_modules/posthog-js/dist/module.js
164.0 KiB src/queries/validators.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.8 KiB src/lib/api.ts
93.3 KiB ../node_modules/.pnpm/prosemirror-view@1.40.1/node_modules/prosemirror-view/dist/index.js
92.7 KiB ../packages/quill/packages/quill/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

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

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

Total: 1312.62 MiB · 🔺 +131.0 KiB (+0.0%)

@trunk-io

trunk-io Bot commented Jul 16, 2026

Copy link
Copy Markdown

Static BadgeStatic BadgeStatic BadgeStatic Badge

View Full Report ↗︎Docs

@charlesvien

Copy link
Copy Markdown
Member Author

@greptileai

@greptile-apps

greptile-apps Bot commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

Reviews (1): Last reviewed commit: "Merge remote-tracking branch 'origin/mas..." | Re-trigger Greptile

Comment thread products/tasks/backend/facade/api.py Outdated
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.

1 participant