Skip to content

chore: absorb audit into packages/audit - #13955

Merged
ChiragAgg5k merged 577 commits into
mainfrom
chore/absorb-audit
Sep 28, 2026
Merged

ChiragAgg5k merged 577 commits into
mainfrom
chore/absorb-audit

Conversation

@ChiragAgg5k

Copy link
Copy Markdown
Member

Summary

Moves utopia-php/audit into packages/audit, so Appwrite loads it directly. Wave 4 of #13828, following rfc/monorepo.md. The mirror head is the 4.0.3 release Appwrite already locks (bc9fa153), so there is no version gap.

# Commit What
1 Add 'packages/audit/' from commit 'bc9fa153…' Subtree import from the mirror with full history
2 chore(audit): mirror plumbing mirror.yml points at this repository's mirror-redirect.yml; README banner refreshed; dead Travis badge dropped. No banned files
3 refactor: load audit from packages/ Root autoload and replace entries; drops utopia-php/audit: ^4.0; hoists utopia-php/fetch for one commit; step A (below); PHPStan baseline; RFC phase 8 bullet
4 refactor(audit): replace utopia-php/fetch with client The one decided exception to the pure move (below)
5 style(audit): strip trailing whitespace from the README Two upstream lines that fail git diff --check

Step A

Before After
Source src/Audit/*, Utopia\Audit\ → src/Audit src/*, Utopia\Audit\ → src/
Unit tier tests/Audit/{QueryTest,Adapter/ClickHouseSqlSnapshotTest}, Utopia\Tests\ tests/*, Utopia\Audit\Tests\
Services tier tests/Audit/{AuditBase,Adapter/ClickHouseTest,Adapter/DatabaseTest} tests/E2E/, Utopia\Audit\Tests\E2E\ (MariaDB and ClickHouse from the package compose file)
phpunit.xml unit suite listed two files tests minus tests/E2E; e2e is tests/E2E
phpstan.neon includes ../../phpstan.neon standalone, level max over src and tests
rector.php none standalone, withPhpSets() + typeDeclarations

Apart from commit 4, src/ is the release byte for byte except the path move and Pint (fn ( spacing, empty constructor bodies, and simplified_null_return turning SQL::getAttribute()'s return null; into return;, which is the same value). Rector changes nothing, so rector.php needs no skips. Nothing new to hoist: database is in the root require, and query, validators, client and psr7 are in packages/.

fetch → client

Adapter\ClickHouse was the only Utopia\Fetch user. It now sends PSR-7 requests through Utopia\Client.

fetch client
new Client() held on the adapter, one reused cURL handle new Client(new CurlAdapter())->withConnectionReuse()
setTimeout(30_000) withTimeout(30)
default 5 s connect timeout client default (5 s)
follows redirects, max 5 withFollowRedirects(), max 50 (see below)
addHeader('X-ClickHouse-User' / 'X-ClickHouse-Key') on the client the same headers on every request
addHeader('X-ClickHouse-Database') before each query the same header on each query request
fetch(…, method: GET) for /ping RequestFactory::createRequest(Method::GET, …)
array body, no content type → cURL multipart RequestFactory::multipart(Method::POST, …, $fields)
string body → cURL's default application/x-www-form-urlencoded RequestFactory::body(…, ContentType::FORM_URLENCODED)
getBody() (string) getBody()
Utopia\Fetch\Exception (an \Exception) caught and wrapped Utopia\Client\Exception\* (also \Exception), caught and wrapped the same way

Status handling is unchanged: non-200 throws ClickHouse query failed with HTTP {status}: {body}, wrapped as ClickHouse query execution failed: …; ping() returns false on any throwable or non-200.

I compared both clients against a header-echo server: same method, URL, auth headers, multipart fields, raw body and content type, and the same Expect: 100-continue behaviour on bodies over 1 MB. Remaining differences:

Where Before After
All requests no Accept-Encoding Accept-Encoding advertised, decoded transparently (ClickHouse only compresses with enable_http_compression=1)
ping() after a query also carried the sticky X-ClickHouse-Database user and key only (/ping ignores them)
Redirect cap 5 hops 50 hops

The 5-hop cap does not carry over because withFollowRedirects(maxHops:) is only on packages/client head (#13910), not in the released client 0.5.1 that the package's registry-resolved job installs. The package requires utopia-php/client: ^0.5; once 0.6.0 is out the cap can come back with maxHops: 5.

The constructor gains an optional trailing ?ClientInterface $client = null (as the agents adapters do), so the request building is unit tested with a named recording fake (tests/Adapter/Client.php): ping, https, multipart parameters, JSONEachRow insert, error status, and network errors. No reflection.

Lock

Package Before After
utopia-php/audit 4.0.3 removed (commit 3)
utopia-php/fetch 1.1.2 removed (commit 4)

Nothing else in the lock changes. With audit gone nothing in Appwrite's dependency graph requires utopia-php/fetch, which completes the fetch replacement from #13893. The one remaining Utopia\Fetch user in the tree is packages/emails/import.php, a dev-only list importer that installs utopia-php/fetch through packages/emails' own require-dev; it is untouched here.

Validation

Check Result
bin/monorepo validate all packages valid
bin/monorepo check audit Rector, Pint and PHPStan level max (with baseline) pass
bin/monorepo test audit (registry-resolved: client 0.5.1, psr7 0.2.2), unit tier 30 tests / 136 assertions
bin/monorepo test audit, e2e tier 91 tests / 979 assertions against MariaDB 10.11 and ClickHouse 25.11; 3 deprecations from the upstream tests' Query::contains()
phpunit --testsuite packages in appwrite/appwrite:2.3.0 completes: 8,736 tests; the audit tests pass. 6 errors outside audit: 5 agents DiffCheck tests that need a git checkout the container cannot see from a worktree, and client's SwooleCoroutine reused-connection test (Connection reset by peer); this PR changes neither package
Root PHPStan (host) on the 6 Appwrite files that use Utopia\Audit no errors
Class resolution Utopia\Audit\Adapter\ClickHouse → packages/audit/src/Adapter/ClickHouse.php; vendor/utopia-php/audit and vendor/utopia-php/fetch gone
composer validate --no-check-publish valid (the existing utopia-php/platform exact-constraint warning only)
bin/monorepo split audit --dry-run 635db709, fast-forwards from the mirror head bc9fa153
git diff --check clean
git grep 'Utopia\\Fetch' only Appwrite\Utopia\Fetch\BodyMultipart and packages/emails/import.php

Baseline: 5 findings. 2 in src: Log::getData() returns the decoded mixed array against its array<string, mixed> docblock, and Pint's return; in the untyped SQL::getAttribute(). 3 in the e2e tests: batch fixtures typed as plain arrays against logBatch()'s event shape. Listed under phase 8 in the RFC.

Merge and follow-up

Merge with a merge commit. A squash drops the git-subtree-* annotation and orphans the package from its mirror.

The mirror already has the canonical main ruleset (id 18922505: no deletion, no force push, PRs required; split app 4016286 always bypasses), so the absorb ran with --skip-ruleset. It also has classic branch protection on main (enforce_admins on, 1 approving review, no required checks) whose PR-review bypass allowances include the split app. Left as is.

After merge:

Step
Split Confirm Split pushes to utopia-php/audit
Retire Remove packages/audit from utopia-php/monorepo
client 0.6.0 Once released, restore the 5-hop cap with maxHops: 5
emails Move packages/emails/import.php off utopia-php/fetch
Triage Open on the mirror, listed below
Mirror Opened Title
PR utopia-php/audit#129 2026-07 refactor(clickhouse): make retention a readonly constructor property
PR utopia-php/audit#111 2026-03 Support string tenant IDs in multi-tenant audit logging

No open issues. Nothing is ported here. Anything still wanted gets re-opened against packages/audit/src/ (paths lost the Audit/ segment).

🤖 Generated with Claude Code

abnegate and others added 30 commits February 12, 2025 22:07
loks0n and others added 12 commits July 31, 2026 15:52
chore(audit)!: upgrade to utopia-php/database 7.x
refactor(audit): migrate the ClickHouse adapter to utopia-php/query 0.6
chore: stop committing package lock files
…89293f'

git-subtree-dir: packages/audit
git-subtree-mainline: 1bc79bd
git-subtree-split: bc9fa15
Point the mirror redirect workflow at appwrite/appwrite, refresh the README banner and drop the dead Travis badge.
Autoload Utopia\Audit from packages/audit and replace utopia-php/audit, so the vendored 4.0.3 copy leaves the lock. utopia-php/fetch is hoisted to the root until the next commit moves the ClickHouse adapter to client.

Step A: flat src/, Utopia\Audit\Tests\ over tests/, the MariaDB and ClickHouse suites under tests/E2E/, a standalone level-max phpstan.neon with a 5-finding baseline, and a standalone rector.php.
utopia-php/fetch is archived. The ClickHouse adapter now sends PSR-7 requests through utopia-php/client with the same 30 s timeout, 5 s connect timeout, followed redirects and reused connection, the same auth and database headers, multipart parameter bodies and urlencoded JSONEachRow bodies, and the same status and error handling.

The constructor takes an optional PSR-18 client so the request building is unit tested with a recording fake. Nothing requires utopia-php/fetch any more, so it leaves the root require and the lock.
@ChiragAgg5k ChiragAgg5k added the absorb History-preserving package absorption; merge commit required label Sep 28, 2026
@hansi-codes

hansi-codes Bot commented Sep 28, 2026 •

Copy link
Copy Markdown

🟢 Tier S · Ready to merge

No concrete defect was found in the newly imported Platform package or its root Composer wiring.

Absorbs Utopia Audit into packages/audit, autoloads it locally, and changes its ClickHouse adapter from Fetch to Utopia Client. The latest commits also absorb Utopia Platform into packages/platform, replacing the pinned external dependency with local source and adding standalone package tooling and tests.

Latest changes: The new commits import Platform's source and tests, add its mirror and package tooling, switch root Composer autoloading and replacement to the local package, and record its PHPStan baseline in the monorepo RFC.

Verdict New comments Fixed Still open
✅ Approved 0 0 0
📂 Walkthrough · 9
File Change
composer.json, composer.lock Load Audit and Platform from local packages and remove their external dependency entries; remove Fetch after the ClickHouse migration.
packages/audit/ Import Audit source and tests, migrate ClickHouse HTTP requests to Utopia Client, and add package tooling and mirror configuration.
packages/platform/src/ Import the Platform action, service, module, HTTP scope, enum and initialization implementations.
packages/platform/tests/ Import HTTP, CLI and worker tests and supporting fixtures.
packages/platform/composer.json, packages/platform/phpunit.xml, packages/platform/phpstan.neon, packages/platform/phpstan-baseline.neon, packages/platform/rector.php Configure the standalone Platform package, test suites and analysis tools.
packages/platform/.github/workflows/mirror.yml, packages/platform/.gitignore, packages/platform/README.md, packages/platform/LICENSE Add mirror routing, ignored artifacts, package documentation and license.
rfc/monorepo.md Record the absorbed packages and Platform's static-analysis baseline.
composer.json Autoloads the local audit package and replaces the external Composer dependency.
packages/audit/src/Adapter/ClickHouse.php Uses a PSR-18 client and PSR-7 requests for ClickHouse HTTP calls.

Reviewed the commits since b931afd · Details · Comment @hansi-codes review to re-run, or mention @hansi-codes with a question.

@greptile-apps

greptile-apps Bot commented Sep 28, 2026 •

Copy link
Copy Markdown
Contributor

RetriggerConfidence Score: 4/5

[High risk] Moves audit library from external package to monorepo.

The PR should not merge until the repository’s identifier-validation requirement and the outstanding review findings are addressed.

Fix All in Claude CodeFindings

  1. P2 Prohibited regex in identifier validation ▶
  2. P2 Tests mirror SQL implementation ▶
  3. P2 Security Test databases exposed beyond localhost ▶
  4. P2 Existing database skips audit setup ▶
  5. P2 PHP requirement is misstated ▶
  6. P2 Custom adapter example cannot load ▶
Fix with agent prompt
### Issue 1
packages/audit/src/Adapter/ClickHouse.php:220
The imported ClickHouse adapter uses `preg_match()` to validate identifiers. The repository prohibits adding regular expressions and calls for string or character checks, or an existing validator, instead. This requirement must be satisfied before merging.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

### Issue 2
packages/audit/tests/Adapter/ClickHouseSqlSnapshotTest.php:100-104
The new tests rebuild query-builder calls without invoking the audit adapter, then assert exact SQL text. As the test's own comment notes, a wrong argument in `ClickHouse::setup()` would not fail these tests, while a harmless SQL-formatting change could. The repository requires tests of observable behavior rather than assertions that mirror source code or configuration. The exact COUNT SQL assertion in `tests/Adapter/ClickHouseTest.php` and reflection-based column-definition assertions in the E2E test follow the same pattern. This repository requirement must be satisfied before merging.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

### Issue 3
packages/audit/docker-compose.yml:5-9
If the E2E services run on a network-reachable host, these port mappings expose MariaDB root and the ClickHouse default user through host interfaces beyond localhost, using passwords fixed in this file. The tests connect locally, so restricting the published ports to loopback would preserve test access without exposing those accounts to other hosts. **How this was verified:** Both services publish host ports without a loopback address and configure known account passwords.

### Issue 4
packages/audit/tests/E2E/Adapter/DatabaseTest.php:39-42
If `utopiaTests` already exists without its audit collection, this branch skips `Audit::setup()`. The shared fixture then immediately cleans up and writes logs, so the E2E suite fails instead of creating the collection it needs. Run the collection setup even when the database already exists.

### Issue 5
packages/audit/README.md:undefined-459
This says PHP 8.0 is supported, but the package's Composer manifest requires PHP 8.5 or later. Readers on PHP 8.0–8.4 who follow the installation instructions cannot install it.

```suggestion
Utopia Audit requires PHP 8.5 or later. We recommend using the latest PHP version whenever possible.
```

### Issue 6
packages/audit/README.md:undefined-357
The example declares `createBatch(array $logs): array`, but the abstract adapter requires a `bool` return. Copying this example creates an incompatible method override, so the custom adapter cannot be loaded.

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Summary

The PR imports audit as a directly loaded monorepo package, replaces its ClickHouse HTTP client, and removes the external audit and fetch packages from the root lockfile.

  • Package autoloading, standalone tooling, and tests are added.
  • Existing review threads remain open; identifier validation also conflicts with a repository instruction.

Reviews (3) · Last reviewed commit: "Merge remote-tracking branch 'origin/mai..."

Comment on lines +100 to +104
$sql = $table->createIfNotExists()->query;

$this->assertStringContainsString('CREATE TABLE IF NOT EXISTS `default`.`audits`', $sql);
$this->assertStringContainsString('`id` String', $sql);
$this->assertStringContainsString('`actorId` Nullable(String)', $sql);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P2 Tests mirror SQL implementation The new tests rebuild query-builder calls without invoking the audit adapter, then assert exact SQL text. As the test's own comment notes, a wrong argument in ClickHouse::setup() would not fail these tests, while a harmless SQL-formatting change could. The repository requires tests of observable behavior rather than assertions that mirror source code or configuration. The exact COUNT SQL assertion in tests/Adapter/ClickHouseTest.php and reflection-based column-definition assertions in the E2E test follow the same pattern. This repository requirement must be satisfied before merging.

Context Used: Call out and harshly judge implementation-coupled tests. We don't mirror source code, configuration, or version pins in assertions. We test observable behavior; use linters for syntax and schema checks. (source)

Prompt To Fix With AI
This is a comment left during a code review.
Path: packages/audit/tests/Adapter/ClickHouseSqlSnapshotTest.php
Line: 100-104

Comment:
**Tests mirror SQL implementation** The new tests rebuild query-builder calls without invoking the audit adapter, then assert exact SQL text. As the test's own comment notes, a wrong argument in `ClickHouse::setup()` would not fail these tests, while a harmless SQL-formatting change could. The repository requires tests of observable behavior rather than assertions that mirror source code or configuration. The exact COUNT SQL assertion in `tests/Adapter/ClickHouseTest.php` and reflection-based column-definition assertions in the E2E test follow the same pattern. This repository requirement must be satisfied before merging.

**Context Used:** Call out and harshly judge implementation-coupled tests. We don't mirror source code, configuration, or version pins in assertions. We test observable behavior; use linters for syntax and schema checks. ([source](https://app.greptile.com/review/custom-context?memory=instruction-0))

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

Fix in Claude Code Fix in Codex

Comment on lines +5 to +9
- MYSQL_ROOT_PASSWORD=password
ports:
- "13307:3306"
healthcheck:
test: ["CMD", "sh", "-c", "mysqladmin ping -h localhost -u root -p$$MYSQL_ROOT_PASSWORD"]

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P2 security Test databases exposed beyond localhost If the E2E services run on a network-reachable host, these port mappings expose MariaDB root and the ClickHouse default user through host interfaces beyond localhost, using passwords fixed in this file. The tests connect locally, so restricting the published ports to loopback would preserve test access without exposing those accounts to other hosts. How this was verified: Both services publish host ports without a loopback address and configure known account passwords.

Prompt To Fix With AI
This is a comment left during a code review.
Path: packages/audit/docker-compose.yml
Line: 5-9

Comment:
**Test databases exposed beyond localhost** If the E2E services run on a network-reachable host, these port mappings expose MariaDB root and the ClickHouse default user through host interfaces beyond localhost, using passwords fixed in this file. The tests connect locally, so restricting the published ports to loopback would preserve test access without exposing those accounts to other hosts. **How this was verified:** Both services publish host ports without a loopback address and configure known account passwords.

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Fix in Claude Code Fix in Codex

Comment on lines +39 to +42
if (! $database->exists('utopiaTests')) {
$database->create();
$this->audit->setup();
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P2 Existing database skips audit setup If utopiaTests already exists without its audit collection, this branch skips Audit::setup(). The shared fixture then immediately cleans up and writes logs, so the E2E suite fails instead of creating the collection it needs. Run the collection setup even when the database already exists.

Prompt To Fix With AI
This is a comment left during a code review.
Path: packages/audit/tests/E2E/Adapter/DatabaseTest.php
Line: 39-42

Comment:
**Existing database skips audit setup** If `utopiaTests` already exists without its audit collection, this branch skips `Audit::setup()`. The shared fixture then immediately cleans up and writes logs, so the E2E suite fails instead of creating the collection it needs. Run the collection setup even when the database already exists.

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Fix in Claude Code Fix in Codex

Comment thread packages/audit/README.md

## System requirements

Utopia Framework requires PHP 8.0 or later. We recommend using the latest PHP version whenever possible.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P2 PHP requirement is misstated This says PHP 8.0 is supported, but the package's Composer manifest requires PHP 8.5 or later. Readers on PHP 8.0–8.4 who follow the installation instructions cannot install it.

Suggested change
Utopia Framework requires PHP 8.0 or later. We recommend using the latest PHP version whenever possible.
Utopia Audit requires PHP 8.5 or later. We recommend using the latest PHP version whenever possible.
Prompt To Fix With AI
This is a comment left during a code review.
Path: packages/audit/README.md
Line: 459

Comment:
**PHP requirement is misstated** This says PHP 8.0 is supported, but the package's Composer manifest requires PHP 8.5 or later. Readers on PHP 8.0–8.4 who follow the installation instructions cannot install it.

```suggestion
Utopia Audit requires PHP 8.5 or later. We recommend using the latest PHP version whenever possible.
```

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Fix in Claude Code Fix in Codex

Comment thread packages/audit/README.md
// Store a single log entry and return a Log object
}

public function createBatch(array $logs): array

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P2 Custom adapter example cannot load The example declares createBatch(array $logs): array, but the abstract adapter requires a bool return. Copying this example creates an incompatible method override, so the custom adapter cannot be loaded.

Prompt To Fix With AI
This is a comment left during a code review.
Path: packages/audit/README.md
Line: 357

Comment:
**Custom adapter example cannot load** The example declares `createBatch(array $logs): array`, but the abstract adapter requires a `bool` return. Copying this example creates an incompatible method override, so the custom adapter cannot be loaded.

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Fix in Claude Code Fix in Codex

@github-actions

github-actions Bot commented Sep 28, 2026 •

Copy link
Copy Markdown

✨ Benchmark results

Comparing main (before) → chore/absorb-audit (after).

Metric Before After Change
🚀 Requests/sec 192.17 194.33 ⚪ +1.1%
⏱️ Latency P50 89.6 ms 88.83 ms ⚪ -0.9%
⏱️ Latency P95 210.48 ms 203.88 ms ⚪ -3.1%
Per-scenario breakdown & investigation details

Metrics below reflect the current branch (after). Δ P95 compares against the base.

Scenario P50 (ms) P95 (ms) Requests RPS Δ P95 (ms)
API total 88.83 203.88 12,312 194.33 -6.6
Account 168.84 325.37 648 10.84 -11.14
TablesDB 86.23 161.86 6,696 108.52 -1.97
Storage 80.72 174.33 3,240 53.9 -3.62
Functions 125.96 246.55 1,728 29.49 -15.26

Top API waits (after)

API request Max wait (ms)
account.prefs.update 510.75
tablesdb.rows.decrement 456.33
account.name.update 456.1
tablesdb.rows.increment 435.42
functions.create 413.97

@hansi-codes hansi-codes 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.

🟢 Tier S · Looks good to merge. Summary

Syncing with main regenerated the lock from main's copy, which still lists fetch; nothing requires it once audit uses client.
}

// ClickHouse identifiers: alphanumeric, underscores, cannot start with number
if (!preg_match('/^[a-zA-Z_]\w*$/', $identifier)) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P2 Prohibited regex in identifier validation The imported ClickHouse adapter uses preg_match() to validate identifiers. The repository prohibits adding regular expressions and calls for string or character checks, or an existing validator, instead. This requirement must be satisfied before merging.

Context Used: AGENTS.md (source)

Prompt To Fix With AI
This is a comment left during a code review.
Path: packages/audit/src/Adapter/ClickHouse.php
Line: 220

Comment:
**Prohibited regex in identifier validation** The imported ClickHouse adapter uses `preg_match()` to validate identifiers. The repository prohibits adding regular expressions and calls for string or character checks, or an existing validator, instead. This requirement must be satisfied before merging.

**Context Used:** AGENTS.md ([source](https://github.com/appwrite/appwrite/blob/main/AGENTS.md))

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

Fix in Claude Code Fix in Codex

@ChiragAgg5k
ChiragAgg5k merged commit 5d7ae28 into main Sep 28, 2026
52 checks passed
abnegate added a commit that referenced this pull request Sep 29, 2026
utopia-php/monorepo#206 prepared audit 5.0.0 for utopia-php/database 8:
the adapters read attributes and indexes as typed Attribute and Index
models, and the legacy TYPE_* constants come from Method. Main absorbed
audit into packages/audit (#13955) and the monorepo closed #206 in
favour of a change here, so this applies #206's candidate (mirror head
f8422f9cbf) to the package, line for line, with its tests. Main's
utopia-php/client transport stays; the train only touched the schema
code around it. getAttribute() now declares ?Attribute, so its
not-found branch returns null explicitly, and two baseline entries go
with the errors the port removes. The package requires database ^8.0
with dev stability until 8.0.0 is tagged, because bin/monorepo check
and test resolve it from Packagist.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

absorb History-preserving package absorption; merge commit required

Projects

None yet

Development

Successfully merging this pull request may close these issues.