Skip to content

perf(ensindexer): unblock Ponder prefetch on hot tables#2016

Merged
shrugs merged 15 commits intomainfrom
perf/delimited-ids
Apr 30, 2026
Merged

perf(ensindexer): unblock Ponder prefetch on hot tables#2016
shrugs merged 15 commits intomainfrom
perf/delimited-ids

Conversation

@shrugs
Copy link
Copy Markdown
Member

@shrugs shrugs commented Apr 29, 2026

Reviewer Focus (Read This First)

  1. packages/enssdk/src/lib/ids.ts — every id constructor switches from CAIP-style mixed : / / delimiters to dash-joined tuples. This is a wire-format change for every public id type. External consumers that string-parse or pattern-match against ids will see different shapes; the in-tree code treats them as opaque strings.
  2. apps/ensindexer/src/lib/protocol-acceleration/migrated-node-db-helpers.ts block comment + the two-table layout
  3. Schema split — pulling the migration-status tables into their own migrated-nodes.schema.ts is mechanical, but perhaps should still live in protocol acceleration because that's the plugin that manages the tables?

Problem & Motivation

  • Ponder's indexing-cache prefetch path predicts hot-table reads ahead of each event by deriving the lookup key from event args. Its profile-pattern matcher only does direct equality and single-level string-delimiter splits — it can't match across mixed delimiters and can't invert keccak.
  • CAIP-style ids use both : and /, which the matcher won't decompose, so every prefetch attempt on Domain / Registry / Resolver / etc. silently failed.
  • Separately, migrated_nodes was keyed by post-namehash node, which the matcher also can't recover from event args. Run D measured 0% prefetch share on the table even though every ENSv1RegistryOld read consults it.
  • Net effect: reads on the busiest tables in the indexer were paying full DB round-trip cost instead of riding the in-memory cache that Ponder is supposed to populate ahead of each event batch.

What Changed (Concrete)

  1. enssdk/src/lib/ids.ts: every id constructor now joins its components with - via _stringifyAccountId
  2. migrated_nodes table renamed to migrated_nodes_by_parent and re-keyed from (node) to composite (parentNode, labelHash).
  3. New sibling table migrated_nodes_by_node keyed by node for the four ENSv1RegistryOld handlers (Transfer / NewTTL / NewResolver) that emit node only.
  4. migrateNode helper writes both tables at once; nodeIsMigratedByParentAndLabel and nodeIsMigrated read from whichever table matches the calling handler's event payload.
  5. Schema split: migratedNodeByParent + migratedNodeByNode moved into packages/ensdb-sdk/src/ensindexer-abstract/migrated-nodes.schema.ts, re-exported from ensindexer-abstract/index.ts. Removed from protocol-acceleration.schema.ts.

Design & Planning

The id format change came out of investigating Ponder's prefetch path in ponder/dist/esm/indexing-store/profile.js — specifically the delimiter splitter that only splits on a single delimiter character per call. Confirmed empirically in Run D (2026-04-27): dash-delimited ids pushed hot tables to 80–100% prefetch share, up from 0% under CAIP. The migration table re-key followed once the dominant migrated_nodes outlier was identified in Run D's per-table breakdown.

Alternatives considered for migrated_nodes:

  • Keep single-table keyed by node → 0% prefetch on the hot read path.
  • Single-table keyed by (parentNode, labelHash) → flips the floor but breaks the four node-only read sites.
  • Two-table layout with paired writes → chosen. Cost is one extra INSERT ON CONFLICT DO NOTHING per migration write; storage roughly doubles for this table (~1GB → ~2GB on mainnet today).

Self-Review

  • Bugs caught: none
  • Logic simplified: none
  • Naming / terminology improved: nodeIsMigrated(node) vs nodeIsMigratedByParentAndLabel(parentNode, labelHash) — names match what the call site actually passes; tables follow migrated_nodes_by_* pattern
  • Dead or unnecessary code removed: none

Cross-Codebase Alignment

Downstream & Consumer Impact

  • Public APIs affected: every id type's wire format is different. External consumers of the GraphQL/REST API that compare ids across deploys, persist them, or pattern-match on the CAIP shape will need to update.
  • Docs updated: block comment in migrated-node-db-helpers.ts is the canonical reference for the two-table design; ids.ts will carry a block comment explaining the prefetch trade-off.
  • Naming decisions worth calling out: migratedNodeByParent / migratedNodeByNode — symmetric naming makes the keyed-by intent explicit.

Testing Evidence

  • Typecheck clean across ensindexer, ensdb-sdk, enssdk, ensapi. pnpm lint clean.
  • manual testing runs
  • Known gaps: no unit tests for the two-table consistency invariant. Relying on the block comment
  • What reviewers have to reason about manually: that no in-tree caller depends on the CAIP-shaped id format.

Scope Reductions

Risk Analysis

  • Storage cost. Migration-status footprint roughly doubles on mainnet (~1GB → ~2GB). Acceptable for the prefetch win.

  • External id consumers. Callers outside this monorepo that pattern-match against the CAIP id shape will see a different format. None known.

  • Mitigations or rollback options: the change is a single commit so revert is mechanical

  • Named owner if this causes problems: @shrugs

Pre-Review Checklist (Blocking)

  • I reviewed every line of this diff and understand it end-to-end
  • I'm prepared to defend this PR line-by-line in review
  • I'm comfortable being the on-call owner for this change
  • Relevant changesets are included (or explicitly not required)

@shrugs shrugs requested a review from a team as a code owner April 29, 2026 21:48
Copilot AI review requested due to automatic review settings April 29, 2026 21:48
@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented Apr 29, 2026

🦋 Changeset detected

Latest commit: 01f2fa3

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

This PR includes changesets to release 24 packages
Name Type
@ensnode/ensdb-sdk Major
enssdk Major
ensapi Major
ensindexer Major
@ensnode/integration-test-env Major
ensadmin Major
ensrainbow Major
@ensnode/enskit-react-example Patch
@namehash/ens-referrals Major
enskit Major
@ensnode/ensnode-react Major
@ensnode/ensnode-sdk Major
@ensnode/ensrainbow-sdk Major
@namehash/namehash-ui Major
fallback-ensapi Major
@docs/ensnode Major
@docs/ensrainbow Major
enscli Major
ensskills Major
@ensnode/datasources Major
@ensnode/ponder-sdk Major
@ensnode/ponder-subgraph Major
@ensnode/shared-configs Major
@ensnode/ensindexer-perf-testing Major

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

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

@vercel
Copy link
Copy Markdown
Contributor

vercel Bot commented Apr 29, 2026

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

Project Deployment Actions Updated (UTC)
admin.ensnode.io Ready Ready Preview, Comment Apr 30, 2026 4:30pm
ensnode.io Ready Ready Preview, Comment Apr 30, 2026 4:30pm
ensrainbow.io Ready Ready Preview, Comment Apr 30, 2026 4:30pm

Two changes that together push the indexing-cache prefetch share from 0
to 35–50% on the hottest ENSv1 read paths:

1. Switch composite ids to dash-delimited tuples (`enssdk/src/lib/ids.ts`).
   Replace CAIP-style mixed `:` / `/` delimiters with a single `-` so
   Ponder's profile pattern matcher can string-split the id and match
   each segment against `event.chain.id` / `event.event.log.address` /
   `event.event.args.*`. Drops the ERC1155 namespace literal from
   makeENSv2DomainId since the registry contract already namespaces it.
   Run D measurements showed this lifts hot tables (Domain, Registry,
   accounts, etc.) to 80–100% prefetch share, up from 0% on the prior
   CAIP form.

2. Re-key migrated_nodes by (parentNode, labelHash) plus a sibling
   migrated_nodes_by_node index keyed on `node`. The five Registry
   handlers that consult migration status split between two payload
   shapes: ENSv1RegistryOld#NewOwner has parentNode + labelHash; the
   Transfer/NewTTL/NewResolver trio has only the post-namehash `node`.
   Ponder's matcher can't invert keccak, so a single-table layout
   surrenders prefetch on whichever shape it doesn't key. The two-table
   layout lets every read site address whichever key matches its event
   args, both stay on the prefetch hot-path. Cost is one extra
   conflict-do-nothing insert per migration write. See the block
   comment in migrated-node-db-helpers.ts for the full rationale.

Schema split: pulled migratedNode + migratedNodeByNode into a sibling
migrated-nodes.schema.ts re-exported from the ensindexer-abstract index,
so the migration-status tables are co-located with their helpers and the
protocol-acceleration schema stays focused on resolver/permissions data.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 29, 2026

Warning

Rate limit exceeded

@shrugs has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 51 minutes and 46 seconds before requesting another review.

To keep reviews running without waiting, you can enable usage-based add-on for your organization. This allows additional reviews beyond the hourly cap. Account admins can enable it under billing.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

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

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: d28c9b3c-3459-493b-a663-f29a21d2e2d7

📥 Commits

Reviewing files that changed from the base of the PR and between ab4a94e and 01f2fa3.

📒 Files selected for processing (8)
  • apps/ensindexer/src/lib/get-this-account-id.ts
  • apps/ensindexer/src/plugins/ensv2/handlers/ensv2/ETHRegistrar.ts
  • docker/docker-compose.orchestrator.yml
  • docs/ensnode.io/src/content/docs/ensdb/concepts/database-schemas.mdx
  • packages/ensdb-sdk/src/ensindexer-abstract/migrated-nodes.schema.ts
  • packages/enssdk/src/lib/ids.ts
  • packages/enssdk/src/lib/types/ensv2.ts
  • packages/integration-test-env/src/orchestrator.ts
📝 Walkthrough

Walkthrough

Split ENS migration tracking into two onchain tables keyed by (parentNode,labelHash) and node; add helpers to read/write both tables; remove legacy registry-migration-status; update ENSv1 handlers to use parent+label lookups; change composite ID constructors to dash-delimited format.

Changes

Cohort / File(s) Summary
Changesets
/.changeset/ensdb-sdk-migrated-nodes-split.md, /.changeset/enssdk-dash-delimited-ids.md
Add metadata documenting the migrated-nodes schema split and the breaking switch to dash-delimited composite IDs.
Schema: migrated nodes
packages/ensdb-sdk/src/ensindexer-abstract/migrated-nodes.schema.ts, packages/ensdb-sdk/src/ensindexer-abstract/index.ts
Add two onchain tables: migrated_nodes_by_parent (composite pk: parentNode+labelHash) and migrated_nodes_by_node (pk: node); re-export new schema.
Remove legacy schema
packages/ensdb-sdk/src/ensindexer-abstract/protocol-acceleration.schema.ts
Delete the previous migrated_nodes table definition.
Migration helpers
apps/ensindexer/src/lib/protocol-acceleration/migrated-node-db-helpers.ts, apps/ensindexer/src/lib/protocol-acceleration/registry-migration-status.ts
Add helpers: nodeIsMigratedByParentAndLabel, nodeIsMigrated, migrateNode (writes both tables idempotently, enforces root-chain); remove old registry-migration-status module.
Handler updates
apps/ensindexer/src/plugins/ensv1/handlers/ensv1/ENSv1Registry.ts, apps/ensindexer/src/plugins/protocol-acceleration/handlers/ENSv1Registry.ts
Update handlers to call nodeIsMigratedByParentAndLabel(context, parentNode, labelHash) and adjust imports to new helpers (no subdomain derivation in NewOwner).
ID format changes
packages/enssdk/src/lib/ids.ts
Refactor ID utilities to emit dash-delimited composite IDs, remove CAIP stringifiers, rename makeStorageId parameter.
Dev/test infra
packages/integration-test-env/package.json, packages/integration-test-env/src/orchestrator.ts, docker/docker-compose.orchestrator.yml
Add viem dep, update orchestrator to aggressively tear down volumes and include an initial down -v phase; inline/adjust Postgres service and healthcheck in compose file.

Sequence Diagram(s)

sequenceDiagram
  participant Event as ENSv1RegistryOld Event
  participant Handler as ENS Indexer Handler
  participant Helper as MigratedNode DB Helper
  participant DB as ENSIndexer Onchain Tables

  Event->>Handler: NewOwner(parentNode, labelHash, ...)
  Handler->>Helper: nodeIsMigratedByParentAndLabel(context,parentNode,labelHash)
  Helper->>DB: SELECT FROM migrated_nodes_by_parent WHERE (parentNode,labelHash)
  alt found
    DB-->>Helper: exists
    Helper-->>Handler: true
    Handler-->>Event: return (ignore event)
  else not found
    DB-->>Helper: not found
    Helper-->>Handler: false
    Handler->>Handler: proceed -> handleNewOwner(...)
    Handler->>Helper: migrateNode(context,parentNode,labelHash) [when migration recorded]
    Helper->>DB: INSERT into migrated_nodes_by_parent & migrated_nodes_by_node (onConflictDoNothing)
    DB-->>Helper: ack
  end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

Poem

🐰 I hopped where nodes were once a single row,
split by parent and label so lookups flow.
Dashes stitch IDs in a neat little line,
helpers write both, so reads stay fine. ✨

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 60.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed Title clearly summarizes the main performance objective: unblocking Ponder's prefetch mechanism on hot database tables.
Description check ✅ Passed Description includes all required sections (Summary, Why, Testing, Notes for Reviewer) with detailed context. However, the PR template requires a Pre-Review Checklist with blocking items, which is completed.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

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

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch perf/delimited-ids

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
Review rate limit: 0/1 reviews remaining, refill in 51 minutes and 46 seconds.

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

@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps Bot commented Apr 29, 2026

Greptile Summary

This PR addresses two independent Ponder prefetch failures: (1) all composite ids switch from CAIP-style mixed : / / delimiters to uniform dash-delimited tuples, which is the only shape Ponder's profile-pattern matcher can decompose; (2) migrated_nodes is split into two tables keyed by (parentNode, labelHash) and by node respectively, allowing each of the four ENSv1RegistryOld handler types to address whichever table key matches its event payload. Additional changes fix an address-normalization gap in ETHRegistrar and harden the integration test environment with ephemeral postgres ports and volume cleanup between runs. The id format change is a documented, intentional temporary trade-off tracked in issue #2034.

Confidence Score: 5/5

Safe to merge — no P0 or P1 issues found; all logic is correct and well-documented.

The implementation correctly solves both prefetch problems: dash-delimited ids remove the CAIP delimiter ambiguity, and the two-table migration layout gives each event handler an addressable key. The two-table write is idempotent and consistent within Ponder's transactional flush model. The ETHRegistrar address-normalization fix is correct. The only finding is a P2 suggestion to align the testcontainers wait strategy with the newly-added healthcheck.

packages/integration-test-env/src/orchestrator.ts — minor: wait strategy could leverage the new healthcheck.

Important Files Changed

Filename Overview
packages/enssdk/src/lib/ids.ts Replaces CAIP-style mixed-delimiter ids with uniform dash-delimited tuples; change is intentional, well-documented, and safe because no component (chainId, address, node, labelHash, storageId, numeric indexes) ever contains a dash.
apps/ensindexer/src/lib/protocol-acceleration/migrated-node-db-helpers.ts New two-table migration-status helper; write path correctly computes node via makeSubdomainNode before inserting into both tables; read paths each target the table whose key matches their calling event's args; idempotent via onConflictDoNothing.
packages/ensdb-sdk/src/ensindexer-abstract/migrated-nodes.schema.ts New schema file defining migratedNodeByParent (composite PK on parentNode+labelHash) and migratedNodeByNode (PK on node); correctly extracted from protocol-acceleration.schema.ts and re-exported from the index.
apps/ensindexer/src/plugins/ensv2/handlers/ensv2/ETHRegistrar.ts Correctly wraps the readContract result in toNormalizedAddress; viem returns checksummed addresses that would otherwise mismatch the NormalizedAddress constraint.
docker/docker-compose.orchestrator.yml Inlines ensdb service with ephemeral port 0:5432 to avoid collisions with host postgres; adds pg_isready healthcheck; removes container_name so testcontainers assigns a unique name.
packages/integration-test-env/src/orchestrator.ts Updates container reference from ensdb to ensdb-1, adds volume cleanup on teardown, and sets devnet chain ID via anvil_setChainId; wait strategy for ensdb-1 still uses forListeningPorts rather than the now-available forHealthCheck.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A["ENSv1Registry(Old)#NewOwner\n(parentNode, labelHash)"] -->|"migrateNode(parentNode, labelHash)"| B["migratedNodeByParent\nPK: (parentNode, labelHash)"]
    A -->|"makeSubdomainNode → node\nmigrateNode writes both"| C["migratedNodeByNode\nPK: node"]

    D["ENSv1RegistryOld#NewOwner\n(parentNode, labelHash)"] -->|"nodeIsMigratedByParentAndLabel"| B
    E["ENSv1RegistryOld#Transfer\n(node)"] -->|"nodeIsMigrated"| C
    F["ENSv1RegistryOld#NewTTL\n(node)"] -->|"nodeIsMigrated"| C
    G["ENSv1RegistryOld#NewResolver\n(node)"] -->|"nodeIsMigrated"| C

    style B fill:#d4edda
    style C fill:#d4edda
Loading

Reviews (8): Last reviewed commit: "fix(enssdk): drop AccountIdString brand ..." | Re-trigger Greptile

Comment thread packages/enssdk/src/lib/ids.ts
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This PR targets a Ponder indexing performance bottleneck by making composite IDs and migration-status lookups decomposable by Ponder’s profile matcher, enabling prefetch on hot tables in ensindexer.

Changes:

  • Switched enssdk ID constructors from CAIP-style mixed delimiters to single --delimited tuple IDs.
  • Split ENSv1 registry-migration tracking into two tables keyed by (parentNode,labelHash) and by node, with paired writes and payload-matching reads.
  • Extracted migrated-node schema into its own ensdb-sdk schema module and re-exported it via ensindexer-abstract.

Reviewed changes

Copilot reviewed 10 out of 10 changed files in this pull request and generated 6 comments.

Show a summary per file
File Description
packages/enssdk/src/lib/ids.ts Changes all exported ID constructors to --joined tuples to make keys prefetch-profileable.
packages/ensdb-sdk/src/ensindexer-abstract/protocol-acceleration.schema.ts Removes the legacy single-table migrated_nodes schema from this module.
packages/ensdb-sdk/src/ensindexer-abstract/migrated-nodes.schema.ts Adds new two-table migrated-node schema (*_by_parent, *_by_node).
packages/ensdb-sdk/src/ensindexer-abstract/index.ts Re-exports the new migrated-nodes schema module.
apps/ensindexer/src/plugins/protocol-acceleration/handlers/ENSv1Registry.ts Updates migration writes to the new (parentNode,labelHash) helper API.
apps/ensindexer/src/plugins/ensv2/handlers/ensv1/ENSv1Registry.ts Updates migration reads to use payload-matching lookup helpers.
apps/ensindexer/src/lib/protocol-acceleration/registry-migration-status.ts Removes the old single-table migration status helper.
apps/ensindexer/src/lib/protocol-acceleration/migrated-node-db-helpers.ts Introduces new two-table read/write helpers with rationale documentation.
.changeset/enssdk-dash-delimited-ids.md Changeset documenting the public enssdk ID wire-format change.
.changeset/ensdb-sdk-migrated-nodes-split.md Changeset documenting the ensdb-sdk migrated-nodes table split/rekey.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread packages/ensdb-sdk/src/ensindexer-abstract/migrated-nodes.schema.ts Outdated
Comment thread packages/ensdb-sdk/src/ensindexer-abstract/migrated-nodes.schema.ts Outdated
Comment thread apps/ensindexer/src/lib/protocol-acceleration/migrated-node-db-helpers.ts Outdated
Comment thread packages/enssdk/src/lib/ids.ts
@shrugs
Copy link
Copy Markdown
Member Author

shrugs commented Apr 29, 2026

@greptile review

@vercel vercel Bot temporarily deployed to Preview – admin.ensnode.io April 30, 2026 16:06 Inactive
…plit

Replace the single `migrated_nodes` section with the two-table layout:
`migrated_nodes_by_parent` (composite PK on parentNode + labelHash) and
`migrated_nodes_by_node` (sibling PK on node). Notes the rationale —
the three RegistryOld handlers that emit only `node` need their own
keyed access to stay on Ponder's prefetch hot-path.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 16 out of 17 changed files in this pull request and generated 3 comments.

Files not reviewed (1)
  • pnpm-lock.yaml: Language not supported

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread packages/enssdk/src/lib/ids.ts
Comment thread apps/ensindexer/src/lib/get-this-account-id.ts
Comment thread packages/integration-test-env/src/orchestrator.ts Outdated
The shape of each id (CAIP-10/CAIP-19/dash-tuple etc.) is a
ids.ts-implementation detail that drifts when the format changes (just
did, in #2016). The brand-only doc comments now describe the entity
identity without leaking the encoding, and reference ids.ts as the
canonical source for the current shape.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The testcontainers DockerComposeEnvironment generates a unique
project name per up() call (`testcontainers-<uuid>`), and each project
gets its own volume namespace. A stale volume from a prior run is
scoped under the prior project's name and is invisible to a new run's
project — so there's no path for state to leak between runs.

The original schema-collision error this was guarding against came from
a host-native postgres on localhost:5432, fixed separately by the
ephemeral host port mapping. With that in place, no scenario justifies
the pre-up wipe.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings April 30, 2026 16:18
@vercel vercel Bot temporarily deployed to Preview – ensrainbow.io April 30, 2026 16:18 Inactive
@vercel vercel Bot temporarily deployed to Preview – ensnode.io April 30, 2026 16:18 Inactive
@vercel vercel Bot temporarily deployed to Preview – admin.ensnode.io April 30, 2026 16:18 Inactive
Two related changes:

- docker-compose.orchestrator.yml: drop `container_name: ensdb` from
  the inlined ensdb override. Without an explicit container name the
  testcontainers project prefix (testcontainers-<uuid>) scopes the
  container globally, so concurrent orchestrators or co-resident dev
  stacks can't collide.
- orchestrator.ts: the testcontainers wait-strategy + getContainer
  lookups parse the container name as `<project>-<service>-<index>` and
  return everything after the project prefix. Without a container_name
  that means `ensdb-1` (single-replica suffix), so update both call
  sites accordingly.

Tried `extends + !override` to preserve DRY-ness against
services/ensdb.yml, but standard YAML language servers don't recognize
the compose-spec !override / !reset tags — kept the inline form for
editor cleanliness.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 17 out of 18 changed files in this pull request and generated 2 comments.

Files not reviewed (1)
  • pnpm-lock.yaml: Language not supported

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread packages/enssdk/src/lib/types/ensv2.ts Outdated
Comment thread .changeset/enssdk-dash-delimited-ids.md
ENSv1RegistryId / ENSv2RegistryId / PermissionsId / ResolverId were
typed as `AccountIdString & { __brand: ... }`, advertising a CAIP-10
shape. After the dash-delimited id refactor (#2016) the runtime values
no longer satisfy that contract — they're tuple-joined strings, not
CAIP-10. Anything that took these ids and fed them into a CAIP-10
parser would silently fail.

Switch to plain `string & { __brand: ... }` so the type doesn't lie
about its shape. AccountIdString itself is still `string` under the
hood, so this is a documentation/intent change rather than a structural
one — no callers needed updating.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.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