mirror of
https://github.com/simstudioai/sim.git
synced 2026-11-02 22:52:17 +08:00
* fix(provenance): name the importer that condemned a run A bundle that arrives already incomplete latches the whole registry one-way, so every later model projection in the run refuses. #6483 made the refusal say what went wrong; it could not say who. In production the answer was reason=source-provenance-incomplete with 23 candidate importers and no way to tell them apart, which is where the last investigation stopped. Carry a stable origin across the import boundary and retain it beside the reason. It inherits through forks and merges — the step that erased attribution before, since a tool crossing forks, imports, then merges back — so the refusal names the importer even though the latch happened frames earlier. Tool crossings take the tool id, so a tool-sourced bundle identifies itself rather than being inferred from timestamps. Origins are caller-supplied strings rather than a closed union, so unlike reasons they carry an explicit bound. No behaviour change: the field is optional, additive, and read only when building a log record. * fix(provenance): attribute the path-scoped and short-circuit latches too importProvenanceForValueAtInputPath took only { trusted }, so the five callers that bind a crossing to an input path — the block, loop, parallel and workflow resolvers, and the guardrails route — could not name themselves. Separately, six latches sit beside a tagged import on the path where the import did not run or returned false: a bundle already marked incomplete short-circuits the || before the import, and each catch latches directly. Those reported no origin while their neighbour reported one. * fix(provenance): stop a broad catch claiming an incomplete bundle The catch around table-row provenance loading also covers a database failure in loadTableRowSecretProvenance, which is not an incomplete bundle. Naming a reason the catch cannot know is the misattribution this work exists to remove, so it reports 'unspecified' with its origin, matching every sibling catch. The decrypt catch keeps its specific reason because its try wraps only the decrypt call.