diff --git a/cmd/generate/runnable_bindings.go b/cmd/generate/runnable_bindings.go index f6a376a0..b5b1c4c2 100644 --- a/cmd/generate/runnable_bindings.go +++ b/cmd/generate/runnable_bindings.go @@ -141,7 +141,12 @@ Examples: ctx, stop := common.SignalContext(ctx) defer stop() - workspace, err := common.LoadWorkspace(ctx) + // Every composed module is walked for its derived operations, so a + // pinned module is materialized first, as a run, a render and + // `generate fixture-composition` do: on a fresh checkout — a CI job — + // the plain loader refuses a pinned module as "not loadable as a local + // checkout", and --check never reaches the file it exists to judge. + workspace, err := common.LoadWorkspaceWithPinnedModules(ctx) if err != nil { return err } diff --git a/docs/commands.md b/docs/commands.md index 42dd9b0c..5ffa08fe 100644 --- a/docs/commands.md +++ b/docs/commands.md @@ -2196,8 +2196,10 @@ workspace composed by identity works for each of them with no prior run: checkout, so it materializes exactly as `run` does; - every `ci` verb (`plan`, `build`, `test`, `run`, `validate`, `push`, `deploy`); -- `generate client`, `sync solution-sdk` and the fixture listing, which read a - composed module's tree. +- `generate client`, `generate runnable-bindings` (whose `--check` is the one + drift check that group has, and could not run on a fresh checkout until it + materialized), `generate fixture-composition`, `sync solution-sdk` and the + fixture listing, which read a composed module's tree. All of them share the fast path: once a receipt answers the request the workspace makes, a later command compares and pulls nothing, takes no lock and diff --git a/docs/runnable.md b/docs/runnable.md index 40a3eae2..e1e92fb5 100644 --- a/docs/runnable.md +++ b/docs/runnable.md @@ -145,7 +145,9 @@ declaring neither fixed scopes nor slots is still refused as declaring no authority. Wildcards (including omitted IDs), collisions with a fixed scope's kind or another slot's kind, duplicate/undeclared slots, unknown fields and selection keys naming no derived operation are refused. A failed preparation -writes nothing and preserves the previous output. +writes no binding output and preserves the previous output; a pinned module it +materialized first stays materialized (cache, overlay, receipt, `.gitignore`), +as after any command that reads composed modules. The generated `configurations//runnable-bindings.env` carries Core's `codefly.runnable-prepared/v3` bindings: owner coordinates, the resolved JSON