Publish extension generation provenance contract - #731
Conversation
📝 WalkthroughWalkthroughAdds a pure ChangesExtension generation contract
Git environment isolation
Vendored Bats test loading
Estimated code review effort: 4 (Complex) | ~60 minutes Sequence Diagram(s)sequenceDiagram
participant Generator
participant ExtensionGenerationInputV1
participant ProvenanceManifest
participant ReviewProjection
Generator->>ExtensionGenerationInputV1: consume canonical Shape, Law, operation, owner, and settings data
Generator->>ProvenanceManifest: submit generator, source, and output references
ProvenanceManifest->>ProvenanceManifest: recompute and verify supplied digests
ProvenanceManifest->>ReviewProjection: derive deterministic non-authoritative review
Possibly related PRs
Suggested labels: 🚥 Pre-merge checks | ✅ 3 | ❌ 2❌ Failed checks (2 warnings)
✅ Passed checks (3 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
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. Comment |
🔍 The Case of Pull Request #731Schema Sets
Schema Set
|
Code Lawyer self-audit findings@codex second opinion requested.
The damaged worktree is preserved untouched at |
Code Lawyer self-audit finding 2@codex second opinion requested.
|
|
@codex review please |
Code Lawyer Activity Summary
No inline review threads existed at audit time. The original damaged worktree remains untouched with 729 staged deletions and five fixture index entries; all review/fix work occurred in a fresh clean worktree. No amend, reset, rebase, force-push, or branch deletion was used. Final local gate: |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 38e74092f2
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (3)
crates/wesley-core/tests/extension_generation.rs (1)
371-444: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winConsider adding a deserialize→revalidate round trip over the checked fixtures.
checked_generation_fixtures_match_public_api_and_published_schemasonly exercises construct-in-Rust → serialize → compare-with-fixture. It never exercises the inverse path (serde_json::from_str::<ExtensionGenerationInputV1>/GenerationProvenanceManifestV1/GenerationReviewV1on the checked-in fixture, followed by.canonical_bytes()), which is the exact path external Rust consumers are expected to use per the PR's "external Rust consumption without invoking the CLI" objective. Adding this would catch asymmetries betweenSerialize/Deserializeand thenormalized()revalidation logic that the current test can't detect.🤖 Prompt for 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. In `@crates/wesley-core/tests/extension_generation.rs` around lines 371 - 444, Extend checked_generation_fixtures_match_public_api_and_published_schemas with a deserialize→revalidate round trip for input.json, provenance.json, and review.json. Deserialize each checked-in fixture into ExtensionGenerationInputV1, GenerationProvenanceManifestV1, and GenerationReviewV1, then compare each value’s canonical_bytes() with the corresponding fixture bytes and preserve schema validation.crates/wesley-core/src/domain/extension_generation.rs (2)
452-469: 🗄️ Data Integrity & Integration | 🔵 Trivial | ⚡ Quick win
authoritativeinvariant is only enforced incanonical_bytes(), not by the type.The doc comment states
authoritativeis "Always false: this projection is never an authority artifact," but the field ispub booland the struct derivesDeserialize, so any code (including external consumers of this published crate) can construct or deserialize aGenerationReviewV1withauthoritative: trueand serialize it with the defaultSerializeimpl, bypassing the guarantee entirely — onlycanonical_bytes()(Lines 516-529) checks and rejects it.Consider encapsulating the field (private field +
pub fn authoritative(&self) -> bool { false }accessor, with a customDeserializethat hard-codes/validates the value) so the non-authoritative guarantee is structural rather than dependent on always callingcanonical_bytes()before trusting the value.🤖 Prompt for 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. In `@crates/wesley-core/src/domain/extension_generation.rs` around lines 452 - 469, The GenerationReviewV1 type exposes a mutable authoritative flag that can violate its documented always-false invariant. Encapsulate authoritative, ensure construction and deserialization cannot accept true, provide an authoritative(&self) accessor returning false, and preserve serialization and canonical_bytes() behavior without relying solely on runtime validation there.
170-233: 🚀 Performance & Scalability | 🔵 Trivial | ⚡ Quick winRoot cause:
digest()/canonical_bytes()silently re-normalize, causing redundant full revalidation insideverify(),new(), andfrom_manifest().
ExtensionGenerationInputV1::digest()(Lines 174-177) callscanonical_bytes()which callsself.normalized()(Lines 179-233), which fully reconstructs the value viaSelf::new(...)— re-sorting/deduping every collection and, when Law IR is present, re-runningvalidate_law_ir_v1_bindingsandcompute_law_hash_v1from scratch.Every downstream caller that already holds a normalized value calls
.digest()afterward, paying this cost twice in one logical operation:
GenerationProvenanceManifestV1::new()(Lines 314-336):input.normalized()theninput.digest().GenerationProvenanceManifestV1::verify()(Lines 352-397): same pattern.GenerationReviewV1::from_manifest()(Lines 471-512): same pattern for bothinputandmanifest.For inputs carrying non-trivial Law IR/Shape IR/operation catalogs, this doubles the cost of binding validation and hashing on every provenance build/verify/review call. Consider adding a private helper (e.g.
fn digest_from_normalized(normalized: &Self) -> Result<String, ...>) that computes the domain digest directly from an already-normalized value, and havenew()/verify()/from_manifest()call it instead of re-invoking.digest().Also applies to: 293-450, 471-512
🤖 Prompt for 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. In `@crates/wesley-core/src/domain/extension_generation.rs` around lines 170 - 233, The digest and canonical serialization paths redundantly normalize already-normalized inputs, causing repeated sorting, validation, and hashing. Add a private helper near ExtensionGenerationInputV1::digest, such as digest_from_normalized, that canonicalizes and hashes without calling normalized(); update GenerationProvenanceManifestV1::new, GenerationProvenanceManifestV1::verify, and GenerationReviewV1::from_manifest to use it after their existing normalization step, while preserving public digest() behavior for unnormalized callers.
🤖 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 `@crates/wesley-core/src/domain/extension_generation.rs`:
- Around line 552-616: The stable diagnostic classification is too broad:
normalize_strings and validate_token report arbitrary invalid strings as
InvalidCoordinate. Add and wire a distinct InvalidToken
GenerationContractErrorKind with its own machine-readable code for
normalize_strings/validate_token failures, while retaining InvalidCoordinate for
coordinate and version validation in validate_coordinate and
GeneratorIdentityV1::validate.
---
Nitpick comments:
In `@crates/wesley-core/src/domain/extension_generation.rs`:
- Around line 452-469: The GenerationReviewV1 type exposes a mutable
authoritative flag that can violate its documented always-false invariant.
Encapsulate authoritative, ensure construction and deserialization cannot accept
true, provide an authoritative(&self) accessor returning false, and preserve
serialization and canonical_bytes() behavior without relying solely on runtime
validation there.
- Around line 170-233: The digest and canonical serialization paths redundantly
normalize already-normalized inputs, causing repeated sorting, validation, and
hashing. Add a private helper near ExtensionGenerationInputV1::digest, such as
digest_from_normalized, that canonicalizes and hashes without calling
normalized(); update GenerationProvenanceManifestV1::new,
GenerationProvenanceManifestV1::verify, and GenerationReviewV1::from_manifest to
use it after their existing normalization step, while preserving public digest()
behavior for unnormalized callers.
In `@crates/wesley-core/tests/extension_generation.rs`:
- Around line 371-444: Extend
checked_generation_fixtures_match_public_api_and_published_schemas with a
deserialize→revalidate round trip for input.json, provenance.json, and
review.json. Deserialize each checked-in fixture into
ExtensionGenerationInputV1, GenerationProvenanceManifestV1, and
GenerationReviewV1, then compare each value’s canonical_bytes() with the
corresponding fixture bytes and preserve schema validation.
🪄 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.yaml
Review profile: CHILL
Plan: Pro
Run ID: 55e63e9a-6784-4a8c-a5b2-4b256de2cd3c
📒 Files selected for processing (38)
CHANGELOG.mdcrates/wesley-cli/tests/cli.rscrates/wesley-core/README.mdcrates/wesley-core/src/domain/extension_generation.rscrates/wesley-core/src/domain/mod.rscrates/wesley-core/src/lib.rscrates/wesley-core/tests/extension_generation.rsdocs/reference/extension-generation.mddocs/topics/README.mddocs/topics/extension-modules.mdschemas/README.mdschemas/wesley-extension-generation-input-v1.schema.jsonschemas/wesley-generation-provenance-manifest-v1.schema.jsonschemas/wesley-generation-review-v1.schema.jsonscripts/pre-push-sanity.mjsscripts/pre-push-sanity.test.mjstest/ci-package-manager-policy.batstest/ci-workflows.batstest/docs-governance.batstest/docs-planning-boundary.batstest/docs-whitespace.batstest/domain-empty-boundary.batstest/fixtures/README.mdtest/fixtures/extension-generation/README.mdtest/fixtures/extension-generation/generated-profile.jsontest/fixtures/extension-generation/input.jsontest/fixtures/extension-generation/provenance.jsontest/fixtures/extension-generation/review.jsontest/fixtures/extension-generation/schema.graphqltest/fixtures/extension-generation/semantic-source.jsontest/ir-fixtures.batstest/release-governance.batstest/serve-static-e2e.batstest/serve-static-relative-unit.batstest/serve-static-unit.batstest/serve-static.batstest/technical-teardown.batstest/weslaw-fixtures.bats
|
@codex review please Final review head: |
Code Lawyer Final Activity SummarySupersedes the earlier activity summary. Final review head:
All five inline review threads were answered and resolved through GraphQL. The remaining normalization-performance nit was inspected and intentionally not implemented: no benchmark or budget demonstrates a problem, and adding a private path that assumes prior normalization would weaken validation-path clarity in this correctness PR. CodeRabbit docstring and scope warnings are addressed by the documented audit-containment rationale and the fact that all new public APIs carry Rustdoc; they are not executable gate failures. Final local gate: |
|
@codex review please Final review head: |
|
Codex Review: Didn't find any major issues. 👍 Reviewed commit: ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. Codex can also answer questions or update the PR. Try commenting "@codex address that feedback". |
Plain-English Walkthrough
TL;DR
[claim:canonical-generation-input, confidence:1.00] Wesley now exposes a
versioned Rust input that combines canonical Shape IR, normalized root
operations, optional bound Law IR, explicit owner-declaration references, a
settings digest, and requested projection roles. Canonical bytes exclude ambient
Shape metadata and normalize set-like values, so equivalent explicit inputs
produce the same identity
(
crates/wesley-core/src/domain/extension_generation.rs#115@a0d4b871;canonical_generation_input_ignores_ambient_metadata_and_set_orderincrates/wesley-core/tests/extension_generation.rs#76@a0d4b871).[claim:provenance-recomputes-material, confidence:1.00] A generation provenance
manifest binds the input, generator, source declarations, settings, contract
versions, and emitted artifacts. Verification recomputes the generator and every
supplied source/output digest before returning a receipt
(
crates/wesley-core/src/domain/extension_generation.rs#295@a0d4b871;provenance_recomputes_generator_source_and_output_digestsincrates/wesley-core/tests/extension_generation.rs#306@a0d4b871).[claim:review-remains-non-authoritative, confidence:1.00] The review projection
is deterministic and structurally non-authoritative: the authority field is
private, deserialization rejects
truewith the stable authority-rejectioncode, construction writes
false, and the JSON Schema requiresfalse(
crates/wesley-core/src/domain/extension_generation.rs#452@a0d4b871;generation_review_deserialization_rejects_authority_claimsincrates/wesley-core/tests/extension_generation.rs#419@a0d4b871).Walkthrough
Before this change, an external semantic generator had no single Wesley-owned
Rust contract for canonical compiler facts and generation provenance. A consumer
either had to scrape CLI JSON, duplicate canonicalization, or adopt the unrelated
descriptor-only target protocol. This PR adds the missing in-memory boundary
without moving Echo, Edict, or any other target's semantics into Wesley.
The flow deliberately separates neutral compiler facts, owner-supplied meaning,
and post-generation evidence:
flowchart LR A[Canonical Shape and operation facts] --> B[ExtensionGenerationInputV1] C[Optional bound Law IR] --> B D[Owner declarations and settings digest] --> B B --> E[External owner generator] E --> F[Emitted artifact bytes] B --> G[GenerationProvenanceManifestV1] H[Exact generator and source bytes] --> G F --> G G --> I[Digest verification receipt] G --> J[Non-authoritative review JSON]Caption: Generation ownership and evidence flow
and emitted artifact schemas.
the review JSON remains derived evidence rather than authority.
The diagram's key boundary is between
ExtensionGenerationInputV1and theexternal generator. Wesley defines what bytes and identities cross that boundary,
but it does not execute the generator or interpret target-specific output.
Canonical input and failures
[claim:no-ambient-discovery, confidence:0.99] Construction operates only on
explicit in-memory values: it strips
WesleyIR.metadata, validates and sortsoperations, normalizes active Law IR, sorts owner references and projection
roles, and performs no filesystem, registry, network, clock, process, or
environment lookup
(
crates/wesley-core/src/domain/extension_generation.rs#140@a0d4b871;docs/reference/extension-generation.md#84@a0d4b871).Conflicting digests for one coordinate, malformed digests, unsupported versions,
Law binding failures, missing or unexpected verification material, digest
mismatches, and attempted authoritative review output use structured stable error
kinds. Target meaning and target artifact validation stay with the external
owner.
[claim:stable-token-diagnostics, confidence:1.00] Malformed generic tokens such
as projection roles and Law tags use
InvalidToken/WESLEY_GENERATION_INVALID_TOKEN, while artifact, generator-version, andoperation coordinates retain
InvalidCoordinate(
crates/wesley-core/src/domain/extension_generation.rs#579@a0d4b871;generation_input_classifies_invalid_projection_roles_as_tokensincrates/wesley-core/tests/extension_generation.rs#238@a0d4b871).[claim:operation-coordinate-validation, confidence:1.00] Publicly constructed
operation catalogs cannot emit schema-invalid empty, padded, or control-bearing
root, field, or argument names. Validation occurs before sorting and
canonicalization and returns the stable
InvalidCoordinatekind(
crates/wesley-core/src/domain/extension_generation.rs#693@a0d4b871;generation_input_rejects_malformed_operation_coordinatesincrates/wesley-core/tests/extension_generation.rs#208@a0d4b871).Published schemas
[claim:nested-schema-enforcement, confidence:1.00] The input JSON Schema validates
nested Shape IR and operation structures and composes the existing canonical Law
IR schema. Negative witnesses reject empty operations, empty Shape types, and
incomplete Law IR
(
schemas/wesley-extension-generation-input-v1.schema.json#1@a0d4b871;published_input_schema_rejects_malformed_nested_contractsincrates/wesley-core/tests/extension_generation.rs#535@a0d4b871).[claim:documented-shape-arguments, confidence:1.00] Shape field arguments use
their own schema definition, so optional descriptions emitted by the Rust Shape
IR are accepted without incorrectly adding descriptions to root operation
arguments
(
schemas/wesley-extension-generation-input-v1.schema.json#1@a0d4b871;published_input_schema_accepts_documented_shape_argumentsincrates/wesley-core/tests/extension_generation.rs#608@a0d4b871).[claim:generation-token-schema, confidence:1.00] The input, provenance, and review
schemas now reject leading/trailing whitespace and C0/C1 control characters on
every token surface already validated by the Rust generation contract
(
schemas/wesley-generation-provenance-manifest-v1.schema.json#1@a0d4b871;published_generation_schemas_reject_malformed_tokensincrates/wesley-core/tests/extension_generation.rs#570@a0d4b871).CI admission
[claim:generation-fixture-ci, confidence:1.00] A change limited to checked
extension-generation fixtures now triggers the Rust product preflight for both
pull requests and main-branch pushes, so fixture drift cannot skip the Rust
projection and schema witnesses
(
.github/workflows/rust-native.yml#22@a0d4b871;rust native preflight provisions pnpm and watches audit inputsintest/ci-workflows.bats#34@a0d4b871).Pre-push containment incident
[claim:prepush-index-isolation, confidence:1.00] Review exposed that Git's
pre-push hook context leaked into nested repository tests, allowing a fixture
git addto replace the caller's index. The runner now removes everyrepository-local Git variable, including indexed
GIT_CONFIG_KEY_*/GIT_CONFIG_VALUE_*entries, before spawning child checks(
scripts/pre-push-sanity.mjs#285@a0d4b871;pre-push sanity removes hook-local Git context from child checksinscripts/pre-push-sanity.test.mjs#111@a0d4b871).The damaged original worktree was left untouched. A fresh worktree was used for
review, and an end-to-end leaked-environment run completed the Rust product
preflight and repo Bats suite while preserving the exact index tree hash before
and after execution.
Contract Surface
ExtensionGenerationInputV1and its canonical bytes/digest.GenerationArtifactReferenceV1and explicit artifact content.GeneratorIdentityV1and frozen schema/ABI identities.GenerationProvenanceManifestV1verification.GenerationReviewV1as derived, non-authoritative JSON.RED / GREEN
Initial contract RED:
cargo test -p wesley-core --test extension_generationfailed because thepublic generation/provenance API did not exist.
Code Lawyer RED:
node --test scripts/pre-push-sanity.test.mjsfailed because the runner didnot expose or implement repository-context sanitization.
cargo test -p wesley-core --test extension_generation published_input_schema_rejects_malformed_nested_contracts -- --exactfailed because the input schema accepted an empty operation.
cargo test -p wesley-core --test extension_generation published_input_schema_accepts_documented_shape_arguments -- --exactfailed because a valid Shape argument description was rejected.
ci-workflows.batscase failed because the generation-fixturetrigger occurred zero times instead of twice.
cargo test -p wesley-core --test extension_generation generation_input_rejects_malformed_operation_coordinates -- --exactfailed because an empty root coordinate was accepted.
cargo test -p wesley-core --test extension_generation published_generation_schemas_reject_malformed_tokens -- --exactfailed because a padded source coordinate passed the input schema.
cargo test -p wesley-core --test extension_generation generation_input_classifies_invalid_projection_roles_as_tokens -- --exactfailed because the stable
InvalidTokencategory did not exist.cargo test -p wesley-core --test extension_generation generation_review_deserialization_rejects_authority_claims -- --exactfailed because
authoritative: truedeserialized successfully.Final GREEN:
pnpm run preflightpassed workspace fmt, Clippy with warnings denied,dependency audit, docs checks, every Rust test, doc tests, and CLI smoke on
head
a0d4b871.GIT_*pre-push simulation passed the complete repo Bats suite andpreserved index tree
ab7e3f92f77450bfbbe8aab42468d00c19a2be9cbefore andafter execution.
cargo test -p wesley-core --test extension_generationpassed 12 tests.cargo test -p wesley-core --test generated_json_artifactspassed 6 tests.bats -t test/ci-workflows.batspassed all 29 workflow cases.cargo xtask legacy-preflightpassed 13 Node harness tests, docs truth,package-manager policy, and dependency-cruiser boundaries after a frozen
lockfile install restored the fresh worktree toolchain.
Compatibility, Dependencies, and Docs
[claim:additive-public-surface, confidence:0.99] The Rust API is additive and
re-exported from
wesley-core; no existing public export was removed orsignature-changed
(
crates/wesley-core/src/lib.rs#27@a0d4b871). No third-party dependency wasadded. The reference guide, extension topic, crate README, schema index, fixture
index, and changelog describe the current contract and ownership boundary.
Review Notes
The initial pre-push defect created fixture-authored commits
7fc9fd8fandf98febb5. History was deliberately preserved: no amend, reset, rebase,force-push, or branch deletion was used. The final tree contains no stray root
schema.graphql, and the current reviewed commits use the maintainer identity.Linked Issue
Issue #728 is closed by
the directive after the citations appendix.
Branch / Issue-Title Check
provider/728-generation-provenancefollows theprovider-campaign branch convention and includes the linked issue number.
Summary
non-authoritative review contracts for external Rust consumers.
harness corrections required to make that boundary enforceable.
Why
The contract keeps Wesley domain-neutral while giving runtime owners a stable,
content-addressed source for generated provider artifacts. Wasmtime execution,
provider packaging, registry resolution, and runtime-specific semantics remain
outside this PR. The pre-push containment changes are included because the
review harness damaged the original worktree while validating this branch; they
are required to make the evidence trustworthy, not a separate product feature.
Changes
failure types.
Git repository state.
Method Evidence
are posted on this PR.
summary.
Tracker Hygiene
work-in-progress; this audit began after thefeature branch already existed, so the history is reported rather than
rewritten retroactively.
normalization optimization was not accepted without benchmark evidence because
it would add a private path that assumes prior validation.
Risk
The primary risk is accepting an artifact whose Rust and JSON Schema
interpretations differ. Exact nested schemas, canonical fixture round trips,
stable negative diagnostics, digest recomputation, and full local/remote gates
mitigate that risk. The change does not execute external code and adds no
dependency.
Backout
Revert the merge commit. Consumers must then stop producing or accepting the
three
wesley.*generation*/v1artifacts until a replacement contract lands.No registry migration, publication, or persisted runtime state is introduced by
this PR.
Testing
pnpm run preflightcargo xtask legacy-preflightcargo test -p wesley-core --test extension_generationcargo test -p wesley-core --test generated_json_artifactsbats -t test/ci-workflows.batsGIT_*pre-push simulation with identical before/after index treeEvidenceMap / SourceMap
Not applicable. This contract does not map SQL or emit an EvidenceMap/SourceMap.
Screenshots / Logs
Not applicable. This PR has no visual surface; command evidence is recorded
above and in the activity summary.
Merge Strategy
constraints; no branch deletion is part of this merge.
Checklist
Appendix: Citations
claim:canonical-generation-inputcrates/wesley-core/src/domain/extension_generation.rs#115@a0d4b871;crates/wesley-core/tests/extension_generation.rs#76@a0d4b871claim:provenance-recomputes-materialcrates/wesley-core/src/domain/extension_generation.rs#352@a0d4b871;crates/wesley-core/tests/extension_generation.rs#306@a0d4b871claim:review-remains-non-authoritativecrates/wesley-core/src/domain/extension_generation.rs#452@a0d4b871;crates/wesley-core/tests/extension_generation.rs#419@a0d4b871claim:no-ambient-discoverycrates/wesley-core/src/domain/extension_generation.rs#140@a0d4b871;docs/reference/extension-generation.md#84@a0d4b871claim:stable-token-diagnosticscrates/wesley-core/src/domain/extension_generation.rs#579@a0d4b871;crates/wesley-core/tests/extension_generation.rs#238@a0d4b871claim:operation-coordinate-validationcrates/wesley-core/src/domain/extension_generation.rs#693@a0d4b871;crates/wesley-core/tests/extension_generation.rs#208@a0d4b871claim:nested-schema-enforcementschemas/wesley-extension-generation-input-v1.schema.json#1@a0d4b871;crates/wesley-core/tests/extension_generation.rs#535@a0d4b871claim:documented-shape-argumentsschemas/wesley-extension-generation-input-v1.schema.json#1@a0d4b871;crates/wesley-core/tests/extension_generation.rs#608@a0d4b871claim:generation-token-schemaschemas/wesley-generation-provenance-manifest-v1.schema.json#1@a0d4b871;crates/wesley-core/tests/extension_generation.rs#570@a0d4b871claim:generation-fixture-ci.github/workflows/rust-native.yml#22@a0d4b871;test/ci-workflows.bats#34@a0d4b871claim:prepush-index-isolationscripts/pre-push-sanity.mjs#285@a0d4b871;scripts/pre-push-sanity.test.mjs#111@a0d4b871claim:additive-public-surfacecrates/wesley-core/src/lib.rs#27@a0d4b871;git diff origin/main...a0d4b871Closes #728