Skip to content

feat(churn): git churn ingest and churn-complexity-hotspots recipe#179

Merged
SutuSebastian merged 8 commits into
mainfrom
feat/churn-complexity-hotspots
Jun 10, 2026
Merged

feat(churn): git churn ingest and churn-complexity-hotspots recipe#179
SutuSebastian merged 8 commits into
mainfrom
feat/churn-complexity-hotspots

Conversation

@SutuSebastian

@SutuSebastian SutuSebastian commented Jun 10, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Add file_churn substrate (schema v40) populated on every index pass: full git rebuild, incremental scoped merge for changed paths, and idle skip when HEAD matches meta.churn_indexed_commit.
  • Ship codemap ingest-churn <json> plus churn.file / churn.since / churn.halfLifeDays config and --churn-since CLI for non-git or golden seeding.
  • Bundle churn-complexity-hotspots recipe (file or symbol grain via by_symbol) ranking churn × cognitive complexity with normalized 0–100 scores and churn_trend; wire into agent intent classification and golden/agent-eval fixtures.
  • Gate churn_ms in perf baseline (~182ms median on this repo).

Test plan

  • bun run check (format, lint, typecheck, unit, golden, agent-eval)
  • bun run check:perf-baseline with updated churn_ms median
  • Manual churn modes on codemap self: full ~213ms, incremental 5 paths ~34ms, idle skip ~7ms
  • codemap query --recipe churn-complexity-hotspots file + by_symbol=true symbol grain
  • codemap ingest-churn fixtures/minimal/file-churn-seed.json golden path

Summary by CodeRabbit

  • New Features

    • Added churn-complexity-hotspots recipe to identify frequently-changing, complex code for refactoring.
    • Added codemap ingest-churn command to import precomputed file churn metrics from JSON.
    • Added --churn-since CLI flag and churn configuration for filtering git history and tuning metrics.
    • Added file_churn metrics tracking to database schema.
  • Documentation

    • Updated architecture, benchmark, glossary, and testing guides; marked churn feature as shipped in roadmap.

Add file_churn substrate with full/incremental/idle refresh on every index pass, codemap ingest-churn for golden seeds, and a refactor-priority recipe ranked by churn × complexity with perf-baseline churn_ms gating.
@changeset-bot

changeset-bot Bot commented Jun 10, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: c8f037c

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
@stainless-code/codemap Minor

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@coderabbitai

coderabbitai Bot commented Jun 10, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@SutuSebastian, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 54 minutes and 45 seconds. Learn how PR review limits work.

Your organization has run out of usage credits. Purchase more in the billing tab.

⌛ How to resolve this issue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans include higher PR review limits than trial, open-source, and free plans. In all cases, reviews become available again over time. During sustained high-volume PR review activity, CodeRabbit may temporarily slow when the next review becomes available.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 25bd10aa-4df5-4ee2-964d-78b59afa7120

📥 Commits

Reviewing files that changed from the base of the PR and between fca4179 and c8f037c.

📒 Files selected for processing (48)
  • .changeset/churn-complexity-hotspots.md
  • README.md
  • docs/agents.md
  • docs/architecture.md
  • docs/benchmark.md
  • docs/glossary.md
  • docs/golden-queries.md
  • fixtures/CAPABILITIES.json
  • fixtures/benchmark/perf-baseline.json
  • fixtures/golden/minimal/churn-complexity-hotspots-path-prefix.json
  • fixtures/golden/minimal/index-table-stats.json
  • fixtures/golden/scenarios.json
  • scripts/check-perf-baseline.ts
  • scripts/churn-hotspots-recipe-scope.test.mjs
  • scripts/query-golden-coverage-matrix.test.mjs
  • scripts/query-golden/run-setup.ts
  • src/application/churn-ingest.test.ts
  • src/application/churn-ingest.ts
  • src/application/context-engine.test.ts
  • src/application/context-engine.ts
  • src/application/http-server.test.ts
  • src/application/http-server.ts
  • src/application/ingest-churn-run.test.ts
  • src/application/ingest-churn-run.ts
  • src/application/mcp-server.test.ts
  • src/application/mcp-server.ts
  • src/application/mcp-tool-allowlist.ts
  • src/application/mcp-tool-annotations.test.ts
  • src/application/mcp-tool-annotations.ts
  • src/application/run-index.ts
  • src/application/tool-handlers.ts
  • src/cli/bootstrap.ts
  • src/cli/cmd-ingest-churn.ts
  • src/cli/cmd-mcp.ts
  • src/config.test.ts
  • src/db.ts
  • src/file-churn.test.ts
  • templates/agent-content/mcp-instructions.md
  • templates/agent-content/rule/00-full.md
  • templates/agent-content/skill/10-recipes-context.md
  • templates/agent-content/skill/20-recipes.gen.md
  • templates/agent-content/skill/30-schema.gen.md
  • templates/agent-content/skill/40-query-patterns.md
  • templates/agent-content/skill/50-maintenance.md
  • templates/recipes/churn-complexity-hotspots.md
  • templates/recipes/churn-complexity-hotspots.sql
  • templates/recipes/high-complexity-untested.md
  • templates/recipes/refactor-risk-ranking.md
📝 Walkthrough

Walkthrough

This PR implements a new "churn × complexity hotspots" feature that ranks files and symbols by combining git change frequency (via weighted commits) with cyclomatic complexity. It adds file churn ingestion (git-backed for repositories, JSON-backed for non-git projects), integrates refresh into the index pipeline, and exposes a new recipe for hotspot analysis.

Changes

Churn × Complexity Hotspots

Layer / File(s) Summary
Churn Configuration Schema & CLI
src/config.ts, src/config.test.ts, src/cli/bootstrap.ts, src/cli/bootstrap-codemap.ts, src/cli/cmd-index.ts, src/cli/main.ts
Extends configuration schema with churn settings (halfLifeDays, since, file), adds --churn-since CLI option, and routes both ingest-churn and index subcommands through CLI bootstrap.
Database Churn Schema & Persistence
src/db.ts, src/application/types.ts
Introduces file_churn STRICT table (SCHEMA_VERSION 40), provides TypeScript helpers for insert/replace/merge/prune, adds metadata constants for tracking indexed commits and config fingerprints, and extends IndexTableStats and IndexPerformanceReport types.
Git-Based Churn Computation & Ingestion
src/application/churn-ingest.ts, src/application/churn-ingest.test.ts
Implements churn trend classification (accelerating/stable/cooling), parses git log --numstat for per-file metrics (commits, weighted mass, line counts, timestamps), supports full/incremental/idle/deletions refresh modes, and falls back to config-based ingestion on git errors.
JSON-Based Churn Fallback
src/application/ingest-churn-run.ts, src/application/ingest-churn-run.test.ts
Provides JSON file ingestion for non-git repositories, validates and normalizes payload rows, filters to indexed file paths, prunes orphans, and records git HEAD as indexed-commit metadata when available.
Index Pipeline Integration & Performance
src/application/run-index.ts, src/application/index-engine.ts, src/cli/cmd-ingest-churn.ts
Hooks churn refresh into all index modes (full, incremental, deletions, up-to-date), patches performance JSON with churn_ms, adds file_churn row-count telemetry to index stats, and implements the codemap ingest-churn CLI command.
Churn × Complexity Recipe
templates/recipes/churn-complexity-hotspots.sql, templates/recipes/churn-complexity-hotspots.md
Joins file_churn and symbols tables, computes hotspot scores (weighted_commits × complexity), supports file-grain and symbol-grain aggregation modes, produces normalized 0–100 scores, and provides configurable row limits and minimum complexity filtering.
Intent Classification & Routing
src/application/context-engine.ts, src/application/context-engine.test.ts
Adds new refactor-priority classification for hotspot/churn/refactor intent patterns, selects churn-complexity-hotspots recipe, and updates refactor classification to include the new recipe.
Runtime Configuration Accessors
src/runtime.ts
Exposes three getter functions (getChurnHalfLifeDays, getChurnSince, getChurnFilePath) to retrieve churn config values at runtime.
Golden Fixtures & Integration Tests
src/file-churn.test.ts, fixtures/golden/minimal/*, fixtures/minimal/file-churn-seed.json, scripts/query-golden/schema.ts, scripts/query-golden/run-setup.ts, scripts/check-perf-baseline.ts, fixtures/benchmark/perf-baseline.json
Adds test coverage for churn computation, golden fixtures for file and symbol-grain hotspot results, extends golden setup schema with seed-file-churn step, updates performance baseline with churn_ms, and validates the entire pipeline.
Documentation & Auxiliary Updates
docs/architecture.md, docs/glossary.md, docs/benchmark.md, docs/golden-queries.md, docs/roadmap.md, docs/plans/substrate-extraction.md, docs/testing-coverage.md, fixtures/CAPABILITIES.json, fixtures/golden/scenarios.json, scripts/agent-eval/scenarios.json, templates/agent-content/rule/00-full.md
Updates architecture and glossary to document file_churn lifecycle, marks churn feature as shipped, adds golden scenario definitions, updates agent-eval probes, revises roadmap and testing-coverage tables, and removes the obsolete plan document.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

  • stainless-code/codemap#70: Introduces symbols.complexity (cyclomatic complexity), which the churn-complexity-hotspots recipe directly consumes to rank files by churn × complexity.
  • stainless-code/codemap#23: Established context intent classification and --performance indexing report; this PR extends both to route churn intents and add churn_ms timing.
  • stainless-code/codemap#139: Introduces the agent-eval harness that this PR extends with a new churn-complexity-hotspots-recipe probe.

Suggested labels

documentation, enhancement

Poem

🐰 Whiskers twitch with delight!
Git histories traced, complexity weighted,
Hotspots now glow—churn × craft collide,
Refactors bloom brighter by measure.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 35.85% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'feat(churn): git churn ingest and churn-complexity-hotspots recipe' clearly summarizes the primary changes: adding git-based churn ingestion and the new churn-complexity-hotspots recipe as core features.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

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

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/churn-complexity-hotspots

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.

Require populated file_churn and config fingerprint before idle skip; deletions-only index skips git log; ingest-churn needs index + inline schema help; delete shipped plan and fix inbound refs.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🧹 Nitpick comments (4)
src/config.test.ts (1)

121-136: ⚡ Quick win

Consider adding test coverage for churn.file path resolution.

The current tests cover defaults and CLI override for churn.since, which is good. However, there's no test verifying that churn.file is resolved to an absolute path (similar to how lines 382-384 in src/config.ts resolve it via resolve(absRoot, parsed.churn.file)).

🧪 Suggested test case
+  it("resolves churn.file to absolute path", () => {
+    const r = resolveCodemapConfig(dir, {
+      churn: { file: "churn-data.json" },
+    });
+    expect(r.churn.file).toBe(join(dir, "churn-data.json"));
+  });
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/config.test.ts` around lines 121 - 136, Add a test that verifies
churn.file is resolved to an absolute path: call resolveCodemapConfig (same
helper used in other tests) with a config object containing churn.file set to a
relative path (e.g., "relative/path/to/file") and assert that the returned
r.churn.file equals the absolute path produced by resolving against the test
root (use path.resolve(dir, "relative/path/to/file")); this ensures the
resolution logic in resolveCodemapConfig / the churn.file handling is covered.
src/cli/cmd-ingest-churn.ts (1)

13-37: ⚡ Quick win

Minor documentation inconsistency for computed_at field.

The help text implies computed_at is a required field in the input JSON. However, parseChurnJsonPayload in ingest-churn-run.ts (lines 70-73) defaults computed_at to the current timestamp when it's not a string, making it effectively optional in the input.

Consider clarifying the help text to indicate that computed_at is optional and will default to the current time if omitted.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/cli/cmd-ingest-churn.ts` around lines 13 - 37, Update the help text in
printIngestChurnCmdHelp to mark computed_at as optional (it defaults to now when
absent) to match parseChurnJsonPayload behavior in ingest-churn-run.ts; edit the
usage string line that lists required fields to say "`computed_at` (optional,
defaults to current time)" or similar so docs and the parseChurnJsonPayload
implementation are consistent.
scripts/query-golden-coverage-matrix.test.mjs (1)

78-84: ⚡ Quick win

Add file_churn assertion to the index-table-stats guardrail test.

This test now protects only a subset of expected tables; add a check for FROM file_churn so regressions in the new churn stats field are caught.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@scripts/query-golden-coverage-matrix.test.mjs` around lines 78 - 84, The test
"index-table-stats locks fetchTableStats-shaped counts" only asserts presence of
FROM file_metrics, FROM unresolved_calls and FROM "references"; add an assertion
to also check for FROM file_churn so the guardrail covers the new churn stats
field. Locate the test that references scenarioIds and scenarios and update it
(the it block named "index-table-stats locks fetchTableStats-shaped counts") to
include expect(scenario?.sql).toContain("FROM file_churn") alongside the
existing expects.
scripts/query-golden/run-setup.ts (1)

45-47: ⚡ Quick win

Validate parsed JSON structure for clearer errors.

The JSON is cast to FileChurnRow[] without validation. If the fixture file is malformed, this could cause cryptic errors downstream when replaceFileChurn processes the data.

Consider adding basic structure validation (array check, required fields) or a Zod schema for FileChurnRow[] to catch fixture errors early with actionable messages.

🛡️ Example validation approach
+    // Basic structure check
+    if (!Array.isArray(rows) || rows.length === 0) {
+      throw new Error(
+        `query-golden setup: ${absPath} must contain a non-empty array`,
+      );
+    }
+    if (!rows.every(r => typeof r === 'object' && r !== null && 'path' in r)) {
+      throw new Error(
+        `query-golden setup: ${absPath} rows must have 'path' field`,
+      );
+    }
     replaceFileChurn(db, rows);
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@scripts/query-golden/run-setup.ts` around lines 45 - 47, The parsed JSON is
blindly cast to FileChurnRow[] which can produce cryptic failures later in
replaceFileChurn; after the readFileSync/JSON.parse step that sets rows, add a
validation block (e.g., Array.isArray(rows) plus checks that each item contains
required keys like filePath, churn, author, etc.) or wire in a Zod schema for
FileChurnRow[] to validate the structure and types, and throw a clear error
message identifying the fixture path and the missing/invalid fields if
validation fails so replaceFileChurn receives guaranteed well-formed data.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/architecture.md`:
- Around line 501-514: The doc currently contradicts non-git handling for
file_churn; update the paragraph so it states one canonical behavior: clarify
that refreshFileChurn → ingestFileChurnFromGit is skipped for non-git repos (so
the git-based ingest produces an empty table), but non-git repos can still
populate file_churn via the codemap "ingest-churn" JSON ingest or by seeding via
the churn.file config/CLI; mention the relevant symbols refreshFileChurn,
ingestFileChurnFromGit, codemap ingest-churn, and churn.file to make the intent
explicit and use consistent terminology (“git ingest is skipped on non-git
repos; use JSON/config seed to populate”).

In `@templates/recipes/churn-complexity-hotspots.md`:
- Line 35: The documented symbol-grain output columns are inconsistent with the
actual SQL recipe output: update the line describing symbol-grain (when
by_symbol=true) in churn-complexity-hotspots.md to match the real schema by
replacing `name`, `kind`, and `cyclomatic_complexity` with the actual column
names `symbol_name`, `symbol_kind`, `max_complexity`, and `avg_complexity` (and
confirm `line_start` remains if present); ensure the `by_symbol=true` sentence
and the overall Output columns list use the same terminology as the SQL result
set to keep docs and code aligned.

---

Nitpick comments:
In `@scripts/query-golden-coverage-matrix.test.mjs`:
- Around line 78-84: The test "index-table-stats locks fetchTableStats-shaped
counts" only asserts presence of FROM file_metrics, FROM unresolved_calls and
FROM "references"; add an assertion to also check for FROM file_churn so the
guardrail covers the new churn stats field. Locate the test that references
scenarioIds and scenarios and update it (the it block named "index-table-stats
locks fetchTableStats-shaped counts") to include
expect(scenario?.sql).toContain("FROM file_churn") alongside the existing
expects.

In `@scripts/query-golden/run-setup.ts`:
- Around line 45-47: The parsed JSON is blindly cast to FileChurnRow[] which can
produce cryptic failures later in replaceFileChurn; after the
readFileSync/JSON.parse step that sets rows, add a validation block (e.g.,
Array.isArray(rows) plus checks that each item contains required keys like
filePath, churn, author, etc.) or wire in a Zod schema for FileChurnRow[] to
validate the structure and types, and throw a clear error message identifying
the fixture path and the missing/invalid fields if validation fails so
replaceFileChurn receives guaranteed well-formed data.

In `@src/cli/cmd-ingest-churn.ts`:
- Around line 13-37: Update the help text in printIngestChurnCmdHelp to mark
computed_at as optional (it defaults to now when absent) to match
parseChurnJsonPayload behavior in ingest-churn-run.ts; edit the usage string
line that lists required fields to say "`computed_at` (optional, defaults to
current time)" or similar so docs and the parseChurnJsonPayload implementation
are consistent.

In `@src/config.test.ts`:
- Around line 121-136: Add a test that verifies churn.file is resolved to an
absolute path: call resolveCodemapConfig (same helper used in other tests) with
a config object containing churn.file set to a relative path (e.g.,
"relative/path/to/file") and assert that the returned r.churn.file equals the
absolute path produced by resolving against the test root (use path.resolve(dir,
"relative/path/to/file")); this ensures the resolution logic in
resolveCodemapConfig / the churn.file handling is covered.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 257777e7-ca24-4d06-bf65-9795f73713d0

📥 Commits

Reviewing files that changed from the base of the PR and between 36106ff and fca4179.

📒 Files selected for processing (49)
  • .changeset/churn-complexity-hotspots.md
  • docs/architecture.md
  • docs/benchmark.md
  • docs/glossary.md
  • docs/golden-queries.md
  • docs/plans/churn-complexity-hotspots.md
  • docs/plans/substrate-extraction.md
  • docs/roadmap.md
  • docs/testing-coverage.md
  • fixtures/CAPABILITIES.json
  • fixtures/benchmark/perf-baseline.json
  • fixtures/golden/minimal/churn-complexity-hotspots-by-symbol.json
  • fixtures/golden/minimal/churn-complexity-hotspots.json
  • fixtures/golden/minimal/files-count.json
  • fixtures/golden/minimal/files-hashes.json
  • fixtures/golden/minimal/files-largest.json
  • fixtures/golden/minimal/index-summary.json
  • fixtures/golden/minimal/index-table-stats.json
  • fixtures/golden/minimal/source-fts-row-count.json
  • fixtures/golden/scenarios.json
  • fixtures/minimal/file-churn-seed.json
  • scripts/agent-eval/scenarios.json
  • scripts/check-perf-baseline.ts
  • scripts/query-golden-coverage-matrix.test.mjs
  • scripts/query-golden/run-setup.ts
  • scripts/query-golden/schema.ts
  • src/application/churn-ingest.test.ts
  • src/application/churn-ingest.ts
  • src/application/context-engine.test.ts
  • src/application/context-engine.ts
  • src/application/index-engine.ts
  • src/application/ingest-churn-run.test.ts
  • src/application/ingest-churn-run.ts
  • src/application/run-index.ts
  • src/application/types.ts
  • src/cli/bootstrap-codemap.ts
  • src/cli/bootstrap.ts
  • src/cli/cmd-index.ts
  • src/cli/cmd-ingest-churn.ts
  • src/cli/main.ts
  • src/config.test.ts
  • src/config.ts
  • src/db.ts
  • src/file-churn.test.ts
  • src/runtime.ts
  • src/worker-pool.dist.test.ts
  • templates/agent-content/rule/00-full.md
  • templates/recipes/churn-complexity-hotspots.md
  • templates/recipes/churn-complexity-hotspots.sql
💤 Files with no reviewable changes (1)
  • docs/plans/churn-complexity-hotspots.md

Comment thread docs/architecture.md Outdated
Comment thread templates/recipes/churn-complexity-hotspots.md Outdated
…ctions

Wire churn-complexity-hotspots into MCP playbook and recipe chains, add churn column guidance to rule/skill shards, per-row review actions on the recipe, and cross-links from refactor-risk recipes.
Ship post-merge items in PR #179: MCP/HTTP ingest_churn, churn.file git
skip, context churn_hint, path_prefix param, churn_idle_ms perf baseline.
Fix architecture/recipe doc drift (CodeRabbit), reject empty churn JSON
without wiping file_churn, and sweep 21-tool consumer surfaces.
Add path_prefix golden + scope test, incremental churn merge test,
churn_idle_ms per-phase noise floor and idle sanity cap, and genericize
served skill shard comments.
Do not wipe file_churn on git log failure; fall back to full churn
refresh when config fingerprint drifts during incremental index. Run
index-table-stats golden before churn seed scenarios (file_churn: 46).
Cover churn.file absolute resolution, mark computed_at optional in ingest-churn help, guard file_churn in index-table-stats matrix, and reuse parseChurnJsonPayload for golden seed validation.
Wrap replaceFileChurn/mergeFileChurnForPaths in transactions; validate churn_trend on JSON ingest; align README, recipe, agent-content, and CLI help for churn.file override and hotspots alias distinction.
@SutuSebastian SutuSebastian merged commit 8595173 into main Jun 10, 2026
10 of 11 checks passed
@SutuSebastian SutuSebastian deleted the feat/churn-complexity-hotspots branch June 10, 2026 15:06
@github-actions github-actions Bot mentioned this pull request Jun 10, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant