All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
0.3.0-alpha.1 - 2026-07-15
-
Added a pure
wesley-coreextension-generation contract with canonical Shape/Law/operation inputs, digest-locked owner declarations and settings, generator/source/output provenance verification, and a deterministic non-authoritative review projection for external semantic generators. -
Added a Plain Wesley first-hour docs path with a beginner compiler tutorial, GraphQL-to-Wesley term map, contributor tutorial, and public-vocabulary rule for new docs terminology.
-
Added an assurance capability matrix that separates shipped native CLI evidence commands, transitional JavaScript tooling, Rust foundation code, and concept-only assurance vocabulary.
-
Added an external target protocol MVP specification for future descriptor-verified external-process target execution with host-enforced capability denial, bounded execution, deterministic command resolution, and staged artifact copy-out.
-
Added
cargo xtask bench-ir, an advisory Rust-native IR lowering benchmark that generates scale fixtures, reports structural counters and timing summaries, and can write JSON release evidence. -
Added a first-PR contributor path with docs-only, fixture-only, emitter-test, and CLI bug fast lanes plus maintainer starter-issue checks.
-
Added a security-tooling posture topic that records Wesley's current scanner baseline, rejects DAST for the current compiler-only surface, and gates future Semgrep or
cargo-denyadoption on low-noise repo-owned policies. -
Added CLI regression coverage for missing schema file diagnostics.
-
Added Rust emitter coverage for single-list GraphQL nullability shapes such as
[String]!and[String!]. -
Added a docs/site starter example for the current
wesley.config.jsonproject manifest path. -
Added CLI integration coverage for YAML project manifests in changed-schema selection.
-
Added a quick-start walkthrough for descriptor-only extension fixture groups.
-
Added
wesley target verifyfor external target descriptor validation without executing target code. -
Added JSON Schemas for the external target descriptor, request, response, diagnostic, and artifact manifest protocol envelopes.
-
Added a
hello-wesley-targetexternal target conformance fixture with descriptor, request, diagnostic, response, artifact manifest, and artifact hash validation. -
Added Holmes CLI regression coverage for normalized
weights --jsonoutput.
- Removed
pnpm auditfromcargo xtask preflightand the release gate after npm retired its audit endpoint (HTTP 410), which had turned the step into an unconditional failure. JavaScript dependency advisories are now tracked by Dependabot and thedependency-reviewworkflow; the Rust-native preflight no longer depends on npm registry health. - Documented and test-protected the supported JSON Schema draft boundary for canonical schema artifacts.
- Aligned Dependabot GitHub Actions update PR labels with existing repository labels.
- Required PR bodies to reference at least one GitHub Issue and to use GitHub closing keywords for every fully resolved issue.
- Removed the repo-resident Method backlog and graveyard trees from the current checkout; live work tracking now stays in GitHub Issues, and historical notes remain available through git history.
- Taught the crates release workflow to classify a tag's release channel from
its SemVer pre-release suffix, so pre-release tags (for example
v0.3.0-alpha.1) now publish a GitHub Release markedprereleaseand notlatest, while stable tags continue to publish as the latest release. - Made review authority structurally false by rejecting authoritative JSON at deserialization and exposing only a read-only authority accessor.
- Distinguished malformed generic generation tokens from malformed coordinates
with the stable
WESLEY_GENERATION_INVALID_TOKENdiagnostic code. - Aligned published input, provenance, and review schemas with Rust's token validation so padded or control-character-bearing values fail both surfaces.
- Rejected empty, padded, or control-character-bearing operation root, field, and argument names before serializing extension-generation input.
- Triggered the Rust product preflight when checked extension-generation fixtures change on pull requests or the main branch.
- Accepted optional Shape field-argument descriptions in the published extension-generation input schema while keeping root operation arguments description-free.
- Isolated pre-push child checks from hook-owned Git repository variables so nested fixture repositories cannot mutate the caller's index.
- Tightened the extension-generation input schema so nested Shape IR, operation, and Law IR values must satisfy their published contracts.
- Replaced pre-push sanity shell-string execution with argv-based command spawning while preserving dry-run command display.
- Repaired tracker-deletion follow-up docs so pending audit reports point at a concrete release gate, historical witness transcripts no longer show impossible Method queue output, and design packets no longer claim deleted files remain in the current checkout.
- Rejected duplicate non-repeatable custom directives during SDL lowering,
including duplicates split across type definitions and extensions, while
preserving ordered arrays for directives declared
repeatable. - Escaped law-backed Rust validator error messages before emission so hostile case values containing quotes, backslashes, or control characters cannot break generated Rust source.
0.2.0 - 2026-06-26
- Project manifest and config CLI: Added the domain-free
wesley.project-manifest/v1JSON/YAML manifest with schema paths, bundle directories, rebuild globs, comment mode, dashboard settings, and generic target metadata. The native CLI now exposeswesley config validate,wesley config inspect, andwesley config changed-schemas; single-schema manifests can also provide the default schema forschema lower,schema hash, andschema operations. - Fixture module zoo: Added descriptor-only compiler-heavy,
evidence-heavy, and BLADE-heavy fixture modules under
test/fixtures/extensions/fixture-zoo, with domain-empty regression guards. - Contributor onramp: Added a public near-term roadmap issue and scoped
good first issuestarter tasks, and linked the onboarding path fromCONTRIBUTING.md. - Comprehensive topic map: Expanded
docs/topics/into a current operator and contributor map covering the native CLI, schema IR, operations, directives, emitters, artifacts, compiler boundaries, project manifests, extension modules, legacy Node retirement, CI, HOLMES, releases, invariants, and docs maintenance.
- Release lifecycle profile: Added a repo-local
.continuum/release.ymlrelease profile and expanded the Wesley release doctrine/runbook around thesis, scope, goalposts, immutable tagged-main publication, verification, and retrospective evidence. - Release process front door: Added a thin root
RELEASE.mdand clarified how Wesley adapts the Continuum release lifecycle around goalpost milestones, version labels, manual signed tags, crates.io publication, and patch-forward failure handling. - Release documentation gate: The release runbook, release policy, and
human sign-off checklist now require a
docs/topics/accuracy and coverage audit before tagging, with minimum 90% accuracy and 90% coverage floors. - HOLMES schema selection: The HOLMES workflow now reads the Wesley project
manifest first, computes changed schema sets with
wesley config changed-schemas, runs schema-scoped matrix jobs, and keeps per-schema report artifacts grouped for one aggregate PR comment. - HOLMES distribution direction: Documented tagged reusable GitHub Actions workflows plus copy/paste templates as the user-facing HOLMES install path, with GitHub App delivery deferred to future identity or Checks API needs.
- Extension documentation: Added current project-manifest and module
authoring references, and clarified that
wesley.config.mjsand the dynamic JavaScript module loader are retired from generic Wesley core. - Release signposts: Refreshed README, GUIDE, ENTRYPOINTS, ARCHITECTURE, METHOD, CONTRIBUTING, and docs topic routing so the current docs point at the domain-free GraphQL-to-IR platform and the topic map rather than stale backlog or retired command surfaces.
- Launch signpost honesty: Refreshed the pre-tag launch wording across
README, GUIDE, ENTRYPOINTS, docs site, BEARING, TECHNICAL_TEARDOWN, release
topics, and docs-maintenance topics so
v0.2.0install commands are present without claiming publication before the signed tag workflow completes.
- Release crate visibility check: The tag-triggered Release Crates workflow
now verifies crates.io visibility for
wesley-emit-codecalong with the rest of the published Rust crate set, with bounded registry-index retries before finalizing the GitHub Release. - Release version-source enforcement:
cargo xtask release-prep-guard,cargo xtask release-guard,cargo xtask package-crates, andcargo xtask publish-cratesnow reject rootpackage.jsonand unpublished required Cargo manifest version drift in addition to published Rust crate manifest drift. - Release issue blocker selection: Release guards now rely on exact-version
issue text and
vX.Y.Zlabels for pre-tag blockers while allowing theRelease: vX.Y.Zgate issue to remain open for post-publication evidence and closeout. - Release advisory-audit profile: The repo-local release profile now declares the Rust advisory audit command alongside the other release validation gates.
- Release signpost profile coverage: The repo-local release profile now includes the public MkDocs source and guide page in user-doc signposts so profile-driven audits cover public release wording.
- Post-merge SHIPME certification:
cert-shipme.ymlnow runs only onmainpushes, so SHIPME certificates bind to the landed target-branch SHA instead of racing PR-time HOLMES comments for a temporary merge SHA. - Docs CLI checker determinism: The docs command checker now reads the
native command list from the Rust CLI source help text instead of invoking
cargo run, so Node-only repository hygiene does not depend on Cargo registry/network state or cascade help-load failures into false doc command errors.
- Rust Holmes law capability alias:
wesley-holmesno longer accepts the pre-canonicalwesley.capability-report/v1input alias. Law capability ingest now accepts only the canonicalwesley.law-capabilities/v1artifact API version.
0.1.1 - 2026-06-26
- External host experiments: Retired the browser, Bun, and Deno host experiment packages, workflows, smoke scripts, browser contract fixtures, and active docs references from the Wesley release surface. Wesley now treats host-specific execution as downstream extension scope rather than core repo product surface.
- Website/playground surface: Removed the old
wesley-websiteVite/React product site, playground/PGLite leftovers, Pages workflow, preview script, and active James website planning docs. Wesley keeps documentation underdocs/anddocs/site; product websites and playgrounds must be owned outside this repo unless a future Wesley release explicitly reslates them.
- v0.1.0 release evidence: Recorded the signed tag, GitHub Release,
Release Crates workflow, and crates.io publication evidence for the published
v0.1.0release, and tightened the release doctrine so future releases treat the signed tag on syncedmainas the repo release boundary instead of relying on manual post-release evidence backfills. - Roadmap governance: Moved Wesley's live roadmap model to GitHub Issues,
Goalpost: ...milestones,Release: ...milestones, the Wesley Roadmap Project, and labels. Repo docs now define direction and evidence instead of tracking live backlog/progress state.
- v0.1 public API compatibility:
wesley-corenow keeps deprecatedcompile_runtime_opticandcompile_runtime_optic_registrationaliases for the renamed operation artifact compiler entry points, preserving compatible0.1.xCargo updates while the generic vocabulary remains primary. - Vendored Bats helper resolution: Repo-level Bats tests now resolve
bats-support,bats-assert, andbats-filefrom tracked files undertest/vendor/bats-plugins; CI no longer clones or downloads those helpers at runtime. - Generated JSON schema validation: Added integration coverage that checks representative generated IR, Weslaw, law diff, contract manifest, Holmes scores/evidence, runtime, REALM, and SHIPME JSON artifacts against their declared schemas, and made Rust product CI watch schema and Weslaw fixture changes.
- Workflow policy regression guards: GitHub workflow tests now pin bot comment updater behavior, PR rollback/backout metadata, and frozen pnpm installs with lockfile drift checks across workflow and composite-action setup paths.
- Package manager policy: Legacy preflight now enforces the
packageManagerpnpm pin and single-root-lockfile policy; CI setup reads the pnpm version frompackage.json, and contributor docs describe Corepack, frozen installs, and the selective pre-commit lockfile refresh hook. - Release guard version scheduling:
cargo xtask release-prep-guardandcargo xtask release-guardnow block on concretevX.Y.Zrelease labels for the release being cut, recognize olderv*labels as prior-version blockers, and no longer depend on the retired genericlane:*labels. - Directive example honesty: Current-path example fixtures now use only directive families that the Rust-native SDL hot path actually lowers, while broader RLS/RPC/reference fixtures are explicitly marked experimental or historical.
0.1.0 - 2026-06-24
- Shared LE binary codec plan: Added
wesley-emit-codec, a language-neutral LE-binary codec planning crate. Rust and TypeScript codec emitters now consume the sameCodecDef/CodecOpplan instead of duplicating generator-side codec lowering. - LE binary runtime port contracts: Generated codec modules now expose the
Writer,Reader, andCodecErrorport shapes required by the generated runtime boundary. - LE binary Rust codec emitter:
wesley emit le-binary-rust(andwesley_emit_rust::emit_le_binary_rust) emits Rustencode_*/decode_*functions over a consumer-providedWriter/Reader/CodecErrorruntime, with a wire format identical tole-binary-typescript— enums as au32LE ordinal discriminant,Int/Floatasi32/f32LE, length-prefixed UTF-8 strings, tagged options, length-prefixed lists. Covers enums, input and output objects, and operation variables (the generated*Requeststruct), so a Rust producer and a TypeScript consumer interoperate byte for byte. This lets domain repos (echo, jedit) drop their hand-mirrored Rust codecs. - LE binary output-object codecs: both the TypeScript and Rust LE binary
emitters now emit codecs for output
typeobjects (not justinput), excluding operation root types, so domain-empty data contracts round-trip.
- TypeScript LE binary decode result contract: Generated TypeScript
decode*functions now returnResult<T>instead of returning raw decoded values and throwing through the public API. Internals still use ordinary throwing helpers, with one boundary wrapper converting failures toerr. - Codec emitter drift reduction: Rust and TypeScript LE-binary emitters now render from the shared codec plan, preserving the existing TypeScript golden bytes for the pure refactor slice before the public decode contract changed.
- Emitter syntax-model boundary: Locked TypeScript and Rust code generation behind explicit syntax-model-to-printer pipelines. The LE binary TypeScript codec emitter now constructs a crate-local TypeScript syntax model before rendering, keeping raw source string writes at the printer boundary.
- Wesley core extension boundary: Removed generic runtime dispatch ID
helpers from
wesley-coreand stopped exporting TypeScriptOP_*constants from the generic LE binary emitter. Target-owned extensions must now supply runtime operation identifiers instead of inheriting them from Wesley core. - Runtime optic authority vocabulary: Kept compiler-owned optic artifact,
requirement, and law witness evidence in
wesley-core, but removed host-issued handle, grant, presentation, ticket, basis, aperture, budget, and observer authority structs from the generic core model. - Strict quality gate:
cargo xtask preflightis now the canonical pre-PR and release quality gate. It runscargo fmt --check,cargo clippy --workspace --all-targets -- -D warnings,pnpm audit --prod=false --json, docs checks, workspace tests, and a native CLI smoke test.cargo xtask strict-preflightis an alias, andcargo xtask release-checkstarts with the same gate before release artifact validation. - Method tracker migration: GitHub Issues are now Wesley's live Method work tracker. Former filesystem backlog cards were migrated to GitHub Issues with Method lane/legend labels.
- Release signpost accuracy: Refreshed README, GUIDE, ENTRYPOINTS,
ARCHITECTURE, TECHNICAL_TEARDOWN, release packet signposts, release runbooks,
and xtask help so
0.1.0describes the current LE-binary codec-plan release, names the sharedwesley-emit-codeccrate, distinguishes pre-tag source checkout usage from published crates.io installs, and marks the supersededv0.0.6planning packet as historical context.
- TypeScript trailing-byte rejection: TypeScript LE-binary public decode wrappers now reject trailing bytes after a top-level decode, closing the #603 class for TypeScript and matching the Rust decoder guard.
- Package advisory cleanup: Added an
undicioverride to the patched7.28.0line sopnpm audit --prod=false --jsonclears the latest transitivejsdomadvisories surfaced during preflight. - Package advisory cleanup: Removed the
rolldown-vitealias that pulledesbuild0.25.xinto the workspace and moved retained Vite tooling to the patched Vite 8 line sopnpm audit --prod=false --jsonreports zero known advisories. - Rust Holmes capability ingest review fix: Report-only law capability ingest now rejects forbidden-resource contradictions across the full touched resource footprint, including reads, writes, creates, slot kinds, and closure reads, instead of checking only write/create overlaps.
weslawcapability artifact version drift: The JSON output fromwesley law capabilities --jsonnow emits the PRD-canonicalwesley.law-capabilities/v1API version. At0.1.0, Holmes also accepted the pre-canonicalwesley.capability-report/v1string as a legacy input alias and normalized it internally.- Release guard tracker checks:
cargo xtask release-prep-guardandcargo xtask release-guardnow query live GitHub Issues for open tag/version blockers by owned issue title/body, milestone, or label instead of relying only on the former local tracker. Third-party comments and automatic cross-reference chatter no longer create false release blockers. - Release governance hardening: Release guards now require exact README and changelog release headings, validate real calendar dates, reject shell commands as guide path citations, require guide SHAs to be commit objects, authenticate GitHub Actions workflow-run checks with read permissions, and document suppression blast radius accurately.
- Rust Holmes validation gate review fixes: Law evidence validation now
continues artifact checks when structure validation emits warning-only
diagnostics, rejects duplicate artifact roles after workspace-relative path
normalization, requires schema versions on every present artifact reference,
and validates artifact
sha256digests with artifact-specific diagnostics instead of allowing malformed digest anchors into later traceability gates. - Rust Holmes assurance review fixes: The new Holmes artifact locator now returns stable Holmes diagnostics for invalid and escaping paths, rejects platform-specific backslash and drive-path input before normalization, the schema-version registry now fails closed when a family requirement is absent, semantic-version parsing rejects leading-zero identifiers, in-memory port writes are readable through the same fake store, and the crate metadata/docs no longer point at nonexistent or unpublished documentation.
weslawsemantic diff review fixes: Law diffs now classify existing channel and invariant law modifications as modification events instead of additions, emit registry/tag/schema-hash events so changedlawHashvalues have a machine-readable cause, ignore programmatic draft entries in semantic hash input, and includeschemaHashQualifiedin emit metadata while retaining the legacy bareschemaHashfield. Follow-up PR review fixes now keep--lawmetadata schema hashes sourced from the validated manifest, reject non-object schema types as footprint resources unless they are explicit registry resources, preserve authoredlaws[n]indices in binding diagnostics after Law IR normalization, reject unknownlaw coverageprofiles, and rebind only the authoredschema.hashanchor instead of unrelated hash mentions.weslawLaw IR loader review fixes: The loader now rejects wrong-typed optional sequence fields and invariant predicates with fields from another predicate operation, the published Law IR JSON Schema now discriminates each entrykindagainst its normalizedbody, normalized Law IR now excludes draft entries and sorts active entries by id, scalar semantic relationship rules are enforced during loading, draft scaffolding is filtered before active kind/body validation, scalar ordering is a closed v1 vocabulary, and the scalar semantics docs now match the shipped v1 surface. Footprint closure cardinality now accepts the authoring-schema default ofonewhen omitted and rejects values outside the closedone/optional/manyvocabulary.
- Rust Holmes law assessment and policy substrate: Extended the unpublished
wesley-holmescrate throughHIMP-035with bundle traceability gate decisions, deterministic provenance report data, aggregate assessment outcome rules, bounded finding summaries, domain snapshots, typedholmes.law-assurance-policy/v1parsing and normalization, profile inheritance, law diff event and coverage gate severity mappings, materialized coverage threshold policy, and narrow suppression rules with owner, reason, expiration, allowed-severity, and audit metadata. - Rust Holmes law assessment substrate: Extended the unpublished
wesley-holmescrate throughHIMP-025with normalized law coverage subjects, category percentages, missing-subject display/omission accounting, strict coverage count validation, report-only law capability ingest, contract bundle manifest ingest with evidence-bundle provenance cross-checks, stable semantic change findings derived from Wesley law diff events without reclassifying event kinds, and profile/category law coverage gate decisions with pass/warn/fail/unavailable outcomes. - Rust Holmes law diff ingest: Added the first
LawDiffIngestPortimplementation forwesley.law-diff/v1JSON artifacts, preserving Wesley's event classifications, law ids, subjects, field changes, hash anchors, and footprint resource deltas inside typed Holmes report data. The report now exposes stable normalized event records withlawDiff.changes[n]event refs and copied schema/law hash anchors while rejecting malformed JSON, unsupported diff API versions, unknown event kinds, malformed diff hashes, and duplicate law-id/event identities before assessment. - Rust Holmes law coverage ingest: Added the first
LawCoverageIngestPortimplementation for currentwesley.law-coverage/v1JSON artifacts, preserving profile, required aggregate totals, per-category required posture, covered/total counts, and missing subject coordinates while rejecting malformed JSON and unsupported coverage API versions before assessment. - Rust Holmes law evidence validation gate: Extended the unpublished
wesley-holmescrate with collected law evidence validation results, required-versus-optional bundle artifact validation, canonical provenance hash/source checks, deprecated schema-version warnings, artifact-local version checks for law diff/coverage/capability/manifest evidence, and an application-layer validator that loads artifacts through deterministic ports while reporting unavailable, unreadable, and oversized artifacts without panics. - Rust Holmes assurance foundation: Added the unpublished
crates/wesley-holmesworkspace crate with a hexagonal module shell, domain dependency-boundary tests, deterministic port traits and fakes, a structured diagnostic envelope, typedHolmesLawEvidenceBundlemodel, safe workspace-relative artifact path locator, and artifact-family schema-version registry for the first ten Holmes implementation slices. weslawv1 consumer payoff:wesley emit rust --law <path>now emits law-backed helper validators for integer scalar semantics and discriminated input variant rules,wesley law capabilitiesemits report-only footprint-to-capability summaries without claiming runtime enforcement, andwesley law coveragereports profile/category-aware coverage for custom scalar semantics, variant inputs, mutation footprints, and channel law. The0019packet now closes the 75-sliceweslawv1 runway with playback, retrospective, release-readiness evidence, and an explicit Law Matrix v1.1 deferral.weslawadoption tooling: Added@wes_channeldirective lowering into canonical Law IR, a fixture proving directive-authored channel law and YAML-authored channel law produce the same semanticlawHash, structure-onlywesley law lint,wesley init-lawscaffolding for known formal directives, description-derived draft suggestions that remain inactive until promoted,wesley law explainfor scalar and operation subjects, and explicitwesley law rebindreporting plus--accept --out <path>output for schema-hash anchor updates.weslawstrict schema binding: Added Rust-core validation that requires activeweslaw/v1documents to match the activesha256:<64 lowercase hex>schema hash, binds scalar/type/input/enum/field/operation/channel/family subject coordinates against Shape IR or explicit law registries, validates variant discriminator fields and enum values, validates footprint resource kinds and argument paths, validates typed invariant field and verifier references, rejects wrong subject kinds and contradictory active law, emits stable binding diagnostics, and exposes the strict pass throughwesley law validate --schema <path> --law <path>.weslawcanonical law hashes: Added canonical semantic Law IR serialization,lawHash, provenance-bearinglawDocumentHash, empty-profileprofileHash, contractbundleHash, and a versionedwesley.contract-bundle-manifest/v1JSON Schema.wesley law validatewith--jsonnow emits the bundle manifest,wesley emit rust --law <path>embedsWESLEY_SCHEMA_HASHandWESLAW_HASHconstants in generated Rust, and emit metadata sidecars record law, profile, bundle, and Law IR codec hashes when a law file is supplied.weslawsemantic diff substrate: Added the versionedwesley.law-diff/v1JSON Schema and Rust-core law diff reports for added/removed law entries, scalar semantic field changes, variant case changes, footprint expansion/contraction/mixed-change events, channel version and channel body changes, invariant predicate changes, registry changes, law tag changes, schema-hash rebound events, strengthened/weakened law classifications, and binding-break events. The nativewesley law diff --old <path> --new <path> --jsoncommand emits machine-readable semantic diff reports;--format markdowngenerates PR-ready summaries; CI and Holmes/BLADE-facing fixture outputs now exercise the public diff schema.weslawsemantic Law IR design: Added design packet0019definingweslawas Wesley's semantic law layer for contract bundles, with typed Law IR, strict binding, schema-hash anchoring, canonical law hashes, structured semantic diffs, directive lowering, deferred SDL+ syntax, and explicit separation between law, policy, evidence, and judgment. The packet now tracks a 75-slice implementation runway with a mandatory scope checkpoint atWLAW-050, plus a lockedWLAW-001throughWLAW-010v1 substrate covering Law IR, coordinate and registry grammar, canonicalization, diagnostics, active/draft semantics, and accepted/rejectedweslaw/v1fixtures. The next packet adds Rust Law IR v1 types, aweslaw/v1structure loader, stable duplicate-id/raw-expression/unknown-kind/unknown-field diagnostics, fixture lowering tests, and versioned canonical JSON Schema artifacts forweslaw/v1andwesley.law-ir/v1.- Holmes assurance hexagon design: Added design packet
0018describing a ground-up Rust Holmes redesign with hexagonal architecture, CLI/API/MCP interfaces, dependency-injected ports, and a reporting abstraction where GitHub PR comments are one publisher instead of the system center. - Parity sentinel archive: Added the
0017parity sentinel archive so JS/Rust parity scripts remain migration evidence while Rust self-consistency and fixture truth become the product release gate. - Package deletion blockers: Added explicit blocker evidence for legacy packages whose deletion gates remain open after the Vue generator removal.
- Legacy compatibility package matrix: Added a Node-retirement compatibility matrix that names every remaining legacy package, its retirement lane, and the gate for deleting, extracting, or rebuilding it.
- Legacy package retirement metadata: Added machine-readable
wesley.retirementmetadata and private-package warnings for every package that remains in the Node retirement ledger. - Legacy command deprecation warnings: The historical Node CLI now warns
when
diff,doctor,generate,typescript, ortshave native Rust replacements. - Capability ABI compatibility diagnostics: Added Rust-core capability
contract version requirements, host compatibility reports, typed
WASM_ABI_UNSUPPORTEDdiagnostics, stateless runtime resource policy, and hermetic cross-host capability fixture verification for the next Node retirement slice. - Host compatibility boundary: Added a Node-retirement design note classifying browser, Bun, Deno, and Node host packages as legacy compatibility surfaces rather than Rust product checks.
- Rust module capability registry proof: Added Rust-core target registry and WASM host-import policy fixtures covering no-module, default target, explicit target, duplicate target, execution-mode metadata, portability floor, requested/granted/denied capability reports, and deny-by-default pre-execution rejection for unavailable WASM host imports.
- Rust-native doctor command: Added
wesley doctorwith text and JSON output for narrow Rust-native health checks covering the native CLI, Rust lowerer, normalized SDL hash evidence, and Rust emitter crates without inspecting legacy Node config, plugins, or package state. - Native emit metadata:
wesley emit rustandwesley emit typescriptnow accept--metadata-out <path>to write deterministic JSON sidecars with the schema hash, generator identity, generator version, andrust-nativeexecution mode. - Emitter retirement fixtures: Added generic TypeScript operation-binding golden fixtures and a domain-empty Rust emitter fixture so retained emitters prove request/response bindings without leaking PostgreSQL, Echo, or jedit semantics.
- Rust SDL normalizer: Added
wesley normalize-sdl --schema <path>and a Rust-corenormalize_schema_sdlAPI that prints a deterministic, extension-folded SDL view from compiler facts, with golden fixtures for sorted types, fields, arguments, unions, defaults, and nested list references. - Normalized SDL hash evidence:
wesley normalize-sdl --schema <path> --hashnow emits a SHA-256 evidence hash for the normalized SDL view, and parser parity reports include normalized SDL hash evidence for accepted Rust fixtures. - Legacy Node retirement campaign: Added design packet
0017, a Node retirement ledger, and a 96-sliceBEARINGchecklist that tracks the Rust-native front-door work required to remove Node as compiler, runtime, release, and documentation authority. - Node retirement guard: Added a machine-readable Node retirement ledger and
cargo xtask docs-checkvalidation that requires package dispositions, guards primary docs against product-front-doorpnpm wesleydrift, and blocks new legacy JS core authority without an explicit allowance. - Rust core binding observatory: Added
pnpm perf:bindingsandpnpm perf:ir -- --observatoryto emitrust-core-binding-observatory.v0reports that separate Rust CLI, legacy JS in-process, future Node-to-Rust binding, future WASM binding, memory posture, and cutover criteria over the explicit IR fixture corpus. - Rust binding strategy packet: Added design packet
0016for the evidence-first Node/Rust/WASM cutover runway, including the binding and memory baseline evidence note and the Node Rust core binding strategy decision matrix. - End-to-end Wesley narrative: Added
docs/END_TO_END.md, a first-principles walkthrough of Wesley's authored SDL, Rust compiler facts, generic emitters, module boundary, assurance tooling, external ownership rules, and design rationale with flowchart, sequence, class, entity, state-machine, and mindmap diagrams. - Parser parity spike: Added
pnpm parity:parser, which compares legacyGraphQLAdapter.parseSDLacceptance with Rustwesley schema loweracceptance over explicit parser-sensitive fixtures, including valid SDL, syntax-invalid SDL, nested list SDL, and shared rejection of duplicate canonical directive aliases.
- Node host-contract shadow: Deleted the last
HOST=nodehost-contract entrypoint and made retained host-contract runs explicitly choosebrowser,deno, orbun. - Final legacy Node compiler surface: Deleted
packages/wesley-core,packages/wesley-cli,packages/wesley-host-node, andpackages/wesley-runtime-node; removed their package workflows, CLI Bats suites, rootpnpm wesleybridge, lockfile importers, progress rows, and stale dependency-cruiser/preflight shadows. - Legacy parity and performance scripts: Removed JS/Rust parity and JavaScript performance observatory scripts after the Rust-native compiler spine became the release gate.
- Legacy Node CI workflows: Removed package-only CLI/core/host-node, fuzzing, quick CLI, and legacy parity/performance workflow coverage that depended on the retired Node compiler stack.
- Legacy JavaScript generator package: Deleted
packages/wesley-generator-js, removed its package workflow, lockfile importer, progress row, host shims, andmodelscommand. Retained generic TypeScript output belongs in Rust emitters; Zod remains only as CLI-local compatibility debt. - Leaf legacy packages: Deleted
packages/wesley-scaffold-multitenant,packages/wesley-test-fixtures, andpackages/wesley-tasks; removed the package-onlypkg-tasksworkflow, lockfile importers, progress rows, and the dead optional task-planner load from the Node host. - Vue generator package: Deleted
packages/wesley-generator-vueafter the retirement ledger classified Vue projection output as target-owned behavior with no generic Wesley owner. - Nested-list type-family parity fixture: Added
nested-list-schema.graphqlto the defaultpnpm parity:ircorpus underjs-sdl-type-family-vs-rust-l1-type-family.v0, and taught the projection to compare nested list wrappers and leaf nullability. - Legacy JS performance comparison option:
pnpm perf:irnow supports--include-legacy-jsto capture in-process legacy JS lowerer wall-clock samples beside Rust CLI lowering evidence without claiming Node binding, WASM, peak RSS, or cutover-threshold proof. - Hermetic module target zoo evidence: Added module-loading tests proving multi-module compile target alias resolution and generated target schema-hash agreement without importing product or database semantics into Wesley core.
- Rust IR performance baseline: Added
pnpm perf:ir, which measures Rust CLIschema lowerwall-clock samples over the explicit valid Rust IR fixture corpus, includinglarge-schema.graphql, and emits JSON or Markdown evidence without implying memory, binding-overhead, or cutover-threshold claims. - Type-family parity projection design: Named
js-sdl-type-family-vs-rust-l1-type-family.v0as the next fair parity projection for schema-extension and non-table GraphQL facts before admitting those fixtures to the default sentinel corpus. - Type-family parity sentinel:
pnpm parity:irnow implementsjs-sdl-type-family-vs-rust-l1-type-family.v0, lets fixtures declare their owning projection, and admitsschema-extensions-schema.graphqlto the default corpus only under that projection. - Rust IR fixture contract note: Moved the core-rs IR contract and fixture
backlog card into the active
0013design packet, naming the v0.0.6 fixture classes, canonical byte rules, diagnostics contract, and repo evidence. - Domain-empty core boundary packet: Pulled the boundary card into design
packet
0014, defining what generic Wesley owns, what external modules or sibling repos own, and the first docs/dispatch audit that keeps product and database semantics outside the base compiler surface. - Resilience policy boundary packet: Pulled the
ninelives/Alfred decision into design packet0015, defining Rust compiler resilience seams, JavaScript child-process bounds, and the non-ownership line that keeps product, database, scheduler, and runtime semantics outside Wesley core. - Rust core resilience policy wrapper: Added
ResiliencePolicyandResilientLoweringPortso Rust lowering callers can opt into explicit, cooperativeninelivestimeout policy at async execution boundaries while preserving ordinary deterministic compiler errors. The wrapper does not claim hard preemption of synchronous CPU-bound parser work. - Rust IR parity sentinel packet: Pulled the parity sentinel backlog item
into design packet
0013, defining comparator inputs, normalization, hash behavior, and failure output for the next JS/Rust parity check. - JS/Rust table parity sentinel: Added
pnpm parity:irand thejs-table-vs-rust-table.v0projection so Wesley can compare legacy JS table IR with Rust L1 over an explicit table-compatible corpus before broadening parity coverage. - Expanded Rust L1 fixture corpus: Added directive-heavy, schema-extension, legacy-alias, and invalid duplicate-directive fixtures for the v0.0.6 compiler-truth lane.
- Post-retirement host lane language: Live host docs, CI doctrine, and the
retirement ledger now call browser/Bun/Deno checks
External Host Experimentlanes instead ofLegacy Compatibilitylanes. - Post-retirement backlog notes: Host portability backlog cards now mark pre-retirement Node-host acceptance text as obsolete instead of treating it as live execution guidance.
- Holmes support ownership: Holmes now carries its retained ledger, artifact-path, evidence-quality, and module-capability helpers locally rather than importing deleted JavaScript core/runtime packages.
- Host experiment ownership: Browser, Bun, and Deno host experiments now run self-contained smoke lowerers instead of importing the deleted JavaScript core.
- Node retirement closeout docs: BEARING, END_TO_END, ENTRYPOINTS,
ARCHITECTURE, DIRECTIVES, GUIDE, legacy migration, and design packet
0017now describe the 96/96-slice closeout and the post-retirement Rust-native direction. - Legacy CLI quick workflow: Reclassified the CLI quick-check workflow as a legacy compatibility check and removed its extra direct host-node smoke; the package tests remain the compatibility proof.
- Product health check:
cargo xtask preflightis now the ordinary product health gate, whilecargo xtask legacy-preflightexplicitly runs the historical Node package preflight only for legacy package or pnpm workspace changes. - Native docs command truth: Documentation command drift checks now read
the Rust-native
wesley --helpsurface instead of treating the Node host CLI as front-door truth. - Rust-native documentation spine: README, GUIDE, ENTRYPOINTS,
ARCHITECTURE, END_TO_END, quick-start docs, package docs, and the release
runbook now present native schema lower/hash/diff and Rust emitter commands
as the normal path, with
pnpm wesleydocumented as a migration bridge. - Package progress posture: README package status now labels legacy npm packages as compatibility surfaces instead of product-front-door artifacts.
- CI lane names: Renamed Rust-native checks as
Rust Product, repository checks asRepository Hygiene, and browser/Bun/Deno/Node host checks asLegacy Compatibility, and replaced the generic CI product schema smoke with the native Rust CLI. - Host package posture: Marked
@wesley/host-node,@wesley/host-browser,@wesley/host-bun, and@wesley/host-denodocs as legacy compatibility surfaces pending deletion or externalization. - Assurance command boundary: Classified certificate, SHIPME, Holmes/Moriarty, run-ledger, validate-bundle, and package-level evidence commands as assurance or compatibility surfaces rather than native compiler front-door commands.
- Legacy command retirement decisions: Classified legacy
zod,models, andinitas externalized or retired core behavior, and narrowed legacygeneratereplacement to explicit nativeemitcommands plus external target modules. - v0.0.6 bearing reset: Reframed
docs/BEARING.mdaround Rust IR parity, module-boundary enforcement, and explicitwesley-postgrespreservation after the v0.0.5 clean-house release. - v0.0.5 release evidence: Replaced pending publication wording with the actual GitHub Release, signed tag, workflow, and crates.io visibility evidence.
weslawsubstrate self-audit: Removed the inline footprint directive shadow from the sharedweslawfixture schema, added guard coverage for the fixture corpus, defined the missing footprint create-slot and update Law IR shapes, and normalized scalar/explain-command spelling in the design packet.- Retired package reappearance guard:
cargo xtask docs-checknow fails if a package listed underretiredPackagesquietly returns with apackage.json. - SHIPME fixture workflow trigger:
cert-shipme.ymlnow runs whenscripts/prepare-shipme-cert-fixture.mjschanges, so certificate fixture regressions cannot bypass the SHIPME CI signal through path filtering. - Node retirement doc guard errors: missing or unreadable
frontDoorDocsentries now failcargo xtask docs-checkas Node retirement ledger check failures instead of CLI usage errors. - Node retirement validation map:
docs/END_TO_END.mdnow routes the Node retirement ledger guard through Rust preflight, matching the actualcargo xtask docs-checkownership. - Normalized SDL enum literals:
normalize_schema_sdlnow renders schema enum defaults and directive enum arguments as GraphQL enum literals while preserving string literals that happen to share enum-like names. - Rust IR performance process bounds:
pnpm perf:irnow wraps Rust lowerer and Git metadata probes in@git-stunts/alfredtimeouts with explicit output buffers so hung or oversized child processes produce controlled evidence instead of blocking CI. - IR parity process bounds:
pnpm parity:irnow uses the shared@git-stunts/alfredchild-process runner for Rust lowerer, Rust hash, and Git metadata probes, giving the parity sentinel timeout and output-buffer controls that are covered by deterministicTestClocktests. - Rust IR performance baseline median: Even-sized duration sample sets now report median as the rounded midpoint of the two central values instead of the upper middle sample.
- Formatter gate ownership:
pnpm run format:checknow uses the workspace-pinned Prettier binary against the repo-owned formatter surface, while leaving Wesley SDL compiler inputs and Rust IR golden bytes under parser/generator control. - Rust invalid-SDL diagnostics:
WesleyErrornow exposes a stable diagnostic object with machine-readable codes, severity, and parser line/column spans where Apollo provides a byte index; semantic lowering errors keep stable codes while source spans remain intentionally absent. - Module target alias collision order:
wesley compilenow rejects a module target name that conflicts with an alias registered by an earlier loaded module, closing an order-dependent gap in module-owned target dispatch. - Parity sentinel evidence contract:
pnpm parity:ir --jsonnow records canonical projected legacy and Rust bytes, and Rust L1 hash checks remove top-level metadata before comparing againstwesley schema hashor tracked*.l1.hashoutputs. - Parity projection ordering: The
js-table-vs-rust-table.v0projection now sorts table names with deterministic code-point ordering instead of locale-aware collation. - Parity custom fixture sidecars:
pnpm parity:ir --fixturenow skips tracked*.l1.hashchecks for non-.graphqlcustom SDL paths instead of reading the schema file as its own hash sidecar. - Multi-projection parity output:
pnpm parity:irfailure output now names the projection for each failing fixture and summarizes multi-projection runs without implying a single global comparison shape. - Type-family repeated directives: The JS side of
js-sdl-type-family-vs-rust-l1-type-family.v0now preserves repeated directive values as ordered arrays instead of overwriting earlier occurrences or re-sorting same-name directive instances. - Rust directive alias normalization: Rust L1 lowering now canonicalizes
the current core Wesley directive aliases to
wes_*names and rejects duplicate canonical directives instead of allowing last-write-wins drift, while repeated custom directives are preserved as ordered values.
0.0.5 - 2026-05-21
- Object extension folding validation: JS GraphQL lowering now rejects
duplicate fields and repeated Wesley directives when
extend typeblocks are folded into base object definitions. - L1 fixture regeneration:
pnpm fixtures:irnow regenerates the tracked Rust L1*.l1.jsonand*.l1.hashcorpus through the native Wesley CLI and exits nonzero when any fixture fails. - Parity sentinel backlog truth: Clarified that Rust L1 fixture regeneration is not the same as the future JS/Rust parity comparator.
- Progress surface cleanup: Removed
@wesley/scaffold-multitenantfrom the active README/progress metadata and architecture-boundary required package checks, and replaced the generated overall status hard break with a Markdown table. - Release dependency audit: Added pnpm overrides for patched
fast-uri,brace-expansion, andwstransitive versions sopnpm audit --prod=falsereports no known vulnerabilities during release prep.
0.0.4 - 2026-05-15
- Runtime optic requirements artifact:
compile_runtime_optic()now emits a Wesley-ownedOpticAdmissionRequirementsArtifactcontaining canonical requirements bytes, an explicitwesley.requirements.canonical-json.v0codec, and a digest computed from those exact bytes. Downstream runtimes can import the bytes, digest, and codec directly without reserializingOpticAdmissionRequirementsto create admission truth.
0.0.3 - 2026-05-14
- Stack Witness 0001 fixture artifact shape: Added a hermetic
jedit-through-Echo file-history fixture with operation ids, temporary fixture
vars bytes, declared footprints, EINT and QueryView helper shapes, fixture
vectors, and Rust/TypeScript operation binding coverage. The semicolon-kv
bytes are explicitly marked as fixture-only, while
targetCodec: wesley-binary/v0records the future Wesley-generated binary codec target without implementing it. - Runtime optic root argument validation:
compile_runtime_optic()now validates selected root field arguments against the schema, preserves canonical root argument bindings inOpticOperation, and includes those bindings in stable operation identity. - Runtime optic selected field arguments:
compile_runtime_optic()now validates selected payload field arguments against the schema, preserves canonical field argument bindings inOpticOperation, and includes those bindings in stable operation and artifact identity. - Runtime optic footprint bounds:
compile_runtime_optic()now requiresreadsandwritesarrays whenever@wes_footprintis present, while omittedforbidsstill defaults to an empty forbidden-resource list. - Runtime optic root footprint admission:
@wes_footprintis now legal only on the selected root field for runtime optic artifacts, keeping nested directives from changing admission-facing requirements. - Runtime optic input literal validation:
compile_runtime_optic()now recursively validates input object literals, required nested input fields, and enum values before emittingshape.valid.v1. - Runtime optic fragment compatibility: Runtime optic lowering now rejects impossible fragment spreads and inline fragments by comparing parent and type condition possible runtime types.
- Runtime optic nested list validation: Runtime optic argument literal validation now preserves nested list wrappers while descending list values, so flattened literals cannot satisfy nested list types.
- Runtime optic nested list variable compatibility: Runtime optic variable validation now rejects nullable nested-list leaf types when the schema argument requires non-null leaves.
- Runtime optic subselection validation: Runtime optic lowering now rejects
composite fields without subselections and leaf fields with subselections
before emitting
shape.valid.v1. - Runtime optic response-name validation: Runtime optic lowering now rejects conflicting same-response-name selections before payload codec extraction can collapse incompatible fields.
- Optic registry resolver errors: Removed the unreachable
ArtifactIdMismatchresolver error from the v0 in-memory registry, where descriptor artifact ids are lookup keys and unknown ids correctly resolve asArtifactNotFound. - Runtime optic footprint label validation: Runtime optic lowering now
rejects duplicate labels within each
@wes_footprintreads,writes, andforbidsarray. - Runtime optic directive argument validation: Runtime optic lowering now rejects duplicate executable directive arguments instead of preserving last-write-wins metadata for law and footprint directives.
- Runtime optic executable subset guards: Runtime optic lowering now rejects
variable defaults,
__typenameselections, and interface inheritance as explicit v0 unsupported features instead of accepting them undershape.valid.v1. - Authority and witness wire snapshots: Runtime optic tests now snapshot
CapabilityGrant,CapabilityPresentation,AdmissionTicket,LawWitness, observer classes, permission actions, evidence kinds, and law verdict enum spellings. - Runtime optic invalid-operation assertions: Runtime optic regression tests now assert structured operation lowering errors instead of matching error message substrings.
- Runtime optic directive preservation: Runtime optic artifacts now preserve directive records from the executable operation, nested selections, fragment spreads, fragment definitions, and inline fragments instead of only the root field.
- Runtime optic payload aliases: Payload codec shapes now use GraphQL response names, so aliases and repeated schema fields with distinct aliases are reflected in payload paths and artifact hashes.
- Runtime optic payload requiredness: Payload codec fields now respect nullable ancestors, preventing non-null children under nullable parents from being emitted as required response paths.
- Runtime optic executable directive variables: Runtime optic directive
records now preserve variable-backed executable directive arguments, such as
@include(if: $flag), as canonical variable-reference JSON. - Optic artifact registry normalization: The in-memory optic artifact registry now derives stored registration descriptors from artifact identity fields instead of trusting stale embedded descriptor data.
- Optic registration descriptor integrity coverage: The in-memory registry tests now assert operation id tampering is rejected alongside artifact hash, schema id, requirements digest, and missing artifact checks.
0.0.2 - 2026-05-09
- Crates.io release clean-worktree recovery: The release workflow now keeps
GitHub Release scratch files in the runner temp directory so draft release
preparation no longer dirties the checkout before
cargo xtask publish-cratesenforces the real-publish clean-worktree guard.
0.0.1 - 2026-05-09
-
Crates.io alpha publishing metadata: Prepared the Rust-native crates for a first
0.0.1alpha publication:wesley-core,wesley-emit-rust,wesley-emit-typescript, andwesley-cli. The installable package iswesley-cli, which provides thewesleybinary, because the barewesleycrate name is already occupied on crates.io. -
Resilient crates.io alpha publish automation: Added
cargo xtask publish-alpha, which plans the alpha publish by default and can publish with--executein dependency order while usingninelivesretry policy to wait for crates.io index propagation between dependent crates. -
Official GitHub Actions Rust release procedure: Documented Wesley's tag-driven crates.io release policy and added release guards for version-tag alignment, tag-on-main validation, required crate package files, changelog coverage, version-linked backlog, dry-runs, and GitHub Actions-only publication.
-
Release package sanity and resumable publish flow: Added strict official publish dry-run reporting, package file-set verification for every published crate, and idempotent publish execution that skips crate versions already visible in the crates.io index.
-
Release workflow publication ordering: The crates.io release workflow now creates or reuses a draft GitHub Release before the first registry mutation, finalizes it only after crates.io visibility is verified, and treats open issues tied to the release by text, milestone, or label as blockers.
-
Release guard split and SemVer validation: Added a pre-tag release prep guard for manifest, changelog, backlog, and package checks, retained the tag-specific release guard for GitHub Actions, and replaced the permissive hand-rolled version check with Rust SemVer parsing.
-
Native Rust schema and operation commands: Added Rust-backed
wesley schema lower,wesley schema hash,wesley operation selections, andwesley operation directive-argscommands. The native CLI now exposes thewesley-coreL1 lowering, registry-hash, operation-selection, and directive-argument primitives without going through the legacy Node entry point. -
Rust-native docs check: Added
cargo xtask docs-checkfor markdown link validation, docs-truth manifest validation, and forbidden machine-local path detection.cargo xtask preflightnow runs those checks before Rust tests and native CLI help. -
Legacy Node migration map: Added a command and package disposition map for retiring the historical Node CLI, generators, hosts, runtime packages, and evidence tooling on the path to a pure Rust Wesley.
-
Native schema diff: Added Rust
SchemaDeltaextraction over L1 IR and exposed it aswesley schema diff --old <path> --new <path>with text, JSON, summary, breaking-only, and breaking-change exit-code modes. -
Git-aware schema diff: Added
wesley schema diff --schema <path> --against <rev>and--base <rev>so local edits can be compared against a schema's previous Git state without manually materializing an old file. -
Native schema operation catalog: Added
SchemaOperationextraction from schema rootQuery,Mutation, andSubscriptionfields, preserving root arguments, result types, and generic directive JSON. Exposed it aswesley schema operations --schema <path> --jsonand covered it with a full jedit hot text runtime fixture. -
Native operation binding emission: Added Rust and TypeScript operation binding projection from
SchemaOperationdata.wesley emit rustnow emits request structs, response aliases, and preserved directive metadata constants for root operations;wesley emit typescriptnow emits request interfaces, response aliases, operation metadata constants, and operation type aliases. -
Native TypeScript emitter: Added
crates/wesley-emit-typescript, a structured TypeScript declaration AST/printer projection from Wesley L1 IR, and exposed it aswesley emit typescript --schema <path> --out <path>. -
Native Rust emitter: Added
crates/wesley-emit-rust, a structured Rust item/type AST printer from Wesley L1 IR, pluswesley emit rust --schema <path> --out <path>and a jedit-shaped hot text model fixture. -
Holmes counterfactual provider capability seam: Added
holmes.counterfactualProvidersto Wesley module capabilities, moved shared Node module-entry loading into@wesley/runtime-node, and taught@wesley/holmesto dispatch counterfactual analysis through loaded module providers. Generic Holmes now emits a typed unsupported report when no provider module is loaded. -
pgTAP smoke tests for emitted ops (#416): Three pgTAP test files replacing the skeleton
ops.pgtap.sql—ops-parameterless-view(view + zero-arg function),ops-parameterized-fn(ILIKE filter with text param), andops-nested-lateral(LATERAL join with nested jsonb arrays). CI seed data expanded with deterministic UUIDs (user, order, order items). CI workflow updated to apply*.view.sqlalongside*.fn.sqland run all*.pgtap.sqlfiles. EXPLAIN snapshots now cover all 4 ops. TAP output is now parsed for assertion failures so CI exits non-zero on test regressions. Negative-case and shape assertions added per CodeRabbit review feedback. CI seed step now readstest/fixtures/postgres/03-seed.sqldirectly instead of inlining a copy. -
graphqldependency for@wesley/cli: Addedgraphqlas a direct dependency of@wesley/cliso that.graphqlops compilation works under pnpm's strict module resolution. Previously the dynamicimport('graphql')ingenerate.mjsrelied on transitive resolution through@wesley/core, which pnpm disallows. -
QIR Dialect Abstraction (
@wesley/core): IntroducedSqlDialectabstract interface andPostgresDialectimplementation that extracts all PostgreSQL-specific rendering (jsonb functions,@>containment,ILIKE,= ANY(),CREATE VIEW/CREATE FUNCTIONDDL) fromlowerToSQL.mjsandemit.mjsinto a pluggable dialect layer. Both modules now accept an optionalopts.dialectparameter (defaulting toPostgresDialect) — existing behaviour is identical. This creates the seam for future MySQL/SQLite/CockroachDB backends without touching the dialect-neutral QIR core. -
QirPlugin (
@wesley/core):GeneratorPluginwrapper for the QIR ops pipeline. Wraps translate → lower → emit as a first-class transmutation participant with per-op evidence tracking. PassesvalidatePlugincontract and supports configurable dialect, schema, security, and search_path options. -
CLI
.graphqlops support:wesley generate --opsnow discovers and compiles.graphqloperation files alongside.op.jsonfiles. GraphQL operations are translated viaTranslateEnv+translateOperationinto QIR plans and emitted as SQL views/functions. New--ops-targetflag selectspostgres(default) orsupabasefor auth variable compilation. -
Example
.graphqlops:example/ops/orders_by_user.graphql(parameterized with nested items) andexample/ops/all_products.graphql(parameterless). -
QIR Translator (
@wesley/core): GraphQL operation documents → QIR query plans.translateOperation(gql, env, options)parses a GraphQL operation string and compiles it into aQueryPlanusing the Wesley IR for schema introspection. Supports scalar projection, belongsTo (many:1) via LEFT JOIN withJsonBuildObject, hasMany (1:N) via LATERAL +JsonAgg, WHERE filters (eq/ne/lt/lte/gt/gte/ilike/isNull/isNotNull, AND/OR/NOT, EXISTS via some/none), ORDER BY, LIMIT/OFFSET, and auth variable compilation per target platform (Supabaseauth.uid()vs vanilla PostgreSQLcurrent_setting). -
TranslateEnv(@wesley/core): Schema introspection layer that wraps the Wesley IR and provides query-time lookups —resolveTable,resolveColumn(with GQL→PG type mapping),resolveRelation(belongsTo/hasMany detection via FK directives and naming heuristics),pkField,rlsEnabled,tenantField, and deterministic alias generation. -
Master Roadmap (
ROADMAP.md): Consolidated strategic roadmap that now acts as the single in-repo roadmap of record, with active backlog and execution tracking moved to GitHub Issues and Milestones. Maps the V2 phase model to workstreams, defines Alpha blockers, critical path (5 phases), and Go Public gate checklist. Includes progress snapshot frommeta/progress.json, deferred/speculative items with provenance tags, completed milestone archive, and artifact map for planning documents.
- Rust core operation analysis boundary: Replaced generic Wesley footprint checking APIs with operation selection resolution and directive argument extraction primitives. Echo-specific footprint honesty now belongs to Echo-owned tooling rather than the Wesley core API.
- Native
check-footprintcommand: Removed the rootwesley check-footprintCLI surface and its JSON contract from the Wesley binary.
- Git identity release guard: Added collaborator-neutral preflight and Rust
release guard checks that reject known fixture identities in repo-local Git
config and the release
HEADauthor/committer metadata before publish prep can proceed. - Nested GraphQL list lowering and emission: L1 type references now retain nested list wrapper depth, and the Rust and TypeScript emitters project nested GraphQL lists as nested vectors/arrays instead of flattening to one level.
- Schema diff field arguments: Schema delta now compares object and interface field arguments, including additions, removals, type changes, default changes, and directive changes, so required argument additions are reported as breaking.
- Operation binding symbol collisions: Rust and TypeScript operation
emitters now include the root operation scope in generated request, response,
metadata, and operation binding symbols so schemas can reuse field names
across
Query,Mutation, andSubscriptionwithout duplicate generated declarations. - PR readiness checks: Fixed PR feedback failures by removing an unused fixture-generation import, replacing the CI-breaking docs link to a sibling checkout with repo-local wording, making the legacy CLI package test glob compatible with Node 20 runners, and preparing a passing SHIPME certificate fixture before the certificate workflow verifies it.
- Docs link preflight and Rust package dry-runs: The legacy Node docs link
checker now ignores Rust
target/build artifacts, matching the Rust-native docs check and preventingcargo publish --dry-runpackage trees from breaking later preflight runs. - Release documentation polish: Crate README links now resolve from packaged crates, the release install example uses a version placeholder, and committed trailing whitespace from the release branch diff was removed.
- Module runtime review hardening: Isolated CLI command registration per
invocation, rejected duplicate module command and compile-target names,
preserved
file://module specifiers in env parsing, failed loudly for missing explicitWESLEY_CONFIGpaths, ignored disabled modules during module allowlist checks, froze normalized capability registry data, and made the front-door CLI docs guard hermetic. - Release dependency audit posture: Added targeted pnpm overrides for
vulnerable
brace-expansion,picomatch, andpostcsslockfile paths, and updated the root PostCSS range sopnpm audit --jsonreports zero vulnerabilities for the current workspace dependency graph. - Front-door CLI documentation drift: Replaced the non-existent
pnpm wesley holmes dashboardguide example with the real HOLMES package report command plus the static dashboard artifact path, and added a preflight guard that verifiesREADME.mdanddocs/GUIDE.mdonly document registeredpnpm wesley <command>examples. - Module-loading trust controls: Added
WESLEY_DISABLE_MODULES=1for no-module diagnostic runs andWESLEY_MODULE_ALLOWLISTfor CI/client environments that must reject unapprovedwesley.config.mjsand module imports before trusted Node extension code executes. - CodeRabbit PR review scope: Added repo-owned CodeRabbit auto-review configuration so non-draft pull requests targeting any base branch are reviewed, not only PRs targeting the repository default branch.
- Stale pre-commit realization guard: Removed the package-manifest commit
hook call and GitHub preflight workflow call to the deleted root
verify:realizationscript. Generic Wesley no longer resurrects the old Continuum verifier during commits or PR checks; product-specific realization checks belong behind module capabilities. - Moriarty counterfactual module discovery: Programmatic Moriarty prediction
calls now forward their injected environment into counterfactual provider
discovery, so
WESLEY_MODULESandWESLEY_CONFIGwork outside the CLI process environment too. - PR #472 Continuum review follow-up:
witness-continuumnow rejects missing canonical Echo schema origins, verifies the Echo IR SDL hash, and reports malformed JSONL rows with line context.bundle-echonow reports malformedir.jsoncontent clearly and only falls back to the workspace generator when@wesley/generator-echois actually missing. The Continuum signposts, backlog packets, and retro verification docs were also tightened to fix canonical-path drift, define the public-surface matrix shape, and clean up wording inconsistencies raised during PR review. - SHIPME PR comment ordering: The PR badge in
.github/workflows/cert-shipme.ymlnow waits for the HOLMES suite comment for the current PR head SHA, checks the live HOLMES workflow state while polling, and fails explicitly if that comment never appears, so reviewers no longer see a SHIPME certificate badge race ahead of the current investigation summary or disappear silently behind a stale timeout. - PR #467 HOLMES comment workflow follow-up: The PR comment job now checks
out the repository before building the comment, the
pr-comment-clihelper no longer depends oncommanderso it can run in the lightweight workflow job without installing package dependencies, and the comment summary cleanup now uses linear whitespace and trailing-period normalization that is pinned by direct Holmes comment tests. Successful HOLMES jobs also distinguish missing and invalid JSON report artifacts in the plain-English summary instead of blaming asuccessworkflow status for unreadable reports. The expanded raw report sections now tell the same truth about missing markdown artifacts, and unavailable Watson or Moriarty reports now add explicit recovery steps to the suggested next actions list instead of failing silently. - PR #467 Holmes comment test hardening: The Holmes PR comment regression tests now use case-insensitive word-boundary matching to keep unexplained score acronyms out of the visible summary, and the missing-report tempdir fixture test now has an explicit timeout so the suite fails fast instead of hanging on a stuck report loader.
- PR #467 Holmes comment ownership guard: The HOLMES PR comment workflow
now updates only the marker-tagged
github-actions[bot]comment, and it warns instead of overwriting legacy bot comments that merely contain the Holmes title text. This prevents the PR comment updater from clobbering unrelated bot comments such as CodeRabbit replies. - PR #467 Holmes next-action and status follow-up: The Holmes PR comment builder now preserves at least one suggested action from Holmes, Watson, and Moriarty before truncating the visible list, so non-Holmes recovery steps do not disappear behind a Holmes-heavy action queue. Omitted workflow-status flags also no longer masquerade as unknown workflow failures when readable Holmes-suite artifacts are already present, and the regression is pinned by direct comment-builder tests.
- PR #467 Holmes workflow and CLI hardening follow-up: The SHIPME workflow
now fails explicitly if no matching
wesley-holmes.ymlrun appears after a bounded poll window and no longer double-filters runs by SHA after the API already scoped them. The Holmes PR comment CLI now imports without side effects, accepts both--flag valueand--flag=valueforms, and the shared test fixtures plus loader diagnostics now keep comment-builder tests reusable and easier to debug when report artifacts are malformed or unreadable. - PR #463 cert failure JSON assertions: The HOLMES failure-path cert E2E
tests now assert against the first JSON document emitted by
cert-verify --json, splitting presence and value checks forholmesPassed,holmesVerdict,eligibleToShip, andreasons, so missing fields and wrong values fail independently while staying robust when the command also emits the framework error envelope. - PR #463 HOLMES fixture and scoring follow-up: The cert E2E HOLMES
fixtures now share one parameterized builder, preserve the weak-evidence and
strong-evidence profiles used by SHIPME coverage, include representative
testResultspayloads, and the scoring tests now pin both sides of index coverage semantics with clearer scenario names and an explicit “indexed but uncovered” regression. - HOLMES workflow schema selection and SHIPME cert fixture: The HOLMES CI
workflow now honors
HOLMES_SCHEMAbefore falling back to repository-wide GraphQL discovery, TCI now treats “no indexed fields” as a fully covered performance obligation instead of an automatic miss, and the SHIPME workflow now exercises a clean schema fixture that can honestly clear HOLMES before certificate verification. - HOLMES-backed SHIPME certification: The certificate workflow now emits a
real Wesley bundle before running HOLMES,
cert-createbuilds HOLMES summaries from bundle-embedded scores instead of requiring a separatescores.json,cert-verifyreports normalized HOLMES verdicts, and the HOLMES workflow jobs now declare the generated bundle/schema dependency explicitly. - SHIPME PR comment matching: Hardened the certificate workflow to anchor
bot comments with a stable HTML marker, paginate comment lookup, and target
github-actions[bot]explicitly before updating an existing PR comment. @wesley/corenpm lockfile drift: Regeneratedpackages/wesley-core/package-lock.jsonso the npm lockfile now matches the@supabase/pg-parser^0.1.7dependency declared inpackage.json.- Website TipTap content sync: Removed the unsupported
preserveCursoroption from theRichEditorsetContent()call and added a regression test so future TipTap bumps do not silently reintroduce the unsupported API usage.
- Built-in Holmes
git-warpprovider: Removed direct@git-stunts/*dependencies andgit-warpprovider defaults from@wesley/holmes; product counterfactual providers now belong in external modules. - QIR duck-typing fallbacks (SR-m2): Removed 3 duck-typing fallbacks from
renderExprand 1 fromrenderRelationinlowerToSQL.mjs. Objects without explicitkindtags now throwUnsupported expr kind/Unsupported relation kindinstead of being silently accepted via structural duck-typing. All current callers already use properNodes.mjsconstructors — no behavioral change for well-formed input.
-
guessPrimaryKeyRef: Usesnew ColumnRef(alias, 'id')constructor instead of a raw object literal, consistent with the rest of the QIR codebase. -
unwrapType: extracted from three inline copies ingenerator-echo(index.mjs,emitWasmAbiCodec.mjs,emitWasmAbiCodecTs.mjs) into sharedsrc/graphql-utils.mjswith 7 dedicated tests
emitWasmAbiCodec: Generateswasm_abi_codec.generated.rswith deterministic binary encode/decode for all Echo WASM FFI response types (DispatchResponse,HeadInfo,StepResponse,ChannelData,DrainResponse,RegistryInfo,AbiError), plus binary envelope helpers (encode_ok,encode_err,decode_envelope) — replaces CBOR encoding at the WASM boundaryemitWasmAbiCodecTs: Generates matchingwasm_abi_codec.generated.tswith TypeScript encode/decode functions (byte-identical wire format to Rust),AbiResult<T>discriminated union,decodeEnvelopegeneric decoder, and per-response-type convenience envelope decodersschemas/echo-wasm-abi.graphql: Canonical GraphQL schema defining WASM ABI response types with custom scalars (Hash32,Bytes,U32,U64)- Custom ABI scalar wire formats:
Hash32encodes as raw 32 bytes (no length prefix — fixed-size BLAKE3 hashes),Bytesas u32 LE length-prefixed blob,U32/U64as unsigned little-endian integers - Envelope wire format: Success
[0x01][payload...], Error[0x00][u32 LE code][u32 LE msg_len][UTF-8 msg...] - 53 tests (30 Rust codec, 23 TypeScript codec) covering struct generation, scalar encoding, envelope functions, optional/nested/list field handling, schema drift, and integration
- Rust codec
decode_raw_le_at: offset parameter now correctly uses&mutinstead of by-value, matching the mutable-offset convention used by all other decode helpers InvalidEnvelopeTagerror variant added to RustAbiErrorenum for exhaustive envelope tag matchingtoSnakeCasenow correctly handles consecutive capitals (e.g.schemaSha256Hex→schema_sha256_hexinstead ofschema_sh_a256_hex)- TS codec: removed redundant
| undefinedfrom optional interface properties (the?modifier already impliesundefined) - TS codec
_encodeOption: signature changed fromT | null | undefinedtoT | nullfor consistency with interface types - Shared SDL fixture: test suites now import from a single canonical
test/fixtures/wasm-abi-sdl.mjsto prevent schema drift between Rust and TS codec tests
CONTRACT_VERSIONbumped from1.1.0to1.2.0— reflects new WASM ABI codec artifact files (wasm_abi_codec.generated.rs,wasm_abi_codec.generated.ts)EchoPlugin.plan()now declares 10 potential artifacts (was 8)
@wesley/test-fixturespackage with shared test schema builders (simpleUser,userWithProfile,multiTenant,ecommerce,allDataTypes,empty,circularForeignKeys), re-exportedMockDatabase,testFixtures,dbAssert, and property-testing utilities for cross-package use.- CLI command auto-discovery in
program.mjs— new commands are registered automatically by dropping a.mjsfile incommands/without editing any registration file (fixes Open/Closed principle violation).
ConcurrentSafetyError,BackpressureError, andSafetyValidationErrornow extendWesleyErrorinstead of bareError, unifying the error hierarchy under a single base class withcode+metasemantics. Backward-compatible:.context/.detailsproperties preserved.
- Dead duplicate generators in
wesley-generator-supabase:repair.mjs,trigger.mjs,rollback.mjs(byte-for-byte copies of the canonical files inwesley-core/src/domain/generators/, never imported or exported).
backpressure-controller.test.mjsandconcurrent-safety-analyzer.test.mjsimported nonexistent underscore-prefixed exports (_BackpressureActivated,_ConcurrentAnalysisStarted, etc.) — corrected to match actual export names.
- License: Standardized all
package.jsonfiles toApache-2.0, matching the project'sLICENSEfile. Removed appended MIND-UCAL text fromLICENSE. AddedNOTICEfile per Apache 2.0 requirements. - IR:
GraphQLAdapter.parseSDL()now emits theWesleyIR.schema.tsshape: structuredFieldTypeobjects ({ base, isList, listItemNullable }), structuredTableDirectives/FieldDirectives, top-levelversion,metadata,enums,scalars,relationships, andtable.fields(notcolumns). The backward-compat shim (table.columns,table.primaryKey,table.foreignKeys,table.tenantBy) has been removed — all consumers now use the new shape directly.
- IR: Backward-compat shim properties (
table.columns,table.primaryKey,table.foreignKeys,table.tenantBy) removed fromGraphQLAdapter,BrowserParserPort, andir.schema.json. Legacy helper methods (applyBackwardCompatShim,mapGraphQLTypeToPostgreSQL_fromFieldType,gqlScalarToPostgreSQL,flattenFieldDirectives) deleted.
-
Transmutations architecture spec: Design doc at
docs/architecture/transmutations.mdcovering source-to-generator mappings, per-element evidence tracking, contextual HOLMES scoring, and Moriarty dual-layer prediction (Phase 0–6). -
WesleyErrorbase class (@wesley/core): Structured error withcode,meta, and optionalcause(forwarded to native ES2022Error.causechain).OpsErrorandPluginErrorextend it. Replaces ad-hoce.code =patterns. -
TransmutationRunner(@wesley/core): Unified orchestrator mergingGenerationPipelineandPluginRunner. Named transmutations, per-element evidence collection, evidence merging, andbuildTaskGraph()DAG descriptor. -
irToSchemain core: Adapter moved from CLI into@wesley/core. CLI re-exports. -
Exit code registry (
@wesley/core):ExitCodes.mjsis the single source of truth for error-code → exit-code mappings.exitCodeFor(),isRegistered(), andgetRegistry()exported from@wesley/core/domain/ExitCodes. BothWesleyCommand.exitCodeFor()and the legacyutils.exitCodeFor()now delegate to the core registry instead of maintaining independent switch/map copies. -
validateGenerateResult()port function (@wesley/core): Extracted inline generate-result validation fromPluginRunnerandTransmutationRunnerinto a reusable port function inGeneratorPlugin.mjs, following thevalidatePlan()pattern. Validates both legacyRecord<string, content>and transmutation-aware{ files, evidence }shapes, returning a normalized{ artifacts, evidence }object. WPLY003 errors are thrown consistently via the port.
up.mjsmigration helpers: Eliminated diverged local copies ofbuildAdditivePlan,explainPlan,lockFor, andemitMigrationsin favor of the shared_migration-plan.mjsmodule. The local copies had silently diverged, introducing 4 bugs:- Index dedup ignored USING method — two indexes on the same fields with different methods (btree vs gin) were silently skipped.
- Falsy default coercion —
lockForused truthiness check instead of!= null, so defaults of0,false,''triggered ACCESS EXCLUSIVE instead of SHARE ROW EXCLUSIVE. - NOT NULL / DEFAULT coupling — DEFAULT was only emitted when the column was also NOT NULL, and NOT NULL was never emitted at all.
- No SQL injection guards — shared module validates
s.type,s.using, ands.defaultagainst safe regexes; local copies had zero validation.
TransmutationRunner: Full null-safety at plugin return shape boundaries.filesvalidated as non-null, non-array object;evidencevalidated as non-null, non-array object; evidence entries with missing/invalid.artifactssilently skipped instead of throwing. All invalid shapes produce structuredWPLY003errors that respect best-effort mode.- Ops manifest validation:
OpsErrorwrapping now reads AJV errors frome.meta.errors(whereassertValidputs them) instead ofe.errors. - Exit code mappings: Added 11 missing error codes (
DIRTY_WORKTREE,CERT_INVALID,EEXIST,EARGS,EUSAGE,ERR_MISSING_ARGUMENT,NO_DSN,REALM_FAILED,OPS_MANIFEST_INVALID,INVALID_TARGET,TTD_COMPILE_FAILED) so CLI exits with stable, semantic exit codes. TransmutationRunner: Validate phase correctly labeled'validate'(was'init').generateRunIdpads to consistent 6-char suffix.evidenceMap.toJSON()serialized once.structuredClonereplacesJSON.parse(JSON.stringify(...))for config cloning. Plugin evidenceerrorsandwarningsforwarded toEvidenceMap.irToSchema: PreserveslistItemNullable→itemNonNullonFieldconstruction (was silently dropped, widening[T!]to[T]).assertCleanGitwrappers: Removed redundant try/catch ingenerate.mjsandplan.mjssinceassertCleanGitnow throwsWesleyErrordirectly.- CLI: Named exports standardized across all 19 command files (removed
export default). - CLI: Revived
models,typescript(aliasts), andzodcommands, wired to existing generators in@wesley/generator-js:wesley models --schema <file> --target ts|js --out-dir <dir>wesley typescript --schema <file> [--out-file <file>]wesley zod --schema <file> [--out-file <file>]
- CLI framework:
irToSchemaadapter bridging parser IR to core domainSchema/Table/Fieldobjects for TypeScript and Zod generators.
GeneratorCommandandFileOutputGeneratorCommandconstructors now accept DI context as first argument, matchingWesleyCommand.
- host-node: Removed public
MigrationDiffEngineexport fromindex.mjs. The internal stub inadapters/index.mjsis unchanged.
- S: Resolved 15 GitHub dependabot alerts (11 high, 4 moderate) — bumped
@playwright/test1.49→1.58.2 (SSL cert verification),dependency-cruiser17.1→17.3.8,ajv^8.12→^8.18 in@wesley/cli(ReDoS); added pnpm overrides for transitiveminimatch(ReDoS),js-yaml(prototype pollution),markdown-it(ReDoS)
- F: Per-op
ResultSchemanow wraps list result types withz.array()and nullable results with.optional()— previouslybuildOpsFromSDLdroppedlist/requiredmetadata from result types, causing e.g.listUsers: [User!]!to generateListUsersResultSchema = UserSchemainstead ofz.array(UserSchema) - F: Generated
parseViewOpsnow throws on trailing garbage bytes (1–7 bytes after the last complete envelope) instead of silently accepting them — critical for deterministic replay and envelope integrity - F: Client/pump integration tests now
evalthe actual generatedparseViewOps/createPumpfunctions instead of reimplementing parsing logic inline, ensuring regressions in generated client behavior are caught - F:
EchoPlugin.plan()now declares all 8 potential artifacts (was missing conditional Rust/TS codecs, joins, guarded views) - F:
emitOps.mjsfindOpId(name)aligned to two-argfindOpId(kind, name)matchingemitClient.mjs— one-arg form could collide when a Query and Mutation share the same field name - F:
evidenceMap.record()for field source locations moved insidebuildTablefield loop (was misplaced at module scope) — fixes #337 - F:
sanitizeGraphQL()in Node host aligned with browser runtime — BOM and null byte stripping now use identical char-code logic instead of regex with embedded control characters
- A:
mustFind()andmustMatch()guard helpers in@wesley/core— centralise the recurring find-or-throw and match-or-throw pattern
- A:
schemas/op.schema.json— JSON Schema for*.op.jsonops DSL (filters, joins, lists, params) - A:
packages/wesley-core/src/domain/qir/op.schema.mjs— ESM companion for runtime Ajv validation, re-exported fromqir/index.mjs - A:
example/ops/all_products.op.json— example op fixture - A:
scripts/dev/setup-bats-plugins.sh— pinned installer for bats test plugins (bats-support, bats-assert, bats-file)
- A: Docker Compose fixture +
scripts/smoke/postgres-fixture.shfor Postgres fixture smoke tests (pnpm run smoke:postgres-fixture)
- A: Updated
README.mdfor@wesley/generator-echo— documents one-pass profile, full artifact list, client/pump API, contract versioning, plugin usage - A: Updated
README.mdfor@wesley/generator-vue— documents unifiedVuePluginentrypoint, legacy function API - A: Updated
docs/specs/echo-ir-v2.md— documentscontract_versionfield, type/op ordering rules, version bump policy
- A:
VuePluginclass implementingGeneratorPlugincontract — canonical unified entrypoint - A: Package exports
./pluginsubpath for plugin-based invocation - A: Vue plugin test suite (
vue-plugin.test.mjs) with 12 tests covering contract, lifecycle, capabilities, and backward compatibility
- C:
CONTRACT_VERSIONbumped from1.0.0to1.1.0— reflectsKIND:namekeyedOP_INDEXand two-argfindOpId(kind, name)in generated artifacts - C: Legacy
generateVue()function remains available but documented as non-primary path
- A:
profilemetadata ingenerateEcho()output describing artifact sets (IR, TS, Rust targets) - A: Types sorted alphabetically in IR for deterministic output independent of SDL declaration order
- A: One-pass profile test suite (
one-pass-profile.test.mjs) with 15 tests covering atomic generation, cross-artifact parity, no-duplicate-transform verification, and performance baseline
- A:
contract_version(semver) field added to IR,ops.generated.ts, andclient.generated.tsHANDSHAKE - A: Types in IR now sorted alphabetically for ordering stability across SDL variations
- A: Contract determinism test suite (
contract-determinism.test.mjs) with 22 tests covering byte-for-byte stability, ordering, edge cases, and version bump policy - A: Version bump policy codified in tests (major/minor/patch rules)
- A: Complete
emitClient.mjsrewrite — generates self-contained TypeScript client with typed dispatch/query APIs - A: Canonical pump loop (
createPump) for view-op envelope parsing and routing - A:
parseViewOpsfor binary envelope decoding (u32le op_id + u32le length + payload) - A:
HANDSHAKEconstants exported for registry handshake / integration gates - A:
DiagnosticsChannelinterface for unknown op / decode error surfacing - A: Client/pump test suite (
client-pump.test.mjs) with 22 tests covering compilation, dispatch, query, pump routing, and edge cases
- A:
emitSchemas.mjsnow generatesVarsSchemaandResultSchemafor every operation in the ops catalog - A:
OP_SCHEMASregistry map exported for runtime op-to-schema lookup - A: TTD
ts-zod.mjsnow emits per-op result schemas alongside existing args schemas - A: Schema completeness test suite (
schema-completeness.test.mjs) with 11 tests covering completeness, edge cases, and ordering stability
- A:
/tryroute, TryNow page, workspace state, file tree UI, Tiptap-based schema editor with GraphQL highlighting - B:
compileSchemaInBrowser()API in@wesley/host-browser— regex-based parser, in-memory pipeline, SQL migration generation - C: PGLite integration —
DbSessionwithapplyMigrations/reset/query(100-row limit),FakeDbSessionfor tests,DatabasePanelwith table view and schema inspector - D1.1a: Centralized error panel for compile, migration, query, and DB init errors
- D1.1b: "Reset Playground" with confirmation modal (resets schemas, DB, compile state)
- D2.1b:
docs/guides/browser-playground.mdarchitecture guide - D2.2: CI test step added to
wesley-website.ymlworkflow; deploy gated to push-to-main only - 10 TryNow component tests (incl. individual error dismissal), 5 PGLite integration tests, 4 FakeDbSession regression tests
- Stable error IDs (monotonic counter) for race-free individual error dismissal
- Per-error dismiss for compile errors (no longer resets
lastSuccess) - Guard against false "success" when no
migrations.sqlin compiled output - DDL detection regex uses word boundaries to avoid false triggers
PlaygroundNavbarhandleSelect fallback to no-op prevents TypeError- Fixed
PlaygroundNavbarcrash when tutorial props are absent wesley-websitebumped to v0.1.0- ROADMAP-ALPHA.md marked 343/343 complete (100%)
- E0.1:
GeneratorPlugincontract withapiVersion, error isolation (WPLY001–004),--best-effortmode, per-plugin status summary,PluginRunnerorchestrator with frozen context - E0.1:
ArtifactWriterwith overwrite detection, conflict reporting, atomic writes via temp staging, dry-run support - E0.2: Plugin discovery and registration via
wesley.config.mjsgeneratorsarray (package,config,enabledfields) - E0.2:
ConfigValidatorwithexperimentalflag support (irV2,rawLe,join) and unknown-flag warnings - E0.3:
testGenerator(plugin, sdl, config?)test harness withtestGeneratorPlan()andexpectArtifact()assertion helpers - E0.4: Generator plugin authoring guide (
docs/guides/generator-plugins.md) - E0.5:
wesley doctorCLI command — checks Node version, config, plugins, crypto, experimental flags;--format json
- E1.1:
canonicalize(sdl)— deterministic AST serialization with lexicographic sorting,extend typefolding, NFC normalization - E1.2:
schemaHash(sdl)— SHA-256 of canonical AST bytes, 64-char lowercase hex - E1.3:
registryHash(obj)andcanonicalizeJSON(obj)— deterministic registry blob hashing - E1.4:
computeHashChain()— full provenance:sdl_hash → schema_hash → ir_hash → registry_hash → bundle_hash - E1.5:
echo-ir/v2format —schema_hash,registry_hash,hash_chain, per-typetype_id/layout_hash, per-fieldjoin - E1.6:
computeDelta(oldSDL, newSDL)— machine-readable schema diff with breaking change detection - E1.7:
wesley diffCLI —--format text|json|summary,--breaking-only,--exit-code
- E2a.1:
emitRawLeCodec— generatesraw_le_codec.generated.rswith per-typeencode_raw_le/decode_raw_le,DecodeErrorenum, alphabetical field order, LE numerics, NaN canonicalization (0x7FC00000),Option<T>prefix tags, length-prefixed strings - E2a.2:
emitRawLeTsCodec— generatesraw_le_codec.generated.tswith browser-safeDataView/Uint8Arrayencode/decode, byte-identical to Rust, TypeScript interfaces for all types - E2a.3:
computeLayoutHash(type, typeIndex)— stable per-type layout descriptor → SHA-256, integrated intoecho-ir/v2aslayout_hashper type
- E2b.1: Echo core storage types in Wesley SDL (
schemas/echo-core-types.graphql):WorldlineTickPatchV1,SnapshotManifest,ClaimRecord,PrivateAtomRefV1,OpaqueRefV1,FieldPatch
- E2c.1:
emitGuardedViews— generatesguarded_views.generated.rswith per-ruleReadView/WriteViewstructs from@wes_viewdirective,from_fullandapply_writemethods
- E2d.1: Golden vector test suite — 44 checked-in JSON vectors across 12 fixture files (Boolean, Int, Float, String, ID, List, Option, Enum, nested objects, multi-field, optional list, privacy types) with reference encoder harness
- E3.1:
@wes_join(strategy: "union"|"max"|"lww")directive parsing and validation - E3.2: Rust
JoinFntrait codegen —emitJoinImpls()generatesimpl JoinFnwith per-field lattice calls,has_joinper-type IR metadata - E3.3: Join directive documentation (
docs/guides/wes-join-directive.md)
- E4.1: Privacy type canonical encoding verification — 28 tests for
ClaimRecord,PrivateAtomRefV1,OpaqueRefV1round-trip encoding, Rust codegen field order, optional field handling
- Generators:
@wesley/generator-vueminimal TS type emission (enums + interfaces) - Generators: hardened
@wesley/generator-echowith explicit SDL validation and package README - Generators: ops helpers tests (
ops.generated.ts) for ops-catalog wiring - Core (QIR):
lowerToSQLfor SELECT/JOIN/LATERAL/ORDER BY/LIMIT/OFFSET - Core (QIR):
emitViewandemitFunction(RETURNS SETOF jsonb) - Tests: unit + snapshot tests for lowering and emission
- Docs:
docs/guides/qir-ops.md; PR template and CODEOWNERS - CI: Ubuntu-only CLI matrix; stabilized architecture-boundaries workflow
- Cursor encoding: Use
charCodeAt()instead ofcodePointAt()for Latin1 binary string decoding (atob output is always 0-255) - Lock-level readability: Break dense
add_columnlock ternary into named boolean (canAvoidRewrite) with multi-line conditional; also fixesstep.defaulttruthy check (0/''are valid defaults) - ESLint flat config: Migrate from legacy
.eslintrc.jsontoeslint.config.jsfor ESLint 9 compatibility; install missingeslint-plugin-promise; fix all 612 pre-existing lint errors across the codebase - Pre-commit hook: Add lint enforcement guard to
.githooks/pre-commit(skippable viaWESLEY_SKIP_LINT_HOOK=1)
generator-echonow emitsecho-ir/v2(wasecho-ir/v1)schema_sha256in IR uses canonical AST hash (was raw SDL hash)- CR-13/14/20/21:
docs/guides/qir-ops.md— remove stale "Discovery Modes (planned)" section, addversionfield to registry example, update shipped features to present tense, prune shipped roadmap bullets - CR-32:
docs/spec/ir-family-spec.md— replace\nwith<br/>in Mermaid node labels so line breaks render correctly - CR-17:
docs/spec/ir-family.md— add##heading markers to Cross-references, Versioning, Validation, and Envelope sections - CR-18:
docs/spec/qir.md— insert blank lines after all##headings for consistent markdown formatting - CR-19:
docs/spec/qir.md— adddistinctOn?field to QueryPlan Top Level section - CR-28: Add cross-reference blockquotes linking
ir-family.mdandir-family-spec.md - CR-29:
docs/README.md— add IR Family Overview, IR Family Specification, and QIR Specification links under Core Concepts
- Double JSON output: Commands that write their own JSON (cert-verify, cert-create, plan, rehearse, up) no longer trigger the framework's duplicate JSON wrapper, fixing
jqpipeline breakage and cert-e2e test failures - SHIPME.md marker ordering:
extractJsonBlock()now throws a descriptive error instead of returning null when certificate markers are present but out of order - SQL comment injection:
emitMigrations()quotes table names in SQL comments using the sameq()function used for all other identifiers - Param index lookup:
lowerToSQLuses nullish coalescing (??) instead of||for parameter index lookups, preventing index0from being swallowed - Missing imports: Fixed
CompilerErrorimport in inprocess-compiler,ev1typo in compiler-inprocess, removed unreachable code in GraphQLAdapter
- C1:
Predicate.isNull()/isNotNull()now emit{ kind: 'Compare', op: 'isNull' }matchinglowerToSQLexpectations (was runtime crash) - C2: Validate
ParamRef.typeHintagainst safe-type regex to prevent SQL injection - C3: Validate
Literal.typeagainst safe-type regex to prevent SQL injection - C4: Validate ORDER BY
nullsto'first'|'last'only (was injectable) - C5:
cert-signcanonicalizes with{ ...json, signatures: [] }to matchcert-verify, fixing multi-signature verification - M1:
qirsubcommand.action()handlers merge parent program opts (--verbose,--quiet,--json) - M2:
validateRealmin rehearse error path wrapped in try/catch to prevent masking original error - M3: Migration SQL emission validates
s.type,s.using,s.defaultagainst safe regexes - M4:
LIMIT/OFFSETvalidated as finite non-negative numbers (was emittingNaN) - M5:
Cursor.mjsexported from barrelindex.mjs - M6:
Cursor.mjsusesbtoa/atobinstead ofBufferfor browser compatibility - M7:
ir-family-spec.mdreferences correctplan-report.schema.json - M8:
ParamCollectorthrows on unrecognized predicate kinds (defense-in-depth) - m1:
generate.mjsuses localloggerinstead ofthis.ctx.loggerfor ops registry validation - m2:
cert-sign.mjsandcert-verify.mjsusefs.read()to match host adapter contract - m3:
generate.mjsusesthis.ctx.envandthis.ctx.shellinstead ofprocess.env/globalThis - m4: Extract shared migration helpers to
_migration-plan.mjs(eliminates duplication) - m5:
emit.mjsdelegates to sharedsanitizeIdentBasefromidentifiers.mjs - m6:
decodeCursorstrips__proto__/constructorkeys afterJSON.parse - m7–m9: Documentation uses present tense for shipped schemas; correct bats test paths
- m10–m11: Remove dead
DistinctOn,Cast,CaseWhenbranches fromParamCollector - n1: Remove pointless
catch (e) { throw e }incert-verify.mjs - n2: Bats tests use robust
setup()withROOT_DIR/CLIpattern andWESLEY_REPO_ROOT - n3:
renderJsonAggpassesoptstorenderOrderBy - n4: Moot — the private RESERVED set in
emit.mjswas removed whensanitizeIdentBasewas consolidated (see m5) - n5: Remove trivial
escIdentwrapper; userenderIdentdirectly - n6:
qir-envelope-schema.batsremoves redundantexport(keepsenvprefix) - n7:
plan-report.schema.jsonremoves redundantadditionalProperties: true - CR-22:
plan-report.schema.json— addadditionalProperties: falseto Phase items, Mapping items, and Radar object (Step/StepWithLock intentionally omitted due toallOf+ draft-07 interaction) - CR-23:
shipme.schema.json— normalize$reffrom absolute URL to relative path (realm.schema.json#) - CR-30: Strip extra trailing newlines from JSON schema files (
qir,ir-envelope,ir,ops-manifest,ops-registry,realm); add missing trailing newline toevidence-map - CR-35:
qir.schema.json— simplifyLiteral.valuefrom verboseoneOf(6 JSON types) to equivalent{} - CR-16:
assertCleanGitprefers asyncshell.exec()over awaiting synchronousexecSync - CR-34:
lockForin_migration-plan.mjs— add clarifying comment explaining PG 11+ ADD COLUMN lock behavior
- Fix
promise/param-namesinBatchOptimizer.mjsandTasksSlapsBridge.mjs— rename unused resolve parameter from_to_resolve - Fix
promise/always-returninErrorRecovery.mjsandDocumentationGenerator.mjs— addreturn undefinedin.then()callbacks - Fix
no-async-promise-executorinAdvisoryLockManager.mjs— replace async executor withPromise.resolve().then()chain - Fix
no-constant-binary-expressioninStandardSanitizer.mjs— remove redundant constant\SET ${nextTok}`on left side of&&` - Fix
no-return-awaitinsql-executor.test.mjs— remove redundantawaitfromreturn await - Fix
no-control-regexincreateNodeRuntime.mjs— addeslint-disable-next-linecomment for intentional null byte detection
- SR-M1:
lowerToSQLLIMIT/OFFSET now requires integer values (Number.isInteger) — fractional values like5.5are rejected instead of producing invalid SQL - SR-M2:
renderLiteralrejectsNaNandInfinitynumber values — previously emitted as bareNaN/InfinitySQL tokens - SR-M3: DISTINCT ON prefix logic rewritten — removes matching entries from orderBy first, then prepends in distinctOn order (preserves user direction/nulls); prevents duplicate ORDER BY entries when user orderBy has the same expressions in a different order
- SR-M4:
encodeCursor/decodeCursoruse TextEncoder/TextDecoder pipeline for UTF-8-safe base64 — previously crashed on multi-byte Unicode (emoji, CJK) via Latin1-onlybtoa - SR-M5:
emitMigrationsemitsDEFAULTfor any column with a default value andNOT NULLfor non-nullable columns — previously only emittedDEFAULTwhennullable === false, silently dropping defaults on nullable columns - SR-M6: Migration
DEFAULTvalidation switched from denylist regex to strict allowlist (SAFE_DEFAULT_RE) — accepts numeric literals, booleans, bare function calls (now()), and single-quoted strings only - SR-M7:
loadMoriartyHistoryreceives env via parameter — removed directprocess.envaccess forWESLEY_BASE_REF,GITHUB_BASE_REF,WESLEY_DEFAULT_BRANCH,GITHUB_DEFAULT_BRANCH - SR-M8:
loadMoriartyHistoryreceives logger via parameter — replaced fourconsole.warncalls with injectedlogger.warn - SR-M9:
plan.mjsassertCleanGitacceptsshellparameter fromthis.ctx.shelland uses asyncshell.exec()— removedglobalThisaccess and synchronousexecSync - SR-M10:
schemaValidator.mjsloadSchemaFileprefersctx.cwd?.()over bareprocess.cwd()fallback; addedawaiton import.meta.url fallback path; added directory math comment - SR-M11: Document mixed JSON Schema drafts (draft 2020-12 vs draft-07) in
docs/spec/ir-family-spec.md - SR-M12:
plan-report.schema.jsonaddsadditionalProperties: falsetoplan,explain, and root objects; addsdescriptiontoStepdefinition explaining whyadditionalPropertiesis intentionally omitted (draft-07allOfconstraint) - SR-M13:
realm-schema.batstest renamed from "validates against realm.schema.json" to "emits plan-report shape" — dry-run output is plan-report, not realm; addedmappingandradarkey assertions - SR-m2:
renderExprduck-typing fallbacks marked as backward-compat shims; logged to.claude/bad_code.md - SR-m3:
identifiers.mjsRESERVED set updated to PostgreSQL 16 — addedalter,any,cast,drop,grant,index,revoke,set,trigger,window,with - SR-m9:
cert-sign.mjsusesTextEncoderfor UTF-8 data signing instead ofBuffer.from() - SR-m13:
generate.mjsrepo root resolution prefersctx.cwd?.()over bareprocess.cwd()fallback - SR-m14:
generate.mjsregistry read usesString()instead of.toString('utf8')for host-adapter compatibility - SR-m15:
generate.mjsops registry and entryschemafields usenormalizedSchema(lowercased) to match emitted SQL - SR-n1:
decodeCursorusesJSON.parsereviver to filter__proto__,constructor, andprototypekeys during parsing - SR-n5: Default join alias uses full table name (
j_${table}) instead of first character to prevent collisions - SR-n6:
renderSearchPathJSDoc documents lowercase-folding behavior - SR-n10: Remove duplicate
-v, --verboseoption fromgeneratesubcommand (already on root program) - SR-n12:
WesleyCommand.mjsprocess.env.WESLEY_LOG_FORMATmutation documented as known DI violation - SR-n15:
qir.schema.jsonroot self-referenceQueryPlan: { "$ref": "#" }logged to BACKLOG for future tooling compatibility - SR-n17:
ops-explain.bats--i-know-what-im-doingflag documented with inline comment - SR-n18:
cert-e2e.batsjq assertions simplified from fragileif has(...) then ... else empty endto direct.validSignatures == 2/.ok == true - SR-n19:
qir-schema.batsheader comment explains why bats-assert plugins are not loaded (inline Node.js test)
- SR-m1: Document
findIndexByNameOnlyfallback inlowerToSQL.mjs— explains when the name-only param lookup legitimately triggers and its silent-binding risk - SR-m4:
ParamCollectornow visitsdistinctOnexpressions — previously skipped, causing uncollected params whendistinctOnreferenced aParamRef - SR-m5:
emit.mjsimportsRESERVEDfromidentifiers.mjsinstead of maintaining a separate (diverged) local copy - SR-m6:
OpPlanBuilder.parseRefarray branch explicitly checks for empty-string, null, and undefined table elements instead of relying on falsy coercion - SR-n2:
emitFunctionwrapping aliasqis now quoted viasqlQuoteIdent— consistent with strict identifier policy - SR-n3: Remove dead
forceCast/!/::/.test(typeHint)guard inrenderParam—SAFE_TYPE_REalready prevents::in type hints - SR-n4:
PredicateCompiler.mjsre-exported from QIR barrelindex.mjs
- QIR:
lowerToSQLrecursive calls (Subquery, Lateral, ScalarSubquery, Exists) now pass fullopts— preservespkResolverandidentPolicyin nested queries; also threadsoptsthroughrenderOrderBy - QIR:
lowerToSQLjoin-type handling is now explicit (LEFT, INNER) and throws on unsupported types instead of silently defaulting to JOIN - QIR:
lowerToSQLDISTINCT ON prefix uses position-based matching — preserves existing direction/nulls, supports multi-column distinctOn - Cert:
cert-signnow validates key type is ed25519 before signing, preventing silent algorithm mismatch - Cert:
cert-verifyno longer masks infrastructure errors (import/parse) asVALIDATION_FAILED - Ops:
resolveManifestEntriesexclude matching uses normalized absolute-path prefix comparison (handles subtree excludes and Windows paths) - Ops:
compileOpsIfRequestedreuses parsed manifest forallowEmptycheck instead of re-reading file (fixes TOCTOU) - Ops: Manifest auto-discovery no longer overrides explicit
--opsflag - Schema:
realm.schema.jsonnow requireserrorfield whenverdictisFAIL - Schema:
shipme.schema.jsonSHA field constrained to hex hash pattern (40 or 64 chars); signature identity fields (signer,keyId,signature) require non-empty strings - Schema:
ops-manifest.schema.jsonschemaproperty rejects empty strings - CI:
ops-explain.batsandqir-schema.batsuse fallback repo root whenWESLEY_REPO_ROOTis unset - Preflight: CLI binary existence check — removed broken
node_modules/.bin/wesleyshell-shim fallback; fails fast when primary entry point is missing - Preflight:
git diff/git ls-filesfailure now detected and reported instead of silently skipping validations - Preflight: Registry path matching is now path-separator-agnostic (Windows-safe)
- E2a.2: TS codec NaN canonicalization used big-endian instead of little-endian — now matches Rust
to_le_bytes - E2a.2: TS codec nested object decode closure did not advance offset — caused corrupt state in lists/options
- E0.1:
ArtifactWriterpath traversal vulnerability — artifact keys with..or absolute paths are now rejected - E2d.1: Golden vector reference encoder used
localeCompare(non-deterministic across platforms) — now uses byte-order comparison - E1.7:
wesley diff --breaking-only --format jsonnow emits only filtered{ changes }(no unfiltered delta arrays) - E2a.2: Replace all
localeComparewith byte-order comparison across codegen (emitRawLeCodec, emitRawLeTsCodec, emitGuardedViews, index.mjs) - E2a.2: TS codec nested encode now uses in-place
_encodehelpers — eliminates intermediateUint8Arrayallocation per nested object - E2d.1: Golden vector
resolveNanSentinelsnow recurses into arrays and array fields - E2d.1: Golden vector
unwrapTypenow throws on missing node name instead of returning'Unknown' - E2d.1: Golden vector test runner now guards against missing
typeNamein fixture files
- SR-m7:
verifySigincert-verify.mjsnow distinguishes crypto mismatches (returnsfalse) from infrastructure errors (re-throws) instead of swallowing all errors via barecatch {} - SR-m8:
extractJsonBlockin_cert-utils.mjsasserts marker ordering (begin < fence < fenceEnd < end) after position lookup, returningnullon misordered markers - SR-m10:
qir-validate.mjsparentqircommand now shows help when invoked without a subcommand instead of throwing - SR-m11:
qir-validate.mjssubcommand.action()handlers use dynamic root-walk (while (root.parent) root = root.parent) instead of hardcodedcommand.parent?.parent?.opts?.() - SR-m12: Health probe SQL in
rehearse.mjsescapes double quotes in table names (replace(/"/g, '""')) to prevent SQL injection viat.name - SR-m18: Snapshot.json read failures in
plan.mjsandrehearse.mjsnow distinguishENOENT(silent) from parse/infrastructure errors (logged vialogger.warn) - SR-n7:
canonicalizein_cert-utils.mjsuses explicit comparator(a, b) => a < b ? -1 : a > b ? 1 : 0instead of locale-dependent.sort() - SR-n8:
hashArtifactsincert-create.mjslogs debug message on file hash failure instead of swallowing errors via barecatch {} - SR-n9:
cert-create.mjsuses staticimport { createHash } from 'node:crypto'instead of dynamicawait import('node:crypto')insidehashArtifacts
- SR-n14:
realm.schema.jsonifcondition now includes"required": ["verdict"]so the conditionalthenclause only fires whenverdictis actually present - SR-n16:
shipme.schema.jsonalgfield gains a description noting supported values ("ed25519"or null) - SR-n11: Index dedup signature in
_migration-plan.mjsnow includes theusingmethod (defaults tobtree), preventing false dedup of indexes on the same columns with different access methods - SR-m16:
docs/spec/ir-family.mdnow documents Plan IR, REALM IR, Ops Manifest, and Ops Registry alongside Schema IR and QIR - SR-n20:
docs/build-artifacts.mdchangesout/ops/description from "Experimental" to "Generated" to match current enabled status - SR-m17:
docs/guides/qir-ops.md"See also" reference reformatted as a proper markdown link (target file exists) - SR-n22: Strip extra trailing blank lines from fixture JSON files (
sample-flat.qir.json,sample-envelope.json,ops.manifest.json) - SR-n23: Strip extra trailing blank lines from spec docs (
qir.md,ir-family.md) - SR-m19:
qir-envelope-schema.batsnow asserts output content (not just exit code) afterenvelope-validate - SR-m20: Verified:
holmes-setup/action.ymlomits explicit pnpm version becausepnpm/action-setup@v4readspackageManagerfrompackage.json— no change needed
- CR-R6-1 (Critical):
renderSearchPathinemit.mjsnow preserves PostgreSQL special variables ($user,pg_temp) verbatim instead of mangling them throughsanitizeIdentBase - CR-R6-2 (Critical):
collectParams(plan)inemitFunctionno longer called twice — result is now passed tolowerToSQLasparamEnv - CR-R6-3 (P2):
emitOpArtifactsnormalizestargetSchemaviasanitizeIdentBasebeforeCREATE SCHEMA IF NOT EXISTS, ensuring schema name matches function emission - CR-R6-4 (Major): Extract shared
schemaValidator.mjshelper — centralises Ajv instantiation, format registration, and dual-path schema resolution (WESLEY_REPO_ROOT → import.meta.url fallback) across cert-verify, generate, plan, qir-validate, and rehearse commands - CR-R6-5 (Major):
plan.mjscatch block no longer mislabels infrastructure errors (import/parse) asVALIDATION_FAILED - CR-R6-6 (Major):
rehearse.mjsdry-run now validates and emits the same shape (full plan-report with mapping/radar stubs) - CR-R6-7 (Major):
qir-validate.mjsfour nearly identical branches consolidated into_validate()dispatcher - CR-R6-8 (Major): Join ambiguity diagnostic in
OpPlanBuildernow catches all unqualified string refs, not just'id' - CR-R6-9 (Minor):
decodeCursornow returns{}for non-object payloads (arrays, primitives) - CR-R6-10 (Minor):
plan.mjsnon-JSON path now returns{ phases, steps }matching JSON return shape - CR-R6-11 (Minor):
qir-ops.mdmarkdown lint fix — add blank line after fenced code block - CR-R6-12 (Trivial):
emitView/emitFunctioncomments clarify intentionalidentPolicydefault difference vslowerToSQL - CR-R6-13 (Trivial):
pkResolveringenerate.mjsgains JSDoc documenting single-table/left-deep limitation - CR-R6-14 (Trivial):
ops-registry.schema.jsonparamsarray gains description noting uniqueness enforced at generation time - CR-R6-15 (Trivial): Bats tests
plan-report-schema.batsandrealm-schema.batsnow assert output content, not just exit status - CR-R6-16 (Trivial): Test coverage: cursor null/undefined/non-object edge cases, qualified join refs positive path, builder-based pkResolver test, LIKE/CONTAINS param guard tests
- Initial public repository layout