Skip to content

TML-2714: generate one import per module in contract.d.ts by reusing the shared renderer#614

Merged
wmadden merged 2 commits into
mainfrom
tml-2714-deduplicate-repeated-mongo-type-imports-in-generated-files
May 29, 2026
Merged

TML-2714: generate one import per module in contract.d.ts by reusing the shared renderer#614
wmadden merged 2 commits into
mainfrom
tml-2714-deduplicate-repeated-mongo-type-imports-in-generated-files

Conversation

@wmadden
Copy link
Copy Markdown
Contributor

@wmadden wmadden commented May 29, 2026

At a glance

Generated contract.d.ts files repeated the same module across separate import type lines. This showed up in every Mongo contract, for instance:

// before
import type { CodecTypes as MongoCodecTypes } from '@prisma-next/adapter-mongo/codec-types';
import type { Vector } from '@prisma-next/adapter-mongo/codec-types';
// after
import type { CodecTypes as MongoCodecTypes, Vector } from '@prisma-next/adapter-mongo/codec-types';

The decision

Route the emitter's import generation through renderImports — the import aggregator in @prisma-next/ts-render that the migration renderers already use — instead of keeping the emitter's own separate renderer. Teach that shared aggregator the two things the emitter needed but it didn't yet support (per-symbol aliases and import type), so one canonical renderer serves both call sites.

How we got here

The duplication was reported against Mongo output, but it was family-agnostic — the same repeated-import pattern appeared across SQL and Document targets, anywhere a module contributed more than one imported type.

The cause was two independent import renderers:

  • Migration renderers used renderImports in @prisma-next/ts-render, which aggregates all named imports for a module onto one statement. Correct.
  • The emitter used its own generateImportLines, which emitted one line per import spec with no per-module aggregation. That is what produced the duplicates.

Two renderers solving the same problem had already drifted once — that drift is this bug. The fix collapses them to one.

The change

  • generateImportLines now maps the emitter's TypesImportSpec[] to ImportRequirement[] and delegates to renderImports.
  • renderImports gains the only capabilities the emitter required that it lacked: per-symbol aliases (CodecTypes as MongoCodecTypes) and type-only imports (import type), with stable sort order. Both are visible in the at-a-glance example — the merged line keeps the alias and the import type modifier.
  • All affected generated fixtures are regenerated.

Verification

  • pnpm build
  • pnpm fixtures:check
  • pnpm --filter @prisma-next/ts-render test (32) · pnpm --filter @prisma-next/emitter test (153)
  • pnpm lint:deps · pnpm typecheck

Out of scope

paradedb-demo and prisma-next-demo-sqlite emit generated output to prisma/ while their tracked artifacts live in src/prisma/ — a pre-existing outDir mismatch unrelated to import dedup. Left for a follow-up.

Alternatives considered

  • Patch the emitter's own generateImportLines in place. Rejected: it leaves two renderers solving the same problem. They drifted once already; fixing only the emitter invites the next divergence.
  • Extract a full shared TypeScript source-construction layer (e.g. adopt @prisma/ts-builders). Deferred. That is a much larger change spanning declarations, type aliases, and doc comments across the emitter and the migration renderers, tracked separately in TML-2272. This PR takes the minimal consolidation that fixes the reported bug now and proves the pattern.

Refs: TML-2714.

@wmadden wmadden requested a review from a team as a code owner May 29, 2026 09:19
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 29, 2026

Warning

Review limit reached

@wmadden, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 6 minutes and 30 seconds. Learn how PR review limits work.

Your organization has run out of usage credits. Purchase more in the billing tab.

⌛ How to resolve this issue?

After more reviews become available, 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 include higher PR review limits than trial, open-source, and free plans. In all cases, reviews become available again over time. During sustained high-volume PR review activity, CodeRabbit may temporarily slow when the next review becomes available.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yml

Review profile: CHILL

Plan: Pro

Run ID: 747ce49b-0c8a-41d1-af21-34a0059457ba

📥 Commits

Reviewing files that changed from the base of the PR and between cbec7fe and ad36c45.

⛔ Files ignored due to path filters (6)
  • packages/3-extensions/sql-orm-client/test/fixtures/generated/contract.d.ts is excluded by !**/generated/**
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
  • test/e2e/framework/test/fixtures/generated/contract.d.ts is excluded by !**/generated/**
  • test/integration/test/mongo/fixtures/generated/contract.d.ts is excluded by !**/generated/**
  • test/integration/test/sql-builder/fixtures/generated/contract.d.ts is excluded by !**/generated/**
  • test/integration/test/sql-orm-client/fixtures/generated/contract.d.ts is excluded by !**/generated/**
📒 Files selected for processing (22)
  • apps/telemetry-backend/src/prisma/contract.d.ts
  • examples/cipherstash-integration/src/prisma/contract.d.ts
  • examples/mongo-blog-leaderboard/src/contract.d.ts
  • examples/mongo-demo/src/contract.d.ts
  • examples/paradedb-demo/src/prisma/contract.d.ts
  • examples/prisma-next-cloudflare-worker/src/prisma/contract.d.ts
  • examples/prisma-next-demo/src/prisma/contract.d.ts
  • examples/prisma-next-postgis-demo/src/prisma/contract.d.ts
  • examples/react-router-demo/src/prisma/contract.d.ts
  • examples/retail-store/src/contract.d.ts
  • packages/1-framework/1-core/ts-render/src/render-imports.ts
  • packages/1-framework/1-core/ts-render/src/ts-expression.ts
  • packages/1-framework/1-core/ts-render/test/render-imports.test.ts
  • packages/1-framework/3-tooling/emitter/package.json
  • packages/1-framework/3-tooling/emitter/src/domain-type-generation.ts
  • packages/1-framework/3-tooling/emitter/test/domain-type-generation.test.ts
  • packages/3-extensions/cipherstash/src/contract.d.ts
  • packages/3-extensions/paradedb/src/contract.d.ts
  • packages/3-extensions/pgvector/src/contract.d.ts
  • packages/3-extensions/postgis/src/contract.d.ts
  • packages/3-extensions/sql-orm-client/scripts/strip-pgvector-fixture.mjs
  • test/integration/test/fixtures/contract.d.ts
📝 Walkthrough

Walkthrough

This PR enhances the TypeScript import rendering system to support per-symbol aliasing and type-only import statements, refactors the aggregation model to track binding metadata, integrates the new pipeline into the emitter, and regenerates contract files across the codebase.

Changes

Import Aliasing and Type-Only Rendering

Layer / File(s) Summary
ImportRequirement contract and core rendering logic
packages/1-framework/1-core/ts-render/src/ts-expression.ts, packages/1-framework/1-core/ts-render/src/render-imports.ts
Enhanced ImportRequirement interface with optional alias and typeOnly fields. Refactored renderImports aggregation to track named imports as a Map<symbol, {alias?, typeOnly?}> and compute module-level type-only state. Rendering now uses isStatementTypeOnly to choose import type vs import, and renderNamedBinding conditionally prefixes type for type-only specifiers in mixed value/type modules.
Import rendering test coverage
packages/1-framework/1-core/ts-render/test/render-imports.test.ts
Added Vitest cases validating aliased named imports, redundant alias suppression, full module import type emission, and per-specifier type prefixing for mixed imports.
Emitter integration
packages/1-framework/3-tooling/emitter/package.json, packages/1-framework/3-tooling/emitter/src/domain-type-generation.ts, packages/1-framework/3-tooling/emitter/test/domain-type-generation.test.ts
Added @prisma-next/ts-render as a runtime dependency. Updated generateImportLines to build ImportRequirement objects with typeOnly: true and delegate rendering to renderImports. Tests verify multi-specifier consolidation and per-package emission.
Post-emit script update
packages/3-extensions/sql-orm-client/scripts/strip-pgvector-fixture.mjs
Aligned fixture-search pattern with new consolidated import type { CodecTypes as PgVectorTypes, Vector } format to ensure post-emit replacements match the generated structure.
Generated contract files
apps/telemetry-backend/src/prisma/contract.d.ts, examples/*/src/**/contract.d.ts, packages/3-extensions/*/src/contract.d.ts, test/integration/test/fixtures/contract.d.ts
Regenerated 14 contract declaration files consolidating type-only imports into single grouped statements per module using the new rendering logic. Exported types and runtime contracts unchanged.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Suggested reviewers

  • jkomyno

🐰 A bundled heap of types now stands,
Where imports once sprawled across many lines,
Aliases dance where the code once fanned,
Type-only flows through consolidated designs! ✨

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 7.69% 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
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.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly describes the main change: consolidating multiple import statements into one per module in generated contract.d.ts files by reusing the ts-render renderer, which aligns with the PR's core objective of deduplicating import lines.

✏️ 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 tml-2714-deduplicate-repeated-mongo-type-imports-in-generated-files

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

@wmadden wmadden changed the title fix(emitter): dedupe generated import lines via ts-render renderImports (TML-2714) fix(emitter): generate one import per module in contract.d.ts by reusing the shared renderer (TML-2714) May 29, 2026
@pkg-pr-new
Copy link
Copy Markdown

pkg-pr-new Bot commented May 29, 2026

Open in StackBlitz

@prisma-next/extension-author-tools

npm i https://pkg.pr.new/@prisma-next/extension-author-tools@614

@prisma-next/mongo-runtime

npm i https://pkg.pr.new/@prisma-next/mongo-runtime@614

@prisma-next/family-mongo

npm i https://pkg.pr.new/@prisma-next/family-mongo@614

@prisma-next/sql-runtime

npm i https://pkg.pr.new/@prisma-next/sql-runtime@614

@prisma-next/family-sql

npm i https://pkg.pr.new/@prisma-next/family-sql@614

@prisma-next/extension-arktype-json

npm i https://pkg.pr.new/@prisma-next/extension-arktype-json@614

@prisma-next/extension-cipherstash

npm i https://pkg.pr.new/@prisma-next/extension-cipherstash@614

@prisma-next/middleware-cache

npm i https://pkg.pr.new/@prisma-next/middleware-cache@614

@prisma-next/mongo

npm i https://pkg.pr.new/@prisma-next/mongo@614

@prisma-next/extension-paradedb

npm i https://pkg.pr.new/@prisma-next/extension-paradedb@614

@prisma-next/extension-pgvector

npm i https://pkg.pr.new/@prisma-next/extension-pgvector@614

@prisma-next/extension-postgis

npm i https://pkg.pr.new/@prisma-next/extension-postgis@614

@prisma-next/postgres

npm i https://pkg.pr.new/@prisma-next/postgres@614

@prisma-next/sql-orm-client

npm i https://pkg.pr.new/@prisma-next/sql-orm-client@614

@prisma-next/sqlite

npm i https://pkg.pr.new/@prisma-next/sqlite@614

@prisma-next/target-mongo

npm i https://pkg.pr.new/@prisma-next/target-mongo@614

@prisma-next/adapter-mongo

npm i https://pkg.pr.new/@prisma-next/adapter-mongo@614

@prisma-next/driver-mongo

npm i https://pkg.pr.new/@prisma-next/driver-mongo@614

@prisma-next/contract

npm i https://pkg.pr.new/@prisma-next/contract@614

@prisma-next/utils

npm i https://pkg.pr.new/@prisma-next/utils@614

@prisma-next/config

npm i https://pkg.pr.new/@prisma-next/config@614

@prisma-next/errors

npm i https://pkg.pr.new/@prisma-next/errors@614

@prisma-next/framework-components

npm i https://pkg.pr.new/@prisma-next/framework-components@614

@prisma-next/operations

npm i https://pkg.pr.new/@prisma-next/operations@614

@prisma-next/ts-render

npm i https://pkg.pr.new/@prisma-next/ts-render@614

@prisma-next/contract-authoring

npm i https://pkg.pr.new/@prisma-next/contract-authoring@614

@prisma-next/ids

npm i https://pkg.pr.new/@prisma-next/ids@614

@prisma-next/psl-parser

npm i https://pkg.pr.new/@prisma-next/psl-parser@614

@prisma-next/psl-printer

npm i https://pkg.pr.new/@prisma-next/psl-printer@614

@prisma-next/cli

npm i https://pkg.pr.new/@prisma-next/cli@614

@prisma-next/cli-telemetry

npm i https://pkg.pr.new/@prisma-next/cli-telemetry@614

@prisma-next/emitter

npm i https://pkg.pr.new/@prisma-next/emitter@614

@prisma-next/migration-tools

npm i https://pkg.pr.new/@prisma-next/migration-tools@614

prisma-next

npm i https://pkg.pr.new/prisma-next@614

@prisma-next/vite-plugin-contract-emit

npm i https://pkg.pr.new/@prisma-next/vite-plugin-contract-emit@614

@prisma-next/mongo-codec

npm i https://pkg.pr.new/@prisma-next/mongo-codec@614

@prisma-next/mongo-contract

npm i https://pkg.pr.new/@prisma-next/mongo-contract@614

@prisma-next/mongo-value

npm i https://pkg.pr.new/@prisma-next/mongo-value@614

@prisma-next/mongo-contract-psl

npm i https://pkg.pr.new/@prisma-next/mongo-contract-psl@614

@prisma-next/mongo-contract-ts

npm i https://pkg.pr.new/@prisma-next/mongo-contract-ts@614

@prisma-next/mongo-emitter

npm i https://pkg.pr.new/@prisma-next/mongo-emitter@614

@prisma-next/mongo-schema-ir

npm i https://pkg.pr.new/@prisma-next/mongo-schema-ir@614

@prisma-next/mongo-query-ast

npm i https://pkg.pr.new/@prisma-next/mongo-query-ast@614

@prisma-next/mongo-orm

npm i https://pkg.pr.new/@prisma-next/mongo-orm@614

@prisma-next/mongo-query-builder

npm i https://pkg.pr.new/@prisma-next/mongo-query-builder@614

@prisma-next/mongo-lowering

npm i https://pkg.pr.new/@prisma-next/mongo-lowering@614

@prisma-next/mongo-wire

npm i https://pkg.pr.new/@prisma-next/mongo-wire@614

@prisma-next/sql-contract

npm i https://pkg.pr.new/@prisma-next/sql-contract@614

@prisma-next/sql-errors

npm i https://pkg.pr.new/@prisma-next/sql-errors@614

@prisma-next/sql-operations

npm i https://pkg.pr.new/@prisma-next/sql-operations@614

@prisma-next/sql-schema-ir

npm i https://pkg.pr.new/@prisma-next/sql-schema-ir@614

@prisma-next/sql-contract-psl

npm i https://pkg.pr.new/@prisma-next/sql-contract-psl@614

@prisma-next/sql-contract-ts

npm i https://pkg.pr.new/@prisma-next/sql-contract-ts@614

@prisma-next/sql-contract-emitter

npm i https://pkg.pr.new/@prisma-next/sql-contract-emitter@614

@prisma-next/sql-lane-query-builder

npm i https://pkg.pr.new/@prisma-next/sql-lane-query-builder@614

@prisma-next/sql-relational-core

npm i https://pkg.pr.new/@prisma-next/sql-relational-core@614

@prisma-next/sql-builder

npm i https://pkg.pr.new/@prisma-next/sql-builder@614

@prisma-next/target-postgres

npm i https://pkg.pr.new/@prisma-next/target-postgres@614

@prisma-next/target-sqlite

npm i https://pkg.pr.new/@prisma-next/target-sqlite@614

@prisma-next/adapter-postgres

npm i https://pkg.pr.new/@prisma-next/adapter-postgres@614

@prisma-next/adapter-sqlite

npm i https://pkg.pr.new/@prisma-next/adapter-sqlite@614

@prisma-next/driver-postgres

npm i https://pkg.pr.new/@prisma-next/driver-postgres@614

@prisma-next/driver-sqlite

npm i https://pkg.pr.new/@prisma-next/driver-sqlite@614

commit: 7a44338

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@packages/1-framework/1-core/ts-render/src/render-imports.ts`:
- Around line 84-90: group.named is currently keyed only by req.symbol which
collapses distinct local aliases (alias) for the same exported symbol; update
the data structure and logic so bindings are preserved per local alias (e.g.,
change group.named to map symbol -> Map<alias, {typeOnly}> or make the top-level
key a composite of symbol+alias) or alternatively throw when an alias mismatch
is detected; update the insertion logic that uses existing, alias, req.symbol
and typeOnly to either set separate entries per alias or to detect and throw on
conflicting aliases, and add regression tests covering (1) same symbol imported
with two different aliases and (2) symbol imported both plain and as an alias to
ensure behavior is correct and order-independent.
- Around line 136-167: The code currently generates an invalid single "import
type" statement when isStatementTypeOnly(group) is true but the group has both a
defaultSymbol and named bindings; update renderModuleImport (and stop relying on
buildImportClause to produce the combined form in that case) so that when
statementTypeOnly is true and both defaultSymbol and named.size>0 you emit two
separate imports: one "import type <Default> from 'module'<attrs>;" and one
"import type { <Named...> } from 'module';" (or alternatively reject/throw on
that input); adjust buildImportClause to avoid producing "Default, { Named }"
for type-only statements and add a regression test covering default+named
type-only imports to ensure the split behavior (reference: renderModuleImport,
buildImportClause, isStatementTypeOnly, renderNamedBinding).
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yml

Review profile: CHILL

Plan: Pro

Run ID: b6f6e847-d06b-4684-900b-d05f4c03068b

📥 Commits

Reviewing files that changed from the base of the PR and between 485d437 and cbec7fe.

⛔ Files ignored due to path filters (6)
  • packages/3-extensions/sql-orm-client/test/fixtures/generated/contract.d.ts is excluded by !**/generated/**
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
  • test/e2e/framework/test/fixtures/generated/contract.d.ts is excluded by !**/generated/**
  • test/integration/test/mongo/fixtures/generated/contract.d.ts is excluded by !**/generated/**
  • test/integration/test/sql-builder/fixtures/generated/contract.d.ts is excluded by !**/generated/**
  • test/integration/test/sql-orm-client/fixtures/generated/contract.d.ts is excluded by !**/generated/**
📒 Files selected for processing (22)
  • apps/telemetry-backend/src/prisma/contract.d.ts
  • examples/cipherstash-integration/src/prisma/contract.d.ts
  • examples/mongo-blog-leaderboard/src/contract.d.ts
  • examples/mongo-demo/src/contract.d.ts
  • examples/paradedb-demo/src/prisma/contract.d.ts
  • examples/prisma-next-cloudflare-worker/src/prisma/contract.d.ts
  • examples/prisma-next-demo/src/prisma/contract.d.ts
  • examples/prisma-next-postgis-demo/src/prisma/contract.d.ts
  • examples/react-router-demo/src/prisma/contract.d.ts
  • examples/retail-store/src/contract.d.ts
  • packages/1-framework/1-core/ts-render/src/render-imports.ts
  • packages/1-framework/1-core/ts-render/src/ts-expression.ts
  • packages/1-framework/1-core/ts-render/test/render-imports.test.ts
  • packages/1-framework/3-tooling/emitter/package.json
  • packages/1-framework/3-tooling/emitter/src/domain-type-generation.ts
  • packages/1-framework/3-tooling/emitter/test/domain-type-generation.test.ts
  • packages/3-extensions/cipherstash/src/contract.d.ts
  • packages/3-extensions/paradedb/src/contract.d.ts
  • packages/3-extensions/pgvector/src/contract.d.ts
  • packages/3-extensions/postgis/src/contract.d.ts
  • packages/3-extensions/sql-orm-client/scripts/strip-pgvector-fixture.mjs
  • test/integration/test/fixtures/contract.d.ts

Comment thread packages/1-framework/1-core/ts-render/src/render-imports.ts Outdated
Comment thread packages/1-framework/1-core/ts-render/src/render-imports.ts
@wmadden wmadden changed the title fix(emitter): generate one import per module in contract.d.ts by reusing the shared renderer (TML-2714) TML-2714: generate one import per module in contract.d.ts by reusing the shared renderer May 29, 2026
wmadden added 2 commits May 29, 2026 11:56
Generated contract.d.ts files emitted duplicate import type lines because the
emitter generateImportLines produced one line per import spec with no per-module
aggregation. Route it through @prisma-next/ts-render renderImports (extended with
alias and type-only support) so imports are aggregated per module specifier,
matching the migration renderers. Regenerate affected fixtures.

Refs: TML-2714
Signed-off-by: Will Madden <madden@prisma.io>
… default+named imports

Bug 1: ModuleImportGroup.named was keyed by symbol alone, so { A } + { A as B } and { A as B } + { A as C } collapsed into a single binding. Key the named-bindings map by (symbol, alias) instead, store the symbol on the binding, and sort by (symbol, alias) using code-unit comparison so the un-aliased form precedes any aliased form of the same symbol. Identical (symbol, alias) pairs still merge typeOnly by AND.

Bug 2: When isStatementTypeOnly was true and the group had both a default and named bindings, buildImportClause emitted import type Default, { Named } which TS rejects (TS1363). Split that case into two valid type-only statements (import type Default from "m"; then import type { Named } from "m";). The non-type-only mixed case still renders on a single line.

JSDoc updated to document the type-only default+named exception, the (symbol, alias) sort key, and the distinct-bindings semantics.

Refs: TML-2714
Signed-off-by: Will Madden <madden@prisma.io>
@wmadden wmadden force-pushed the tml-2714-deduplicate-repeated-mongo-type-imports-in-generated-files branch from 7a44338 to ad36c45 Compare May 29, 2026 09:56
@wmadden wmadden enabled auto-merge (rebase) May 29, 2026 09:56
@wmadden wmadden disabled auto-merge May 29, 2026 09:57
@wmadden wmadden merged commit 034ac56 into main May 29, 2026
8 checks passed
@wmadden wmadden deleted the tml-2714-deduplicate-repeated-mongo-type-imports-in-generated-files branch May 29, 2026 09:57
wmadden-electric added a commit that referenced this pull request May 30, 2026
…istory

Replace the three synthetic normal-shape golden cases with cases drawn
from real merged PRs, so the corpus measures Drive runs against work the
team actually shipped rather than synthesised tasks:

- direct-change-example-emit-outputpath (TML-2722 / #618)
- slice-dedupe-generated-imports (TML-2714 / #614)
- project-reap-subsumed-ir-surfaces (TML-2727 / #630, #631, #629) — a
  three-slice parallel fan-out that exercises planner parallelisation and
  scope discipline.

Each real case carries the task as posed (Linear ticket, solution-scrubbed
so the run still does the design/planning), a base_sha to run against, and
a reference.md describing the known-good output by commit SHA (the output
itself is fetchable via git diff <base_sha> <merge_sha>). case.json gains
source + base_sha; the loader ignores the extra fields until the
experiment-engine slice wires base_sha into a checkout.

The two pathological cases (i12-halt, spike-first) stay synthetic: no clean
merged PR exhibits a halted or spiked run.

Update harness tests, SKILL.md examples, and the corpus README for the
renamed slugs. validate-parser fixtures are left as-is — they are
synthetic parser fixtures with tuned event counts, not corpus members.

Signed-off-by: wmadden-electric <286902546+wmadden-electric@users.noreply.github.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.

1 participant