Skip to content

feat: upgrade @ladybugdb/core to 0.15.2 and remove segfault workarounds#374

Merged
magyargergo merged 12 commits into
mainfrom
feat/upgrade-ladybugdb-0.15.2
Mar 19, 2026
Merged

feat: upgrade @ladybugdb/core to 0.15.2 and remove segfault workarounds#374
magyargergo merged 12 commits into
mainfrom
feat/upgrade-ladybugdb-0.15.2

Conversation

@abhigyanpatwari

@abhigyanpatwari abhigyanpatwari commented Mar 18, 2026

Copy link
Copy Markdown
Owner

Summary

  • Upgrade @ladybugdb/core from ^0.15.1 to ^0.15.2 — includes the merged fix for child QueryResult lifetime segfault (ladybug-nodejs#1)
  • Fix N-API destructor crashes that prevented lbug-db tests from running on macOS
  • Add defense-in-depth write query validation to pool adapter executeQuery
  • Unify CI test architecture — single vitest run with coverage, cross-platform smoke tests
  • Update CI report with per-platform status and accurate test/coverage data

Root causes found & fixed

Issue Root cause Fix
0/8 lbug-db tests ran on macOS global-setup.ts called db.close() without awaitPromise<void> in 0.15.2 API left stale file lock await conn.close() + await db.close()
Fork crash after 2-3 files with isolate: false Repeated native DB open/close cycles corrupt vitest fork state Removed isolate: false, each file gets own fork
poolAdapter tests segfault on macOS writable→read-only switch calls db.close() which triggers N-API destructor segfault initLbugWithDb() — pool adapter reuses core adapter's writable Database, no close needed
Unhandled Promise rejections from conn.close() try { conn.close() } catch {} doesn't catch async rejections Changed to conn.close().catch(() => {})
Write queries succeed on shared writable DB Pool adapter had no application-level write protection Added WRITE_QUERY_RE check in executeQuery (defense-in-depth)

Changes

File Change
gitnexus/package.json @ladybugdb/core ^0.15.1^0.15.2
gitnexus-web/package.json @ladybugdb/wasm-core ^0.15.1^0.15.2
gitnexus/test/global-setup.ts await async close() calls (were fire-and-forget)
gitnexus/vitest.config.ts Removed isolate: false, updated comments
gitnexus/src/core/lbug/lbug-adapter.ts Added getDatabase() export for pool adapter reuse
gitnexus/src/mcp/core/lbug-adapter.ts initLbugWithDb() for external DB injection, WRITE_QUERY_RE in executeQuery, external flag in SharedDB, .catch() on fire-and-forget closes
gitnexus/test/helpers/test-indexed-db.ts Pool adapter setup uses initLbugWithDb instead of close-and-reopen
.github/workflows/ci-tests.yml Renamed from ci-unit-tests.yml
.github/workflows/ci.yml Updated workflow reference
.github/workflows/ci-report.yml Per-platform status columns, commit SHA, cleaner formatting

Test results

Platform Files Tests Status
Ubuntu (coverage) 84 3077
Windows 84 3077
macOS 84 3077 ✅ (was 0/8 lbug-db before)

All tests pass on all platforms. No tests skipped or modified — the initLbugWithDb + WRITE_QUERY_RE approach preserves all existing test assertions.

Test plan

  • npx vitest run passes locally (84 files, 3077 tests, 0 errors)
  • npx vitest run --project lbug-db passes (8 files, 111 tests)
  • npx tsc --noEmit passes
  • CI passes on Ubuntu, Windows, macOS
  • Verify CI report comment shows accurate coverage data after merge

🤖 Generated with Claude Code

The upstream fix (ladybug-nodejs#1) resolves the child QueryResult lifetime
segfault, making .close() safe on all platforms. This removes 6 workaround
sites:

- Remove `dangerouslyIgnoreUnhandledErrors` from vitest config
- Remove platform-conditional .close() guards in global-setup and test helper
- Delete test/setup.ts (process._getActiveHandles unref hack)
- Replace no-op cleanup in test-indexed-db.ts with real adapter close
- Fix pool adapter closeOne() to properly close connections with shared
  Database refcount guard and orphaned connection handling in checkin()
- Update segfault-related comments across the codebase

Also bumps @ladybugdb/wasm-core to ^0.15.2 in gitnexus-web for consistency.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@vercel

vercel Bot commented Mar 18, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
gitnexus Ready Ready Preview, Comment Mar 19, 2026 8:19am

Request Review

The N-API destructor ordering crash during worker fork exit on macOS is
independent of the QueryResult lifetime fix in 0.15.2. Tests pass, but
the exit triggers a crash. Keep the flag with an updated comment
explaining the actual cause. Can be removed once LadybugDB fixes all
destructor ordering issues upstream.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

CI Report

All checks passed

Pipeline Status

Stage Status Details
✅ Typecheck success tsc --noEmit
✅ Unit Tests success 3 platforms
✅ Integration success 3 OS x 4 groups = 12 jobs

Test Results

Suite Tests Passed Failed Skipped Duration
Unit 1766 1765 0 1 8s
Integration 1348 1329 0 19 69s
Total 3114 3094 0 20 77s

✅ All 3094 tests passed

20 test(s) skipped — expand for details

Integration:

  • Python match/case as-pattern type binding > resolves u.save() to User#save via match/case as-pattern binding
  • Python match/case as-pattern type binding > does NOT resolve u.save() to Repo#save (negative disambiguation)
  • Swift constructor-inferred type resolution > detects User and Repo classes, both with save methods
  • Swift constructor-inferred type resolution > resolves user.save() to Models/User.swift via constructor-inferred type
  • Swift constructor-inferred type resolution > resolves repo.save() to Models/Repo.swift via constructor-inferred type
  • Swift constructor-inferred type resolution > emits exactly 2 save() CALLS edges (one per receiver type)
  • Swift self resolution > detects User and Repo classes, each with a save function
  • Swift self resolution > resolves self.save() inside User.process to User.save, not Repo.save
  • Swift parent resolution > detects BaseModel and User classes plus Serializable protocol
  • Swift parent resolution > emits EXTENDS edge: User → BaseModel
  • Swift parent resolution > emits IMPLEMENTS edge: User → Serializable (protocol conformance)
  • Swift cross-file User.init() inference > resolves user.save() via User.init(name:) inference
  • Swift cross-file User.init() inference > resolves user.greet() via User.init(name:) inference
  • Swift return type inference > detects User class and getUser function
  • Swift return type inference > detects save function on User (Swift class methods are Function nodes)
  • Swift return type inference > resolves user.save() to User#save via return type of getUser() -> User
  • Swift return-type inference via function return type > resolves user.save() to User#save via return type of getUser()
  • Swift return-type inference via function return type > user.save() does NOT resolve to Repo#save
  • Swift return-type inference via function return type > resolves repo.save() to Repo#save via return type of getRepo()

Unit:

  • buildTypeEnv > known limitations (documented skip tests) > Ruby block parameter: users.each { |user| } — closure param inference, different feature

Code Coverage

Combined (Unit + Integration)

Metric Coverage Covered Base Delta Status
Statements 61.51% 7195/11697 46.88% 📈 +14.6 🟢 ████████████░░░░░░░░
Branches 55.44% 4996/9010 41.48% 📈 +14.0 🟢 ███████████░░░░░░░░░
Functions 60.91% 611/1003 46.56% 📈 +14.3 🟢 ████████████░░░░░░░░
Lines 63.46% 6428/10128 48.48% 📈 +15.0 🟢 ████████████░░░░░░░░
Coverage breakdown by test suite

Unit Tests

Metric Coverage Covered Base Delta Status
Statements 46.83% 5478/11697 46.88% 📉 -0.1 🔴 █████████░░░░░░░░░░░
Branches 41.47% 3737/9010 41.48% 📉 -0.0 🔴 ████████░░░░░░░░░░░░
Functions 46.56% 467/1003 46.56% = 0.0 🟢 █████████░░░░░░░░░░░
Lines 48.43% 4906/10128 48.48% 📉 -0.0 🔴 █████████░░░░░░░░░░░

Integration Tests

Metric Coverage Covered Base Delta Status
Statements 47.08% 5508/11697 46.88% 📈 +0.2 🟢 █████████░░░░░░░░░░░
Branches 44.15% 3978/9010 41.48% 📈 +2.7 🟢 ████████░░░░░░░░░░░░
Functions 44.56% 447/1003 46.56% 📉 -2.0 🔴 ████████░░░░░░░░░░░░
Lines 48.25% 4887/10128 48.48% 📉 -0.2 🔴 █████████░░░░░░░░░░░

📋 View full run · Generated by CI

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

Code Review

Overall: Solid upgrade that properly addresses the N-API segfault workarounds. The move from "let the OS reclaim on exit" to explicit .close() calls is a meaningful reliability improvement.

Key Changes Reviewed

Pool connection lifecycle (lbug-adapter.ts)

  • The new closed flag on PoolEntry is the right pattern. Connections checked out during eviction get closed on checkin() instead of being silently orphaned. This fixes a real resource leak.
  • closeOne() now properly closes available connections before decrementing the shared DB refcount. The ordering is correct: close connections first, then conditionally close the DB when refCount hits 0.

Test cleanup

  • Removing the platform-gated .close() calls (previously Windows-only) and making cleanup universal is the correct call given the 0.15.2 fixes.
  • Deleting test/setup.ts entirely is clean. The _getActiveHandles unref hack was always fragile.

Notes

  1. dangerouslyIgnoreUnhandledErrors still present - The comment explains why (vitest forks + N-API destructor ordering at exit). This is reasonable as a transient workaround, but the TODO should be tracked somewhere to avoid it becoming permanent. Consider filing an issue upstream.

  2. try { conn.close(); } catch {} pattern - Used in several places (closeOne, checkin). Silent catches are fine here since these are cleanup paths where failure is non-actionable, but a debug-level log would help diagnose issues if they recur.

  3. Race window in closeOne - Between setting entry.closed = true and pool.delete(repoId), a concurrent checkout() could grab a connection from entry.available that is about to be closed in the loop. The available.length = 0 at the end mitigates this, but since the close loop iterates the array while checkout might .pop() from it, there is a narrow window. Since this is single-threaded Node.js and there are no awaits in the loop, this is safe in practice, but worth a comment.

  4. tree-sitter-swift removed from lockfile - Looks like an unrelated cleanup that landed in this PR. Not a problem, just noting it.

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

Code Review

Clean upgrade — removes the segfault workarounds that were papered over the N-API destructor bug in @ladybugdb/core 0.15.1. A few notes:

Key Observations

  1. Connection pool closed flag — The new closed field on PoolEntry with the checkin() orphan-close logic is a good pattern. One edge case: if a connection is checked out, the entry is closed (LRU eviction), and then checkin closes the connection — but if closeOne is called again for the same repoId before checkin happens (e.g. rapid re-init), pool.delete(repoId) already ran, so checkin would need to handle a missing pool entry. Currently it receives the entry object directly (not looked up by key), so this is actually safe. Just noting the reasoning for future readers.

  2. Database refCount closecloseOne now decrements shared.refCount and closes the Database when it hits 0. The previous code only decremented without closing. This is correct now that the N-API destructors are fixed, but the dangerouslyIgnoreUnhandledErrors: true in vitest.config.ts is still there with a TODO — make sure that gets tracked.

  3. Removed test/setup.ts — The old afterAll that unref'd active handles is gone. This is correct since 0.15.2 handles cleanup properly, but verify CI passes on all platforms (the comment in vitest.config.ts mentions macOS still has destructor ordering issues at exit).

  4. tree-sitter-swift removed from package.json — This seems unrelated to the ladybugdb upgrade. Is this intentional? If Swift parsing support is being dropped, it should probably be its own commit or at least mentioned in the PR description.

Good

  • Test helpers now properly close resources instead of relying on process exit, which is the right approach.
  • The prebuilt platform binaries in optionalDependencies should eliminate the cmake-js build step on CI.
  • Comments explain why dangerouslyIgnoreUnhandledErrors is still needed (exit-time destructor ordering, not the fixed QueryResult lifetime issue).

Looks good. Minor question on the tree-sitter-swift removal.

Repository owner deleted a comment from claude Bot Mar 19, 2026
- Update `npm test` to run all tests (unit + integration + lbug-db)
  via `vitest run` instead of `vitest run test/unit`
- Add `test:unit` script for running unit tests only
- Remove `ci-integration.yml` — the per-file lbug-db process isolation
  is no longer needed with `dangerouslyIgnoreUnhandledErrors` and
  `fileParallelism: false` handling fork exit issues
- Update `ci-unit-tests.yml` to run all tests with build + coverage
- Simplify `ci.yml` gate (two jobs: quality + tests)
- Simplify `ci-report.yml` (single coverage artifact, no merge step)
os.homedir() checks USERPROFILE on Windows, not HOME.

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

Code Review

Overall: Major quality-of-life upgrade. Bumps @ladybugdb/core to 0.15.2, removes segfault workarounds, merges the CI integration test matrix into a single test job, and properly closes native handles. This is a significant reduction in CI complexity and tech debt.

Key Changes

Native handle cleanup is now correct. The closeOne() function properly:

  1. Marks the pool entry as closed to prevent orphaned connections
  2. Closes available connections immediately
  3. Handles in-flight connections via checkin() (detects entry.closed and closes on return)
  4. Reference-counts the shared Database and only closes when refCount === 0

This is a clean fix for a real resource leak / crash pattern.

CI simplification is well-structured. Merging unit + integration into a single tests workflow reduces the matrix from 3 OS x 4 groups = 12 jobs to 3 OS x 1 = 3 jobs, which should cut CI cost and time significantly. The ci-report.yml changes consistently rename unit/integration to the unified tests naming.

Concerns

  1. dangerouslyIgnoreUnhandledErrors is still enabled in vitest.config.ts. The TODO says "remove once LadybugDB fixes all N-API destructor ordering issues." Now that 0.15.2 fixes the segfault-on-close path, is this flag still needed? If the main segfault was the closeSync() destructor bug, this upgrade might have fixed it. Worth testing a CI run with the flag removed to see if it passes clean.

  2. tree-sitter-swift was removed from package.json dependencies (line in the lockfile diff). If this is intentional, the PR description should mention it. If any Swift parsing tests exist, they would silently fail or skip.

  3. Integration test coverage reporting is gone. The old CI ran integration tests separately with --coverage and merged coverage. The new unified npx vitest run with coverage should cover both, but the test:integration script still exists in package.json. This could confuse contributors who run npm run test:integration locally and expect it to still work as a standalone command.

  4. Potential race in closeOne() + checkin() interaction: If closeOne() is called while a connection is checked out, entry.closed = true is set. When checkin() runs later, it checks entry.closed and closes the connection. But closeOne() also calls pool.delete(repoId), so the entry object is orphaned from the pool. This works because checkin() receives the entry reference directly (not via pool lookup), but it's worth a comment noting this contract.

No security issues found. The resource cleanup improvements are a net positive for stability.

On macOS, N-API destructors crash fork workers on exit. With
isolate: true (default), vitest recycles the fork between files,
triggering the crash after each file. After several crashes, the
remaining lbug-db files never execute.

isolate: false keeps all 8 lbug-db files in a single fork — the
fork only exits once after all files complete, and that single exit
crash is caught by dangerouslyIgnoreUnhandledErrors.
Vitest v4 requires unique groupOrder when projects have different
maxWorkers (lbug-db has fileParallelism: false → maxWorkers: 1).
global-setup.ts called conn.close() and db.close() without await —
these return Promise<void> in @ladybugdb/core 0.15.2.  The setup
function returned before the DB was fully closed, so vitest forks
hit a stale file lock when opening the same DB path, crashing the
lbug-db worker before any test ran.

isolate: false caused native state corruption after 2-3 open/close
cycles in the same fork (vitest-specific, not reproducible in plain
Node.js).  Without it, each file gets its own module scope and the
N-API destructor crash at fork exit is caught by
dangerouslyIgnoreUnhandledErrors.

Also fixes fire-and-forget close() calls in the pool adapter —
try/catch around an async close() never catches rejections; changed
to .catch(() => {}) for proper unhandled-rejection prevention.

Before: 0/8 lbug-db files ran on macOS CI (fork crash).
After:  8/8 pass, 84 files, 3077 tests, zero errors.
…flect correct symbol counts and relationships
The old ci-report.yml used workflow_run which always runs code from
the default branch (main). This meant the PR comment used main's
stale report template that still referenced the old unit/integration
split architecture — causing "Merge coverage reports" failures.

Moving the report inline to ci.yml means it runs from the PR branch
and uses the current report template. The report now shows:
- per-platform status (Ubuntu/Windows/macOS columns)
- unified test counts from the single vitest run
- coverage with base branch (main) delta comparison
- commit SHA for traceability

Also removes the save-pr-meta job since the report no longer needs
a separate workflow_run trigger.
@github-actions

Copy link
Copy Markdown
Contributor

CI Report

All checks passede637bf1

Pipeline

Stage Status Ubuntu Windows macOS
Typecheck success
Tests success

Tests

Metric Value
Total 3301
Passed 3281
Skipped 20
Files 932
Duration 1m 42s

✅ All 3281 tests passed across 932 files

20 test(s) skipped
  • buildTypeEnv > known limitations (documented skip tests) > Ruby block parameter: users.each { |user| } — closure param inference, different feature
  • Python match/case as-pattern type binding > resolves u.save() to User#save via match/case as-pattern binding
  • Python match/case as-pattern type binding > does NOT resolve u.save() to Repo#save (negative disambiguation)
  • Swift constructor-inferred type resolution > detects User and Repo classes, both with save methods
  • Swift constructor-inferred type resolution > resolves user.save() to Models/User.swift via constructor-inferred type
  • Swift constructor-inferred type resolution > resolves repo.save() to Models/Repo.swift via constructor-inferred type
  • Swift constructor-inferred type resolution > emits exactly 2 save() CALLS edges (one per receiver type)
  • Swift self resolution > detects User and Repo classes, each with a save function
  • Swift self resolution > resolves self.save() inside User.process to User.save, not Repo.save
  • Swift parent resolution > detects BaseModel and User classes plus Serializable protocol
  • Swift parent resolution > emits EXTENDS edge: User → BaseModel
  • Swift parent resolution > emits IMPLEMENTS edge: User → Serializable (protocol conformance)
  • Swift cross-file User.init() inference > resolves user.save() via User.init(name:) inference
  • Swift cross-file User.init() inference > resolves user.greet() via User.init(name:) inference
  • Swift return type inference > detects User class and getUser function
  • Swift return type inference > detects save function on User (Swift class methods are Function nodes)
  • Swift return type inference > resolves user.save() to User#save via return type of getUser() -> User
  • Swift return-type inference via function return type > resolves user.save() to User#save via return type of getUser()
  • Swift return-type inference via function return type > user.save() does NOT resolve to Repo#save
  • Swift return-type inference via function return type > resolves repo.save() to Repo#save via return type of getRepo()

Coverage

Metric Coverage Covered Base (main) Delta
Statements 67.08% 7864/11722 46.88% 📈 +20.2%
Branches 58.56% 5281/9018 41.48% 📈 +17.1%
Functions 68.97% 696/1009 46.56% 📈 +22.4%
Lines 69.42% 7049/10154 48.48% 📈 +20.9%

📋 Full run · Coverage from Ubuntu · Generated by CI

@magyargergo magyargergo merged commit 60c93d7 into main Mar 19, 2026
8 checks passed
@magyargergo magyargergo deleted the feat/upgrade-ladybugdb-0.15.2 branch March 19, 2026 08:25
motolese pushed a commit to motolese/datamoto-gitnexus that referenced this pull request Apr 23, 2026
…ds (abhigyanpatwari#374)

* feat: upgrade @ladybugdb/core to 0.15.2 and remove segfault workarounds

The upstream fix (ladybug-nodejs#1) resolves the child QueryResult lifetime
segfault, making .close() safe on all platforms. This removes 6 workaround
sites:

- Remove `dangerouslyIgnoreUnhandledErrors` from vitest config
- Remove platform-conditional .close() guards in global-setup and test helper
- Delete test/setup.ts (process._getActiveHandles unref hack)
- Replace no-op cleanup in test-indexed-db.ts with real adapter close
- Fix pool adapter closeOne() to properly close connections with shared
  Database refcount guard and orphaned connection handling in checkin()
- Update segfault-related comments across the codebase

Also bumps @ladybugdb/wasm-core to ^0.15.2 in gitnexus-web for consistency.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: keep dangerouslyIgnoreUnhandledErrors for macOS N-API exit crash

The N-API destructor ordering crash during worker fork exit on macOS is
independent of the QueryResult lifetime fix in 0.15.2. Tests pass, but
the exit triggers a crash. Keep the flag with an updated comment
explaining the actual cause. Can be removed once LadybugDB fixes all
destructor ordering issues upstream.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* ci: unify test run for single-pass coverage

- Update `npm test` to run all tests (unit + integration + lbug-db)
  via `vitest run` instead of `vitest run test/unit`
- Add `test:unit` script for running unit tests only
- Remove `ci-integration.yml` — the per-file lbug-db process isolation
  is no longer needed with `dangerouslyIgnoreUnhandledErrors` and
  `fileParallelism: false` handling fork exit issues
- Update `ci-unit-tests.yml` to run all tests with build + coverage
- Simplify `ci.yml` gate (two jobs: quality + tests)
- Simplify `ci-report.yml` (single coverage artifact, no merge step)

* fix: update cli-commands test for renamed test:all → test:unit script

* fix: set USERPROFILE in setup-skills test for Windows compatibility

os.homedir() checks USERPROFILE on Windows, not HOME.

* fix: add isolate: false to lbug-db project to prevent fork crashes

On macOS, N-API destructors crash fork workers on exit. With
isolate: true (default), vitest recycles the fork between files,
triggering the crash after each file. After several crashes, the
remaining lbug-db files never execute.

isolate: false keeps all 8 lbug-db files in a single fork — the
fork only exits once after all files complete, and that single exit
crash is caught by dangerouslyIgnoreUnhandledErrors.

* fix: add unique sequence.groupOrder to vitest projects

Vitest v4 requires unique groupOrder when projects have different
maxWorkers (lbug-db has fileParallelism: false → maxWorkers: 1).

* fix: await async close() in global-setup and remove isolate: false

global-setup.ts called conn.close() and db.close() without await —
these return Promise<void> in @ladybugdb/core 0.15.2.  The setup
function returned before the DB was fully closed, so vitest forks
hit a stale file lock when opening the same DB path, crashing the
lbug-db worker before any test ran.

isolate: false caused native state corruption after 2-3 open/close
cycles in the same fork (vitest-specific, not reproducible in plain
Node.js).  Without it, each file gets its own module scope and the
N-API destructor crash at fork exit is caught by
dangerouslyIgnoreUnhandledErrors.

Also fixes fire-and-forget close() calls in the pool adapter —
try/catch around an async close() never catches rejections; changed
to .catch(() => {}) for proper unhandled-rejection prevention.

Before: 0/8 lbug-db files ran on macOS CI (fork crash).
After:  8/8 pass, 84 files, 3077 tests, zero errors.

* fix: update project index references in AGENTS.md and CLAUDE.md to reflect correct symbol counts and relationships

* feat: enhance lbug adapter with external database support and write operation validation

* feat: create ci-tests workflow for comprehensive test coverage across platforms

* ci: move PR report inline to ci.yml, delete ci-report.yml

The old ci-report.yml used workflow_run which always runs code from
the default branch (main). This meant the PR comment used main's
stale report template that still referenced the old unit/integration
split architecture — causing "Merge coverage reports" failures.

Moving the report inline to ci.yml means it runs from the PR branch
and uses the current report template. The report now shows:
- per-platform status (Ubuntu/Windows/macOS columns)
- unified test counts from the single vitest run
- coverage with base branch (main) delta comparison
- commit SHA for traceability

Also removes the save-pr-meta job since the report no longer needs
a separate workflow_run trigger.

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Gergo Magyar <gergomagyar@icloud.com>
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.

3 participants