Skip to content

fix(admin): Supabase drift report + close admin-rollup 42501 root cause + drift guard - #775

Merged
njrini99-code merged 3 commits into
mainfrom
fix/helmv3-stabilization-one-shot
Jul 3, 2026
Merged

fix(admin): Supabase drift report + close admin-rollup 42501 root cause + drift guard#775
njrini99-code merged 3 commits into
mainfrom
fix/helmv3-stabilization-one-shot

Conversation

@njrini99-code

@njrini99-code njrini99-code commented Jul 3, 2026

Copy link
Copy Markdown
Owner

Summary

Two related pieces from the HelmV3 stabilization brief, landed together because the second was discovered while building the drift guard needed for the first:

1. Read-only Supabase drift verification report

Re-verifies the Bucket A Supabase drift findings (#651, #728, #732, #772 linked-lint) directly against live information_schema/pg_proc via the Supabase MCP, per the brief's instruction not to trust schema_migrations alone.

2. Admin rollup 42501 root cause (PR #736 follow-up) + Supabase drift guard

While building the drift guard, found that PR #736 fixed the symptom of the admin-panel outage (restored the admin row, added admin_allowlist/is_super_admin()) but never migrated the RPC layer off the bug that caused it:

  • All 11 get_admin_*_rollup SECURITY DEFINER functions (6 directly, 5 via the shared __admin_rollup_b_gate() helper) still gated solely on users.role = 'admin'. Bridge's app-layer gate (requireSuperAdmin()) only checks SUPER_ADMIN_USER_IDS + admin_allowlist and never looks at users.role — so the original failure ("requireSuperAdmin() still passed, but admin panel RPCs died with 42501") was still fully reproducible by anything that flips users.role, not just the specific baseball-onboarding path already patched.
  • guard_users_role_self_change() blocked self-escalation to a role outside player/coach, but explicitly allowed 'coach'/'player' as NEW.role — i.e. it did nothing to stop a super admin's own onboarding/profile-update flow from silently self-demoting admincoach, which is the literal P0: stop baseball onboarding demoting admins + honest Bridge panel fallback #736 incident. That specific transition was never actually blocked.

Migration admin_rollup_consistent_super_admin_gate (applied to production, verified live via pg_get_functiondef):

  • Every rollup gate now accepts EITHER public.is_super_admin() OR the legacy users.role = 'admin' check — additive only; verified pre-change that admin_allowlist and users.role='admin' are the same single user, so no currently authorized caller loses access.
  • guard_users_role_self_change() now also blocks OLD.role = 'admin'NEW.role IN (coach, player) for allowlisted super admins.

New: scripts/db/check-supabase-drift.mjs (npm run db:drift:check) — read-only guard covering #651 columns, golf drift shape, #728 function body, #772 linked-lint functions, #732 rate_limits, admin rollup RPC existence + consistent gating, and the role-demotion guard. Queries information_schema/pg_proc directly rather than schema_migrations, per the drift report's finding that the migration ledger can't be trusted alone here.

Also surfaced (documented, not fixed in this PR)

  • npm run test:rls (vitest --project rls) matches zero files under its own *.rls.test.{ts,tsx} glob — there are no RLS-specific test files anywhere in the repo, so that CI lane silently runs generic unit tests under the "rls" label instead of testing RLS policies. Same "safety net that never actually runs" pattern as the dead scripts/__tests__/ secrets guard fixed in fix(security): remove live hardcoded service-role secrets from scripts (#516) #774.

What this PR does NOT do

  • No supabase db push, migration repair, or db reset.
  • No issues closed (recommendations only).
  • Does not fix the test:rls gap or the migration-ledger mismatch — both documented for a dedicated follow-up.

Test plan

  • Migration applied to production via Supabase MCP apply_migration, approved via the native approval card (sensitive admin-RPC mutation).
  • Verified live: all 8 functions (__admin_rollup_b_gate + 6 rollups + guard_users_role_self_change) now reference is_super_admin().
  • npm run test:rls (4472 passed / 39 skipped) and npm run test:run (4398 passed / 39 skipped) — both green post-migration.
  • npm run typecheck clean.
  • src/lib/types/database.ts regenerated by the pre-commit hook — diff was empty (function body changes don't affect generated types).

Related

#732, #772)

Re-verifies the Bucket A Supabase drift findings from the stabilization
brief directly against live information_schema/pg_proc (not migration
history, per the brief's own guardrail). All of #651's 12 columns,
#728's function body, and #772's two linked-lint functions are already
resolved in production as of this pass. #732 has no first-party
public.rate_limits reference; reclassified as needing log correlation
instead of a schema fix.

Also documents a new, separate finding: local migration filenames and
the remote-applied version numbers are systemically mismatched for
essentially every migration since ~2026-05-26 (193 local-only / 445
remote-only by version, almost entirely 1:1 name-paired), and
npm run check:ledger is not wired into any CI job. Read-only pass only —
no migrations created/applied, no db push/repair/reset run.

Co-authored-by: Cursor <cursoragent@cursor.com>
@vercel

vercel Bot commented Jul 3, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
helmv3 Ignored Ignored Preview Jul 3, 2026 11:01pm

Request Review

@coderabbitai

coderabbitai Bot commented Jul 3, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: d9c69371-249d-4bfb-bfe4-7dbe3ff1abea

📥 Commits

Reviewing files that changed from the base of the PR and between 98c9b05 and d871fcd.

📒 Files selected for processing (2)
  • eslint.config.mjs
  • scripts/db/check-supabase-drift.mjs

Summary by CodeRabbit

  • New Features

    • Added a read-only database drift check you can run from npm to verify Supabase schema and authorization consistency.
    • Introduced stronger admin access safeguards, including protection against accidental self-demotion.
  • Bug Fixes

    • Improved checks for stale or missing database references and function definitions.
    • Updated admin rollup access rules to better handle role drift and keep permissions consistent.
  • Documentation

    • Added guidance for running, interpreting, and extending the drift verification process.

Walkthrough

Adds a read-only Supabase drift report, a drift-check CLI and runbook, and a migration that updates admin rollup authorization and self-role-change behavior.

Changes

Supabase Drift Verification

Layer / File(s) Summary
Report findings and verified issues
docs/audits/SUPABASE_DRIFT_REPORT_2026-07-03.md:1-159
Documents the verification method, resolved findings for #651, #728, and #772, the #732 table absence finding, and historical drift context.
Migration ledger integrity and next steps
docs/audits/SUPABASE_DRIFT_REPORT_2026-07-03.md:160-249
Records the migration ledger integrity investigation, states what the audit did not do, and lists the follow-up actions.
Drift guard script contract and npm wiring
docs/operations/SUPABASE_DRIFT_GUARD.md:1-87, package.json:11, eslint.config.mjs:5,48-55, scripts/db/check-supabase-drift.mjs:1-95
Adds the drift-guard runbook, the npm script entry, the Node script entrypoint, the connection-string bootstrap, the check constants, and the ESLint Node globals config for scripts.
Drift guard checks and execution
scripts/db/check-supabase-drift.mjs:97-347
Implements the read-only PostgreSQL checks, per-check reporting, failure handling, and process exit behavior.
Admin rollup gate and self-change rules
supabase/migrations/20260703210000_admin_rollup_consistent_super_admin_gate.sql:1-1186
Adds the admin rollup gate function, updates all admin rollup RPC authorization checks to accept super admin or legacy admin access, and blocks allowlisted super admins from self-demoting away from admin.

Estimated code review effort: 5 (Critical) | ~90 minutes

Possibly related issues

Possibly related PRs

  • njrini99-code/helmv3#738: The drift guard checks the Baseball schema columns that this earlier reconciliation PR restored.
  • njrini99-code/helmv3#740: Both PRs touch admin authorization and rollup behavior around users.role and super-admin gating.

Suggested labels: security, database, ci

🚥 Pre-merge checks | ✅ 11 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Title check ⚠️ Warning The title is related, but it uses the غیر-approved scope admin instead of one of the required Conventional Commits scopes. Change the scope to an approved one, e.g. fix(supabase): add drift guard and admin rollup gate.
✅ Passed checks (11 passed)
Check name Status Explanation
Description check ✅ Passed The description clearly matches the Supabase drift report, admin-rollup fix, and new drift guard added in the PR.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
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.
No Service-Role In Client Bundles ✅ Passed PASS: No changed file outside allowed admin paths uses SUPABASE_SERVICE_ROLE_KEY or initializes Supabase with a service-role key; only service_role hit is SQL auth at supabase/migrations/...:47.
Rls Coverage On New Tables ✅ Passed PASS: supabase/migrations/20260703210000_admin_rollup_consistent_super_admin_gate.sql:34-40 says no table/column changes, and the file only defines functions; no CREATE TABLE/policy is present.
Auth Check In Server Actions ✅ Passed No changed files under src/app//actions//*.ts; the PR only touches docs, config, scripts, and a migration, so the auth check is not applicable.
Sport-Prefixed Table Names ✅ Passed PASS: HEAD only touches eslint.config.mjs:1 and scripts/db/check-supabase-drift.mjs:1; no .ts/.tsx files changed, so the sport-prefix rule is not applicable.
No Destructive Writes ✅ Passed No DELETE/INSERT rebuilds found; drift script is SELECT-only (scripts/db/check-supabase-drift.mjs:3-10,97-124) and migration is CREATE OR REPLACE FUNCTION only (supabase/migrations/20260703210000_a...
No Edits To Historical Migrations ✅ Passed PASS: only migration changed is supabase/migrations/20260703210000_admin_rollup_consistent_super_admin_gate.sql:1 (>20260527120000); no historical migrations touched.
Conventional Commits ✅ Passed HEAD squash subject fix(db): harden Supabase drift guard matches the required conventional-commits regex.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/helmv3-stabilization-one-shot
  • 🛠️ helm safety pass
  • 🛠️ dashboard ux pass
  • 🛠️ rls test pass

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

eslint.config.mjs

ESLint skipped: missing config or dependency (missing-dependency). The ESLint configuration references a package that is not available in the sandbox.

scripts/db/check-supabase-drift.mjs

ESLint skipped: the ESLint configuration for this file references a package that is not available in the sandbox.


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

@qodo-code-review

Copy link
Copy Markdown

PR Summary by Qodo

docs(audits): add read-only Supabase drift verification report (2026-07-03)

📝 Documentation 🕐 Less than 10 minutes

Grey Divider

AI Description

• Add a production-verified Supabase drift report for Bucket A findings (read-only).
• Document evidence that #651/#728/#772 are resolved and reclassify #732 to log correlation.
• Flag systemic migration-ledger version mismatches and note check:ledger is not in CI.
Diagram

graph TD
  A["Engineer / Auditor"] --> B["Supabase MCP (SQL)"] --> C[("Prod Postgres")]
  C --> D["information_schema / pg_proc"] --> E["Drift report (MD)"]
  A --> F["Supabase CLI"] --> G["Remote migration ledger"] --> E
Loading
High-Level Assessment

The following are alternative approaches to this PR:

1. Put evidence only in issue comments (no repo artifact)
  • ➕ Keeps the repository free of time-stamped audit files
  • ➕ Evidence lives next to the issues being dispositioned
  • ➖ Harder to reference as a single canonical write-up
  • ➖ Less discoverable for future audits and onboarding
2. Automate drift checks now (script-first, no narrative report)
  • ➕ Turns verification into repeatable, enforceable guardrails
  • ➕ Reduces future manual effort and subjectivity
  • ➖ Higher scope/risk for a Phase 2 read-only deliverable
  • ➖ Does not capture the investigative context and rationale as well
3. Store audit output as CI artifact (generated markdown)
  • ➕ Always up to date and tied to a run
  • ➕ Avoids accumulating multiple dated files
  • ➖ Requires CI wiring and stable execution environment
  • ➖ Does not help if CI isn’t yet trusted (e.g., ledger mismatch problem)

Recommendation: Keep the PR’s approach: a read-only, repo-versioned audit report is appropriate for Phase 2 and provides a stable evidence trail. Follow up by (1) copying key evidence into the referenced issues, and (2) addressing the ledger-version mismatch before wiring check:ledger into CI or relying on migration-list diffs for drift detection.

Files changed (1) +249 / -0

Documentation (1) +249 / -0
SUPABASE_DRIFT_REPORT_2026-07-03.mdAdd production-verified Supabase drift report with evidence and recommendations +249/-0

Add production-verified Supabase drift report with evidence and recommendations

• Introduces a time-stamped audit report that re-verifies Bucket A drift findings (#651, #728, #732, #772) directly against live 'information_schema' and 'pg_proc', documenting which items are already resolved and how #732 should be re-investigated. Also records a new finding about systemic local/remote migration version mismatches and notes that the existing ledger-check script is not wired into CI.

docs/audits/SUPABASE_DRIFT_REPORT_2026-07-03.md

@qodo-code-review

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (1) 📘 Rule violations (0) 📎 Requirement gaps (0) 📜 Skill insights (0)

Context used
✅ Compliance rules (platform): 97 rules

Grey Divider


Remediation recommended

1. Wrong npm script name 🐞 Bug ⚙ Maintainability
Description
The report mentions npm run check:migration-ledger, but the repo only defines check:ledger, so
the referenced command will fail if someone tries to run it to reproduce the ledger check.
Code

docs/audits/SUPABASE_DRIFT_REPORT_2026-07-03.md[R191-193]

+  the fact without a corresponding ledger update. Either way, **`npm run
+  check:migration-ledger` (if wired into CI) would fail continuously**
+  on this repo in its current state, and `supabase migration list
Relevance

⭐⭐⭐ High

Team has accepted fixes correcting docs-to-reality mismatches (e.g., keep advertised fallback
functional in docs/CI in PR #621).

PR-#621

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The newly added report text references npm run check:migration-ledger, but the repository’s npm
scripts only include check:ledger for running scripts/check-migration-ledger.mjs, so the command
as written in the report does not exist.

docs/audits/SUPABASE_DRIFT_REPORT_2026-07-03.md[187-194]
package.json[5-9]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The drift report references an npm script `check:migration-ledger` that is not defined in `package.json`. This creates a docs/repro mismatch (the actual script is `check:ledger`).

## Issue Context
`package.json` defines `check:ledger` pointing at `scripts/check-migration-ledger.mjs`, but there is no `check:migration-ledger` script.

## Fix Focus Areas
- docs/audits/SUPABASE_DRIFT_REPORT_2026-07-03.md[191-193]
- package.json[5-9]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

Qodo Logo

Comment on lines +191 to +193
the fact without a corresponding ledger update. Either way, **`npm run
check:migration-ledger` (if wired into CI) would fail continuously**
on this repo in its current state, and `supabase migration list

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Remediation recommended

1. Wrong npm script name 🐞 Bug ⚙ Maintainability

The report mentions npm run check:migration-ledger, but the repo only defines check:ledger, so
the referenced command will fail if someone tries to run it to reproduce the ledger check.
Agent Prompt
## Issue description
The drift report references an npm script `check:migration-ledger` that is not defined in `package.json`. This creates a docs/repro mismatch (the actual script is `check:ledger`).

## Issue Context
`package.json` defines `check:ledger` pointing at `scripts/check-migration-ledger.mjs`, but there is no `check:migration-ledger` script.

## Fix Focus Areas
- docs/audits/SUPABASE_DRIFT_REPORT_2026-07-03.md[191-193]
- package.json[5-9]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

coderabbitai[bot]
coderabbitai Bot previously approved these changes Jul 3, 2026
…ift guard (#736 follow-up)

While building the Phase 4 drift guard, direct inspection of live admin
RPCs found that PR #736 fixed the symptom (restored the admin row, added
admin_allowlist/is_super_admin()) but never migrated the RPC layer off
the original bug: all 11 get_admin_*_rollup SECURITY DEFINER functions
(6 directly, 5 via the shared __admin_rollup_b_gate() helper) still gate
solely on `users.role = 'admin'`. Bridge's app-layer gate
(requireSuperAdmin()) only checks SUPER_ADMIN_USER_IDS + admin_allowlist
and never looks at users.role, so the original failure mode --
"requireSuperAdmin() still passed, but admin panel RPCs died with
42501" -- is still fully reproducible today by anything that flips
users.role for the allowlisted admin, not just the specific
baseball-onboarding path already patched.

Also found: guard_users_role_self_change() blocked self-*escalation* to
a role outside player/coach, but explicitly allowed 'coach'/'player' as
NEW.role -- meaning it did nothing to stop a super admin's own
onboarding/profile-update flow from silently self-demoting from admin
to coach, which is the literal #736 incident. That specific transition
was never actually blocked.

Migration `admin_rollup_consistent_super_admin_gate` (applied to
production and verified live):
- Every rollup gate now accepts EITHER public.is_super_admin() OR the
  legacy users.role = 'admin' check -- additive only, no currently
  authorized caller loses access (verified pre-change that
  admin_allowlist and users.role='admin' are the same single user).
- guard_users_role_self_change() now also blocks OLD.role = 'admin' ->
  NEW.role IN (coach, player) for allowlisted super admins.

New: scripts/db/check-supabase-drift.mjs (`npm run db:drift:check`) --
read-only guard covering #651 columns, golf drift shape, #728 function
body, #772 linked-lint functions, #732 rate_limits, admin rollup RPC
existence + consistent gating, and the role-demotion guard. Queries
information_schema/pg_proc directly rather than schema_migrations, per
docs/audits/SUPABASE_DRIFT_REPORT_2026-07-03.md's finding that the
migration ledger cannot be trusted alone on this project.

Co-authored-by: Cursor <cursoragent@cursor.com>
@njrini99-code njrini99-code changed the title docs(audits): read-only Supabase drift verification report fix(admin): Supabase drift report + close admin-rollup 42501 root cause + drift guard Jul 3, 2026
@coderabbitai coderabbitai Bot added ci CI, Vercel, test, build, deploy database Schema, migrations, indexes, SQL security Auth, secrets, RLS, PII, webhooks labels Jul 3, 2026

@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: 5

🤖 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 `@scripts/db/check-supabase-drift.mjs`:
- Around line 151-170: The super-admin-gate drift check is matching raw SQL
text, so comment-only mentions of is_super_admin can incorrectly satisfy it.
Extract the existing comment-stripping behavior from
can_manage_baseball_lift_group into a shared helper and reuse it in the admin
rollup RPCs check so the match only considers executable SQL, not -- comment
lines.
- Around line 26-34: The drift check script builds its connection string from
process.env before loading local env files, so it misses values from .env.local.
Update the entrypoint in check-supabase-drift.mjs to load dotenv/config (or
equivalent) before buildConnectionString() reads DATABASE_URL,
SUPABASE_PROJECT_ID, and SUPABASE_DB_PASSWORD, matching the check:stats
convention and ensuring .env.local is consulted first.
- Around line 26-34: The connection string builder in buildConnectionString()
interpolates SUPABASE_DB_PASSWORD directly into the URL, so passwords with
reserved URL characters can break parsing. Update the password handling in
buildConnectionString() to URL-encode the password before composing the
postgresql://postgres.${projectId}:...@${POOLER_HOST}:6543/postgres string,
while keeping the DATABASE_URL passthrough unchanged.
- Around line 27-29: The script uses Node globals like process and console in
check-supabase-drift.mjs, but the ESLint setup does not currently treat
scripts/**/*.mjs as Node code. Update the shared ESLint config in
eslint.config.mjs to add a Node globals/override for scripts/**, or add a local
/* eslint-env node */ annotation in this script if you want the scope to stay
isolated. Make sure the fix covers the getDatabaseUrl logic and the later
logging/exit usage in the main drift-check flow.
- Line 312: The Supavisor transaction-mode connection created in the drift check
script is using the default prepared statements, which can cause intermittent
failures. Update the postgres client initialization in the connection setup to
disable prepared statements by adding the appropriate option alongside ssl and
max, and keep this change in the code path that builds the Supabase pooler
connection.
🪄 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: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 853a486a-5220-4c15-9272-4c59380ade5f

📥 Commits

Reviewing files that changed from the base of the PR and between cef9747 and 98c9b05.

📒 Files selected for processing (4)
  • docs/operations/SUPABASE_DRIFT_GUARD.md
  • package.json
  • scripts/db/check-supabase-drift.mjs
  • supabase/migrations/20260703210000_admin_rollup_consistent_super_admin_gate.sql

Comment thread scripts/db/check-supabase-drift.mjs
Comment thread scripts/db/check-supabase-drift.mjs
Comment thread scripts/db/check-supabase-drift.mjs
Comment thread scripts/db/check-supabase-drift.mjs Outdated
@cursor

cursor Bot commented Jul 3, 2026

Copy link
Copy Markdown

Bugbot is not enabled for your account, so this pull request was not reviewed.

Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs.

@njrini99-code
njrini99-code merged commit 63a1ab7 into main Jul 3, 2026
36 of 37 checks passed
@njrini99-code
njrini99-code deleted the fix/helmv3-stabilization-one-shot branch July 3, 2026 23:18
njrini99-code added a commit that referenced this pull request Jul 3, 2026
Phase 14 of the HelmV3 stabilization brief — final deliverable.
Classifies every issue named in the brief against evidence gathered
this session. No issues closed automatically (recommendations only,
per the brief's guardrail).

Headline findings:
- #516 (hardcoded service-role key) was marked closed but was NOT
  actually fixed — reopened in spirit via PR #774, key rotation is
  still an outstanding manual action.
- #651, #728, and both #772 linked-lint findings verified resolved
  directly against production.
- #736's "prevent recurrence" criterion was not actually met until
  this pass (PR #775) — the RPC layer never migrated off the gate
  model that caused the original incident.
- #390 and #388 (CI runbook issues) were already fully closed and
  verified accurate — no new work needed.
- #477, #442/#443, #415 gained regression coverage this pass (PR
  #776); #406 and true #442 concurrency are blocked on Docker not
  being available in this environment.

Full PR list, dependency-PR triage (2 merged, 1 blocked on a real
Review Gate failure, 6 left for individual review), and everything
explicitly out of scope are listed at the bottom.

Co-authored-by: Fable Integrator <fable@helm.local>
Co-authored-by: Cursor <cursoragent@cursor.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ci CI, Vercel, test, build, deploy database Schema, migrations, indexes, SQL security Auth, secrets, RLS, PII, webhooks

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant