Skip to content

Commit abc1572

Browse files
committed
docs: triage the thirteen out-of-band heroes and record the worklist
Full-size and card-scale review of each surveyed hero against its README and contract. Two are legitimate deviations and now carry the one-line README Framing deviation note: damped-track-aim (radiating composition — the spikes read as converging from beyond the frame; it is a pinned calibration member and the gallery's reference standard stays) and wave-displace (edge-to-edge field — the fill is the point). sky-texture-sun-elevation is a measurement artifact: the hero is the sky itself, so the matte only saw the cone props; its README now documents report-only. vse-cut-list is in scope — its still renders from the Bay scene with BayCam, and the README records that the (scene, camera) pair must be passed explicitly. The remaining ten are genuine defects (clipped subjects, over-fill, dead space) and land on the ROADMAP candidate pool as a restage worklist with measured numbers. No re-renders in this pass. Signed-off-by: fOuttaMyPaint <[email protected]>
1 parent f15d990 commit abc1572

9 files changed

Lines changed: 42 additions & 0 deletions

File tree

‎ROADMAP.md‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,8 @@ Not committed; target list for the next content version. (v0.3.0 shipped the smo
129129
- UV atlas pack witness — lightmap/unique UV island packing with non-overlap + utilization closed forms (deferred behind hygiene/origin; overlaps `uv-layer-grid` / `triangulate-tangents` / `gltf-export-roundtrip` UV arc)
130130
- Attribute domain witness: writing a POINT-domain color attribute and reading it as if it were CORNER (or vice versa) silently shears colors across shared verts — companion to `color-attribute-wheel`
131131

132+
- Gallery framing defect worklist (from the #107 survey; restage + re-render into the 0.70–0.90 band with all margins ≥ 0.02, then wire `examples/gallery_framing.py`'s `check_framing`): **depsgraph-export** (fill 0.984x over; left cube clipped by left+bottom edges), **driver-wave** (0.969x over; side margins 0.016), **shader-node-group** (0.969x over; side margins 0.016), **swatch-grid** (0.944y over, marginal), **gp-lineart-contour** (0.978y over; glass base cropped at bottom edge), **png-exr-alpha** (display plinth touches bottom edge, minor), **vertex-weight-limit** (base cropped at bottom edge; x-fill 0.247 with dead space), **text-version-stamp** (max fill 0.663 under; dead lower third), **triangulate-tangents** (0.334x/0.661y under; dead space both sides), **curve-bevel-arc** (right cap margin 0.012 < 0.02, marginal). Triaged as documented deviations instead (README `Framing deviation` notes, no restage): damped-track-aim (radiating composition, calibration member) and wave-displace (edge-to-edge field); sky-texture-sun-elevation is a measurement artifact (world-contract subject — report-only if wired); vse-cut-list is in scope via its `Bay` scene/camera pair.
133+
132134
## Future (uncommitted)
133135

134136
- Asset library and asset browser scripting skill

‎docs/gallery/damped-track-aim/index.html‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,8 @@ <h1>damped-track-aim</h1>
185185
<section class="detail-section md">
186186
<p>A runnable example that aims twelve brass spikes at an ember core with <code>Object.constraints.new(&#x27;DAMPED_TRACK&#x27;)</code> — the data-API path, not <code>bpy.ops.object.constraint_add</code> (which needs an active object and fails in headless loops). Damped Track is the twist-stable aim constraint: it points one local axis at a target without the roll fights Track To is known for.</p>
187187
<p><strong>What it witnesses:</strong> every spike carries exactly one unmuted <code>DAMPED_TRACK</code> bound to the core on <code>TRACK_Z</code>. After a depsgraph update, each evaluated local <code>+Z</code> aligns with the world vector toward the core (dot ≥ 0.998 ≈ 3.6°). A missing constraint, a muted one, a <code>TRACK_TO</code> stand-in, or a flipped axis fails the check.</p>
188+
<h2>Framing deviation</h2>
189+
<p>Radiating composition — the twelve spikes read as converging on the core from beyond the frame, so their tails bleed past the left, right, and bottom edges by design (measured fill 1.000x/0.917y with edge touch on three sides). If wired to <code>examples/gallery_framing.py</code>, call it with <code>deviation=&quot;radiating composition; spikes read as extending past frame&quot;</code>.</p>
188190
<h2>Run</h2>
189191
<pre><code># Cheap correctness check (no render) — the CI check:
190192
blender --background --python damped_track_aim.py --

‎docs/gallery/sky-texture-sun-elevation/index.html‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,8 @@ <h1>sky-texture-sun-elevation</h1>
190190
<p><strong>Version witness:</strong> <code>sky_type</code> and the dust/aerosol rename are the divergence; <code>sun_elevation</code> itself is stable. Zenith rise differs by model (Nishita vs multiple scattering) but clears the same gate on both binaries.</p>
191191
<h2>Stage deviation</h2>
192192
<p>World carries a Nishita / multiple-scattering Sky Texture instead of the default near-black Background — the contract *is* the sky. Gallery still is a dual-elevation diptych (8° | 55°) so failure (identical panels) is visible at thumbnail scale. Layer 1 still holds: <code>view_transform=&#x27;Standard&#x27;</code>, designed terracotta materials, chosen camera, no helpers in frame.</p>
193+
<h2>Framing deviation</h2>
194+
<p>The hero is the sky itself — a world contract, not an object on the stage. The silhouette matte can only measure the cone reference props (0.369x / 0.489y), so the out-of-band number is a measurement artifact, not the composition; if ever wired to <code>examples/gallery_framing.py</code>, this example reports with <code>deviation=&quot;world-contract subject; matte sees only the cone props&quot;</code> rather than enforcing.</p>
193195
<h2>Run</h2>
194196
<pre><code># Zenith-luminance correctness check (tiny Cycles CPU EXR probes) — the CI check:
195197
blender --background --python sky_texture_sun_elevation.py --

‎docs/gallery/vse-cut-list/index.html‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,8 @@ <h1>vse-cut-list</h1>
192192
<ul><li>A GAMMA_CROSS asked to outlast its inputs&#x27; overlap is <strong>silently clamped</strong> to the overlap — request length 9 over a (25, 33) overlap, get (25, 33).</li><li>A scene strip pointing at its <strong>own</strong> scene is a feedback loop and renders transparent (alpha 0) — the &quot;stage&quot; is silently absent. Source a separate scene.</li><li>Effect strips <strong>consume</strong> their inputs: input strips never composite on their own channel, and the effect&#x27;s transform applies on top of the inputs&#x27; transforms. Consumption requires the effect on a channel <strong>above</strong> its inputs; below, they keep painting independently.</li><li>An empty <code>bpy_prop_collection</code> is falsy — <code>se.strips or se.sequences</code> silently falls through to the legacy accessor on an empty timeline. Always branch on <code>hasattr</code>.</li></ul>
193193
<p><strong>Version divergence:</strong> the whole example is the divergence — gated on the <code>bpy.app.version</code> tuple (<code>&gt;= (5, 0, 0)</code>), never on <code>version_string</code> (<code>&quot;4.5.11 LTS&quot;</code> is not bare semver). Each side asserts its own canonical contract plus the other side&#x27;s removal/bridge state. Measured values are identical on 4.5.11 and 5.1.1, including the pixel witness.</p>
194194
<p><strong>Render:</strong> the program wall *is* the sequencer output at frame 29 (mid cross) — crimson A, teal B, amber long-runner C, and the 50/50 cross blend, over the Stage scene strip showing the dark studio. An off-by-one in end-exclusive span math drops its cell to the dark stage; the caption strip carries the closed form. The hero presents that authentic frame on a reference monitor in a dark-studio editing bay — the pixels on the screen are the genuine sequencer output (evidence); only the bay around them is staged (presentation). Rendered locally with EEVEE (GPU host); the checks and <code>--check-pixels</code> need no GPU (Cycles CPU).</p>
195+
<h2>Framing measurement</h2>
196+
<p>The gallery still renders from the dedicated <code>Bay</code> scene (camera <code>BayCam</code>), not <code>bpy.context.scene</code> — a framing measurement with <code>examples/gallery_framing.py</code> must be handed that (scene, camera) pair explicitly.</p>
195197
<h2>Run</h2>
196198
<pre><code># Cheap correctness check (no render) — the CI check:
197199
blender --background --python vse_cut_list.py --

‎docs/gallery/wave-displace/index.html‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,8 @@ <h1>wave-displace</h1>
185185
<section class="detail-section md">
186186
<p>A runnable example that displaces a 96×96 grid (9,409 vertices) into a standing wave using <strong>one <code>foreach_get</code> and one <code>foreach_set</code></strong> — the bulk-IO pattern from <a href="https://github.com/TMHSDigital/Blender-Developer-Tools/tree/main/rules/use-foreach-set-for-bulk-data.mdc"><code>use-foreach-set-for-bulk-data</code></a> and the <a href="https://github.com/TMHSDigital/Blender-Developer-Tools/tree/main/skills/mesh-editing-and-bmesh/SKILL.md"><code>mesh-editing-and-bmesh</code></a> skill — instead of 9,409 individual <code>mesh.vertices[i].co</code> accesses.</p>
187187
<p><strong>What it witnesses:</strong> the bulk path is not just faster, it is *correct* — the check asserts the flat grid gained the expected Z span (the write actually landed) and that <strong>every</strong> vertex matches the closed-form wave, so a stride or interleave bug in the flat buffer cannot hide behind a lucky probe.</p>
188+
<h2>Framing deviation</h2>
189+
<p>Edge-to-edge field — the displaced sheet fills the frame and crops at the left, right, and bottom edges so the wave reads as a surface, not an object on a stage (measured fill 1.000x/0.817y with edge touch on three sides). If wired to <code>examples/gallery_framing.py</code>, call it with <code>deviation=&quot;edge-to-edge wave field; the fill is the point&quot;</code>.</p>
188190
<h2>Run</h2>
189191
<pre><code># Cheap correctness check (no render) — the CI check:
190192
blender --background --python wave_displace.py --

‎examples/damped-track-aim/README.md‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,14 @@ bound to the core on `TRACK_Z`. After a depsgraph update, each evaluated local
1212
constraint, a muted one, a `TRACK_TO` stand-in, or a flipped axis fails the
1313
check.
1414

15+
## Framing deviation
16+
17+
Radiating composition — the twelve spikes read as converging on the core from
18+
beyond the frame, so their tails bleed past the left, right, and bottom edges
19+
by design (measured fill 1.000x/0.917y with edge touch on three sides). If
20+
wired to `examples/gallery_framing.py`, call it with
21+
`deviation="radiating composition; spikes read as extending past frame"`.
22+
1523
## Run
1624

1725
```bash

‎examples/sky-texture-sun-elevation/README.md‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,15 @@ dual-elevation diptych (8° | 55°) so failure (identical panels) is visible at
3939
thumbnail scale. Layer 1 still holds: `view_transform='Standard'`, designed
4040
terracotta materials, chosen camera, no helpers in frame.
4141

42+
## Framing deviation
43+
44+
The hero is the sky itself — a world contract, not an object on the stage.
45+
The silhouette matte can only measure the cone reference props (0.369x /
46+
0.489y), so the out-of-band number is a measurement artifact, not the
47+
composition; if ever wired to `examples/gallery_framing.py`, this example
48+
reports with `deviation="world-contract subject; matte sees only the cone
49+
props"` rather than enforcing.
50+
4251
## Run
4352

4453
```bash

‎examples/vse-cut-list/README.md‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,13 @@ are the genuine sequencer output (evidence); only the bay around them is
9393
staged (presentation). Rendered locally with EEVEE (GPU host); the checks
9494
and `--check-pixels` need no GPU (Cycles CPU).
9595

96+
## Framing measurement
97+
98+
The gallery still renders from the dedicated `Bay` scene (camera `BayCam`),
99+
not `bpy.context.scene` — a framing measurement with
100+
`examples/gallery_framing.py` must be handed that (scene, camera) pair
101+
explicitly.
102+
96103
## Run
97104

98105
```bash

‎examples/wave-displace/README.md‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,14 @@ the flat grid gained the expected Z span (the write actually landed) and that **
1111
vertex matches the closed-form wave, so a stride or interleave bug in the flat buffer
1212
cannot hide behind a lucky probe.
1313

14+
## Framing deviation
15+
16+
Edge-to-edge field — the displaced sheet fills the frame and crops at the left,
17+
right, and bottom edges so the wave reads as a surface, not an object on a
18+
stage (measured fill 1.000x/0.817y with edge touch on three sides). If wired
19+
to `examples/gallery_framing.py`, call it with
20+
`deviation="edge-to-edge wave field; the fill is the point"`.
21+
1422
## Run
1523

1624
```bash

0 commit comments

Comments
 (0)