Dependency identity and invalidation ==================================== ``DependencyGraph`` is a persistent directed acyclic graph used to answer two separate questions: **is this product the same?** and **what work must run?** A 32-byte content digest answers the first; node-kind dirty flags answer the second. Calling it a Merkle DAG is not enough because a source edit is not automatically the identity parent of every semantic compiler result. :: scene.slang -> imported project.noise -> reflected entry point -> pipeline | ^ `-> parameter layout -+ +-> UI schema `-> parameter values Source and imported-module nodes identify authored inputs. Compilation yields independently hashed entry-point, UI-schema, parameter-layout, resource, and pipeline products. Stable dependency keys are canonicalized, so order does not accidentally change identity and shared modules need not be copied into a tree. Why separation matters ---------------------- Changing ``UIName`` can change the inspector schema without changing uniform byte layout, so it should not rebuild a GPU pipeline. A slider changes parameter values and normally requests only a uniform upload. An imported module edit invalidates documents that resolved that module. A binding-layout change requests binding and pipeline work even if a label did not change. The Inspector presents authored sources/imports first and keeps internal compiler and renderer products under an advanced branch. Implementation -------------- ``NodeId`` identifies a stable graph node; ``NodeKind`` selects invalidation semantics. Relevant source is ``cpp/include/miskeyed/workbench/core/DependencyGraph.h``, its implementation, and graph construction in ``cpp/src/workbench/slang/ShaderDocument.cpp``.