User reports all 34 cells classified as 미인식 with score 0.00 even
when the grid was correctly cropped. Multiple compounding issues:
1. _is_empty required mean<60 (dark) AND std<14. HDR/bright captures
produce pinkish empty slots with mean ~150-180, so even empty cells
fell through to template matching. Drop the mean check; uniformity
alone (std<18 grayscale, std<22 per-channel) is the real signal.
2. Score 0.00 across the board strongly suggests templates list was
empty (only path that returns exactly 0.0). Track per-bucket load
counts (slabs_ok/fail, artifacts_ok/fail) and surface them in the
GUI status bar so a CDN failure is immediately visible. Currently
no signal at all on download failure.
3. min_score 0.55 was tuned against simulator-clean renders. Real game
captures have decorative cell borders, stack-count badges in
corners, HDR shader effects. Lower to 0.35 and inset cell crops by
16% on each side before matching to skip the decorative frame.
4. Add 디버그 저장 button + dump_debug() that saves screenshot.png,
bbox_crop.png, cells/<row>-<col>.png, and report.txt with top-3
matches per cell to %LOCALAPPDATA%/sephiria_inv/debug/<timestamp>/.
Lets us iterate on tuning from real captures without round-tripping
raw screenshots through chat each time.
Python 3.7's bundled Tcl/Tk on Windows is UCS-2 only and refuses
characters above U+FFFF. The button labels contained game-controller,
desktop, folder and refresh emojis (U+1F3AE, U+1F5A5, U+1F4C2, U+1F501),
so App.__init__ raised TclError and gui.main caught it, exited 1, and
the user saw 'nothing happened'.
Replace with plain Korean text. Per CLAUDE.md these emojis should not
have been added in the first place.
v0.3.3 wrapper only logged once it reached _main(). User reports CMD
window flashes shut and no log file created — meaning Python likely
never reached our code. Two fixes:
1. Move first log write to module top (before any project import) and
write to BOTH the exe directory AND %LOCALAPPDATA%/sephiria_inv/.
Either log existing proves Python booted; neither existing means
PyInstaller bootloader itself failed.
2. Add run-debug.bat that runs the exe with stdout/stderr captured to
sephiria_inv_console.log and pauses, so the window does not close
before the user can read it.
--noconsole exes silently exit on import-time errors, so when v0.3.2
crashed during startup the user just saw nothing happen. This wrapper:
- Catches BaseException at module-import and main() level
- Writes traceback to %LOCALAPPDATA%/sephiria_inv/startup.log
- Pops a Tk messagebox-equivalent window with the traceback
- Falls back gracefully if Tk itself is unavailable
Also build with --console (no --noconsole) so prints/tracebacks are
visible in real time. Once we know what is failing we can re-enable
windowed mode.
ScreenshotFrame previously read master.master.slot_var, but
master is the Notebook and master.master is the inner padding Frame
inside App._build, not App. Use winfo_toplevel() so we always reach
the App where slot_var lives.
Reported as: AttributeError: 'Frame' object has no attribute 'slot_var'
at gui.py:401 during run.py startup.
- window_capture.py: enumerate top-level windows (pygetwindow) and
capture a specific one via PrintWindow PW_RENDERFULLCONTENT (works
on non-focused windows). Linux falls back to mss region grab.
- recognizer.py: replace MAE matcher with NCC over numpy vectors.
Each rotatable slab generates 4 templates (0/90/180/270). Adds 248
artifact templates and an empty-cell heuristic (low mean/std-dev).
Cells below confidence floor are tagged "unknown" — likely merged
"?" boxes.
- gui.py: new ScreenshotFrame with [게임 창 선택] button → window
picker dialog → bbox crop → recognize → editable preview grid with
per-cell CellEditor that handles slab / artifact / merged(?) / empty.
Merged cells let user pick which two slabs got combined + a level.
- artifacts.py + bundled _artifacts.json (248 entries from
WhiteDog1004/sephiria) for matching and rendering.
- renderer.py: factored CDN fetch into _fetch_image; added
fetch_artifact_image().
- requirements.txt: + numpy, pygetwindow (Win), pywin32 (Win).
- docker-build-cmd.sh: upgrade PyInstaller to 5.x inside cdrx
container so numpy DLL manifest reads work.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- New ScreenshotFrame: capture screen / load PNG, two-click bbox,
threaded template matching, editable preview grid for corrections
- ManualFrame kept as second tab for users who prefer typing counts
- capture.py: screen grab via mss (cross-platform)
- requirements: add mss>=6.0 for screen capture support
Closes the gap from v0.1.0 where users had to manually count
every slab — now they aim, click two corners, and edit any
mis-recognized cell.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Slab catalog and effect handlers ported from WhiteDog1004/sephiria
- Hill-climbing solver maximizes effect sum on slab-occupied cells
- PIL renderer outputs PNG with effects overlay; downloads + caches slab
images from img.sephiria.wiki on demand
- Tkinter GUI for picking slabs by tier; CLI also available
- Screenshot recognizer (template matching, beta)
- build.bat / build.sh for portable single-file builds via PyInstaller