Skip to content

feat(selfhost): add PostHog error tracking as a parallel sink alongside Sentry#8607

Merged
loopover-orb[bot] merged 1 commit into
mainfrom
claude/posthog-orb-selfhost-error-tracking
Jul 25, 2026
Merged

feat(selfhost): add PostHog error tracking as a parallel sink alongside Sentry#8607
loopover-orb[bot] merged 1 commit into
mainfrom
claude/posthog-orb-selfhost-error-tracking

Conversation

@JSONbored

Copy link
Copy Markdown
Owner

Summary

  • Adds src/selfhost/posthog.ts as a full parallel error-tracking sink alongside src/selfhost/sentry.ts, exposing the same capture surface: capturePostHogError, capturePostHogReviewFailure, structured-log forwarding, and cron-monitor heartbeats (orb_monitor_heartbeat, since PostHog has no native check-in product).
  • Extracts the shared, security-critical redaction logic both sinks depend on into src/selfhost/redaction-scrub.ts (zero behavior change to Sentry — its 82 existing tests pass unchanged against the extracted version).
  • Wires PostHog capture into every existing Sentry call site: server boot/shutdown, both queue implementations (pg + sqlite), all 5 scheduled-job monitors (via a new withBothMonitors helper), review-orchestration failures, and agent-action-executor failures.
  • Fully opt-in and parallel-run: unset POSTHOG_API_KEY → no-op, posthog-node only dynamically imported when configured. Sentry is untouched; both sinks run simultaneously until the epic's gated decommission (Sentry decommission: gated cutover checklist across all six surfaces #8298) says otherwise.
  • Docs: new "Enabling PostHog error tracking" section in self-hosting-operations.mdx, plus a drift-guard test mirroring the existing Sentry one.

Closes #8287

Test plan

  • npm run typecheck clean
  • npx vitest run test/unit/selfhost-posthog.test.ts test/unit/selfhost-sentry.test.ts test/unit/docs-selfhost-posthog-observability.test.ts test/unit/docs-selfhost-sentry-observability.test.ts — 151/151 passing
  • npm run test:ci — full suite green (one pre-existing, unrelated failure confirmed present on main independent of this branch: mcp-cli-profiles.test.ts's changelog-JSON test, tracked separately)
  • npm run selfhost:env-reference:check clean
  • npm run cf-typegen:check clean

…de Sentry

Adds src/selfhost/posthog.ts, mirroring sentry.ts's capture surface
(capturePostHogError, capturePostHogReviewFailure, structured-log
forwarding, cron-monitor heartbeats) and wires it into every existing
Sentry call site across the self-host server, queues, and monitors.
Extracts the shared redaction primitives both sinks now depend on into
src/selfhost/redaction-scrub.ts so the security-critical scrubbing logic
isn't duplicated. Runs opt-in and fully parallel with Sentry per the
epic's gated decommission plan (#8298) -- Sentry is untouched here.

Closes #8287
@cloudflare-workers-and-pages

Copy link
Copy Markdown

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Preview URL Updated (UTC)
✅ Deployment successful!
View logs
loopover-ui a7b49b2 Commit Preview URL

Branch Preview URL
Jul 25 2026, 07:07 AM

@codecov

codecov Bot commented Jul 25, 2026

Copy link
Copy Markdown

Bundle Report

Changes will increase total bundle size by 5.92kB (0.08%) ⬆️. This is within the configured threshold ✅

Detailed changes
Bundle name Size Change
loopover-ui 7.42MB 5.92kB (0.08%) ⬆️

Affected Assets, Files, and Routes:

view changes for bundle: loopover-ui

Assets Changed:

Asset Name Size Change Total Size Change (%)
assets/add-scalar-classes-si2frfD3.js (New) 2.17MB 2.17MB 100.0% 🚀
assets/tanstack-vendor-texZZKiw.js (New) 738.33kB 738.33kB 100.0% 🚀
assets/docs.fumadocs-spike-api-reference-yeMDCMfe.js (New) 442.92kB 442.92kB 100.0% 🚀
assets/AgentScalarChatInterface.vue-COyTGQ6r.js (New) 201.71kB 201.71kB 100.0% 🚀
assets/modal-DsplC37l.js (New) 184.38kB 184.38kB 100.0% 🚀
assets/client-CiqlpHR1.js (New) 146.06kB 146.06kB 100.0% 🚀
assets/self-hosting-operations-A97yi6_M.js (New) 134.78kB 134.78kB 100.0% 🚀
assets/self-hosting-configuration-ufMfmgMA.js (New) 100.13kB 100.13kB 100.0% 🚀
assets/maintainer-panel-CKvbCzBK.js (New) 78.99kB 78.99kB 100.0% 🚀
assets/ui-vendor-I2DbL7VS.js (New) 57.04kB 57.04kB 100.0% 🚀
assets/routes-C3BXAvw5.js (New) 34.98kB 34.98kB 100.0% 🚀
assets/owner-panel-JiuOPQXI.js (New) 27.46kB 27.46kB 100.0% 🚀
assets/app-D7cCVV37.js (New) 25.95kB 25.95kB 100.0% 🚀
assets/app.runs-DxIaNlbh.js (New) 23.56kB 23.56kB 100.0% 🚀
assets/miner-panel-J1OhdP74.js (New) 20.28kB 20.28kB 100.0% 🚀
assets/api._op-CT9qX4N8.js (New) 17.57kB 17.57kB 100.0% 🚀
assets/self-hosting-docs-audit-BRkqjdPO.js (New) 16.61kB 16.61kB 100.0% 🚀
assets/app.index-BU6NQFHH.js (New) 15.62kB 15.62kB 100.0% 🚀
assets/docs._slug-gGjouk07.js (New) 15.37kB 15.37kB 100.0% 🚀
assets/playground-panel-ZbvoaEpM.js (New) 14.49kB 14.49kB 100.0% 🚀
assets/fairness-BY6KlnHg.js (New) 10.6kB 10.6kB 100.0% 🚀
assets/app.audit-CA83nSI9.js (New) 10.11kB 10.11kB 100.0% 🚀
assets/app.config-generator-C_VyRlpg.js (New) 10.09kB 10.09kB 100.0% 🚀
assets/maintainers-CXVe4_s6.js (New) 8.09kB 8.09kB 100.0% 🚀
assets/miners-BcQETfv2.js (New) 7.91kB 7.91kB 100.0% 🚀
assets/agents-AY8XsOpl.js (New) 7.8kB 7.8kB 100.0% 🚀
assets/commands-panel-BLQlFi-b.js (New) 6.65kB 6.65kB 100.0% 🚀
assets/roadmap-DLITUTsh.js (New) 6.52kB 6.52kB 100.0% 🚀
assets/maintainer-workflow-Cq_9JV6x.js (New) 6.52kB 6.52kB 100.0% 🚀
assets/digest-panel-D3aslXfA.js (New) 6.18kB 6.18kB 100.0% 🚀
assets/repos._owner._repo.quality-BTsIK7OK.js (New) 6.14kB 6.14kB 100.0% 🚀
assets/docs-nav-DAsAOPjc.js (New) 5.95kB 5.95kB 100.0% 🚀
assets/docs.index-BATgnySw.js (New) 5.95kB 5.95kB 100.0% 🚀
assets/api.index-CixbEzlJ.js (New) 4.7kB 4.7kB 100.0% 🚀
assets/docs-1EgglJDU.js (New) 2.7kB 2.7kB 100.0% 🚀
assets/api-B1yR2W-m.js (New) 2.69kB 2.69kB 100.0% 🚀
assets/docs-page-BBuMr_vV.js (New) 2.1kB 2.1kB 100.0% 🚀
assets/table-CAlSLJUL.js (New) 1.75kB 1.75kB 100.0% 🚀
assets/app.workbench-DNvg-qQm.js (New) 1.58kB 1.58kB 100.0% 🚀
assets/tooltip-Kxb0MkhQ.js (New) 1.47kB 1.47kB 100.0% 🚀
assets/session-BpMp-j_D.js (New) 1.45kB 1.45kB 100.0% 🚀
assets/tabs-DM_ROXve.js (New) 1.39kB 1.39kB 100.0% 🚀
assets/app.repos-DkyPrcYo.js (New) 1.07kB 1.07kB 100.0% 🚀
assets/input-dE8F0Tzt.js (New) 796 bytes 796 bytes 100.0% 🚀
assets/file-cog-CYQjqGgO.js (New) 758 bytes 758 bytes 100.0% 🚀
assets/app.maintainer-j3O1fjpw.js (New) 502 bytes 502 bytes 100.0% 🚀
assets/sparkles-UvCcz_vG.js (New) 494 bytes 494 bytes 100.0% 🚀
assets/app.owner-D8_xBxYT.js (New) 474 bytes 474 bytes 100.0% 🚀
assets/app.commands-Dz4uyO8i.js (New) 455 bytes 455 bytes 100.0% 🚀
assets/app.playground-BlmNxgDQ.js (New) 442 bytes 442 bytes 100.0% 🚀
assets/index-BVFdA9Pf.js (New) 438 bytes 438 bytes 100.0% 🚀
assets/app.digest-BQp_tfLo.js (New) 430 bytes 430 bytes 100.0% 🚀
assets/eye-off-BoeYfiht.js (New) 430 bytes 430 bytes 100.0% 🚀
assets/app.miner-BYlVNBfE.js (New) 422 bytes 422 bytes 100.0% 🚀
assets/key-round-dSer6wl7.js (New) 355 bytes 355 bytes 100.0% 🚀
assets/bot-B-lN8WRl.js (New) 328 bytes 328 bytes 100.0% 🚀
assets/trash-2-uOSVD9j3.js (New) 328 bytes 328 bytes 100.0% 🚀
assets/save-DsPrPEol.js (New) 327 bytes 327 bytes 100.0% 🚀
assets/git-pull-request-arrow-DalxAOha.js (New) 321 bytes 321 bytes 100.0% 🚀
assets/wrench-D5w5v2wx.js (New) 303 bytes 303 bytes 100.0% 🚀
assets/list-checks-BCOZ8qhN.js (New) 279 bytes 279 bytes 100.0% 🚀
assets/workflow-f3_eoew3.js (New) 265 bytes 265 bytes 100.0% 🚀
assets/compass-DSAzShSS.js (New) 251 bytes 251 bytes 100.0% 🚀
assets/history-s1upYGaQ.js (New) 237 bytes 237 bytes 100.0% 🚀
assets/activity-BVee2LpE.js (New) 234 bytes 234 bytes 100.0% 🚀
assets/message-square-qDcmxswG.js (New) 233 bytes 233 bytes 100.0% 🚀
assets/lock-t0z57JFE.js (New) 206 bytes 206 bytes 100.0% 🚀
assets/rotate-cw-CKlfMdl3.js (New) 201 bytes 201 bytes 100.0% 🚀
assets/play-Bz2C81_0.js (New) 190 bytes 190 bytes 100.0% 🚀
assets/circle-check-DVjv4YRr.js (New) 178 bytes 178 bytes 100.0% 🚀
assets/search-Bqoi0VXq.js (New) 174 bytes 174 bytes 100.0% 🚀
assets/circle-CnbvF2IB.js (New) 130 bytes 130 bytes 100.0% 🚀
assets/add-scalar-classes-CZPVOTyb.js (Deleted) -2.17MB 0 bytes -100.0% 🗑️
assets/tanstack-vendor-BKGCjKXg.js (Deleted) -738.33kB 0 bytes -100.0% 🗑️
assets/docs.fumadocs-spike-api-reference-Dw6L84qc.js (Deleted) -442.92kB 0 bytes -100.0% 🗑️
assets/AgentScalarChatInterface.vue-DrJ37XcR.js (Deleted) -201.71kB 0 bytes -100.0% 🗑️
assets/modal-CBfCo-1E.js (Deleted) -184.38kB 0 bytes -100.0% 🗑️
assets/client-lSBGpUQ_.js (Deleted) -146.06kB 0 bytes -100.0% 🗑️
assets/self-hosting-operations-Da_bjBO-.js (Deleted) -128.95kB 0 bytes -100.0% 🗑️
assets/self-hosting-configuration-Bj3rAeJY.js (Deleted) -100.04kB 0 bytes -100.0% 🗑️
assets/maintainer-panel-DWyZNmrF.js (Deleted) -78.99kB 0 bytes -100.0% 🗑️
assets/ui-vendor-CNhNmGSl.js (Deleted) -57.04kB 0 bytes -100.0% 🗑️
assets/routes-RDGwuQw9.js (Deleted) -34.98kB 0 bytes -100.0% 🗑️
assets/owner-panel-qMGmPZx-.js (Deleted) -27.46kB 0 bytes -100.0% 🗑️
assets/app-BemnA3yi.js (Deleted) -25.95kB 0 bytes -100.0% 🗑️
assets/app.runs-DcXnTtlM.js (Deleted) -23.56kB 0 bytes -100.0% 🗑️
assets/miner-panel-CgO4ThN8.js (Deleted) -20.28kB 0 bytes -100.0% 🗑️
assets/api._op-C_MaA-wK.js (Deleted) -17.57kB 0 bytes -100.0% 🗑️
assets/self-hosting-docs-audit-BIsuno2_.js (Deleted) -16.61kB 0 bytes -100.0% 🗑️
assets/app.index-CHTPleuV.js (Deleted) -15.62kB 0 bytes -100.0% 🗑️
assets/docs._slug-CI9ZEcYm.js (Deleted) -15.37kB 0 bytes -100.0% 🗑️
assets/playground-panel-DJ00oKEl.js (Deleted) -14.49kB 0 bytes -100.0% 🗑️
assets/fairness-CqccyvtM.js (Deleted) -10.6kB 0 bytes -100.0% 🗑️
assets/app.audit-XUGeAAjh.js (Deleted) -10.11kB 0 bytes -100.0% 🗑️
assets/app.config-generator-DG9AyC6m.js (Deleted) -10.09kB 0 bytes -100.0% 🗑️
assets/maintainers-Cos070da.js (Deleted) -8.09kB 0 bytes -100.0% 🗑️
assets/miners-bpkGSS7A.js (Deleted) -7.91kB 0 bytes -100.0% 🗑️
assets/agents-CQZ7fnyE.js (Deleted) -7.8kB 0 bytes -100.0% 🗑️
assets/commands-panel-DV2oEdQa.js (Deleted) -6.65kB 0 bytes -100.0% 🗑️
assets/roadmap-BYhpXTh_.js (Deleted) -6.52kB 0 bytes -100.0% 🗑️
assets/maintainer-workflow-BTd7A7OB.js (Deleted) -6.52kB 0 bytes -100.0% 🗑️
assets/digest-panel-BoWazaxM.js (Deleted) -6.18kB 0 bytes -100.0% 🗑️
assets/repos._owner._repo.quality-DB6aXo1b.js (Deleted) -6.14kB 0 bytes -100.0% 🗑️
assets/docs-nav-DSGbpQWF.js (Deleted) -5.95kB 0 bytes -100.0% 🗑️
assets/docs.index-DS5YW9oJ.js (Deleted) -5.95kB 0 bytes -100.0% 🗑️
assets/api.index-CycYNhkq.js (Deleted) -4.7kB 0 bytes -100.0% 🗑️
assets/docs-DI8TVAtP.js (Deleted) -2.7kB 0 bytes -100.0% 🗑️
assets/api-DL_Z5MRx.js (Deleted) -2.69kB 0 bytes -100.0% 🗑️
assets/docs-page-zm1OqeOD.js (Deleted) -2.1kB 0 bytes -100.0% 🗑️
assets/table-BWnn2Ncl.js (Deleted) -1.75kB 0 bytes -100.0% 🗑️
assets/app.workbench-BXlzMNqO.js (Deleted) -1.58kB 0 bytes -100.0% 🗑️
assets/tooltip-DY-VobdR.js (Deleted) -1.47kB 0 bytes -100.0% 🗑️
assets/session-DxAEr4eO.js (Deleted) -1.45kB 0 bytes -100.0% 🗑️
assets/tabs-C0x97Q8I.js (Deleted) -1.39kB 0 bytes -100.0% 🗑️
assets/app.repos-BxE0NWX9.js (Deleted) -1.07kB 0 bytes -100.0% 🗑️
assets/input-Du92O_bK.js (Deleted) -796 bytes 0 bytes -100.0% 🗑️
assets/file-cog-CZAzJitF.js (Deleted) -758 bytes 0 bytes -100.0% 🗑️
assets/app.maintainer-Cv_aKWDT.js (Deleted) -502 bytes 0 bytes -100.0% 🗑️
assets/sparkles-BvkMivz-.js (Deleted) -494 bytes 0 bytes -100.0% 🗑️
assets/app.owner-Cu_fTrtm.js (Deleted) -474 bytes 0 bytes -100.0% 🗑️
assets/app.commands-Cm92OV1e.js (Deleted) -455 bytes 0 bytes -100.0% 🗑️
assets/app.playground-yQAi1QFs.js (Deleted) -442 bytes 0 bytes -100.0% 🗑️
assets/index--h7_o8yI.js (Deleted) -438 bytes 0 bytes -100.0% 🗑️
assets/app.digest-BtwEy-Ic.js (Deleted) -430 bytes 0 bytes -100.0% 🗑️
assets/eye-off-BYkX84zY.js (Deleted) -430 bytes 0 bytes -100.0% 🗑️
assets/app.miner-B8z7U6P0.js (Deleted) -422 bytes 0 bytes -100.0% 🗑️
assets/key-round-RcKGz7Hj.js (Deleted) -355 bytes 0 bytes -100.0% 🗑️
assets/bot-87gfMdPK.js (Deleted) -328 bytes 0 bytes -100.0% 🗑️
assets/trash-2-BmCxxw4M.js (Deleted) -328 bytes 0 bytes -100.0% 🗑️
assets/save-BiK_lk8s.js (Deleted) -327 bytes 0 bytes -100.0% 🗑️
assets/git-pull-request-arrow-DWAHFhgo.js (Deleted) -321 bytes 0 bytes -100.0% 🗑️
assets/wrench-parlZqEZ.js (Deleted) -303 bytes 0 bytes -100.0% 🗑️
assets/list-checks-DjK1ihY5.js (Deleted) -279 bytes 0 bytes -100.0% 🗑️
assets/workflow-DaavQn1L.js (Deleted) -265 bytes 0 bytes -100.0% 🗑️
assets/compass-CIV_dmzz.js (Deleted) -251 bytes 0 bytes -100.0% 🗑️
assets/history-DZ4EE9fk.js (Deleted) -237 bytes 0 bytes -100.0% 🗑️
assets/activity-DQavApxI.js (Deleted) -234 bytes 0 bytes -100.0% 🗑️
assets/message-square-KRY3XYnc.js (Deleted) -233 bytes 0 bytes -100.0% 🗑️
assets/lock-CPjQ6v_W.js (Deleted) -206 bytes 0 bytes -100.0% 🗑️
assets/rotate-cw-CDn13AyQ.js (Deleted) -201 bytes 0 bytes -100.0% 🗑️
assets/play-h_i0Dn_d.js (Deleted) -190 bytes 0 bytes -100.0% 🗑️
assets/circle-check-CCU8zmid.js (Deleted) -178 bytes 0 bytes -100.0% 🗑️
assets/search-DSq0bur7.js (Deleted) -174 bytes 0 bytes -100.0% 🗑️
assets/circle-DcSfK13F.js (Deleted) -130 bytes 0 bytes -100.0% 🗑️

@JSONbored JSONbored self-assigned this Jul 25, 2026
@codecov

codecov Bot commented Jul 25, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 99.58848% with 1 line in your changes missing coverage. Please review.
✅ Project coverage is 92.00%. Comparing base (16dc507) to head (a7b49b2).
✅ All tests successful. No failed tests found.

Files with missing lines Patch % Lines
src/selfhost/posthog.ts 99.24% 0 Missing and 1 partial ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main    #8607      +/-   ##
==========================================
- Coverage   92.54%   92.00%   -0.55%     
==========================================
  Files         796      798       +2     
  Lines       79690    79850     +160     
  Branches    24066    24120      +54     
==========================================
- Hits        73749    73463     -286     
- Misses       4803     5311     +508     
+ Partials     1138     1076      -62     
Flag Coverage Δ
backend 92.95% <99.58%> (-0.77%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing lines Coverage Δ
src/queue/ai-review-orchestration.ts 100.00% <100.00%> (ø)
src/queue/processors.ts 95.66% <100.00%> (+<0.01%) ⬆️
src/selfhost/monitored-work.ts 100.00% <100.00%> (ø)
src/selfhost/redaction-scrub.ts 100.00% <100.00%> (ø)
src/selfhost/sentry.ts 99.08% <100.00%> (-0.24%) ⬇️
src/selfhost/sqlite-queue.ts 99.61% <100.00%> (+<0.01%) ⬆️
src/services/agent-action-executor.ts 97.28% <100.00%> (+0.02%) ⬆️
src/selfhost/posthog.ts 99.24% <99.24%> (ø)

... and 3 files with indirect coverage changes

@loopover-orb loopover-orb Bot added the gittensor:feature Gittensor-scored feature linked to a feature issue — scores a 0.25x multiplier. label Jul 25, 2026
@loopover-orb

loopover-orb Bot commented Jul 25, 2026

Copy link
Copy Markdown
Contributor

Tip

✅ LoopOver review result - approve/merge recommended

Review updated: 2026-07-25 07:23:36 UTC

15 files · 1 AI reviewer · no blockers · readiness 100/100 · CI green · clean

✅ Suggested Action - Approve/Merge

  • safe to merge

Review summary
This PR adds a fully parallel PostHog error-tracking sink alongside the existing Sentry integration, wiring it into every Sentry call site (server boot/shutdown, both queue implementations, scheduled monitors via a new withBothMonitors helper, review orchestration, and agent-action-executor) while extracting the shared redaction logic into redaction-scrub.ts with claimed zero-behavior-change to Sentry's existing 82 tests. The withBothMonitors composition in monitored-work.ts correctly runs the callback only once (PostHog wraps a thunk that itself invokes withSentryMonitor), avoiding double execution of the underlying work — a subtle but correctly-handled wiring detail. The extraction of redaction-scrub.ts appears mechanical and sentry.ts's own tests reportedly still pass unchanged, which is the right way to validate a zero-behavior-change refactor.

Nits — 6 non-blocking
  • src/selfhost/posthog.ts:103 (scrubPostHogEvent) swallows any scrub error by returning null, which silently drops the entire event instead of surfacing that redaction failed — matches sentry.ts's existing fail-closed pattern but is worth confirming that's the intended posture for PostHog too.
  • src/selfhost/posthog.ts hardcodes the default PostHog host `https:​//us.i.posthog.com` — consistent with src/mcp/telemetry.ts's existing default, but flagging for consistency awareness.
  • The pg-queue.ts and sqlite-queue.ts changes double-nest `withPostHogMonitor(..., () => withSentryMonitor(...))` for queue-dead-letter-revive specifically, diverging from the withBothMonitors helper used elsewhere in monitored-work.ts — worth a comment or using the shared helper for consistency.
  • Several magic numbers (depth caps of 6, summary line cap of 90 chars, max 5 fields) in posthog.ts/redaction-scrub.ts are unexplained inline literals mirrored from sentry.ts; naming them would help future maintainers, though this mirrors existing precedent.
  • Consider having the pg-queue/sqlite-queue dead-letter-revive sites use the same `withBothMonitors` helper introduced in monitored-work.ts instead of manually nesting withPostHogMonitor(withSentryMonitor(...)), for consistency and DRY.
  • PR author also opened the linked issue — Link an issue that was opened by a different contributor, or provide a rationale for why this self-authored issue represents genuine discovery work.

Decision drivers

  • ✅ Code review — No blockers (1 reviewer)
  • ✅ Gate result — Passing (No configured blocker found.)
Context & advisory signals — never blocks the verdict
Signal Result Evidence
Linked issue ✅ Linked #8287
Related work ✅ No active overlap found No same-issue or scoped active PR overlap found.
Change scope ✅ 20/20 Low review scope from cached public metadata (1 linked issue).
Validation posture ✅ 25/25 PR body includes validation/test evidence.
Contributor workload ✅ 10/10 Author activity: 13 registered-repo PR(s), 13 merged, 266 issue(s).
Contributor context ✅ Confirmed Gittensor contributor JSONbored; Gittensor profile; 13 PR(s), 266 issue(s).
Improvement ✅ Minor risk: clean · value: minor · LLM: moderate
Linked issue satisfaction

Addressed
The PR adds src/selfhost/posthog.ts implementing $exception capture via posthog-node with the full ported scrub pipeline (extracted into redaction-scrub.ts and reused unchanged by Sentry), preserves severity thresholds, wires structured-log forwarding and monitor heartbeats (orb_monitor_heartbeat) across all five monitors via withBothMonitors, keeps the sink lazily-imported and opt-in on POSTHOG_A

Review context
  • Author: JSONbored
  • Role context: owner (maintainer lane)
  • Public audience mode: oss maintainer
  • Lane context: Repository is configured for direct PR review.
  • Public profile languages: Python, TypeScript, Ruby, Go, MDX, Shell, Solidity, JavaScript
  • Official Gittensor activity: 13 PR(s), 266 issue(s).
  • PR-specific overlap: none found.
Contributor next steps
  • Start here: Treat this as maintainer-lane context rather than normal contributor-lane activity.
Signal definitions
  • Related work = same linked issue, overlapping active PRs, or title/path similarity.
  • Change scope = cached public metadata such as size labels, draft state, and review-burden hints.
  • Validation posture = whether the PR provides enough public validation/test evidence for maintainer review.
  • Contributor workload = public contributor activity and cleanup pressure, not a repo-wide quality failure.
  • Contributor context = public GitHub/Gittensor identity context; non-Gittensor status is not a blocker.
🧪 Chat with LoopOver

Ask LoopOver a question about this PR directly in a comment — grounded only in the same cached, public-safe facts shown above, never a new claim.

  • @loopover ask &lt;question&gt; answers contribution-quality Q&A with source citations and freshness.
  • @loopover chat &lt;question&gt; answers in natural prose from cached decision-pack facts via local inference (maintainer/collaborator; read-only).
  • A plain-language @loopover mention with a real question is routed to the closest matching read-only command automatically — no exact syntax required.

Full command reference: https://loopover.ai/docs/loopover-commands

🧪 Experimental — new and may change.

Visual preview
Route Viewport Before (production) After (this PR's preview) Diff
/ desktop before /
before /
after /
after /
/ mobile before / (mobile)
before / (mobile)
after / (mobile)
after / (mobile)

Click any thumbnail to open the full-size screenshot. Before = production · After = this PR's preview deploy.

Scroll preview
Route Before (production) After (this PR's preview)
/ before / (scroll)
before / (scroll)
after / (scroll)
after / (scroll)

A short scroll-through clip (desktop) — click either thumbnail to open the full animation. Evidence for scroll-linked behavior a single screenshot can't show.

🟩 Safe / merged · 🟦 Advisory · 🟨 Held for review · 🟥 Blocked / closed


💰 Earn for open-source contributions like this. Gittensor lets GitHub contributors earn for the work they already do — register to start earning →.

Checked by LoopOver, a quiet PR intelligence layer for OSS maintainers.

  • Re-run LoopOver review

@loopover-orb loopover-orb Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LoopOver approves — the gate is satisfied and CI is green.

@loopover-orb
loopover-orb Bot merged commit a972353 into main Jul 25, 2026
11 checks passed
@loopover-orb
loopover-orb Bot deleted the claude/posthog-orb-selfhost-error-tracking branch July 25, 2026 07:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

gittensor:feature Gittensor-scored feature linked to a feature issue — scores a 0.25x multiplier.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

PostHog error tracking for the ORB self-host server (swap the src/selfhost/sentry.ts sink; cron-monitor heartbeat design)

1 participant