From fa762379e35d3825fbf8a0e1b15e632a5727c5a9 Mon Sep 17 00:00:00 2001 From: Dennis Kobert Date: Wed, 5 Aug 2026 23:02:38 +0200 Subject: [PATCH] Align RFC summary, soundness, and rationale with the stack model --- node-graph/rfcs/attribute-model.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/node-graph/rfcs/attribute-model.md b/node-graph/rfcs/attribute-model.md index ef3d02468f..89c657338c 100644 --- a/node-graph/rfcs/attribute-model.md +++ b/node-graph/rfcs/attribute-model.md @@ -7,9 +7,9 @@ declare their attribute reads and writes in their signatures, and the compiler resolves every access to a byte offset during wiring, so there is no name lookup at runtime. Storage and batch results are per-attribute columns. The contiguous record only exists as a per-lane view, assembled -into buffers the compiler assigns. All of the machinery that could -corrupt a layout is generated code, so getting it wrong is a type error or -a graph compile error rather than undefined behavior. +into activation frames on a per-thread record stack. All of the machinery +that could corrupt a layout is generated code, so getting it wrong is a +type error or a graph compile error rather than undefined behavior. # Motivation @@ -484,9 +484,9 @@ make semantic mistakes (evaluating an input it did not need to) but cannot misalign an offset. Kernels see contexts only as an opaque `impl Ctx + ...` they cannot construct, and lifetimes keep them from stashing handles in node state. The one remaining discipline lives -inside generated code (a result buffer must not be borrowed across a -sibling evaluation it could alias), and debug assertions guard it at -wiring boundaries, following the existing precedent for TypeId checks. +inside generated code (a borrow of a released frame must not survive the +next claim), and debug assertions guard it at wiring boundaries, +following the existing precedent for TypeId checks. # Drawbacks @@ -515,8 +515,8 @@ wiring boundaries, following the existing precedent for TypeId checks. per value, and no compile-time name checking. Interning the keys improves the constant (about 1.9ns per access vs. 0.43 for a resolved offset) but keeps a per-access search and rules out the structural - optimizations that need static layouts: bypass, uniform columns, slot - coalescing. + optimizations that need static layouts: bypass, uniform columns, + stack-allocated activation frames. - Attributes as separate graph edges, one channel per attribute: bypass and per-channel caching become graph structure. We prototyped and measured this. Without caching at fan-outs, every channel re-evaluates