2026-04-16 - 2026-07-16
Overview
73 issues closed from 1 user
Closed
#385 WASM: IDBFS not exported to runtime under Emscripten 5.0.0 — /save mount throws ReferenceError
Closed
#382 [Tooling] "Open in Playground" links from doc snippets — url-encoded short, raw-URL fetch long — with tag/commit version pinning
Closed
#383 Headless Timer epoch uses wall clock (runtime), not simulation_time — first fire under step() is nondeterministic
Closed
#384 make wasm full-game web build wears the playground code-panel shell (shell.html) instead of shell_game.html
Closed
#378 [Bugfix] Embedded interpreter's filesystem encoding is ASCII: open() cannot read a UTF-8 file
Closed
#379 [Bugfix] A transition into the first scene leaves mcrfpy.current_scene as None for the whole transition
Closed
#373 [Bugfix] A GC'd Python subclass wrapper resurrects as its base type (residual gap from #369)
Closed
#377 [Bugfix] Only UICollection.append maintains the parent link; insert/extend/setitem/slice do not
Closed
#341 get_metrics() draw_calls / ui_elements / render counters read 0 in windowed builds
Closed
#376 [Bugfix] Grid layer property setters (visible, z_index) don't invalidate the render cache
Closed
#372 [Bugfix] tests/demo/ is rotted and unrunnable — screens/base.py calls mcrfpy.sceneUI, removed long ago; demos are not in the test suite
Closed
#356 [Bugfix] Doc generator/stub generator miss module-level dynamic attributes (current_scene, scenes)
Closed
#369 [Bugfix] .parent allocates a fresh wrapper on every read, so child.parent is parent is always False
Closed
#350 [Bugfix] Headless mcrfpy.step() bypasses updatePythonScenes() — scene.update() and lifecycle callbacks never fire in headless tests
Closed
#375 [Bugfix] DijkstraMap.path_from() returns the path reversed; step_from() returns a non-adjacent cell (teleport)
Closed
#355 [Bugfix] Grid cell callbacks, child clicks, and cell hover all dead since #252 GridView unification
Closed
#361 [Refactor] Complete #252: GridData becomes a public data type, GridView is the only drawable, Grid becomes an alias
Closed
#358 [Bugfix] ImGui scene explorer shows no children/entities for grids (UIGRIDVIEW hits default: break)
Closed
#360 [Bugfix] Grid children get grid-world pixel coords in click_at, Frame children get frame-local — inconsistent
Closed
#359 [Bugfix] Shared-data grid path is unwired: Grid(grid=...) never sets owning_view, and _GridData.view is always None
Closed
#363 [Bugfix] Cursor leaving the window never fires on_cell_exit; hovered_cell stays stuck
Closed
#366 [Refactor] Dead derived_type()==UIGRID gate remains in UICollection::repr — grids counted as "other"
Closed
#365 [Bugfix] Stale last_clicked_cell can be dispatched for a GridView with no grid data
Closed
#367 [Bugfix] Losing window focus strands hover state the same way a window-leave did (#363's sibling)
Closed
#368 [Bugfix] Frame(cache_subtree=True) silently freezes its subtree's content: render_dirty is a write-once latch, so markContentDirty never propagates
Closed
#357 [Bugfix] mcrfpy.find()/findAll() never search entities inside grids (UIGRID gate dead since #252)
Closed
#362 [Bugfix] GridData::views leaks expired weak_ptrs — ~UIGridView never unregisters
Closed
#370 [Bugfix] Grid.center_camera() and Grid.size = ... are silent no-ops (they write to the ghost camera)
Closed
#371 [Bugfix] Shader uniform binding reads a GridView wrapper as a _GridData wrapper (type confusion)
Closed
#364 [Bugfix] Grid children's dirty propagation dead-ends at the internal UIGrid, never reaching the GridView or its caching ancestors
Closed
#282 [Minor Feature] Install modern Clang for improved TSan and fuzzing
Closed
#333 Eliminate walkable/transparent duplication between GridData and TCODMap
Closed
#354 [Minor Feature] The Crucible — headless wall-clock microbenchmark for cross-version A/B
Closed
#332 GridData SoA refactor: dense uint8 planes for walkable/transparent
Closed
#353 [Bugfix] The Gauntlet can OOM / hard-lock the machine — GRID TITAN ramps grid side unbounded
Closed
#351 [Bugfix] UIGridView::render() has no clean-state early-out — idle grid clears+redraws its RenderTexture every frame
Closed
#334 Buffer protocol for DiscreteMap (np.asarray zero-copy)
Closed
#335 Buffer protocol / numpy views for ColorLayer and TileLayer
Closed
#145 TexturePool with power-of-2 bucketing for RenderTexture reuse
Closed
#117 Memory Pool for Entities
Closed
#255 Tracking down performance improvement opportunities
Closed
#344 [Performance] on_key rebuilds Key/InputState enum members on every keypress
Closed
#342 [Performance] Animation property dispatch resolves property name by strcmp cascade every frame
Closed
#343 [Performance] PyScene::update does GetAttrString("update") every frame even when unoverridden
Closed
#348 [Performance] GridView shim's get_grid re-allocates a Grid wrapper + weakref on every call (100% cache miss)
Closed
#345 [Performance] Add profiling build target + document native profiler workflow (Callgrind + perf)
Closed
#331 Fast path for .pos and similar getters: stop importing mcrfpy per property read
Closed
#327 [1.0 Decision] Document the threading contract: mcrfpy.lock() is the rule for off-main-thread access
Closed
#328 [1.0 Decision] Bulk-edit convention for future array/buffer APIs (edit() context manager vs explicit sync)
Closed
#330 [1.0 Docs] State that subinterpreters are out of scope for 1.x compatibility
Closed
#340 The Gauntlet: interactive on-screen stress benchmark with baseline recording
Closed
#326 [1.0 Decision] Color/Vector copy semantics: value types vs write-through proxies
Closed
#329 grid.entities[i] is O(n): std::list + std::advance per indexed access
Closed
#339 [Test] MCP label validation — safe to close
Closed
#324 [Bugfix] UBSan: Texture.hsl_shift(nan) -> nan->unsigned char cast (PyTexture.cpp:458-460)
Closed
#325 [Bugfix] UBSan: Vector with inf component -> inf->long cast (PyVector.cpp:610-611)
Closed
#323 [Bugfix] UBSan: SoundBuffer.pitch_shift(nan) -> nan->unsigned long cast (AudioEffects.cpp:27)
Closed
#322 [Bugfix] WangSet.terrain_enum() calls Python with a pending error -> _PyErr_Occurred assertion / abort
Closed
#321 [Bugfix] bad-free in GridData::computeFOV / ~GridData via ColorLayer.draw_fov (ASan)
Closed
#312 [Minor Feature] Extend fuzz coverage to remaining public API surface
Closed
#320 [Bugfix] Caption constructor positional signature disagrees with its frozen docstring
Closed
#317 [Bugfix] automation.scroll() ignores the x-coordinate of its position argument
Closed
#318 GridView.texture getter always returns None (unimplemented)
Closed
#319 [Bugfix] Entity.visible_entities(radius=None) raises TypeError instead of applying the default
Closed
#316 Sparse perspective writeback in UIEntity::updateVisibility (Phase 5.2 finding)
Closed
#314 [Documentation] API audit follow-through: close the gaps from docs/api-audit-2026-04.md
Closed
#313 [Refactoring] Migrate UIEntity::grid from shared_ptr<UIGrid> to shared_ptr<GridData>
Closed
#315 Behavior pathfinding architecture — support A*↔Dijkstra spectrum, multi-root, and custom heuristics
Closed
#294 Entity.gridstate as DiscreteMap reference
Closed
#311 DijkstraMap pathfinding accepts out-of-bounds coords and aborts via TCOD assertion
Closed
#309 Caption numeric setters cast negative floats to unsigned int (UBSan)
Closed
#310 compute_fov loads out-of-range int into TCOD_fov_algorithm_t enum (UBSan)
Closed
#283 [Major Feature] Coverage-guided fuzz harness for Python API (libFuzzer + ASan)
80 issues created by 1 user
Opened
#312 [Minor Feature] Extend fuzz coverage to remaining public API surface
Opened
#313 [Refactoring] Migrate UIEntity::grid from shared_ptr<UIGrid> to shared_ptr<GridData>
Opened
#314 [Documentation] API audit follow-through: close the gaps from docs/api-audit-2026-04.md
Opened
#315 Behavior pathfinding architecture — support A*↔Dijkstra spectrum, multi-root, and custom heuristics
Opened
#316 Sparse perspective writeback in UIEntity::updateVisibility (Phase 5.2 finding)
Opened
#317 [Bugfix] automation.scroll() ignores the x-coordinate of its position argument
Opened
#318 GridView.texture getter always returns None (unimplemented)
Opened
#319 [Bugfix] Entity.visible_entities(radius=None) raises TypeError instead of applying the default
Opened
#320 [Bugfix] Caption constructor positional signature disagrees with its frozen docstring
Opened
#321 [Bugfix] bad-free in GridData::computeFOV / ~GridData via ColorLayer.draw_fov (ASan)
Opened
#322 [Bugfix] WangSet.terrain_enum() calls Python with a pending error -> _PyErr_Occurred assertion / abort
Opened
#323 [Bugfix] UBSan: SoundBuffer.pitch_shift(nan) -> nan->unsigned long cast (AudioEffects.cpp:27)
Opened
#324 [Bugfix] UBSan: Texture.hsl_shift(nan) -> nan->unsigned char cast (PyTexture.cpp:458-460)
Opened
#325 [Bugfix] UBSan: Vector with inf component -> inf->long cast (PyVector.cpp:610-611)
Opened
#326 [1.0 Decision] Color/Vector copy semantics: value types vs write-through proxies
Opened
#327 [1.0 Decision] Document the threading contract: mcrfpy.lock() is the rule for off-main-thread access
Opened
#329 grid.entities[i] is O(n): std::list + std::advance per indexed access
Opened
#328 [1.0 Decision] Bulk-edit convention for future array/buffer APIs (edit() context manager vs explicit sync)
Opened
#331 Fast path for .pos and similar getters: stop importing mcrfpy per property read
Opened
#330 [1.0 Docs] State that subinterpreters are out of scope for 1.x compatibility
Opened
#332 GridData SoA refactor: dense uint8 planes for walkable/transparent
Opened
#334 Buffer protocol for DiscreteMap (np.asarray zero-copy)
Opened
#333 Eliminate walkable/transparent duplication between GridData and TCODMap
Opened
#336 Free-threading (3.14t) hardening: Py_mod_gil, UIEntity::pyobject race, unlocked registries
Opened
#335 Buffer protocol / numpy views for ColorLayer and TileLayer
Opened
#337 numpy availability strategy: bundle, side-venv, or scientific package variant
Opened
#338 UIDrawable per-instance memory diet (always-embedded render_sprite, duplicate RenderTextures, string members)
Opened
#339 [Test] MCP label validation — safe to close
Opened
#340 The Gauntlet: interactive on-screen stress benchmark with baseline recording
Opened
#341 get_metrics() draw_calls / ui_elements / render counters read 0 in windowed builds
Opened
#342 [Performance] Animation property dispatch resolves property name by strcmp cascade every frame
Opened
#343 [Performance] PyScene::update does GetAttrString("update") every frame even when unoverridden
Opened
#344 [Performance] on_key rebuilds Key/InputState enum members on every keypress
Opened
#345 [Performance] Add profiling build target + document native profiler workflow (Callgrind + perf)
Opened
#346 [Performance] Document web-build (WASM) profiling workflow — DevTools + emcc, sibling to #345
Opened
#347 [Rendering] Investigate renderer parity: SFML (desktop) vs SDL2/WebGL (web) — shaders & pixel-perfect output
Opened
#348 [Performance] GridView shim's get_grid re-allocates a Grid wrapper + weakref on every call (100% cache miss)
Opened
#349 [Major Feature] Hybrid Scene Serialization — declarative scene-graph snapshot (test oracle + save/load) with raster escape-hatch
Opened
#350 [Bugfix] Headless mcrfpy.step() bypasses updatePythonScenes() — scene.update() and lifecycle callbacks never fire in headless tests
Opened
#351 [Bugfix] UIGridView::render() has no clean-state early-out — idle grid clears+redraws its RenderTexture every frame
Opened
#352 [Refactoring] Let perspective-enabled grids take the render early-out (track FOV/perspective_map changes in content-generation)
Opened
#353 [Bugfix] The Gauntlet can OOM / hard-lock the machine — GRID TITAN ramps grid side unbounded
Opened
#354 [Minor Feature] The Crucible — headless wall-clock microbenchmark for cross-version A/B
Opened
#355 [Bugfix] Grid cell callbacks, child clicks, and cell hover all dead since #252 GridView unification
Opened
#356 [Bugfix] Doc generator/stub generator miss module-level dynamic attributes (current_scene, scenes)
Opened
#357 [Bugfix] mcrfpy.find()/findAll() never search entities inside grids (UIGRID gate dead since #252)
Opened
#358 [Bugfix] ImGui scene explorer shows no children/entities for grids (UIGRIDVIEW hits default: break)
Opened
#359 [Bugfix] Shared-data grid path is unwired: Grid(grid=...) never sets owning_view, and _GridData.view is always None
Opened
#360 [Bugfix] Grid children get grid-world pixel coords in click_at, Frame children get frame-local — inconsistent
Opened
#361 [Refactor] Complete #252: GridData becomes a public data type, GridView is the only drawable, Grid becomes an alias
Opened
#362 [Bugfix] GridData::views leaks expired weak_ptrs — ~UIGridView never unregisters
Opened
#363 [Bugfix] Cursor leaving the window never fires on_cell_exit; hovered_cell stays stuck
Opened
#364 [Bugfix] Grid children's dirty propagation dead-ends at the internal UIGrid, never reaching the GridView or its caching ancestors
Opened
#365 [Bugfix] Stale last_clicked_cell can be dispatched for a GridView with no grid data
Opened
#366 [Refactor] Dead derived_type()==UIGRID gate remains in UICollection::repr — grids counted as "other"
Opened
#367 [Bugfix] Losing window focus strands hover state the same way a window-leave did (#363's sibling)
Opened
#368 [Bugfix] Frame(cache_subtree=True) silently freezes its subtree's content: render_dirty is a write-once latch, so markContentDirty never propagates
Opened
#369 [Bugfix] .parent allocates a fresh wrapper on every read, so child.parent is parent is always False
Opened
#370 [Bugfix] Grid.center_camera() and Grid.size = ... are silent no-ops (they write to the ghost camera)
Opened
#371 [Bugfix] Shader uniform binding reads a GridView wrapper as a _GridData wrapper (type confusion)
Opened
#372 [Bugfix] tests/demo/ is rotted and unrunnable — screens/base.py calls mcrfpy.sceneUI, removed long ago; demos are not in the test suite
Opened
#373 [Bugfix] A GC'd Python subclass wrapper resurrects as its base type (residual gap from #369)
Opened
#374 [Refactoring] Adopt or retire the 19 orphan scripts under tests/demo/screens/
Opened
#375 [Bugfix] DijkstraMap.path_from() returns the path reversed; step_from() returns a non-adjacent cell (teleport)
Opened
#376 [Bugfix] Grid layer property setters (visible, z_index) don't invalidate the render cache
Opened
#377 [Bugfix] Only UICollection.append maintains the parent link; insert/extend/setitem/slice do not
Opened
#378 [Bugfix] Embedded interpreter's filesystem encoding is ASCII: open() cannot read a UTF-8 file
Opened
#379 [Bugfix] A transition into the first scene leaves mcrfpy.current_scene as None for the whole transition
Opened
#380 Template example programs (templates/*/) are shipped but gated by nothing
Opened
#381 [Tooling] Deterministic snippet screenshots as a visual-regression oracle (rendered into the doc-site repo, not the engine)
Opened
#382 [Tooling] "Open in Playground" links from doc snippets — url-encoded short, raw-URL fetch long — with tag/commit version pinning
Opened
#383 Headless Timer epoch uses wall clock (runtime), not simulation_time — first fire under step() is nondeterministic
Opened
#384 make wasm full-game web build wears the playground code-panel shell (shell.html) instead of shell_game.html
Opened
#385 WASM: IDBFS not exported to runtime under Emscripten 5.0.0 — /save mount throws ReferenceError
Opened
#386 [DX] make deploy-playground — copy build-playground/ into the site checkout
Opened
#387 [Epic] Web deployment parity & divergence-testing sprint
Opened
#388 [Keystone] Cross-backend screenshot diff harness (desktop-headless oracle vs web canvas)
Opened
#389 [Testing] Validate SDL-event → SFML-enum input parity (asserted "Full", never tested)
Opened
#390 [Hardening] SDL2Renderer: Fail-Early on shader/program compile, GL context loss, canvas resize
Opened
#391 [Docs] Promote the Web Build Constraints table into an audited parity matrix with test-coverage column
15 unresolved conversations
Open
#239
Playground: Automated WASM testing infrastructure with headless browser
Open
#62
Multiple Windows
Open
#54
Jupyter Notebook Interface
Open
#70
Package mcrfpy without embedded interpreter
Open
#156
Turn-based LLM Agent Orchestration
Open
#55
McRogueFace as Agent Simulation Environment
Open
#124
Grid Point Animation
Open
#220
Secondary Concurrency Model: Subinterpreter Support
Open
#154
Grounded Multi-Agent Testbed: LLM Agents in Discrete Simulated Environments
Open
#152
Sparse Grid Layers
Open
#46
subinterpreter tests
Open
#45
Accessibility modes and demos
Open
#53
Alternative Input Methods
Open
#248
[7DRL Prep] Crypt of Sokoban Remaster
Open
#167
[Demo Target] r/roguelikedev Tutorial Series Demo Game