<feed xmlns='http://www.w3.org/2005/Atom'>
<title>demo.git/src/tests/assets, branch main</title>
<subtitle>Vide-coded 64k demo system</subtitle>
<id>https://git.taar-o.com/demo.git/atom?h=main</id>
<link rel='self' href='https://git.taar-o.com/demo.git/atom?h=main'/>
<link rel='alternate' type='text/html' href='https://git.taar-o.com/demo.git/'/>
<updated>2026-03-08T08:38:43Z</updated>
<entry>
<title>fix: Update tests to use new asset manifest</title>
<updated>2026-03-08T08:38:43Z</updated>
<author>
<name>skal</name>
<email>pascal.massimino@gmail.com</email>
</author>
<published>2026-03-08T08:38:43Z</published>
<link rel='alternate' type='text/html' href='https://git.taar-o.com/demo.git/commit/?id=fa7d2d7f3aa40d581ca2ad97e39fe944769ee5a3'/>
<id>urn:sha1:fa7d2d7f3aa40d581ca2ad97e39fe944769ee5a3</id>
<content type='text'>
- Updated 'src/tests/gpu/test_shader_composer.cc' to use 'ASSET_TEST_WGSL' and simplified the test.
- Overhauled 'src/tests/assets/test_assets.cc' to align with the new, more concise test asset manifest, resolving compilation errors and improving test focus.
</content>
</entry>
<entry>
<title>test: remove obsolete test_sequence.cc</title>
<updated>2026-03-05T23:31:52Z</updated>
<author>
<name>skal</name>
<email>pascal.massimino@gmail.com</email>
</author>
<published>2026-03-05T23:31:52Z</published>
<link rel='alternate' type='text/html' href='https://git.taar-o.com/demo.git/commit/?id=65054e545d4748a04cd29dd1589740809a68c792'/>
<id>urn:sha1:65054e545d4748a04cd29dd1589740809a68c792</id>
<content type='text'>
</content>
</entry>
<entry>
<title>test(assets): add MP3 asset type test (TEST_MP3/ASSET_TEST_MP3)</title>
<updated>2026-03-03T08:11:27Z</updated>
<author>
<name>skal</name>
<email>pascal.massimino@gmail.com</email>
</author>
<published>2026-03-03T08:11:27Z</published>
<link rel='alternate' type='text/html' href='https://git.taar-o.com/demo.git/commit/?id=e0be1ff83f6da41f37ac806428bcb0ce7f0e4b32'/>
<id>urn:sha1:e0be1ff83f6da41f37ac806428bcb0ce7f0e4b32</id>
<content type='text'>
Adds a minimal test.mp3 fixture to the test workspace and verifies
GetAssetType returns AssetType::MP3 and GetAsset returns non-null data.

handoff(Gemini): MP3 asset test added, 34/34 tests passing.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>style: Apply clang-format</title>
<updated>2026-02-17T07:16:03Z</updated>
<author>
<name>skal</name>
<email>pascal.massimino@gmail.com</email>
</author>
<published>2026-02-17T07:16:03Z</published>
<link rel='alternate' type='text/html' href='https://git.taar-o.com/demo.git/commit/?id=64f977f6fbedf75d5edbc3963e002b593c8428d8'/>
<id>urn:sha1:64f977f6fbedf75d5edbc3963e002b593c8428d8</id>
<content type='text'>
</content>
</entry>
<entry>
<title>fix: calculate beat_phase for FlashEffect and refactor uniforms</title>
<updated>2026-02-16T16:04:41Z</updated>
<author>
<name>skal</name>
<email>pascal.massimino@gmail.com</email>
</author>
<published>2026-02-16T16:04:41Z</published>
<link rel='alternate' type='text/html' href='https://git.taar-o.com/demo.git/commit/?id=c79ebff06ae74135c5f67ecc01d5bb55aeb5eda9'/>
<id>urn:sha1:c79ebff06ae74135c5f67ecc01d5bb55aeb5eda9</id>
<content type='text'>
- seq_compiler.py: Calculate beat_phase from beat_time (was hardcoded 0.0f)
- Refactor: Replace CommonPostProcessUniforms with UniformsSequenceParams
- Remove duplicate struct definition in post_process_helper.h
- Update all CNN effects and tests to use unified uniform struct
- Fixes FlashEffect showing solid white instead of flashing to beat

Co-Authored-By: Claude Sonnet 4.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>feat(sequence): complete v2 migration with DAG-based routing</title>
<updated>2026-02-16T10:54:46Z</updated>
<author>
<name>skal</name>
<email>pascal.massimino@gmail.com</email>
</author>
<published>2026-02-16T10:54:46Z</published>
<link rel='alternate' type='text/html' href='https://git.taar-o.com/demo.git/commit/?id=af5d0e4c3a6cb773a4fb51ac32f4c33a7f8d8224'/>
<id>urn:sha1:af5d0e4c3a6cb773a4fb51ac32f4c33a7f8d8224</id>
<content type='text'>
Phase 4 complete: V1 system removed, v2 fully operational.

Architecture Changes:
- Explicit Node system with typed buffers (u8x4_norm, f32x4, depth24)
- DAG effect routing with multi-input/multi-output support
- Python compiler (seq_compiler_v2.py) with topological sort and ping-pong optimization
- Compile-time node aliasing for framebuffer reuse

V1 Removal (~4KB):
- Deleted effect.h/cc base classes (1.4KB)
- Deleted 19 v1 effect pairs: heptagon, particles, passthrough, gaussian_blur,
  solarize, scene1, chroma_aberration, vignette, hybrid_3d, flash_cube,
  theme_modulation, fade, flash, circle_mask, rotating_cube, sdf_test,
  distort, moving_ellipse, particle_spray (2.7KB)

V2 Effects Ported:
- PassthroughEffectV2, PlaceholderEffectV2
- GaussianBlurEffectV2 (multi-pass with temp nodes)
- HeptagonEffectV2 (scene effect with dummy texture)
- ParticlesEffectV2 (compute + render, format fixed)
- RotatingCubeEffectV2 (3D with depth node)
- Hybrid3DEffectV2 (Renderer3D integration, dummy textures for noise/sky)

Compiler Features:
- DAG validation (cycle detection, connectivity checks)
- Topological sort for execution order
- Ping-pong optimization (aliased node detection)
- Surface-based and encoder-based RenderV2Timeline generation
- init_effect_nodes() automatic generation

Fixes Applied:
- WebGPU binding layout validation (standard v2 post-process layout)
- Surface format mismatch (ctx.format for blit, RGBA8Unorm for framebuffers)
- Depth attachment compatibility (removed forced depth from gpu_create_render_pass)
- Renderer3D texture initialization (created dummy 1x1 white textures)
- ParticlesEffectV2 format (changed from ctx.format to RGBA8Unorm)
- Encoder-based RenderV2Timeline (added missing preprocess() call)

Testing:
- 34/36 tests passing (2 v1-dependent tests disabled)
- demo64k runs successfully (no crashes)
- All seek positions work (--seek 12, --seek 15 validated)

Documentation:
- Updated PROJECT_CONTEXT.md (v2 status, reference to SEQUENCE_v2.md)
- Added completion entry to COMPLETED.md

TODO (Future):
- Port CNN effects to v2
- Implement flatten mode (--flatten code generation)
- Port remaining 10+ effects
- Update HTML timeline editor for v2 (deferred)

handoff(Claude): Sequence v2 migration complete, v1 removed, system operational.
Phase 5 (editor) deferred per user preference.

Co-Authored-By: Claude Sonnet 4.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>feat: implement beat-based timing system</title>
<updated>2026-02-11T23:30:56Z</updated>
<author>
<name>skal</name>
<email>pascal.massimino@gmail.com</email>
</author>
<published>2026-02-11T23:30:56Z</published>
<link rel='alternate' type='text/html' href='https://git.taar-o.com/demo.git/commit/?id=89c46872127aaede53362f64cdc3fe9b3164650b'/>
<id>urn:sha1:89c46872127aaede53362f64cdc3fe9b3164650b</id>
<content type='text'>
BREAKING CHANGE: Timeline format now uses beats as default unit

## Core Changes

**Uniform Structure (32 bytes maintained):**
- Added `beat_time` (absolute beats for musical animation)
- Added `beat_phase` (fractional 0-1 for smooth oscillation)
- Renamed `beat` → `beat_phase`
- Kept `time` (physical seconds, tempo-independent)

**Seq Compiler:**
- Default: all numbers are beats (e.g., `5`, `16.5`)
- Explicit seconds: `2.5s` suffix
- Explicit beats: `5b` suffix (optional clarity)

**Runtime:**
- Effects receive both physical time and beat time
- Variable tempo affects audio only (visual uses physical time)
- Beat calculation from audio time: `beat_time = audio_time * BPM / 60`

## Migration

- Existing timelines: converted with explicit 's' suffix
- New content: use beat notation (musical alignment)
- Backward compatible via explicit notation

## Benefits

- Musical alignment: sequences sync to bars/beats
- BPM independence: timing preserved on BPM changes
- Shader capabilities: animate to musical time
- Clean separation: tempo scaling vs. visual rendering

## Testing

- Build: ✅ Complete
- Tests: ✅ 34/36 passing (94%)
- Demo: ✅ Ready

handoff(Claude): Beat-based timing system implemented. Variable tempo
only affects audio sample triggering. Visual effects use physical_time
(constant) and beat_time (musical). Shaders can now animate to beats.

Co-Authored-By: Claude Sonnet 4.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>refactor: Simplify effect render API and fix uniform initialization</title>
<updated>2026-02-11T10:34:08Z</updated>
<author>
<name>skal</name>
<email>pascal.massimino@gmail.com</email>
</author>
<published>2026-02-11T10:34:08Z</published>
<link rel='alternate' type='text/html' href='https://git.taar-o.com/demo.git/commit/?id=d378da77eec4d506bc01e4c08c38644d72969cc7'/>
<id>urn:sha1:d378da77eec4d506bc01e4c08c38644d72969cc7</id>
<content type='text'>
Root cause: Uniform buffers created but not initialized before bind group
creation, causing undefined UV coordinates in circle_mask_compute.wgsl.

Changes:
- Add get_common_uniforms() helper to Effect base class
- Refactor render()/compute() signatures: 5 params → CommonPostProcessUniforms&amp;
- Fix uninitialized uniforms in CircleMaskEffect and CNNEffect
- Update all 19 effect implementations and headers
- Fix WGSL syntax error in FlashEffect (u.audio_intensity → audio_intensity)
- Update test files (test_sequence.cc)

Benefits:
- Cleaner API: construct uniforms once per frame, reuse across effects
- More maintainable: CommonPostProcessUniforms changes need no call site updates
- Fixes UV coordinate bug in circle_mask_compute.wgsl

All 36 tests passing (100%)

handoff(Claude): Effect API refactor complete
</content>
</entry>
<entry>
<title>refactor: Reorganize tests into subsystem subdirectories</title>
<updated>2026-02-09T19:27:04Z</updated>
<author>
<name>skal</name>
<email>pascal.massimino@gmail.com</email>
</author>
<published>2026-02-09T19:27:04Z</published>
<link rel='alternate' type='text/html' href='https://git.taar-o.com/demo.git/commit/?id=eff8d43479e7704df65fae2a80eefa787213f502'/>
<id>urn:sha1:eff8d43479e7704df65fae2a80eefa787213f502</id>
<content type='text'>
Restructured test suite for better organization and targeted testing:

**Structure:**
- src/tests/audio/    - 15 audio system tests
- src/tests/gpu/      - 12 GPU/shader tests
- src/tests/3d/       - 6 3D rendering tests
- src/tests/assets/   - 2 asset system tests
- src/tests/util/     - 3 utility tests
- src/tests/common/   - 3 shared test helpers
- src/tests/scripts/  - 2 bash test scripts (moved conceptually, not physically)

**CMake changes:**
- Updated add_demo_test macro to accept LABEL parameter
- Applied CTest labels to all 36 tests for subsystem filtering
- Updated all test file paths in CMakeLists.txt
- Fixed common helper paths (webgpu_test_fixture, etc.)
- Added custom targets for subsystem testing:
  - run_audio_tests, run_gpu_tests, run_3d_tests
  - run_assets_tests, run_util_tests, run_all_tests

**Include path updates:**
- Fixed relative includes in GPU tests to reference ../common/

**Documentation:**
- Updated doc/HOWTO.md with subsystem test commands
- Updated doc/CONTRIBUTING.md with new test organization
- Updated scripts/check_all.sh to reflect new structure

**Verification:**
- All 36 tests passing (100%)
- ctest -L &lt;subsystem&gt; filters work correctly
- make run_&lt;subsystem&gt;_tests targets functional
- scripts/check_all.sh passes

Backward compatible: make test and ctest continue to work unchanged.

handoff(Gemini): Test reorganization complete. 36/36 tests passing.
</content>
</entry>
</feed>
