Skip to content

test(api): make the durable analysis cache own its database setup - #43

Merged
edwardnewgate710 merged 3 commits into
mainfrom
claude/analysis-cache-fresh-db
Sep 5, 2026
Merged

edwardnewgate710 merged 3 commits into
mainfrom
claude/analysis-cache-fresh-db

Conversation

@edwardnewgate710

@edwardnewgate710 edwardnewgate710 commented Sep 5, 2026 •

Copy link
Copy Markdown
Collaborator

M15 Increment 49 — the durable analysis-cache suite establishes its own database

Closes the defect Increment 48 recorded as out of its own scope. Test lifecycle only — no production code, migration, constraint, foreign key or repository semantic changed.

The defect, re-proven on current main before any edit

Measured on PostgreSQL 16.14 (pgvector/pgvector:pg16), Node v24.15.0, pg 8.22.0, at origin/main 771b1f93c05585294474e95fcb24bf116766db3d.

State Result
A — genuinely fresh, never-migrated database, target file alone 10 tests, 4 pass, 6 fail
B — already-migrated database, target file alone 10/10 pass — and 5 rows left behind
C1 — whole packages/api package, fresh database 993 tests, 977 pass, 6 fail (the same six)
C2 — packages/persistence first (186 pass), then the target file 10 pass, 0 fail

Three of the six failures threw SQLSTATE 42P01 relation "engine_analysis_cache" does not exist from the suite's own LOCK TABLE, DELETE and UPDATE. The other three failed as ordinary assertions, expecting a durable row and getting a recomputation.

The four that passed did so vacuously. PgAnalysisCache absorbs a database fault, reports it through onError, and returns a miss — so the engine recomputes and a suite about durability runs with no durability at all. "A different engine build does not read the first build's rows" asserts two searches and no cache hit, which a table that does not exist satisfies perfectly; two more shut the cache tier down before touching the table; the last points at an unreachable server and never uses DATABASE_URL.

Root cause

The suite required schema it did not establish. engine_analysis_cache is created by packages/persistence/migrations/0026_engine_analysis_cache.sql and indexed by 0027; the file never called migrate(), never used withTestDatabase or withSharedDatabase, and opened pools straight onto DATABASE_URL. It was the only file in the repository operating on application tables while neither migrating nor creating scratch DDL of its own.

The masking was measured, not assumed: seventeen packages/persistence suites call migrate() on the shared DATABASE_URL, and both the root test script and the CI postgres-integration job run that package before packages/api.

The residue is the same question from the other side. freshFen() minted a unique position per test — collision-avoidance, not cleanup. A fresh identity means the next run never collides, not that this one took its rows back.

Design

Three candidates were compared against the repository's own patterns before anything was written.

  • A (chosen) — migrate the shared DATABASE_URL once per file, own the rows. It is the shape of the sibling suite for this exact table, packages/persistence/test/analysis-cache.integration.test.ts, and of packages/api/test/analysis-real-stack.test.ts, which runs the same composition, applies the canonical migrations itself, and which CI already proves against a never-migrated database in the analysis-smoke job.
  • B — a disposable migrated database per test. Rejected on cost and blast radius: ten CREATE DATABASEs, ten passes over 31 migrations, ten quiescence waits and ten drops, for a suite that needs one table — and a crash mid-run leaves orphaned test_db_* databases behind.
  • C — migrate inside every test body. Rejected as A without the flag: the same semantics, re-walking 31 migrations ten times.

Regression first, proven RED for the right reason

packages/api/test/analysis-cache-durable-ownership.integration.test.ts was written before the fix and run against the unmodified suite: 3 tests, 0 pass, 3 fail, with relation "engine_analysis_cache" does not exist appearing four times and the residue check reporting the exact five surplus rows by identity.

It follows the parent/child harness Increment 48 established: a disposable database from withTestDatabase — which creates a database and applies nothing, so it is the fresh condition — and the compiled suite spawned as a child with NODE_TEST_CONTEXT deleted (a child that inherits it silently declines to run the file and exits 0) and --test-reporter=tap pinned. Three readings:

  1. the suite passes against a database nothing else prepared, and leaves it empty;
  2. any single one of its tests can be the only one that runs (--test-name-pattern), so establishing the schema in the first test would not satisfy the check;
  3. against a migrated database carrying a stranger's row, the table comes back exactly as it was found.

The child is deliberately spawned from the repository root, not packages/api, so a working directory the suite does not control cannot decide whether its schema gets built.

Implementation

  • MIGRATIONS asks the persistence package for the directory it ships, through its own migrationsDir(), instead of assembling a path from process.cwd() or from this file's relative position.
  • ensureMigrated(pool) applies the canonical ledger once, behind a file-scoped flag.
  • Every test runs inside withDatabase = withSharedDatabase({ max: 2, cleanup: deleteMintedRows }).
  • freshFen() records each identity before returning it, so a body that throws after a commit still hands cleanup something it owns.
  • Cleanup deletes by exact FEN equality (WHERE fen = ANY($1::text[])) — never by the rnbqkbnr/... prefix every standard starting position shares. Minted counters start at a million because the persistence package's own cache suite keys its rows on the canonical ... 0 1, and this file deletes by FEN without regard to fingerprint.
  • Tests that built their own single-connection pools use the one withDatabase hands them; the two ad-hoc finally deletes — which swallowed their own failures with .catch(() => {}) — are gone, because cleanup owns those rows on the failure path too.
  • An after hook audits that the file left nothing behind, which is the reading a developer running only this file still gets.
  • Two lifecycle holes found in adversarial review were closed: the lock-holding test acquired its client outside the try that guarantees the engine is shut down, and the racing test awaited two shutdowns in sequence so a rejection from the first skipped the second.

Rejected outright: TRUNCATE, broad DELETE, prefix cleanup, retries, sleeps, conflict suppression, test-order dependence, "run persistence first", silent skip on a missing table, and any catch that turns a schema failure into success.

Acceptance, on the final code

Check Result
Three independent brand-new empty databases 10/10, 10/10, 10/10 — 0 rows of residue each
Already-migrated database carrying 5 unrelated rows 10/10 — all 5 still there afterwards
Whole packages/api package, brand-new database, nothing run first 996 tests, 986 pass, 0 fail, 10 skipped, 0 residue
Leaked test_db_* databases 0
Lingering backends 0

The 10 skips are the engine-binary smoke files, which self-skip without STOCKFISH_PATH.

Falsification — 7 of 9 killed, both survivors reported

Killed: remove the schema establishment · assert the ledger was already applied · point the composition at no database so the durable tier silently switches off · skip teardown · widen cleanup to DELETE FROM engine_analysis_cache · resolve the migrations from the working directory again · record the minted identity for the audit but not for the cleanup that acts on it.

Survivor 1 — let a teardown failure replace the body failure. That precedence contract belongs to withSharedDatabase, not to this file, and the same mutation is killed by the suite that owns it (packages/persistence/test/reused-database.integration.test.ts, 6 failing).

Survivor 2 — migrate on the first body to run instead of behind the flag. An equivalent mutant: with tests running one at a time, the two are the same observable behaviour.

Every mutated source was restored and verified byte-identical by SHA-256.

Validation

npm run build ✅ · npm run lint ✅ · ownership regression 3/3 · full repository suite exit 0, 19 packages, 3304 tests, 3276 pass, 0 fail, 28 skipped, with 0 suites self-skipping for a missing DATABASE_URL · check:ci-parity, check:variant-parity, check:adr-claims, check:engine-pin-parity, check:observability, test:scripts all exit 0 · git diff --check clean.

npm run test:counts — exit 1. Measured without piping anything that could swallow its status: 3256 tests (113 skipped) and gateway-service: ERROR with six TS2307: Cannot find module 'ioredis' diagnostics. This is the pre-existing open issue recorded in Increment 48 and it is not fixed here — the root workspaces field is packages/*, so services/gateway dependencies are never installed by a root npm install. No gateway dependency was installed or mutated in this PR. Its totals are lower than the suite's above because it runs without DATABASE_URL, so the database suites self-skip; that is a property of how the script is invoked, not a change in coverage.

Review findings, and what they turned out to be

Adversarial review found four things worth acting on and two worth stating. Acted on: the sentinel row in the ownership regression used the canonical ... 0 1, which the suite's own minting could produce roughly once in two million and would then have deleted, so minted counters now start at a million; the lock-holding test acquired its client outside the try that guarantees a shutdown; the racing test awaited two shutdowns in sequence; and the TAP tally parser anchored on $ without allowing the carriage return Windows puts before it.

Qodo — migrations path (fixed). It flagged join(__dirname, '../../../persistence/migrations') as encoding the emitted dist-test layout. Its stated failure mode — running the TypeScript source directly — is not reachable in this repository: every test file, including untouched ones on main, fails first at ESM resolution of its extensionless relative imports, so Node never reaches the path. The underlying concern was right regardless, and the answer already existed: migrationsDir() walks up from the persistence module itself and was added in response to an earlier path-portability finding. The file now knows nothing about any layout. Verified both ways round — the compiled suite passes on a fresh database run from packages/api and from the repository root.

Known limits recorded rather than fixed

  • The retention test calls deleteExpired(new Date('2000-01-01'), 100), which is table-wide by design — it is the production sweep under test, not cleanup this PR added. Pre-existing and unchanged.
  • mintedFens is module-scoped and drained by whichever cleanup runs next, which assumes tests run one at a time — what --test-concurrency=1 and node's sequential top-level tests give, and the same assumption the sibling persistence suite makes. Now stated in the file rather than implied.
  • The finally blocks that shut engines down are still plain try/finally, so a shutdown() that rejects while an assertion is already failing replaces it. Pre-existing, unchanged, and now said out loud where the opposite could have been read into the cleanup docstring.

Still open

  • Signature B — UNRESOLVED. 0 occurrences recorded across this increment's pre-fix reproduction on four databases, its acceptance runs, two rounds of falsification and a full-repository run of 3304 tests. Like Increment 47's 26 bounded runs and Increment 48's zero, that bounds the rate under those conditions and resolves nothing. Not attributed to this change.
  • npm run test:counts / services/gateway workspace exclusion — OPEN. This PR is not that task. The remedy is still not assumed to be "add it to the workspaces".

Changed files

  • packages/api/test/analysis-cache-durable.integration.test.ts — the suite
  • packages/api/test/analysis-cache-durable-ownership.integration.test.ts — new regression
  • docs/PROJECT_STATE.md, docs/ROADMAP.md

DO NOT MERGE — the repository owner merges manually.

🤖 Generated with Claude Code

https://claude.ai/code/session_01CUPqvu66J5ZVyiv4nJ797r

Summary by CodeRabbit

  • Documentation

    • Updated project handover notes with migration, lifecycle, portability, validation, and known limitation details.
    • Refined roadmap tracking for ongoing investigations, integration coverage, and workspace test-count follow-ups.
  • Tests

    • Added coverage for durable analysis-cache ownership, database setup, cleanup, retention, and preservation of existing data.
    • Improved integration testing across fresh and reused databases, failure scenarios, concurrency, locking, outages, cache consistency, and cross-platform test output.

hessiun710 and others added 2 commits September 5, 2026 12:28
The suite required `engine_analysis_cache` and never built it. On a
genuinely fresh database it failed 6 of 10 tests — three throwing
SQLSTATE 42P01 from its own statements, three asserting on a durable row
that was never written, because the cache absorbs a missing table as a
fault and degrades to computing. It passed only because the persistence
package migrates the shared database and runs first, in both the root
test script and the postgres-integration CI job. On a migrated database
it passed and left five rows behind every run: minting a fresh FEN per
test is collision-avoidance, not cleanup.

It now applies the canonical migrations itself, once per file, from a
path anchored on its own location rather than the working directory, and
every test runs inside the `withSharedDatabase` contract with cleanup
scoped to the exact FENs it minted — recorded before the statement that
creates the row, so a body that throws after a commit still surrenders
it. A new ownership regression runs the compiled suite as a child
process against a disposable, unmigrated database and reads the result
from outside: it passes with nothing prepared for it, any one of its
tests can be the only one that runs, and it hands a migrated table back
exactly as it found it, stranger's row included.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CUPqvu66J5ZVyiv4nJ797r
Records the reproduction on four databases, the proven root cause and
the measured masking order, the ownership design and the two candidates
rejected, the RED regression, the fresh-database acceptance matrix, and
7 of 9 mutations killed with both survivors named and explained. Marks
the analysis-cache-durable fresh-database dependency RESOLVED, and keeps
Signature B and the test:counts/services/gateway workspace issue open —
the latter re-measured here as exit 1, unchanged in kind.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CUPqvu66J5ZVyiv4nJ797r
@edwardnewgate710

Copy link
Copy Markdown
Collaborator Author

/review

@edwardnewgate710

Copy link
Copy Markdown
Collaborator Author

@coderabbitai full review

@qodo-code-review

Copy link
Copy Markdown

PR Summary by Qodo

Make durable analysis-cache tests own their database lifecycle

🐞 Bug fix 🧪 Tests 📝 Documentation 🕐 40+ Minutes

Grey Divider

AI Description

• Make durable cache tests apply canonical migrations independently.
• Clean up only cache rows identified by FENs minted during each test.
• Add regressions for fresh databases, isolated execution, and unrelated-row preservation.
Diagram

graph TD
  R["Ownership Regression"] --> D[("Disposable Database")] --> C["Child Test Suite"] --> H["Shared DB Harness"] --> M["Canonical Migrations"] --> T[("Cache Table")] --> U["Scoped Cleanup"] --> A["Residue Audit"]
Loading
High-Level Assessment

The following are alternative approaches to this PR:

1. Disposable database per test
  • ➕ Provides complete test isolation.
  • ➕ Eliminates shared-row ownership bookkeeping.
  • ➖ Runs the full migration ledger ten times.
  • ➖ Adds database creation, quiescence, and drop overhead.
  • ➖ Can leave orphaned databases after interrupted runs.
2. Migrate inside every test
  • ➕ Makes each test's schema prerequisite explicit.
  • ➕ Avoids file-scoped migration state.
  • ➖ Repeatedly walks the same migration ledger.
  • ➖ Provides no additional isolation over the selected shared-database approach.
  • ➖ Increases suite runtime without addressing cleanup ownership.

Recommendation: Keep the selected file-scoped migration plus exact-row cleanup approach. It follows existing repository patterns for the same table, preserves realistic shared-database behavior, and avoids the cost and orphan risk of database-per-test isolation while still proving fresh-database independence externally.

Files changed (4) +731 / -229

Bug fix (1) +376 / -225
analysis-cache-durable.integration.test.tsMake durable cache tests establish and clean their database state +376/-225

Make durable cache tests establish and clean their database state

• Applies canonical migrations once per file and runs every test through the shared-database lifecycle helper. Tracks minted FENs for exact cleanup, audits residue after the suite, reuses managed pools, and strengthens shutdown behavior on failure paths.

packages/api/test/analysis-cache-durable.integration.test.ts

Tests (1) +201 / -0
analysis-cache-durable-ownership.integration.test.tsAdd external database-ownership regression coverage +201/-0

Add external database-ownership regression coverage

• Runs the compiled durable cache suite as a child process against disposable databases. It verifies operation from an unmigrated state, standalone execution of an individual test, complete cleanup, and preservation of unrelated cache rows.

packages/api/test/analysis-cache-durable-ownership.integration.test.ts

Documentation (2) +154 / -4
PROJECT_STATE.mdRecord Increment 49 analysis-cache lifecycle resolution +151/-1

Record Increment 49 analysis-cache lifecycle resolution

• Documents the fresh-database failure, accidental test-order dependency, selected ownership model, implementation, validation, falsification results, and remaining limits. It also records that no production or migration semantics changed.

docs/PROJECT_STATE.md

ROADMAP.mdMark the durable cache schema dependency as resolved +3/-3

Mark the durable cache schema dependency as resolved

• Reclassifies the durable analysis-cache test lifecycle defect from open to resolved and summarizes its migration and cleanup guarantees. It also updates observations for the unrelated Signature B and test-count issues.

docs/ROADMAP.md

@qodo-code-review

qodo-code-review Bot commented Sep 5, 2026 •

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (0) 📘 Rule violations (0) 📜 Skill insights (0)

Grey Divider


Remediation recommended

1. Source-mode migration path breaks ✓ Resolved 🐞 Bug ≡ Correctness
Description
MIGRATIONS is relative to the emitted dist-test/test layout, so executing the source test
directly resolves it to the nonexistent <repo>/persistence/migrations instead of
<repo>/packages/persistence/migrations. Consequently, an IDE or Node TypeScript run against a
fresh database still fails during migration despite the new standalone-database guarantee.
Code

packages/api/test/analysis-cache-durable.integration.test.ts[56]

+const MIGRATIONS = join(__dirname, '../../../persistence/migrations');
Relevance

●●● Strong

The source-relative path is incorrect; recent precedents accept fixes for migration and runtime
path-resolution portability.

PR-#18
PR-#23

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The source file is under packages/api/test, where ../../../persistence/migrations normalizes to
<repo>/persistence/migrations; the real directory is packages/persistence/migrations. The path
happens to work in the normal package script only because tsconfig.test.json emits beneath
packages/api/dist-test/test, adding the extra directory level that this relative traversal
implicitly relies upon, contradicting the changed code's stated IDE/direct-run support.

packages/api/test/analysis-cache-durable.integration.test.ts[49-56]
packages/api/tsconfig.test.json[3-5]
packages/api/package.json[23-26]

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 migration path only works after TypeScript emits the test beneath `dist-test`. Running the source test directly from an IDE or Node resolves the path one directory too high and cannot establish a fresh database.

## Issue Context
The new comments explicitly require migration discovery to work for IDE and direct `node --test packages/api/...` execution as well as the compiled npm test path. Resolve the persistence migration directory from a stable repository/package landmark, or account explicitly for both source and emitted layouts, and add coverage for both resolutions.

## Fix Focus Areas
- packages/api/test/analysis-cache-durable.integration.test.ts[49-56]
- packages/api/test/analysis-cache-durable-ownership.integration.test.ts[33-36]

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


Grey Divider

Context sources
Review mode: 🚀 Fast: The push makes a localized test-path portability adjustment plus documentation updates, with no production behavior or high-risk contract changes.

Grey Divider

Tip of the day
💡 Did you know, you can keep summaries lean with Finding overflow, which tucks the rest behind 'View more'

More tips ↗ | Customize Qodo ↗ | Qodo docs ↗

Grey Divider

Qodo Logo

Comment thread packages/api/test/analysis-cache-durable.integration.test.ts Outdated
@coderabbitai

coderabbitai Bot commented Sep 5, 2026 •

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Team

Run ID: ca1bb1e6-cf02-4b7b-a2f1-3ebdf583e600

📥 Commits

Reviewing files that changed from the base of the PR and between 771b1f9 and daa430c.

📒 Files selected for processing (4)
  • docs/PROJECT_STATE.md
  • docs/ROADMAP.md
  • packages/api/test/analysis-cache-durable-ownership.integration.test.ts
  • packages/api/test/analysis-cache-durable.integration.test.ts

Included review availability: Your plan provides up to 8 included reviews per hour; 1 remains after this review.


📝 Walkthrough

Walkthrough

The durable analysis-cache integration tests now resolve packaged migrations, use shared database lifecycle helpers, track owned FEN rows, verify cleanup and ownership, and validate execution in isolated child processes. Project documentation records the implementation and remaining limitations.

Changes

Analysis-cache integration lifecycle

Layer / File(s) Summary
Shared database lifecycle
packages/api/test/analysis-cache-durable.integration.test.ts
The suite uses canonical migrations, shared pools, tracked FEN ownership, centralized cleanup, residue audits, and fixture-managed execution for cache, outage, concurrency, locking, staleness, and retention scenarios.
Ownership regression harness
packages/api/test/analysis-cache-durable-ownership.integration.test.ts
Child-process tests verify fresh-database setup, focused test execution, skipped and failed test detection, cleanup of suite-owned rows, and preservation of pre-existing rows.
Verification records
docs/PROJECT_STATE.md, docs/ROADMAP.md
The handover and roadmap record the implementation, validation results, unresolved investigation, known limitations, and workspace test-count limitation.

Estimated code review effort: 4 (Complex) | ~45 minutes

Merge Risk: ⚪ Minimal · up to daa43

The test isolation and cleanup changes are ready to merge, with no identified production or repository risk.

Sequence Diagram(s)

sequenceDiagram
  participant OwnershipTest
  participant ChildProcess
  participant DurableSuite
  participant PostgreSQL
  OwnershipTest->>ChildProcess: start durable suite
  ChildProcess->>DurableSuite: execute selected tests
  DurableSuite->>PostgreSQL: apply migrations and manage cache rows
  ChildProcess-->>OwnershipTest: return TAP output and exit status
  OwnershipTest->>PostgreSQL: verify cleanup and ownership
Loading

Suggested reviewers: hessiun710

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main change: the durable analysis-cache API tests now manage their own database setup.
Docstring Coverage ✅ Passed Docstring coverage is 88.89% which is sufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 9 functions across 2 files. (2 skipped: 2 u…
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.
✨ 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 claude/analysis-cache-fresh-db

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

@coderabbitai

coderabbitai Bot commented Sep 5, 2026 •

Copy link
Copy Markdown
✅ Action performed

Full review finished.

Qodo found the migrations path encoded the emitted `dist-test` layout —
`join(__dirname, '../../../persistence/migrations')` is only correct one
directory down from the source tree. Its stated failure mode, running
the TypeScript source directly, is not reachable here: every test file,
untouched ones on `main` included, fails first at ESM resolution of its
extensionless relative imports. The concern was right regardless, and
the answer already existed. `migrationsDir()` walks up from the
persistence module itself and was added in response to an earlier
path-portability finding, so the file now knows nothing about any
layout. Verified both ways round: the compiled suite passes on a fresh
database run from `packages/api` and from the repository root.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CUPqvu66J5ZVyiv4nJ797r
@edwardnewgate710

Copy link
Copy Markdown
Collaborator Author

/review

@edwardnewgate710

Copy link
Copy Markdown
Collaborator Author

@coderabbitai full review

@qodo-code-review

Copy link
Copy Markdown

Code review by qodo was updated up to the latest commit daa430c

@coderabbitai

coderabbitai Bot commented Sep 5, 2026 •

Copy link
Copy Markdown
✅ Action performed

Full review finished.

@edwardnewgate710

Copy link
Copy Markdown
Collaborator Author

Qodo's finding is addressed in daa430c.

Its stated failure mode — running the TypeScript source directly — is not reachable in this repository: every test file, including untouched ones on main, fails first at ESM resolution of its extensionless relative imports, so Node never reaches the migrations path. Verified against packages/api/test/analysis-real-stack.test.ts on main, which fails identically.

The underlying concern was right regardless: a relative path encodes a layout. MIGRATIONS now calls migrationsDir() from @chess-platform/persistence/pg, which walks up from the persistence module itself and was added in response to an earlier path-portability finding, so this file knows nothing about any layout.

Verified both ways round on brand-new empty databases: the compiled suite is 10/10 with 0 rows of residue when run from packages/api and when run from the repository root. The ownership regression spawns its child from the repository root for exactly this reason, and a mutation that reverts the resolution to a working-directory walk is killed by it (3 failing).

@edwardnewgate710
edwardnewgate710 merged commit 026005b into main Sep 5, 2026
10 checks passed
@edwardnewgate710
edwardnewgate710 deleted the claude/analysis-cache-fresh-db branch September 5, 2026 10:56
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.

2 participants