feat(backend): replace backend_repo_index_job_completed with backend_repo_first_indexed - #900

Merged
brendan-kellam merged 2 commits into
mainfrom
brendan/posthog-repo-indexing-events
Feb 18, 2026
Merged

feat(backend): replace backend_repo_index_job_completed with backend_repo_first_indexed#900
brendan-kellam merged 2 commits into
mainfrom
brendan/posthog-repo-indexing-events

Conversation

@brendan-kellam

@brendan-kellambrendan-kellam commented Feb 18, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Removes the backend_repo_index_job_completed PostHog event, which was firing on every re-index and generating enormous event volume (2M+ events/week, dominated by a single looping install)
  • Adds backend_repo_first_indexed which fires only the first time a repo is successfully indexed (indexedAt === null before the update), enabling accurate tracking of unique repositories ever indexed

Test plan

  • Deploy and verify backend_repo_first_indexed fires when a new repo is indexed for the first time
  • Verify the event does not fire on subsequent re-indexes of the same repo
  • Confirm backend_repo_index_job_completed no longer appears in PostHog

🤖 Generated with Claude Code

Summary by CodeRabbit

Changed

  • Repository indexing event tracking refined to record first-time index completion separately, providing more precise analytics insights.

…repo_first_indexed
Replaces the high-volume per-index PostHog event with one that fires only
on the first successful index of a repo, enabling accurate tracking of
unique repositories ever indexed without flooding the event stream.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@cursor

cursorBot commented Feb 18, 2026

Copy link
Copy Markdown

You have run out of free Bugbot PR reviews for this billing cycle. This will reset on March 14.

To receive reviews on all of your PRs, visit the Cursor dashboard to activate Pro and start your 14-day free trial.

@github-actions

This comment has been minimized.

@coderabbitai

coderabbitaiBot commented Feb 18, 2026

Copy link
Copy Markdown
Contributor

Walkthrough

The pull request replaces the general backend_repo_index_job_completed telemetry event with backend_repo_first_indexed, which fires conditionally only on the first successful repository index. The event payload is simplified by removing the jobType field.

Changes

Cohort / File(s)Summary
Documentation
CHANGELOG.md
Added entry documenting the replacement of backend_repo_index_job_completed with backend_repo_first_indexed event that fires only on first successful repo index.
Telemetry Event Definition
packages/backend/src/posthogEvents.ts
Renamed event map entry from backend_repo_index_job_completed to backend_repo_first_indexed and removed the jobType field from its schema, keeping only repoId and type.
Event Emission Logic
packages/backend/src/repoIndexManager.ts
Modified onJobCompleted to conditionally emit backend_repo_first_indexed only for INDEX-type jobs without a prior indexedAt timestamp, replacing the previous unconditional event emission on all job completions.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Possibly related PRs

  • #878: Introduced the original backend_repo_index_job_completed telemetry event that this PR modifies and replaces.
  • #860: Modified repoIndexManager.ts job-completion handling logic that this PR's conditional event emission depends on.
🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly and concisely describes the main change: replacing one PostHog event with another. It directly reflects the primary objective of the PR.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch brendan/posthog-repo-indexing-events

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

@coderabbitaicoderabbitaiBot 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.

🧹 Nitpick comments (1)
packages/backend/src/repoIndexManager.ts (1)

578-583: Add an inline comment to document the intentional stale-value read.

jobData.repo.indexedAt is the value fetched at line 514 — beforedb.repo.update sets indexedAt: new Date() at line 547. This is the correct sentinel for "first ever successful index", but the implicit ordering dependency is easy to accidentally break during future refactoring (e.g., merging the two db.repo.update calls).

📝 Suggested comment
+ // jobData.repo.indexedAt holds the value *before* the db.repo.update+ // above set it to `new Date()`. A null value here means this is the+ // first time this repo has been successfully indexed.
if (jobData.type === RepoIndexingJobType.INDEX && jobData.repo.indexedAt === null) {
captureEvent('backend_repo_first_indexed', {
repoId: job.data.repoId,
type: jobData.repo.external_codeHostType,
});
}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/backend/src/repoIndexManager.ts` around lines 578 - 583, Add an
inline comment at the check that reads jobData.repo.indexedAt === null (used
with RepoIndexingJobType.INDEX/jobData) explaining this is an intentional
stale-value read: jobData.repo.indexedAt was fetched earlier (when jobData was
built) and is used as the sentinel for "first ever successful index" even though
db.repo.update later sets indexedAt; mention the ordering dependency and warn
that merging or reordering the db.repo.update calls (or changing where jobData
is sourced) would break this logic so future maintainers should preserve the
read-before-update pattern.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Nitpick comments:
In `@packages/backend/src/repoIndexManager.ts`:
- Around line 578-583: Add an inline comment at the check that reads
jobData.repo.indexedAt === null (used with RepoIndexingJobType.INDEX/jobData)
explaining this is an intentional stale-value read: jobData.repo.indexedAt was
fetched earlier (when jobData was built) and is used as the sentinel for "first
ever successful index" even though db.repo.update later sets indexedAt; mention
the ordering dependency and warn that merging or reordering the db.repo.update
calls (or changing where jobData is sourced) would break this logic so future
maintainers should preserve the read-before-update pattern.

@brendan-kellam
brendan-kellam merged commit f59e5e6 into mainFeb 18, 2026
11 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Feb 18, 2026
Sign up for freeto 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

@brendan-kellam
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks"); } } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); } })(); (function(){ try { var __m = "github.com"; var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat(backend): replace backend_repo_index_job_completed with backend_repo_first_indexed - #900

Merged
brendan-kellam merged 2 commits into
mainfrom
brendan/posthog-repo-indexing-events
Feb 18, 2026
Merged

feat(backend): replace backend_repo_index_job_completed with backend_repo_first_indexed#900
brendan-kellam merged 2 commits into
mainfrom
brendan/posthog-repo-indexing-events

Conversation

@brendan-kellam

@brendan-kellambrendan-kellam commented Feb 18, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Removes the backend_repo_index_job_completed PostHog event, which was firing on every re-index and generating enormous event volume (2M+ events/week, dominated by a single looping install)
  • Adds backend_repo_first_indexed which fires only the first time a repo is successfully indexed (indexedAt === null before the update), enabling accurate tracking of unique repositories ever indexed

Test plan

  • Deploy and verify backend_repo_first_indexed fires when a new repo is indexed for the first time
  • Verify the event does not fire on subsequent re-indexes of the same repo
  • Confirm backend_repo_index_job_completed no longer appears in PostHog

🤖 Generated with Claude Code

Summary by CodeRabbit

Changed

  • Repository indexing event tracking refined to record first-time index completion separately, providing more precise analytics insights.

…repo_first_indexed
Replaces the high-volume per-index PostHog event with one that fires only
on the first successful index of a repo, enabling accurate tracking of
unique repositories ever indexed without flooding the event stream.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@cursor

cursorBot commented Feb 18, 2026

Copy link
Copy Markdown

You have run out of free Bugbot PR reviews for this billing cycle. This will reset on March 14.

To receive reviews on all of your PRs, visit the Cursor dashboard to activate Pro and start your 14-day free trial.

@github-actions

This comment has been minimized.

@coderabbitai

coderabbitaiBot commented Feb 18, 2026

Copy link
Copy Markdown
Contributor

Walkthrough

The pull request replaces the general backend_repo_index_job_completed telemetry event with backend_repo_first_indexed, which fires conditionally only on the first successful repository index. The event payload is simplified by removing the jobType field.

Changes

Cohort / File(s)Summary
Documentation
CHANGELOG.md
Added entry documenting the replacement of backend_repo_index_job_completed with backend_repo_first_indexed event that fires only on first successful repo index.
Telemetry Event Definition
packages/backend/src/posthogEvents.ts
Renamed event map entry from backend_repo_index_job_completed to backend_repo_first_indexed and removed the jobType field from its schema, keeping only repoId and type.
Event Emission Logic
packages/backend/src/repoIndexManager.ts
Modified onJobCompleted to conditionally emit backend_repo_first_indexed only for INDEX-type jobs without a prior indexedAt timestamp, replacing the previous unconditional event emission on all job completions.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Possibly related PRs

  • #878: Introduced the original backend_repo_index_job_completed telemetry event that this PR modifies and replaces.
  • #860: Modified repoIndexManager.ts job-completion handling logic that this PR's conditional event emission depends on.
🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly and concisely describes the main change: replacing one PostHog event with another. It directly reflects the primary objective of the PR.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch brendan/posthog-repo-indexing-events

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

@coderabbitaicoderabbitaiBot 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.

🧹 Nitpick comments (1)
packages/backend/src/repoIndexManager.ts (1)

578-583: Add an inline comment to document the intentional stale-value read.

jobData.repo.indexedAt is the value fetched at line 514 — beforedb.repo.update sets indexedAt: new Date() at line 547. This is the correct sentinel for "first ever successful index", but the implicit ordering dependency is easy to accidentally break during future refactoring (e.g., merging the two db.repo.update calls).

📝 Suggested comment
+ // jobData.repo.indexedAt holds the value *before* the db.repo.update+ // above set it to `new Date()`. A null value here means this is the+ // first time this repo has been successfully indexed.
if (jobData.type === RepoIndexingJobType.INDEX && jobData.repo.indexedAt === null) {
captureEvent('backend_repo_first_indexed', {
repoId: job.data.repoId,
type: jobData.repo.external_codeHostType,
});
}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/backend/src/repoIndexManager.ts` around lines 578 - 583, Add an
inline comment at the check that reads jobData.repo.indexedAt === null (used
with RepoIndexingJobType.INDEX/jobData) explaining this is an intentional
stale-value read: jobData.repo.indexedAt was fetched earlier (when jobData was
built) and is used as the sentinel for "first ever successful index" even though
db.repo.update later sets indexedAt; mention the ordering dependency and warn
that merging or reordering the db.repo.update calls (or changing where jobData
is sourced) would break this logic so future maintainers should preserve the
read-before-update pattern.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Nitpick comments:
In `@packages/backend/src/repoIndexManager.ts`:
- Around line 578-583: Add an inline comment at the check that reads
jobData.repo.indexedAt === null (used with RepoIndexingJobType.INDEX/jobData)
explaining this is an intentional stale-value read: jobData.repo.indexedAt was
fetched earlier (when jobData was built) and is used as the sentinel for "first
ever successful index" even though db.repo.update later sets indexedAt; mention
the ordering dependency and warn that merging or reordering the db.repo.update
calls (or changing where jobData is sourced) would break this logic so future
maintainers should preserve the read-before-update pattern.

@brendan-kellam
brendan-kellam merged commit f59e5e6 into mainFeb 18, 2026
11 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Feb 18, 2026
Sign up for freeto 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

@brendan-kellam
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(backend): replace backend_repo_index_job_completed with backend_repo_first_indexed - #900

Merged
brendan-kellam merged 2 commits into
mainfrom
brendan/posthog-repo-indexing-events
Feb 18, 2026
Merged

feat(backend): replace backend_repo_index_job_completed with backend_repo_first_indexed#900
brendan-kellam merged 2 commits into
mainfrom
brendan/posthog-repo-indexing-events

Conversation

@brendan-kellam

@brendan-kellambrendan-kellam commented Feb 18, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Removes the backend_repo_index_job_completed PostHog event, which was firing on every re-index and generating enormous event volume (2M+ events/week, dominated by a single looping install)
  • Adds backend_repo_first_indexed which fires only the first time a repo is successfully indexed (indexedAt === null before the update), enabling accurate tracking of unique repositories ever indexed

Test plan

  • Deploy and verify backend_repo_first_indexed fires when a new repo is indexed for the first time
  • Verify the event does not fire on subsequent re-indexes of the same repo
  • Confirm backend_repo_index_job_completed no longer appears in PostHog

🤖 Generated with Claude Code

Summary by CodeRabbit

Changed

  • Repository indexing event tracking refined to record first-time index completion separately, providing more precise analytics insights.

…repo_first_indexed
Replaces the high-volume per-index PostHog event with one that fires only
on the first successful index of a repo, enabling accurate tracking of
unique repositories ever indexed without flooding the event stream.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@cursor

cursorBot commented Feb 18, 2026

Copy link
Copy Markdown

You have run out of free Bugbot PR reviews for this billing cycle. This will reset on March 14.

To receive reviews on all of your PRs, visit the Cursor dashboard to activate Pro and start your 14-day free trial.

@github-actions

This comment has been minimized.

@coderabbitai

coderabbitaiBot commented Feb 18, 2026

Copy link
Copy Markdown
Contributor

Walkthrough

The pull request replaces the general backend_repo_index_job_completed telemetry event with backend_repo_first_indexed, which fires conditionally only on the first successful repository index. The event payload is simplified by removing the jobType field.

Changes

Cohort / File(s)Summary
Documentation
CHANGELOG.md
Added entry documenting the replacement of backend_repo_index_job_completed with backend_repo_first_indexed event that fires only on first successful repo index.
Telemetry Event Definition
packages/backend/src/posthogEvents.ts
Renamed event map entry from backend_repo_index_job_completed to backend_repo_first_indexed and removed the jobType field from its schema, keeping only repoId and type.
Event Emission Logic
packages/backend/src/repoIndexManager.ts
Modified onJobCompleted to conditionally emit backend_repo_first_indexed only for INDEX-type jobs without a prior indexedAt timestamp, replacing the previous unconditional event emission on all job completions.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Possibly related PRs

  • #878: Introduced the original backend_repo_index_job_completed telemetry event that this PR modifies and replaces.
  • #860: Modified repoIndexManager.ts job-completion handling logic that this PR's conditional event emission depends on.
🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly and concisely describes the main change: replacing one PostHog event with another. It directly reflects the primary objective of the PR.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch brendan/posthog-repo-indexing-events

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

@coderabbitaicoderabbitaiBot 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.

🧹 Nitpick comments (1)
packages/backend/src/repoIndexManager.ts (1)

578-583: Add an inline comment to document the intentional stale-value read.

jobData.repo.indexedAt is the value fetched at line 514 — beforedb.repo.update sets indexedAt: new Date() at line 547. This is the correct sentinel for "first ever successful index", but the implicit ordering dependency is easy to accidentally break during future refactoring (e.g., merging the two db.repo.update calls).

📝 Suggested comment
+ // jobData.repo.indexedAt holds the value *before* the db.repo.update+ // above set it to `new Date()`. A null value here means this is the+ // first time this repo has been successfully indexed.
if (jobData.type === RepoIndexingJobType.INDEX && jobData.repo.indexedAt === null) {
captureEvent('backend_repo_first_indexed', {
repoId: job.data.repoId,
type: jobData.repo.external_codeHostType,
});
}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/backend/src/repoIndexManager.ts` around lines 578 - 583, Add an
inline comment at the check that reads jobData.repo.indexedAt === null (used
with RepoIndexingJobType.INDEX/jobData) explaining this is an intentional
stale-value read: jobData.repo.indexedAt was fetched earlier (when jobData was
built) and is used as the sentinel for "first ever successful index" even though
db.repo.update later sets indexedAt; mention the ordering dependency and warn
that merging or reordering the db.repo.update calls (or changing where jobData
is sourced) would break this logic so future maintainers should preserve the
read-before-update pattern.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Nitpick comments:
In `@packages/backend/src/repoIndexManager.ts`:
- Around line 578-583: Add an inline comment at the check that reads
jobData.repo.indexedAt === null (used with RepoIndexingJobType.INDEX/jobData)
explaining this is an intentional stale-value read: jobData.repo.indexedAt was
fetched earlier (when jobData was built) and is used as the sentinel for "first
ever successful index" even though db.repo.update later sets indexedAt; mention
the ordering dependency and warn that merging or reordering the db.repo.update
calls (or changing where jobData is sourced) would break this logic so future
maintainers should preserve the read-before-update pattern.

@brendan-kellam
brendan-kellam merged commit f59e5e6 into mainFeb 18, 2026
11 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Feb 18, 2026
Sign up for freeto 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

@brendan-kellam
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length \u003e 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(backend): replace backend_repo_index_job_completed with backend_repo_first_indexed - #900

Merged
brendan-kellam merged 2 commits into
mainfrom
brendan/posthog-repo-indexing-events
Feb 18, 2026
Merged

feat(backend): replace backend_repo_index_job_completed with backend_repo_first_indexed#900
brendan-kellam merged 2 commits into
mainfrom
brendan/posthog-repo-indexing-events

Conversation

@brendan-kellam

@brendan-kellambrendan-kellam commented Feb 18, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Removes the backend_repo_index_job_completed PostHog event, which was firing on every re-index and generating enormous event volume (2M+ events/week, dominated by a single looping install)
  • Adds backend_repo_first_indexed which fires only the first time a repo is successfully indexed (indexedAt === null before the update), enabling accurate tracking of unique repositories ever indexed

Test plan

  • Deploy and verify backend_repo_first_indexed fires when a new repo is indexed for the first time
  • Verify the event does not fire on subsequent re-indexes of the same repo
  • Confirm backend_repo_index_job_completed no longer appears in PostHog

🤖 Generated with Claude Code

Summary by CodeRabbit

Changed

  • Repository indexing event tracking refined to record first-time index completion separately, providing more precise analytics insights.

…repo_first_indexed
Replaces the high-volume per-index PostHog event with one that fires only
on the first successful index of a repo, enabling accurate tracking of
unique repositories ever indexed without flooding the event stream.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@cursor

cursorBot commented Feb 18, 2026

Copy link
Copy Markdown

You have run out of free Bugbot PR reviews for this billing cycle. This will reset on March 14.

To receive reviews on all of your PRs, visit the Cursor dashboard to activate Pro and start your 14-day free trial.

@github-actions

This comment has been minimized.

@coderabbitai

coderabbitaiBot commented Feb 18, 2026

Copy link
Copy Markdown
Contributor

Walkthrough

The pull request replaces the general backend_repo_index_job_completed telemetry event with backend_repo_first_indexed, which fires conditionally only on the first successful repository index. The event payload is simplified by removing the jobType field.

Changes

Cohort / File(s)Summary
Documentation
CHANGELOG.md
Added entry documenting the replacement of backend_repo_index_job_completed with backend_repo_first_indexed event that fires only on first successful repo index.
Telemetry Event Definition
packages/backend/src/posthogEvents.ts
Renamed event map entry from backend_repo_index_job_completed to backend_repo_first_indexed and removed the jobType field from its schema, keeping only repoId and type.
Event Emission Logic
packages/backend/src/repoIndexManager.ts
Modified onJobCompleted to conditionally emit backend_repo_first_indexed only for INDEX-type jobs without a prior indexedAt timestamp, replacing the previous unconditional event emission on all job completions.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Possibly related PRs

  • #878: Introduced the original backend_repo_index_job_completed telemetry event that this PR modifies and replaces.
  • #860: Modified repoIndexManager.ts job-completion handling logic that this PR's conditional event emission depends on.
🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly and concisely describes the main change: replacing one PostHog event with another. It directly reflects the primary objective of the PR.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch brendan/posthog-repo-indexing-events

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

@coderabbitaicoderabbitaiBot 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.

🧹 Nitpick comments (1)
packages/backend/src/repoIndexManager.ts (1)

578-583: Add an inline comment to document the intentional stale-value read.

jobData.repo.indexedAt is the value fetched at line 514 — beforedb.repo.update sets indexedAt: new Date() at line 547. This is the correct sentinel for "first ever successful index", but the implicit ordering dependency is easy to accidentally break during future refactoring (e.g., merging the two db.repo.update calls).

📝 Suggested comment
+ // jobData.repo.indexedAt holds the value *before* the db.repo.update+ // above set it to `new Date()`. A null value here means this is the+ // first time this repo has been successfully indexed.
if (jobData.type === RepoIndexingJobType.INDEX && jobData.repo.indexedAt === null) {
captureEvent('backend_repo_first_indexed', {
repoId: job.data.repoId,
type: jobData.repo.external_codeHostType,
});
}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/backend/src/repoIndexManager.ts` around lines 578 - 583, Add an
inline comment at the check that reads jobData.repo.indexedAt === null (used
with RepoIndexingJobType.INDEX/jobData) explaining this is an intentional
stale-value read: jobData.repo.indexedAt was fetched earlier (when jobData was
built) and is used as the sentinel for "first ever successful index" even though
db.repo.update later sets indexedAt; mention the ordering dependency and warn
that merging or reordering the db.repo.update calls (or changing where jobData
is sourced) would break this logic so future maintainers should preserve the
read-before-update pattern.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Nitpick comments:
In `@packages/backend/src/repoIndexManager.ts`:
- Around line 578-583: Add an inline comment at the check that reads
jobData.repo.indexedAt === null (used with RepoIndexingJobType.INDEX/jobData)
explaining this is an intentional stale-value read: jobData.repo.indexedAt was
fetched earlier (when jobData was built) and is used as the sentinel for "first
ever successful index" even though db.repo.update later sets indexedAt; mention
the ordering dependency and warn that merging or reordering the db.repo.update
calls (or changing where jobData is sourced) would break this logic so future
maintainers should preserve the read-before-update pattern.

@brendan-kellam
brendan-kellam merged commit f59e5e6 into mainFeb 18, 2026
11 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Feb 18, 2026
Sign up for freeto 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

@brendan-kellam
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feat(backend): replace backend_repo_index_job_completed with backend_repo_first_indexed - #900

Merged
brendan-kellam merged 2 commits into
mainfrom
brendan/posthog-repo-indexing-events
Feb 18, 2026
Merged

feat(backend): replace backend_repo_index_job_completed with backend_repo_first_indexed#900
brendan-kellam merged 2 commits into
mainfrom
brendan/posthog-repo-indexing-events

Conversation

@brendan-kellam

@brendan-kellambrendan-kellam commented Feb 18, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Removes the backend_repo_index_job_completed PostHog event, which was firing on every re-index and generating enormous event volume (2M+ events/week, dominated by a single looping install)
  • Adds backend_repo_first_indexed which fires only the first time a repo is successfully indexed (indexedAt === null before the update), enabling accurate tracking of unique repositories ever indexed

Test plan

  • Deploy and verify backend_repo_first_indexed fires when a new repo is indexed for the first time
  • Verify the event does not fire on subsequent re-indexes of the same repo
  • Confirm backend_repo_index_job_completed no longer appears in PostHog

🤖 Generated with Claude Code

Summary by CodeRabbit

Changed

  • Repository indexing event tracking refined to record first-time index completion separately, providing more precise analytics insights.

…repo_first_indexed
Replaces the high-volume per-index PostHog event with one that fires only
on the first successful index of a repo, enabling accurate tracking of
unique repositories ever indexed without flooding the event stream.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@cursor

cursorBot commented Feb 18, 2026

Copy link
Copy Markdown

You have run out of free Bugbot PR reviews for this billing cycle. This will reset on March 14.

To receive reviews on all of your PRs, visit the Cursor dashboard to activate Pro and start your 14-day free trial.

@github-actions

This comment has been minimized.

@coderabbitai

coderabbitaiBot commented Feb 18, 2026

Copy link
Copy Markdown
Contributor

Walkthrough

The pull request replaces the general backend_repo_index_job_completed telemetry event with backend_repo_first_indexed, which fires conditionally only on the first successful repository index. The event payload is simplified by removing the jobType field.

Changes

Cohort / File(s)Summary
Documentation
CHANGELOG.md
Added entry documenting the replacement of backend_repo_index_job_completed with backend_repo_first_indexed event that fires only on first successful repo index.
Telemetry Event Definition
packages/backend/src/posthogEvents.ts
Renamed event map entry from backend_repo_index_job_completed to backend_repo_first_indexed and removed the jobType field from its schema, keeping only repoId and type.
Event Emission Logic
packages/backend/src/repoIndexManager.ts
Modified onJobCompleted to conditionally emit backend_repo_first_indexed only for INDEX-type jobs without a prior indexedAt timestamp, replacing the previous unconditional event emission on all job completions.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Possibly related PRs

  • #878: Introduced the original backend_repo_index_job_completed telemetry event that this PR modifies and replaces.
  • #860: Modified repoIndexManager.ts job-completion handling logic that this PR's conditional event emission depends on.
🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly and concisely describes the main change: replacing one PostHog event with another. It directly reflects the primary objective of the PR.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch brendan/posthog-repo-indexing-events

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

@coderabbitaicoderabbitaiBot 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.

🧹 Nitpick comments (1)
packages/backend/src/repoIndexManager.ts (1)

578-583: Add an inline comment to document the intentional stale-value read.

jobData.repo.indexedAt is the value fetched at line 514 — beforedb.repo.update sets indexedAt: new Date() at line 547. This is the correct sentinel for "first ever successful index", but the implicit ordering dependency is easy to accidentally break during future refactoring (e.g., merging the two db.repo.update calls).

📝 Suggested comment
+ // jobData.repo.indexedAt holds the value *before* the db.repo.update+ // above set it to `new Date()`. A null value here means this is the+ // first time this repo has been successfully indexed.
if (jobData.type === RepoIndexingJobType.INDEX && jobData.repo.indexedAt === null) {
captureEvent('backend_repo_first_indexed', {
repoId: job.data.repoId,
type: jobData.repo.external_codeHostType,
});
}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/backend/src/repoIndexManager.ts` around lines 578 - 583, Add an
inline comment at the check that reads jobData.repo.indexedAt === null (used
with RepoIndexingJobType.INDEX/jobData) explaining this is an intentional
stale-value read: jobData.repo.indexedAt was fetched earlier (when jobData was
built) and is used as the sentinel for "first ever successful index" even though
db.repo.update later sets indexedAt; mention the ordering dependency and warn
that merging or reordering the db.repo.update calls (or changing where jobData
is sourced) would break this logic so future maintainers should preserve the
read-before-update pattern.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Nitpick comments:
In `@packages/backend/src/repoIndexManager.ts`:
- Around line 578-583: Add an inline comment at the check that reads
jobData.repo.indexedAt === null (used with RepoIndexingJobType.INDEX/jobData)
explaining this is an intentional stale-value read: jobData.repo.indexedAt was
fetched earlier (when jobData was built) and is used as the sentinel for "first
ever successful index" even though db.repo.update later sets indexedAt; mention
the ordering dependency and warn that merging or reordering the db.repo.update
calls (or changing where jobData is sourced) would break this logic so future
maintainers should preserve the read-before-update pattern.

@brendan-kellam
brendan-kellam merged commit f59e5e6 into mainFeb 18, 2026
11 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Feb 18, 2026
Sign up for freeto 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

@brendan-kellam
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(backend): replace backend_repo_index_job_completed with backend_repo_first_indexed - #900

Merged
brendan-kellam merged 2 commits into
mainfrom
brendan/posthog-repo-indexing-events
Feb 18, 2026
Merged

feat(backend): replace backend_repo_index_job_completed with backend_repo_first_indexed#900
brendan-kellam merged 2 commits into
mainfrom
brendan/posthog-repo-indexing-events

Conversation

@brendan-kellam

@brendan-kellambrendan-kellam commented Feb 18, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Removes the backend_repo_index_job_completed PostHog event, which was firing on every re-index and generating enormous event volume (2M+ events/week, dominated by a single looping install)
  • Adds backend_repo_first_indexed which fires only the first time a repo is successfully indexed (indexedAt === null before the update), enabling accurate tracking of unique repositories ever indexed

Test plan

  • Deploy and verify backend_repo_first_indexed fires when a new repo is indexed for the first time
  • Verify the event does not fire on subsequent re-indexes of the same repo
  • Confirm backend_repo_index_job_completed no longer appears in PostHog

🤖 Generated with Claude Code

Summary by CodeRabbit

Changed

  • Repository indexing event tracking refined to record first-time index completion separately, providing more precise analytics insights.

…repo_first_indexed
Replaces the high-volume per-index PostHog event with one that fires only
on the first successful index of a repo, enabling accurate tracking of
unique repositories ever indexed without flooding the event stream.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@cursor

cursorBot commented Feb 18, 2026

Copy link
Copy Markdown

You have run out of free Bugbot PR reviews for this billing cycle. This will reset on March 14.

To receive reviews on all of your PRs, visit the Cursor dashboard to activate Pro and start your 14-day free trial.

@github-actions

This comment has been minimized.

@coderabbitai

coderabbitaiBot commented Feb 18, 2026

Copy link
Copy Markdown
Contributor

Walkthrough

The pull request replaces the general backend_repo_index_job_completed telemetry event with backend_repo_first_indexed, which fires conditionally only on the first successful repository index. The event payload is simplified by removing the jobType field.

Changes

Cohort / File(s)Summary
Documentation
CHANGELOG.md
Added entry documenting the replacement of backend_repo_index_job_completed with backend_repo_first_indexed event that fires only on first successful repo index.
Telemetry Event Definition
packages/backend/src/posthogEvents.ts
Renamed event map entry from backend_repo_index_job_completed to backend_repo_first_indexed and removed the jobType field from its schema, keeping only repoId and type.
Event Emission Logic
packages/backend/src/repoIndexManager.ts
Modified onJobCompleted to conditionally emit backend_repo_first_indexed only for INDEX-type jobs without a prior indexedAt timestamp, replacing the previous unconditional event emission on all job completions.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Possibly related PRs

  • #878: Introduced the original backend_repo_index_job_completed telemetry event that this PR modifies and replaces.
  • #860: Modified repoIndexManager.ts job-completion handling logic that this PR's conditional event emission depends on.
🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly and concisely describes the main change: replacing one PostHog event with another. It directly reflects the primary objective of the PR.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch brendan/posthog-repo-indexing-events

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

@coderabbitaicoderabbitaiBot 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.

🧹 Nitpick comments (1)
packages/backend/src/repoIndexManager.ts (1)

578-583: Add an inline comment to document the intentional stale-value read.

jobData.repo.indexedAt is the value fetched at line 514 — beforedb.repo.update sets indexedAt: new Date() at line 547. This is the correct sentinel for "first ever successful index", but the implicit ordering dependency is easy to accidentally break during future refactoring (e.g., merging the two db.repo.update calls).

📝 Suggested comment
+ // jobData.repo.indexedAt holds the value *before* the db.repo.update+ // above set it to `new Date()`. A null value here means this is the+ // first time this repo has been successfully indexed.
if (jobData.type === RepoIndexingJobType.INDEX && jobData.repo.indexedAt === null) {
captureEvent('backend_repo_first_indexed', {
repoId: job.data.repoId,
type: jobData.repo.external_codeHostType,
});
}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/backend/src/repoIndexManager.ts` around lines 578 - 583, Add an
inline comment at the check that reads jobData.repo.indexedAt === null (used
with RepoIndexingJobType.INDEX/jobData) explaining this is an intentional
stale-value read: jobData.repo.indexedAt was fetched earlier (when jobData was
built) and is used as the sentinel for "first ever successful index" even though
db.repo.update later sets indexedAt; mention the ordering dependency and warn
that merging or reordering the db.repo.update calls (or changing where jobData
is sourced) would break this logic so future maintainers should preserve the
read-before-update pattern.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Nitpick comments:
In `@packages/backend/src/repoIndexManager.ts`:
- Around line 578-583: Add an inline comment at the check that reads
jobData.repo.indexedAt === null (used with RepoIndexingJobType.INDEX/jobData)
explaining this is an intentional stale-value read: jobData.repo.indexedAt was
fetched earlier (when jobData was built) and is used as the sentinel for "first
ever successful index" even though db.repo.update later sets indexedAt; mention
the ordering dependency and warn that merging or reordering the db.repo.update
calls (or changing where jobData is sourced) would break this logic so future
maintainers should preserve the read-before-update pattern.

@brendan-kellam
brendan-kellam merged commit f59e5e6 into mainFeb 18, 2026
11 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Feb 18, 2026
Sign up for freeto 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

@brendan-kellam
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(backend): replace backend_repo_index_job_completed with backend_repo_first_indexed - #900

Merged
brendan-kellam merged 2 commits into
mainfrom
brendan/posthog-repo-indexing-events
Feb 18, 2026
Merged

feat(backend): replace backend_repo_index_job_completed with backend_repo_first_indexed#900
brendan-kellam merged 2 commits into
mainfrom
brendan/posthog-repo-indexing-events

Conversation

@brendan-kellam

@brendan-kellambrendan-kellam commented Feb 18, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Removes the backend_repo_index_job_completed PostHog event, which was firing on every re-index and generating enormous event volume (2M+ events/week, dominated by a single looping install)
  • Adds backend_repo_first_indexed which fires only the first time a repo is successfully indexed (indexedAt === null before the update), enabling accurate tracking of unique repositories ever indexed

Test plan

  • Deploy and verify backend_repo_first_indexed fires when a new repo is indexed for the first time
  • Verify the event does not fire on subsequent re-indexes of the same repo
  • Confirm backend_repo_index_job_completed no longer appears in PostHog

🤖 Generated with Claude Code

Summary by CodeRabbit

Changed

  • Repository indexing event tracking refined to record first-time index completion separately, providing more precise analytics insights.

…repo_first_indexed
Replaces the high-volume per-index PostHog event with one that fires only
on the first successful index of a repo, enabling accurate tracking of
unique repositories ever indexed without flooding the event stream.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@cursor

cursorBot commented Feb 18, 2026

Copy link
Copy Markdown

You have run out of free Bugbot PR reviews for this billing cycle. This will reset on March 14.

To receive reviews on all of your PRs, visit the Cursor dashboard to activate Pro and start your 14-day free trial.

@github-actions

This comment has been minimized.

@coderabbitai

coderabbitaiBot commented Feb 18, 2026

Copy link
Copy Markdown
Contributor

Walkthrough

The pull request replaces the general backend_repo_index_job_completed telemetry event with backend_repo_first_indexed, which fires conditionally only on the first successful repository index. The event payload is simplified by removing the jobType field.

Changes

Cohort / File(s)Summary
Documentation
CHANGELOG.md
Added entry documenting the replacement of backend_repo_index_job_completed with backend_repo_first_indexed event that fires only on first successful repo index.
Telemetry Event Definition
packages/backend/src/posthogEvents.ts
Renamed event map entry from backend_repo_index_job_completed to backend_repo_first_indexed and removed the jobType field from its schema, keeping only repoId and type.
Event Emission Logic
packages/backend/src/repoIndexManager.ts
Modified onJobCompleted to conditionally emit backend_repo_first_indexed only for INDEX-type jobs without a prior indexedAt timestamp, replacing the previous unconditional event emission on all job completions.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Possibly related PRs

  • #878: Introduced the original backend_repo_index_job_completed telemetry event that this PR modifies and replaces.
  • #860: Modified repoIndexManager.ts job-completion handling logic that this PR's conditional event emission depends on.
🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly and concisely describes the main change: replacing one PostHog event with another. It directly reflects the primary objective of the PR.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch brendan/posthog-repo-indexing-events

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

@coderabbitaicoderabbitaiBot 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.

🧹 Nitpick comments (1)
packages/backend/src/repoIndexManager.ts (1)

578-583: Add an inline comment to document the intentional stale-value read.

jobData.repo.indexedAt is the value fetched at line 514 — beforedb.repo.update sets indexedAt: new Date() at line 547. This is the correct sentinel for "first ever successful index", but the implicit ordering dependency is easy to accidentally break during future refactoring (e.g., merging the two db.repo.update calls).

📝 Suggested comment
+ // jobData.repo.indexedAt holds the value *before* the db.repo.update+ // above set it to `new Date()`. A null value here means this is the+ // first time this repo has been successfully indexed.
if (jobData.type === RepoIndexingJobType.INDEX && jobData.repo.indexedAt === null) {
captureEvent('backend_repo_first_indexed', {
repoId: job.data.repoId,
type: jobData.repo.external_codeHostType,
});
}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/backend/src/repoIndexManager.ts` around lines 578 - 583, Add an
inline comment at the check that reads jobData.repo.indexedAt === null (used
with RepoIndexingJobType.INDEX/jobData) explaining this is an intentional
stale-value read: jobData.repo.indexedAt was fetched earlier (when jobData was
built) and is used as the sentinel for "first ever successful index" even though
db.repo.update later sets indexedAt; mention the ordering dependency and warn
that merging or reordering the db.repo.update calls (or changing where jobData
is sourced) would break this logic so future maintainers should preserve the
read-before-update pattern.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Nitpick comments:
In `@packages/backend/src/repoIndexManager.ts`:
- Around line 578-583: Add an inline comment at the check that reads
jobData.repo.indexedAt === null (used with RepoIndexingJobType.INDEX/jobData)
explaining this is an intentional stale-value read: jobData.repo.indexedAt was
fetched earlier (when jobData was built) and is used as the sentinel for "first
ever successful index" even though db.repo.update later sets indexedAt; mention
the ordering dependency and warn that merging or reordering the db.repo.update
calls (or changing where jobData is sourced) would break this logic so future
maintainers should preserve the read-before-update pattern.

@brendan-kellam
brendan-kellam merged commit f59e5e6 into mainFeb 18, 2026
11 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Feb 18, 2026
Sign up for freeto 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

@brendan-kellam
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feat(backend): replace backend_repo_index_job_completed with backend_repo_first_indexed - #900

Merged
brendan-kellam merged 2 commits into
mainfrom
brendan/posthog-repo-indexing-events
Feb 18, 2026
Merged

feat(backend): replace backend_repo_index_job_completed with backend_repo_first_indexed#900
brendan-kellam merged 2 commits into
mainfrom
brendan/posthog-repo-indexing-events

Conversation

@brendan-kellam

@brendan-kellambrendan-kellam commented Feb 18, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Removes the backend_repo_index_job_completed PostHog event, which was firing on every re-index and generating enormous event volume (2M+ events/week, dominated by a single looping install)
  • Adds backend_repo_first_indexed which fires only the first time a repo is successfully indexed (indexedAt === null before the update), enabling accurate tracking of unique repositories ever indexed

Test plan

  • Deploy and verify backend_repo_first_indexed fires when a new repo is indexed for the first time
  • Verify the event does not fire on subsequent re-indexes of the same repo
  • Confirm backend_repo_index_job_completed no longer appears in PostHog

🤖 Generated with Claude Code

Summary by CodeRabbit

Changed

  • Repository indexing event tracking refined to record first-time index completion separately, providing more precise analytics insights.

…repo_first_indexed
Replaces the high-volume per-index PostHog event with one that fires only
on the first successful index of a repo, enabling accurate tracking of
unique repositories ever indexed without flooding the event stream.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@cursor

cursorBot commented Feb 18, 2026

Copy link
Copy Markdown

You have run out of free Bugbot PR reviews for this billing cycle. This will reset on March 14.

To receive reviews on all of your PRs, visit the Cursor dashboard to activate Pro and start your 14-day free trial.

@github-actions

This comment has been minimized.

@coderabbitai

coderabbitaiBot commented Feb 18, 2026

Copy link
Copy Markdown
Contributor

Walkthrough

The pull request replaces the general backend_repo_index_job_completed telemetry event with backend_repo_first_indexed, which fires conditionally only on the first successful repository index. The event payload is simplified by removing the jobType field.

Changes

Cohort / File(s)Summary
Documentation
CHANGELOG.md
Added entry documenting the replacement of backend_repo_index_job_completed with backend_repo_first_indexed event that fires only on first successful repo index.
Telemetry Event Definition
packages/backend/src/posthogEvents.ts
Renamed event map entry from backend_repo_index_job_completed to backend_repo_first_indexed and removed the jobType field from its schema, keeping only repoId and type.
Event Emission Logic
packages/backend/src/repoIndexManager.ts
Modified onJobCompleted to conditionally emit backend_repo_first_indexed only for INDEX-type jobs without a prior indexedAt timestamp, replacing the previous unconditional event emission on all job completions.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Possibly related PRs

  • #878: Introduced the original backend_repo_index_job_completed telemetry event that this PR modifies and replaces.
  • #860: Modified repoIndexManager.ts job-completion handling logic that this PR's conditional event emission depends on.
🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly and concisely describes the main change: replacing one PostHog event with another. It directly reflects the primary objective of the PR.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch brendan/posthog-repo-indexing-events

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

@coderabbitaicoderabbitaiBot 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.

🧹 Nitpick comments (1)
packages/backend/src/repoIndexManager.ts (1)

578-583: Add an inline comment to document the intentional stale-value read.

jobData.repo.indexedAt is the value fetched at line 514 — beforedb.repo.update sets indexedAt: new Date() at line 547. This is the correct sentinel for "first ever successful index", but the implicit ordering dependency is easy to accidentally break during future refactoring (e.g., merging the two db.repo.update calls).

📝 Suggested comment
+ // jobData.repo.indexedAt holds the value *before* the db.repo.update+ // above set it to `new Date()`. A null value here means this is the+ // first time this repo has been successfully indexed.
if (jobData.type === RepoIndexingJobType.INDEX && jobData.repo.indexedAt === null) {
captureEvent('backend_repo_first_indexed', {
repoId: job.data.repoId,
type: jobData.repo.external_codeHostType,
});
}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/backend/src/repoIndexManager.ts` around lines 578 - 583, Add an
inline comment at the check that reads jobData.repo.indexedAt === null (used
with RepoIndexingJobType.INDEX/jobData) explaining this is an intentional
stale-value read: jobData.repo.indexedAt was fetched earlier (when jobData was
built) and is used as the sentinel for "first ever successful index" even though
db.repo.update later sets indexedAt; mention the ordering dependency and warn
that merging or reordering the db.repo.update calls (or changing where jobData
is sourced) would break this logic so future maintainers should preserve the
read-before-update pattern.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Nitpick comments:
In `@packages/backend/src/repoIndexManager.ts`:
- Around line 578-583: Add an inline comment at the check that reads
jobData.repo.indexedAt === null (used with RepoIndexingJobType.INDEX/jobData)
explaining this is an intentional stale-value read: jobData.repo.indexedAt was
fetched earlier (when jobData was built) and is used as the sentinel for "first
ever successful index" even though db.repo.update later sets indexedAt; mention
the ordering dependency and warn that merging or reordering the db.repo.update
calls (or changing where jobData is sourced) would break this logic so future
maintainers should preserve the read-before-update pattern.

@brendan-kellam
brendan-kellam merged commit f59e5e6 into mainFeb 18, 2026
11 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Feb 18, 2026
Sign up for freeto 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

@brendan-kellam