Add missing files
Build / Do we need to build the application? (push) Failing after 4s
Build / Gradle builder (push) Skipped
Code style / Is there any Java source code to lint? (push) Failing after 2s
Code style / Code style linter (push) Skipped
CodeQL / Is there any code to analyze? (push) Successful in 5s
MD Lint / Markdown linter (push) Failing after 9s
Translations / Translations linter (push) Successful in 6s
CodeQL / Analyze (java) (push) Failing after 1m15s

This commit is contained in:
2026-09-24 22:14:52 +02:00
parent a4b9e4f770
commit 88c2fd34d4
292 changed files with 35041 additions and 0 deletions
+108
View File
@@ -0,0 +1,108 @@
# AGENTS.md
This file provides guidance to Codex (Codex.ai/code) when working with code in this repository.
Logisim-evolution is a Java 21 / Swing digital logic designer and simulator, built with Gradle.
## Commands
```bash
./gradlew run # build and launch the app
./gradlew build # full build + tests + checkstyle
./gradlew test # run tests (JUnit 5 / junit-jupiter)
./gradlew test --tests com.cburch.logisim.std.ttl.Ttl7493Test # single test class
./gradlew checkstyleMain # lint main sources (checkstyleTest for tests)
./gradlew shadowJar # fat jar -> build/libs/logisim-evolution-<ver>-all.jar
./gradlew createAll # platform installer(s) into build/dist (jpackage; host platform only)
./gradlew genFiles # run code generation only (needed before importing into Eclipse)
```
CI (`.github/workflows/build.yml`) runs `./gradlew build -x checkstyleMain -x checkstyleTest` on JDK 21
(temurin); style is checked separately (`checkstyle.yml`), and only on files the PR touches.
## Build-time code generation
`compileJava`/`compileTestJava` depend on `genFiles`, which runs `genBuildInfo`. That task writes
`com.cburch.logisim.generated.BuildInfo` (version, git branch/hash, build timestamp, URL) into
`build/generated/logisim/java` — a generated source root. Never edit it by hand; change
`gradle.properties` (`version`, `url`) instead.
`processResources` depends on `generateHelpSets`, which runs the separate `src/docgen/java` source set
(`com.cburch.logisim.docs.DocumentationGenerator`) over `src/main/doc/help-sets.xml` +
`src/main/resources/doc` to emit JavaHelp descriptors into `build/generated/documentation-resources`.
## Architecture
**Component model.** A component type is a `ComponentFactory`, in practice a subclass of
`InstanceFactory` (`com/cburch/logisim/instance/`), which supplies `paintInstance(InstancePainter)`,
`propagate(InstanceState)`, port/attribute declarations, and an optional `HdlGeneratorFactory` passed
to its constructor. Factories are stateless singletons (conventionally a `public static final FACTORY`
field); **all per-instance state lives in an `InstanceData` retrieved via
`InstanceState.getData()`/`setData()`** — never in factory fields. Values are read and written through
`InstanceState.getPortValue(port)` / `setPort(port, value, delay)` using `Value` and `BitWidth` from
`com/cburch/logisim/data/`.
**Libraries and registration.** Components are exposed as `Tool`s (usually `new AddTool(X.FACTORY)`)
grouped into a `Library` (e.g. `std/gates/GatesLibrary.java`); larger libraries (`ttl`, `io`, `soc`)
instead list `FactoryDescription` entries so tools are constructed lazily. All built-in libraries are
enumerated in `src/main/java/com/cburch/logisim/std/Builtin.java`. Every library, tool, and component
declares a `public static final String _ID`; **these IDs are serialized into `.circ` project files and must never
change** once released, or existing projects stop loading.
**Simulation.** `circuit/` holds the netlist and runtime: `Circuit`, `CircuitState` (per-circuit value
and component-data store, nested for subcircuits) and `Propagator`, which drives value propagation with
delays. `proj/Project` ties a loaded file to its simulator and GUI; `file/` handles `.circ`
load/save (`XmlWriter`, `Loader`); `gui/` is the Swing UI; `tools/` the toolbox and editing tools;
`comp/` the lower-level component/wire abstractions (`Component`, `ComponentFactory`, `EndData`).
`CircuitState` is itself an `InstanceData`, which is how subcircuit state nests.
**HDL / FPGA.** `fpga/` contains board models, design-rule checks, and the download/synthesis flow.
Components generate HDL by supplying an `HdlGeneratorFactory` (usually extending
`AbstractHdlGeneratorFactory` in `fpga/hdlgenerator/`), which declares ports, wires, parameters and
emits VHDL/Verilog; `InlinedHdlGeneratorFactory` is for components rendered inline. Passing `null` as
the generator means "no HDL support". `vhdl/` supports user-supplied VHDL components; `soc/` implements
the SoC library (RV32IM and Nios2 soft cores, SocBus, memory/PIO/VGA/DMA/JtagUart peripherals, plus
ELF loading and an assembler/disassembler).
**Localization.** Each package has a `Strings` class holding a
`LocaleManager("resources/logisim", "<bundle>")`, used as a static import `S`, with `S.get("key")` /
`S.getter("key")` (a `StringGetter` for lazily-localized labels). Bundles live in
`src/main/resources/resources/logisim/strings/<bundle>/<bundle>.properties` (English, the fallback) with
`<bundle>_<lang>.properties` siblings. A new language must also be added to
`resources/logisim/settings.properties`. Translation files are maintained with `trans-tool`; lines
prefixed `# ==> key =` mark untranslated keys.
## Conventions
- Code style is **Google Java Style** via Checkstyle (`google_checks.xml` shipped with the tool),
relaxed by `checkstyle-suppressions.xml` in the repo root — 2-space indent, and the codebase widely
uses the `final var` idiom. Keep the Checkstyle version in `build.gradle.kts` and
`.github/workflows/checkstyle.yml` in sync.
- Every source file carries the project's GPLv3 header comment block.
- Files are UTF-8, LF line endings, no trailing whitespace, and end with a newline
(`.pre-commit-config.yaml.dist` enforces this; copy it to `.pre-commit-config.yaml` to use).
- **CI enforces two PR requirements** (`changelog.yml`, `ticket.yml`): an entry in the topmost `@dev`
section of `CHANGES.md` crediting the author (`* Fixed the frobnicator (@nick).`), and a closing
reference to an existing open issue (`Closes #1234`) in the PR description. Opt out with
`NO_CHANGELOG_ENTRY` / `NO_CHANGELOG_AUTHOR_CREDIT` / `NO_TICKET` in the description.
- All work targets the `main` branch.
## Tests
Tests are JUnit 5 under `src/test/java`, mirroring the main package layout, many extending the shared
`com.cburch.logisim.TestBase`. Test components through their public `InstanceState`/port API rather
than private helpers. Logisim also has a runtime circuit-verification feature (Test Vectors) documented
in `docs/test_vector.md` — unrelated to the JUnit suite.
## Adding a TTL component
`docs/implementing_ttl_components.md` is the authoritative checklist. In short: extend
`AbstractTtlGate` in `std/ttl/` with data-sheet-accurate one-based physical pin numbers (logical ports
are zero-based after unused/power pins are dropped), implement `propagateTtl()`, then complete all
integration points in the same change — `FactoryDescription` in `TtlLibrary`, the `TTL<n>` keys in
`std.properties`, the entry in `resources/doc/en/html/libs/ttl/index.html`, and the `CHANGES.md` line.
## Further docs
`docs/developers.md` (build & contribute), `docs/style.md` (style setup), `docs/localization.md`,
`docs/implementing_ttl_components.md`, `docs/test_vector.md`, `docs/automatic_library_import.md`.
+73
View File
@@ -0,0 +1,73 @@
#!/usr/bin/env python3
"""Build runtime and packaging icons from the three editable SVG masters.
Requires rsvg-convert and ImageMagick. ICNS is assembled from PNG icon chunks,
so macOS package assets can be generated on Linux too.
"""
from __future__ import annotations
import shutil
import struct
import subprocess
from pathlib import Path
ROOT = Path(__file__).resolve().parent.parent
ART = ROOT / "artwork"
IMG = ROOT / "src/main/resources/resources/logisim/img"
SUPPORT = ROOT / "support/jpackage"
SIZES = (16, 32, 48, 64, 128, 256, 512)
def render(name: str, destination: Path, width: int) -> None:
destination.parent.mkdir(parents=True, exist_ok=True)
subprocess.run(
["rsvg-convert", "-w", str(width), "-o", str(destination), str(ART / name)],
check=True,
)
def icns(pngs: dict[int, Path], destination: Path) -> None:
chunks = []
for size, kind in ((16, b"icp4"), (32, b"icp5"), (64, b"icp6"),
(128, b"ic07"), (256, b"ic08"), (512, b"ic09")):
image = pngs[size].read_bytes()
chunks.append(kind + struct.pack(">I", len(image) + 8) + image)
body = b"".join(chunks)
destination.write_bytes(b"icns" + struct.pack(">I", len(body) + 8) + body)
def main() -> None:
app = {}
document = {}
for size in SIZES:
app[size] = IMG / f"logisim-revolution-icon-{size}.png"
document[size] = IMG / f"logisim-revolution-document-{size}.png"
render("logisim-revolution-mark.svg", app[size], size)
render("logisim-revolution-document.svg", document[size], size)
render("logisim-revolution-wordmark.svg", IMG / "logisim-revolution-logo.png", 900)
render("logisim-revolution-mark.svg",
ROOT / "src/main/resources/doc/img-guide/revolution-mark-24.png", 24)
brand = ROOT / "src/main/resources/resources/logisim/brand"
brand.mkdir(parents=True, exist_ok=True)
shutil.copyfile(ART / "logisim-revolution-mark.svg", brand / "logisim-revolution-mark.svg")
shutil.copyfile(app[128], SUPPORT / "linux/logisim-revolution-icon-128.png")
subprocess.run(
["magick", *map(str, (app[size] for size in (16, 32, 48, 64, 128, 256))),
str(SUPPORT / "windows/Logisim-Revolution.ico")],
check=True,
)
subprocess.run(
["magick", *map(str, (document[size] for size in (16, 32, 48, 64, 128, 256))),
str(SUPPORT / "windows/Logisim-Revolution-circ.ico")],
check=True,
)
icns(app, SUPPORT / "macos/Logisim-Revolution.icns")
icns(document, SUPPORT / "macos/Logisim-Revolution-circ.icns")
icns(app, IMG / "Logisim-Revolution.icns")
shutil.copyfile(app[128], ROOT / "snap/gui/logisim-revolution-icon-128.png")
shutil.copyfile(app[128], ROOT / "support/Flatpak/dev.briggen.LogisimRevolution.png")
if __name__ == "__main__":
main()
+14
View File
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Logisim Revolution circuit document icon. Copyright 2026 Logisim Revolution contributors. GPL-3.0-or-later. -->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" role="img" aria-labelledby="title">
<title id="title">Logisim circuit document</title>
<path d="M104 32h208l104 104v328c0 15-12 28-28 28H104c-15 0-28-13-28-28V60c0-15 13-28 28-28z"
fill="#f7f9fd" stroke="#5676ae" stroke-width="18"/>
<path d="M312 32v104h104" fill="#d7e5ff" stroke="#5676ae" stroke-width="18" stroke-linejoin="round"/>
<path d="M148 268h58v-58h95v70h66M206 268v67h95" fill="none"
stroke="#2f6fed" stroke-width="20" stroke-linecap="round" stroke-linejoin="round"/>
<circle cx="148" cy="268" r="17" fill="#2f6fed"/>
<circle cx="301" cy="210" r="17" fill="#2f6fed"/>
<circle cx="301" cy="335" r="17" fill="#2f6fed"/>
<circle cx="367" cy="280" r="17" fill="#2f6fed"/>
</svg>

After

Width:  |  Height:  |  Size: 937 B

+13
View File
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Logisim Revolution emblem. Copyright 2026 Logisim Revolution contributors. GPL-3.0-or-later. -->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" role="img" aria-labelledby="title">
<title id="title">Logisim Revolution circuit R</title>
<rect x="16" y="16" width="480" height="480" rx="104" fill="#182337"/>
<path d="M148 366V146h116c65 0 103 30 103 82s-38 82-103 82H148M248 310l117 76"
fill="none" stroke="#f7f9fd" stroke-width="31" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M80 254h68M367 228h65" fill="none" stroke="#4c8dff"
stroke-width="19" stroke-linecap="round"/>
<circle cx="148" cy="146" r="19" fill="#4c8dff"/>
<circle cx="365" cy="386" r="21" fill="#4c8dff"/>
<circle cx="432" cy="228" r="15" fill="#4c8dff"/>
</svg>

After

Width:  |  Height:  |  Size: 831 B

+20
View File
@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Logisim Revolution wordmark. Copyright 2026 Logisim Revolution contributors. GPL-3.0-or-later. -->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 900 180" role="img" aria-labelledby="title">
<title id="title">Logisim Revolution</title>
<rect x="0" y="0" width="900" height="180" rx="30" fill="#182337"/>
<g transform="translate(20 18) scale(.28)">
<rect x="16" y="16" width="480" height="480" rx="104" fill="#223553"/>
<path d="M148 366V146h116c65 0 103 30 103 82s-38 82-103 82H148M248 310l117 76"
fill="none" stroke="#f7f9fd" stroke-width="31" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M80 254h68M367 228h65" fill="none" stroke="#4c8dff"
stroke-width="19" stroke-linecap="round"/>
<circle cx="148" cy="146" r="19" fill="#4c8dff"/>
<circle cx="365" cy="386" r="21" fill="#4c8dff"/>
<circle cx="432" cy="228" r="15" fill="#4c8dff"/>
</g>
<text x="184" y="82" fill="#f7f9fd" font-family="DejaVu Sans, Arial, sans-serif"
font-size="62" font-weight="700" letter-spacing="-2">Logisim</text>
<text x="185" y="139" fill="#86b3ff" font-family="DejaVu Sans, Arial, sans-serif"
font-size="43" font-weight="600" letter-spacing="3">REVOLUTION</text>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

+176
View File
@@ -0,0 +1,176 @@
# Visual QA recovery and repair plan
Implementation follow-up: [repair pass and verification](fixes/README.md). The
audit below is the preserved before-state, not the current repair status.
The interface needs a coordinated repair pass. The parts picker cannot be read at the tested 1.6 scale; the same mismatch between fonts, layout and control metrics affects much of the application. Separate workflow defects can lose edits or make panels and commands unavailable. Those take priority over cosmetic refinements.
This is a QA report and implementation plan, not a claim that the application is fixed. No production code was changed for this audit.
## Findings that determine the repair order
| Finding | Evidence | Required outcome |
| --- | --- | --- |
| **P0: canceling project close discards unsaved edits** | Fresh File Close → Escape and Save → cancel chooser runs; [editing review](reviewers/editing.md) | Every dismissal or failed save leaves the project and recovery state intact. |
| **P1: component names are clipped or absent** | Native captures at [1.6](evidence/foundations-evidence/02-palette-1.6-crop.png) and [2.0](evidence/foundations-evidence/08-palette-2.0-crop.png) scale | Control geometry and font metrics agree; component names are distinguishable without hovering. |
| **P1: Cancel changes selected property values** | Fresh [before/cancel/undo sequence](evidence/editing-evidence/14-cancel-sequence.png) | Cancel is mutation-free and a committed multi-edit is one undo transaction. |
| **P1: splitters snap back and hide usable results** | Fresh [test-vector drawer](evidence/remaining-evidence/12-vector-crop.png); two passes/two failures computed, but rows not visible | Panels resize normally and results can actually be inspected. |
| **P1: FPGA Execute fails before useful work** | Fresh action/log evidence in the [workflow review](reviewers/remaining.md) | Controller state must not cast the replacement SVG icon to the previous icon class. |
| **P1/P2: scaling, theme and secondary-window regressions** | [Foundations](reviewers/foundations.md), [dialogs](reviewers/dialogs.md), [components](reviewers/components.md) | Repair shared metrics first, then verify each affected surface and workflow at native size. |
The complete register has 381 tracked observations: 20 runtime-confirmed, 65 visually confirmed, 58 source-confirmed, 87 design recommendations, 56 unverified, 94 duplicates and one rejected claim. These are evidence dispositions, **not 381 independent bugs**. Some confirmed observations describe different consequences of one shared defect. Archived `originalClaim` suggestions are historical input, not approved fixes; follow each reviewed qualification and this plan.
## Evidence and recovery
- Revision inspected: `0a6226664` on `main`. The pre-existing untracked `AGENTS.md` was preserved.
- Runtime: Java 21.0.12, FlatLaf/flatlaf-extras 3.7.2, Linux/KWin/Xwayland.
- Copied QA jar and current `build/libs` jar both have SHA256 `c854edbbea34d6cfc0e53ac9cf70ef5b2a5dcf550a3959ff0ed99d852950d433`.
- Runtime checks apply to that binary; source checks apply to the recorded checkout. The replacement pass did not rebuild it. Hash equality does not establish a reproducible source build, and embedded BuildInfo names the older `2532c84d`. The implicated close/edit/splitter paths were checked against current source; W0 closes the provenance gap for future acceptance runs.
- Recovered original workflow `wf_2db45d7c-b0c`: 26 launched assignments, 11 completed inspection reports containing 352 observations, and one completed source-verification report adding 15 more observations. Four inspectors and ten verifiers had no final result. There was no completed clustering report.
- The exact recovered workflow matches the original on disk: SHA256 `2ea21a9b403651d86378887fe2ff13b39e985692b166ebf2b8588aa91cb0ae43`.
- Five replacement reviewers cover foundations/picker; editing/shell/attributes; dialogs/Analyzer/light theme; unfinished simulation/projects/HDL/keyboard; and component rendering. The lead reviews the overall design, evidence integrity and theme lifecycle.
- [Finding register](findings.json) preserves every original observation, its disposition, evidence, and assigned workstream. [Readable checklist](checklist.md) provides the same traceability without the full original prose. Neither count is a count of independent bugs.
- [Recovery index](recovery/index.json), [original workflow](recovery/original-workflow.js), [original harness](recovery/original-qa.sh.txt), and [reviewer reports](reviewers/) preserve the recovered work. The historical workflow requires its original agent host; its tasks were transferred to the current agent tools.
Native-resolution screenshot crops were inspected, including unreadable picker labels, ROM values, black text on the dark canvas, appearance toolbar icons, narrow Hex Editor, and About credits. Fresh reviewer evidence is distinguished from reinspection of historical captures in the register. A screenshot path or source hit alone does not establish visual acceptance.
Fresh evidence linked by the replacement reports is archived under `evidence/`; the register's `evidenceMap` maps original scratch paths to archived copies. Historical captures still referenced under `/tmp/claude-1000/` are explicitly recovered evidence, not fresh reruns. Keep that distinction when implementing or rechecking a finding.
The virtual display reproduces 2560×1600 application coordinates and app scale 1.6, not every aspect of the user's physical KDE compositor, fractional scaling, or mixed-monitor behavior. Real monitor moves remain an acceptance gate. The old harness also composites screenshots onto a fixed-size image and does not isolate `user.home`; edge-tooltip, splash and recovery findings require direct window captures and isolated reruns.
## Recommended sequence
| Workstream | Priority | Deliverable | Depends on |
| --- | --- | --- | --- |
| W0 | First | Reproducible, isolated QA and trustworthy build identity | — |
| W1 | Urgent | Safe close/save/cancel, non-destructive defaults, actionable failures | W0 |
| W2 | Urgent | One scale contract and reliable theme/lifecycle handling | W0 |
| W3 | High | Readable parts picker and usable, resizable shell | W2 |
| W4 | High | Clear, reliable property editing | W1, W2 |
| W5 | High | Legible components/canvas and correct export | W2 |
| W6 | High | Functional simulation, navigation and tool drawers | W1, W2, W3 |
| W7 | High | Responsive secondary editors, analysis and settings | W1, W2, W4 |
| W8 | Completion gate | Keyboard access, coherent terminology and visual finish | W3–W7 |
Implement W1 and W2 as independently reviewable changes. Then prove a complete editor specimen—picker, canvas, selected-component properties and simulation drawer—before sweeping the remaining windows. Do not count a package complete while its screenshot or interaction acceptance is visibly broken.
## W0 — Repair the QA process
Preserve the recovered scripts as evidence; use a corrected harness for future runs. Each run must have its own `user.home`, Java preferences, autosaves, temporary files and copied circuit fixtures. Validate IDs and verify process identity before cleanup. An interrupted test must never leave a process that continues writing to the user's home.
Capture windows at their actual dimensions, including popup geometry and stacking order. Keep a full image for context and native-resolution crops for text. Record revision, dirty status, jar hash, JVM, OS, physical/logical screen geometry, Java device transform, FlatLaf scale, app zoom, theme, locale, and fixture. Fix `genBuildInfo` task inputs so the generated revision changes when HEAD changes; the current jar title still names an older revision.
Add a small repeatable interaction harness around real Swing windows, separate from headless unit checks. Use existing snapshot tooling only after isolating its settings and removing its implicit 1.0-scale assumption. Compare preference/autosave snapshots before and after the run. Do not delete existing user recents or recovery files to obtain a clean screenshot.
Acceptance: two consecutive runs produce the same baseline; user settings remain unchanged; 1280×800 and 2560×1600 images are correctly sized; exact revision and jar identity accompany all evidence. A build/test result is recorded separately from visual and workflow results.
## W1 — Protect work and make failure recoverable
- Unify File Close, window Close and Quit around one save/discard/cancel contract. Escape, title-bar close, failed save and cancelled Save As must leave the edited document open. Only an explicit discard may abandon changes. Inspect autosave cleanup and undo preservation in the same flow.
- This is urgent: fresh scratch runs lost unsaved circuit edits both on File Close → Escape and on File Close → Save → cancel the chooser. Also repair `Frame.confirmClose`'s autosave lifetime on a failed/cancelled save; routing menu close there without inspecting that branch is insufficient.
- Make Analyzer Build Circuit start with a unique new-circuit name and focused, selected text. Require an explicit named Replace action for a collision; retain undo. Recheck keyboard-only behavior so typing cannot accidentally activate the default button.
- Ensure canceling property editors, color/font pickers and multi-selection choices performs no mutation. Delayed wheel edits must remain attached to the original edit target or be cancelled when selection changes.
- Put shortcut/menu preference updates on the Swing event thread, with lifecycle-aware subscriptions. The recovered log contains a real `ConcurrentModificationException` in `hotkeySync`; changing themes/settings and opening tool windows must not kill that update path.
- Expose unsupported simulation components with an actionable status and bounded error reporting. A component whose propagation deliberately throws must not repeatedly fail while appearing fully supported. Preserve its serialized ID and any legitimate hardware-only use.
- Remove behavior that depends on concrete icon classes. A fresh FPGA UI run records a `FlatSVGIcon` to `ProjectAddIcon` cast failure in `FpgaCommander.actionPerformed`; changing a button's artwork must not break its action. Keep action state in the controller and render the appropriate icon from that state.
- Review conditional legacy label normalization separately from ordinary loading. Keep display labels stable where compatibility permits; use deterministic HDL identifiers or an explicit migration notice. Do not describe the conditional sanitizer as renaming every valid label.
Acceptance: scripted close/save/cancel permutations preserve the circuit model and on-disk file; Escape never means discard. Property cancel leaves the model and undo history unchanged. Repeated preferences/window cycles log no concurrency exception. Normal file open/save retains circuit IDs and user content.
## W2 — Unify scaling, themes and lifetime
Define three distinct concepts: operating-system device scale, application UI zoom, and document/canvas zoom. Store panel geometry in logical units. Preserve explicitly chosen existing zoom settings; do not silently reset users to 1.0 or infer physical DPI solely from screen height.
Use FlatLaf as the owner of widget metrics. The installed 3.7.2 API includes `UIScale.setZoomFactor`, `getZoomFactor`, and supported zoom factors; verify its behavior in a small prototype before selecting the live-zoom path. Remove the global AWT font rewrite once native metrics own scaling. `UiFonts` must derive roles from an already-scaled base font without multiplying again, and `AppIcons` must not pre-scale SVG dimensions that FlatLaf scales again. Keep body, secondary, heading and monospace roles intact across adding components, changing theme and changing scale.
Update every geometry cache and custom control from the same scale notification. This includes row heights, editors, captions, splitters, focus rings, hit targets, tree renderers, keyboard-shortcut fields, dialog minima, toolbar icons, diagram rows and gutters. Size text-bearing elements from actual font metrics and content. Scale must affect the control and its text together.
Use one ordered theme transaction for startup, explicit choice and OS notifications. Refresh component/value palettes, UI defaults, code-editor themes, caches and repaint listeners together. Move OS discovery off the event thread and bound the entire child-process lifetime; the diagnostic probe shows the current two-second timeout taking three seconds because it reads output before applying the timeout.
Cache regular/accent/disabled icons separately: a runtime probe proves requesting a disabled icon currently mutates the shared regular instance. Pair subscription registration with disposal; palette rebuilds currently retain old tiles through strong theme listeners. Preserve user-defined colors, and do not run palette migrations that erase overrides.
Acceptance: 1.0 → 1.25 → 1.5 → 1.6 → 2.0 → 1.0 produces coherent widget/text sizes without restart artifacts or cumulative scaling. Repeat light → dark → light with project, Preferences, Analyzer and a code editor open. A silent OS-probe process cannot block typing. Listener counts stabilize after repeated rebuilds and window closure. Document zoom and exported geometry remain stable.
## W3 — Make the picker and shell usable
The parts picker is the first visual benchmark. Replace the fixed 68×62-pixel tile with a layout measured from icon area, scaled padding and two caption lines. Use readable foreground text, wrap words, and provide a full-name list presentation for long labels such as TTL and floating-point operations. Full names must be discoverable without hovering every tile. Scale the favorite marker and its hit target. Do not rename serialized component IDs to make captions fit.
Search must commit the current query before Enter chooses a result. Ensure keyboard traversal, visible focus, no-results guidance, full-name tooltips, favorite/recents persistence, unambiguous categories, disabled recursion choices and correct placement tools. Avoid rebuilding the entire palette on every incidental event; ensure disposed results release listeners.
Let the user actually drag all shell splitters. Reconcile stored sizes with layout only on initial restore or explicit programmatic reset; do not snap a divider back during an active drag. Scale default widths and enforce content-aware minima while leaving useful canvas space on small screens.
Expose discoverable toggles to reopen Properties, the navigator and the drawer. Reset Layout is recovery, not the only route to a closed panel. Keep command state synchronized with activity-bar actions. Define last-tab behavior, active-tab overflow, selected circuit synchronization and clear circuit-versus-appearance labels. Fix stale zoom status by binding to the active editor model. Give welcome and no-selection states useful guidance; avoid invisible startup actions in the user's undo history.
Retain the circuit-list listener strongly for the view's lifetime, since its event sources use weak references. A fresh GC/rename/tab-switch check left stale rows and selection. Unregister on disposal and guard operations against a circuit that no longer belongs to the project. Include add/delete/reorder/set-main and undo/redo in that regression check.
Acceptance: a user can identify NOT, Controlled Buffer, Pull Resistor and representative long TTL names at native size; type a query and immediately Enter the intended tool; place it; open Properties; resize/hide/reopen panels; switch/close overflowing tabs; and reopen the project without layout drift. Capture the whole sequence at the user's 1.6 scale in both themes and at a constrained window width.
## W4 — Rebuild property editing around the task
Use a selection summary, meaningful groups and optional explanations: Identity, Behavior, Connections, Appearance and hardware details where applicable. Keep uncommon options behind a clearly labeled advanced section. Display compatible multi-selection values consistently, with an explicit mixed value rather than misleading blanks or a false supported state.
Size labels and editors independently; permit column resizing or a responsive stacked layout. Avoid an invisible fixed 50/50 split. Full labels, selected values, validation text and font/color previews must fit. Use native boolean toggles, bounded numeric editors, readable choices and dedicated font/color controls. Keep component descriptions available through keyboard focus as well as hover. Use semantic status colors with text, not neon-filled cells.
Centralize edit validation and undo transactions. Enter commits once, Escape cancels, selection changes finish or cancel according to a clear rule, and multi-edit applies only compatible attributes. Scrolling the panel must not unexpectedly change values. A wheel-nudge edit requires deliberate focus/modifier semantics and a bounded undo group.
Acceptance: edit an AND gate, a splitter, ROM, a labeled component, two compatible gates and mixed incompatible selections. Test invalid input, minimum/maximum, cancel, undo/redo and selection changes during pending edits. All changed models and undo entries must match what the inspector shows. Verify an expanded locale or long labels as well as English.
## W5 — Make circuit rendering legible and export correct
Separate automatic interface/default colors from explicit document colors. Fix foreground and background together for ROM/RAM contents, constants, reset/clock components, bus traces and value badges. New text must be readable in the active theme. Existing explicitly colored text and custom appearances must remain intact; a theme-adapted display option must be reversible and must not rewrite saved data or print output.
Audit small pin values, radix labels, gate labels, splitter indices, internal arithmetic labels, off segments, TTL and SoC painters at actual size. Use contrast-tested pairs and reserve signal colors for signal meaning. Preserve IEEE/IEC shapes and port geometry. Remove accidental overlaps and displaced drawing, including `DotMatrixBase.drawCircle` multiplying already-absolute positions by the display's local scale.
Define a readable initial viewport and fit/center behavior separately from circuit coordinates. Any new display transform must be shared by painting, mouse hit testing, grid, scrolling, ghost placement, selection and saved view state. Do not blindly multiply document coordinates or stored zoom by application UI zoom.
Export needs its own proof: inspect antialiasing, pixel bounds, white-background print palettes, transparent backgrounds and custom appearance colors. Do not judge an image only by a reduced preview or use a count of colors as sufficient proof of antialiasing.
Acceptance: render a fixture covering gates, labels, wiring, memory, displays, TTL, custom appearances and SoC at 50/100/200% in both themes and print view. Exercise selection/wiring at each zoom. Inspect native-resolution output images and ensure LED dots stay inside their component. Round-trip the fixture and confirm component IDs, coordinates, connectivity and explicit colors are unchanged.
## W6 — Complete simulation and navigation workflows
Make run/pause, propagation step, half/full tick, clock-enabled state and frequency legible and synchronized wherever shown. Distinguish simulation state from document editing state. Empty clock selection and unsupported components need useful guidance. Surface errors in a persistent, inspectable place with deduplication and a route to the affected component.
Treat timing diagrams, signal selection, data tables and test vectors as functional editor content. Give the drawer a usable initial/minimum height, resizable regions and a path to expand or detach when needed. Closing one tool tab must not unexpectedly remove unrelated tools. Audit the old hidden JFrame controllers for focus, menu bindings, simulator listeners and visible-state assumptions after reparenting.
Keep signal names aligned with waveform rows at every scale, make time axes and bus labels readable, and test horizontal scrolling and zoom on long captures. Make test-vector load/run/results navigable with the keyboard. Preserve circuit/subcircuit instance navigation and state when switching tabs; the circuit being edited and the simulation instance being inspected must be distinguishable.
Acceptance: build or open a small clocked circuit, run/stop/step/tick it, select signals, scroll a long timing capture, inspect a failing vector, navigate into and out of an instance, hide/reopen the drawer and change theme/scale. Verify model state and labels, not merely that a panel opens. Run a sustained capture to check memory behavior after correctness is established.
## W7 — Finish secondary windows and settings
Work in separate slices after shared metrics are stable:
1. **Preferences and Project Options:** viewport-width-aware, top-aligned forms; sensible line wrapping; reachable Browse/Apply actions; search by individual setting and synonym; consistent reset scope and shortcut editing.
2. **Analyzer:** measured signal/table rows and combo popups; predictable editing/focus; clear primary Build action; grouped import/export; readable expressions and Karnaugh annotations; safe build defaults from W1. Fix expression overbar placement using the same final text metrics used to paint, and test digits on overlapping K-map covers. Move optimization to a cancellable worker with an explicit progress/cancel path and EDT-only UI updates.
3. **Hex and HDL editors:** adequate initial geometry, consistent toolbar and search, scale-aware code and gutter fonts, validation/error navigation, clear file ownership. Shell-hosting requires explicit menu/action routing and lifecycle work; merely moving a component out of a JFrame is insufficient.
4. **FPGA and SoC tools:** responsive form sections, readable reports and CPU/trace views, clear missing-toolchain state, proper action enablement. Preserve hardware-only features and report external tool failures. Actual synthesis/programming requires available software and hardware.
5. **Dialogs, chooser, About and Help:** owner-relative placement, bounded screen size, correct focus/default/cancel behavior, coherent labels, readable credits and documentation navigation. Preserve upstream authorship and license acknowledgments during branding changes.
Acceptance: every form's primary action is reachable at minimum supported window size and 2.0 scale; no clipped combo choices or horizontal scrolling just to reach a normal action. Repeat a normal, invalid, canceled and keyboard-only path for each slice. Record FPGA programming and printer output as untested until actual dependencies are available.
## W8 — Keyboard access and visual completion
Use actual actions and accessible controls for clickable labels, section headers, breadcrumbs, palette results and zoom controls. Give each a name, role, visible focus and keyboard activation. Resolve reserved/configurable shortcut conflicts and distinguish closing an editor tab from closing a project. Escape cancels the current interaction first; it must not discard documents.
Apply a coherent typographic hierarchy and icon grammar. Interface icons should share stroke, weight and contrast; miniature circuit symbols may retain domain-specific information. Refresh old drawing-tool icons and raster assets where they visibly fail. Normalize terminology across menus, toolbar tips, Properties, search and dialogs. Clarify disabled actions and empty states, reduce duplicate status and remove debug build metadata from everyday titles while retaining it in About/Copy Details.
Inspect real theme tokens and contrast rather than recoloring by intuition. Primary/secondary text must remain readable on its actual surface; state and selection need more than color alone. Compare the complete editor and secondary windows at native size, including focus, hover, selected, disabled and error states. Treat tooltip clipping as provisional until the real popup capture confirms it.
Acceptance: a keyboard-only user can start a project, find/place components, edit attributes, wire, run/inspect simulation, save, reopen and close safely. Repeat with long names and locale expansion. A final reviewer unfamiliar with the implementation must complete the same task using only what the interface explains.
## Release gate
| Dimension | Required coverage |
| --- | --- |
| UI zoom | 1.0, 1.25, 1.5, the reported 1.6, 2.0; one larger stress setting |
| Theme | light, dark, live light/dark cycle, simulated and physical OS-following change |
| Window | full 2560×1600, 3840×2160/4K, 1280×800 or documented minimum, resized/narrow panels |
| Physical display | user's fractional KDE setup; a genuine HiDPI transform; mixed-DPI monitor move |
| Data | fresh isolated settings; migrated copied settings; simple fixture; large real circuit; custom appearance |
| Interaction | mouse, keyboard, search, cancel, undo/redo, invalid input, persistence, reopen |
| Output | screen, PNG export, print-view rendering; real printer only if available |
Use pairwise coverage for broad window sweeps, and the full relevant matrix for scale/theme infrastructure and the picker. Record both whole-window captures and native crops. Human review must verify text and affordances at normal viewing size, not only enlarged crops. Unit tests should cover real invariants—cancel safety, model changes, coordinate mappings, cache ownership and bounds—not implementation trivia. Run the existing appropriate Gradle checks and report failures explicitly; the previously known `SoftwaresTest` failure is not a blanket exemption for new failures.
Done means every confirmed finding has a fix and passing acceptance evidence, every duplicate resolves to that fix, every rejected claim has a reason, and every unverified claim has a named reproduction task. Source review, a successful build, or a low-resolution screenshot cannot substitute for this gate.
+430
View File
@@ -0,0 +1,430 @@
# QA finding checklist
Every recovered observation has a disposition. Counts include duplicated symptoms, recommendations and unresolved hypotheses; they are not a defect count. The original claims and full evidence are retained in [findings.json](findings.json). Workstream descriptions and acceptance criteria are in [the plan](README.md). No item is marked fixed by this audit.
## W0 — QA isolation and provenance
| ID | Disposition | Observation | Review note |
| --- | --- | --- | --- |
| editing-harness-01 | duplicate | Preferences isolation does not isolate unnamed autosaves | See qa-new-06. Original harness leaves user.home unchanged. Private Java home was supplied and verified for this review; no real autosave cleanup was attempted. |
| dialogs-new-01 | duplicate | Original QA harness exposes user-home autosaves despite isolated Java preferences | See qa-new-06. Loader derives unnamed autosave path from user.home; userRoot alone isolates only preferences. Discovery was observed; real autosave mutation was not performed. |
| qa-new-05 | confirmed-source | Generated build ID can identify a previous commit | QA jar and current build jar have identical SHA256, but generated title reports main/2532c84d while repository HEAD is 0a6226664. genBuildInfo inputs omit Git revision/ref, so a commit with unchanged source need not regenerate metadata. |
| qa-new-06 | confirmed-source | Recovered QA harness does not fully isolate home or faithfully capture all window sizes | Original qa.sh isolates preferences but not user.home, while unnamed autosaves use user.home. Its shot command hardcodes a 2560x1600 black canvas and composites windows by area rather than stacking order. Old recent lists contain assistant scratch files. Screenshot-edge and first-launch claims need special care. |
## W1 — Data integrity and broken actions
| ID | Disposition | Observation | Review note |
| --- | --- | --- | --- |
| analyzer-01 | confirmed-runtime | Build Circuit defaults to overwriting the circuit being analyzed; two keystrokes replace the user's circuit | Initial Q typing did not change FULLADDER. Space then Enter replaced its layout. Undo restored the original layout and clean title. This is an unsafe, recoverable default; no irreversible or saved-file loss demonstrated. |
| components-13 | confirmed-source | Labels are silently rewritten on every load with a random hash suffix | Narrowed: findValidLabels rewrites only VHDL-invalid names/labels. generateValidVHDLLabel adds a random suffix only if normalization changes the trimmed label. Reopening the same unsanitized input can differ; saved valid labels do not randomly change every load. At HEAD readLibrary unconditionally calls ensureLogisimCompatibility at 1152 BEFORE considerRepairs at 1154. Version guards at 1024/1046/1076/1078 belong to subsequent repairs and do not guard this sanitizer. No save/reopen data-loss experiment performed. |
| components-22 | confirmed-runtime | Reptar Local Bus throws UnsupportedOperationException on every propagation | Runtime evidence is the recovered verifier stack trace, corroborated by the unconditional current propagate throw. This interrupts a propagation attempt for a circuit containing Reptar. Do not claim every other circuit always stops or that the simulator process dies. No new live run was started. |
| critic-26 | duplicate | ConcurrentModificationException in AppPreferences.hotkeySync on the preferences event thread | See shell-31. Recovered app-session1.log contains ConcurrentModificationException; current HotkeyOptions updates menus off EDT while iterating mutable menu registration. |
| dialogs-15 | duplicate | Form dialogs are bare JOptionPanes: '?' icon beside forms, OK instead of verbs, Yes/No confirmations with the destructive action as default | See analyzer-01. Unsafe confirm default demonstrated specifically by analyzer-01. Broader reset/export/unload examples not all checked and should not be counted separately. |
| shell-01 | confirmed-runtime | Escape (or the dialog's x) on 'Confirm Close' discards unsaved work and closes the project | Independent scratch reproduction: unsaved AND gate disappeared after File Close > Escape. File Close > Save > cancel Save also disposed it. Both branches are unchanged at HEAD. Dialog-X and filesystem write failure were not separately exercised. The missing question mark is absent from the hard-coded source string, not proof of clipping. |
| shell-31 | confirmed-source | ConcurrentModificationException in hotkeySync on the preferences thread | Recovered log contains ConcurrentModificationException in hotkeySync on java.util.prefs dispatcher. HEAD retains an unfiltered preference listener and iteration of mutable gui_sync_objects off EDT. No independent race reproduction; frequency and user impact remain unknown. |
| remaining-hdl-01 | confirmed-runtime | HDL-only Execute throws an icon ClassCastException and strands the commander | Fresh live reproduction plus current source and recovered log. |
## W2 — Scale, theme and lifecycle
| ID | Disposition | Observation | Review note |
| --- | --- | --- | --- |
| analyzer-29 | duplicate | Circuits explorer header truncated to 'CI…' | See light-03. Narrow explorer heading is part of fixed shell geometry in light-03. Fresh owned session at its wider sidebar showed CIRCUITS fully, so this is width-dependent. |
| canvas-01 | design-recommendation | Canvas '100%' ignores the 1.6 UI scale – circuits, values and labels render at 1/1.6 size and files open tiny | Live 100-percent gate size is small relative to 1.6-scale chrome. Canvas zoom and interface scale are separate concepts; automatically multiplying serialized circuit coordinates is not an established fix. Calibrate initial viewport/readability as a design change. |
| canvas-05 | design-recommendation | Bus wires are the same colour as component outlines in dark theme | Light bus and component outlines are visible in the archived fit image. Similar hue alone is not a bug; width and junction geometry also encode meaning. Consider an additional distinction after testing schematic clarity. |
| canvas-13 | unverified | Selection feedback: wires show only endpoint dots; handles pile up, scale with zoom and hide small parts | Not independently reproduced, visually inspected, or source-traced in this bounded review. Retained as a candidate, not counted as a verified defect. |
| canvas-17 | unverified | Width-mismatch badges use light-theme colours (dark red on peach) and overlap other labels | Not independently reproduced, visually inspected, or source-traced in this bounded review. Retained as a candidate, not counted as a verified defect. |
| canvas-21 | design-recommendation | Port markers are 4 px specks in low-contrast grey/red | Larger or zoom-adaptive hit/port affordances may improve use; tiny marker and error-signaling interpretations were not independently measured for every component. |
| canvas-27 | design-recommendation | Off-screen indicators look like crop-mark brackets, are unscaled, and collide with content/zoom pill | Edge-indicator shape, scale and placement need visual design review. Reported collisions were not independently inspected; no blanket removal recommendation. |
| codeaudit-02 | duplicate | FlatLaf's own UI scale is never set: every metric FlatLaf paints stays at 1x while text is 1.6x | See scaling-01. Independent app scaling and LaF metrics are the same mismatch documented in scaling-01. FlatLaf can scale via its own font/zoom paths, so 'never scales' is not globally true. |
| codeaudit-03 | confirmed-source | A global AWT listener forces every added JLabel/JButton/JMenuItem/... to 14x scale (22.4px), which flattens the type hierarchy and makes it depend on call order | Global COMPONENT_ADDED listener replaces specified roles with constant 14*Scale. UiFonts derives a different ramp from Label.font. Order-dependent hierarchy loss is real. |
| codeaudit-04 | duplicate | Menu shortcuts render at ~13px beside 22px menu items, and some read 'Ctrl+Comma' | See scaling-01. Menu label/accelerator mismatch is a symptom of uncoordinated scale. Ctrl+Comma wording is cosmetic. |
| codeaudit-06 | duplicate | Shell panel sizes and splitter widths are raw device pixels (side 260, inspector 280, bottom 200, min 160, divider 5) | See scaling-03. Same raw-pixel shell dimensions; see migration and drag qualifications. |
| codeaudit-07 | confirmed-source | HDL, assembler and breakpoint code editors are reset to an unscaled 13px font by EditorTheme | EditorTheme loads the XML theme without a scaled base font after editor creation. Actual editor/gutter sizes were not measured in this run; treat as source-supported scale integration debt. |
| codeaudit-08 | confirmed-source | Timing diagram (chrono) uses fixed 20px header and 30px rows, so time labels are drawn half above the panel | ChronoPanel has literal 20px header, 30px rows and 10pt selector font. Header clipping screenshot was not viewed; source mechanism only. |
| codeaudit-09 | confirmed-source | Keyboard-shortcut preferences: hotkey fields are fixed 170x28 with 18x18 buttons that hold 26px icons, plus 8pt fonts and Nimbus hacks | Fixed hotkey editor metrics and 8pt action fonts exist; recovered page has cramped scroll regions. Prior verifier says resize timer corrects field text height, so do not claim all text fields clip. |
| codeaudit-12 | duplicate | About dialog: scrolling credits in 2005 colours (#690000, #300060, ...) are invisible on the dark background; fixed 640x440 and raster logo | See scaling-14. Same independently viewed dark-credit contrast defect. |
| codeaudit-16 | confirmed-source | Muted/secondary text tokens fail WCAG AA: 3.97:1 in dark, 3.15:1 in light | Recomputed reported color pairs: dark 3.976:1, light 3.152:1. Theme formulas and muted caption usage checked. Physical display/color management and light-theme pixels were not remeasured. |
| codeaudit-17 | design-recommendation | Dark theme activity bar and status bar are pure #000000 (darken 25% clamps to black); token fallbacks disagree with the theme | Black activity/status backgrounds are visible; black itself is not a defect. Missing selected-background token should be handled together with activity state painting. |
| codeaudit-20 | duplicate | Double-Shift search dialog is a fixed 680x440 device px with 3-8px unscaled paddings and a highlighter-pen match chip | See scaling-20. Same recovered fixed-size search dialog and horizontal overflow. |
| codeaudit-23 | unverified | Literal font sizes and font-by-name bypass the type ramp: 8, 9, 10, 12 and 18*scale | Font literals can be overwritten by global listener. No blanket claim of actual 8/9/12px runtime text accepted without renderer or native-image evidence. |
| codeaudit-24 | design-recommendation | Icon sizes are ad hoc: 10, 12, 14, 15, 16 and 20 used side by side | Different icon sizes can legitimately express hierarchy. Establish a small role-based size set; not an independent defect merely because values differ. |
| codeaudit-25 | confirmed-source | Latent double scaling: AppIcons and UiFonts multiply by the app scale on top of FlatLaf's scale | UiFonts scales LaF font again and AppIcons passes app-scaled dimensions into FlatSVGIcon. Latent double-scaling integration risk; no physical mixed-DPI reproduction. Public FlatLaf zoom API verified locally. |
| codeaudit-26 | duplicate | Auto interface scale = screen height / 1000, applied only at 1600px and above: a resolution heuristic, discontinuous, and a fractional 1.6 | See scaling-22. Same fallback heuristic. Reject the blanket OS-scale-ignorance wording; source explicitly tests Java2D device transform. |
| codeaudit-27 | duplicate | Changing the interface scale in Preferences takes effect only partly, with no restart prompt | See scaling-06. Live partial refresh confirmed. Static restart warning exists; dynamic restart action absent. |
| codeaudit-31 | design-recommendation | Debug and placeholder output left in UI code (stdout 'todo', 'chrono clear', TikZ spam; dead TablePanel) | Chrono debug print exists. No demonstrated UI failure/performance regression from logging; cleanup backlog, not visual blocker. |
| codeaudit-33 | design-recommendation | Paint paths allocate on every repaint (Tokens.color creates a new Color; AppIcons.colored builds a string key per paint) | Tokens allocates Color wrappers and AppIcons allocates keys, but no profiling evidence of material cost. Do not schedule optimization ahead of observed UX failures. |
| codeaudit-34 | unverified | Mixed scaled and unscaled offsets in custom painting (tool halos, toolbar icon inset, K-map strokes, swatches) | Specific canvas/K-map stroke, halo and swatch sites not independently verified. Literal offsets alone do not determine rendered scale. |
| codeaudit-35 | duplicate | Canvas '100%' ignores the interface scale: circuits, handles and hover halos are drawn at 1 unit = 1 device px on a 1.6x UI | See scaling-07. Same document-zoom versus interface-scale decision; avoid altering saved circuit font/geometry semantics. |
| critic-02 | duplicate | Fonts are scaled by a legacy AWT hack while FlatLaf metrics stay at 1x: tiny checkboxes and radios, unscaled row heights | See codeaudit-02. Same inconsistent scale ownership. |
| critic-03 | duplicate | Menu shortcuts render in an unscaled ~14 px font next to 22 px item labels | See codeaudit-04. Menu accelerator font mismatch shares the scaling repair. |
| critic-04 | duplicate | Shell panels are sized in raw pixels: cramped sidebar, truncating inspector, useless 200 px drawer | See codeaudit-06. Same unscaled dock dimensions. |
| critic-13 | design-recommendation | The canvas ignores the 1.6 interface scale: circuits open at 100% and look tiny | Readable initial view needs improvement, but document zoom and UI zoom are distinct contracts. Do not multiply all canvas coordinates by the UI scale without migrating view state and verifying hit testing/export. |
| critic-24 | duplicate | About credits are invisible (dark purple on dark); About, Help and splash still carry the old branding | See codeaudit-12. Lead inspected About: dark-purple credits are nearly unreadable on dark background. Preserve upstream attribution during any branding refresh. |
| critic-32 | duplicate | No consistent typographic scale: 22 px body dominates, headers smaller, many stray sizes | See codeaudit-03. Same global font rewriting destroys intended hierarchy. |
| critic-36 | unverified | Dark-green '0' wires have low contrast on the canvas | Low contrast is plausible, but no fresh contrast measurement or native rendering check performed by lead. Keep a readable signal-state acceptance test; preserve semantic distinction. |
| dialogs-02 | confirmed-runtime | Live theme switch permanently shrinks title-bar and section-header fonts and leaves stale colours | Preferences and main titles shrink visibly after Dark to Light and remain small on Dark return. Not every listed header/background was measured. |
| inspector-01 | duplicate | Inspector is 280 unscaled px wide with a fixed 50/50 column split, so about half of all labels and values are cut off at 1.6x | See shell-05. Same device-pixel width and clipped two-column inspector, visually confirmed live. |
| light-03 | confirmed-source | Side panel and inspector widths are unscaled 260/280 px, so labels and values truncate everywhere | Default panel dimensions are fixed 260/280/200. Original truncation breadth was not inspected; owned fresh sidebar width differed and title was readable. |
| light-06 | duplicate | Live theme switch permanently shrinks every window title and other fonts to unscaled size | See dialogs-02. Same runtime title shrink as dialogs-02; not an additional theme bug. |
| light-11 | design-recommendation | Saturated 2005 primaries in the light theme (pure #0000FF labels, blue arrows, #00FF00/#FF00FF defaults, black 2px border) | Saturated semantic colors are not inherently defects. Contrast-sensitive dark rendering is separately covered by light-30 and dialogs-18; light palette redesign needs measured requirements. |
| light-20 | confirmed-visual | Muted grey text is below 4.5:1 contrast in light theme (captions, section headers, panel titles, subtitles) | Recovered muted palette captions are visibly weak, independently of clipping. Original 3:1/hex measurements not remeasured; require actual composited contrast measurement before choosing replacement tokens. |
| light-30 | confirmed-visual | Dark-theme leaks spotted during the live switch: unreadable ROM contents, blue radix on dark, white-box icons | Recovered ROM capture has pale hex text on light-gray fill; HEAD mixes fixed LIGHT_GRAY with theme-aware foreground. Pin radix and palette white-box variants not independently inspected. |
| scaling-01 | confirmed-visual | Interface scale only enlarges fonts; every Look-and-Feel metric stays at 1x (checkboxes, radios, sliders, arrows, close buttons, menu shortcuts, icons) | Native menu and preferences captures show large labels with small accelerators/checkboxes. Phrase 'only fonts' is too broad: custom icons also scale, but FlatLaf metrics are not coordinated. |
| scaling-03 | confirmed-source | Side panel, inspector and bottom panel widths are raw device pixels, so panels shrink relative to content at high scales | Panel dimensions are persisted and clamped in raw pixels. Fresh migration can yield 320 rather than 260. Scaling strategy must preserve user-adjusted widths. |
| scaling-06 | confirmed-runtime | Changing the scale ('Zoom factor') applies half-live: mixed-size UI, misleading restart text, no value shown, no restart action | Live 2.0->1.0 slider/Home change shrinks captions and toolbar glyphs while menu, headers, fields and cached previews retain old sizes. Restart warning exists; no dynamic restart action. |
| scaling-07 | design-recommendation | Canvas '100%' ignores the interface scale: circuits render at half the UI text size at 1.6 (a third at 2.5), with hairline strokes | UI scale and document zoom are intentionally separate. Changing circuit fonts/geometry with theme would violate UiFonts' document-font contract. Evaluate default viewport zoom separately; no blanket canvas-scale bug. |
| scaling-08 | confirmed-visual | First-painted list/table row gets a different font size (re-font hack vs UiFonts), causing uneven nav items and header cells | Recovered Statistics crop clearly shows large Component header beside small remaining headers. COMPONENT_ADDED font replacement can affect shared renderers; nav first-cell variability was not fully retested. |
| scaling-10 | confirmed-visual | Circuit Statistics dialog opens at screen (0,0) with a fixed unscaled size and a raw, truncating JTable | Recovered native Statistics screenshot shows truncated cells and mixed headers. Source omits parent centering and caps dimensions rather than using one universal fixed size. |
| scaling-12 | confirmed-runtime | Preferences 'Filter settings' only matches page titles: 'scale', 'zoom' and 'theme' find nothing and leave a blank list | Corrected live scale query clears the navigation list and leaves old Window page with no no-results explanation. SettingsNav matches page titles only. |
| scaling-14 | confirmed-visual | About dialog and splash are the old 2005 branding: dripping-red logo, dark purple credits on black (unreadable), fixed unscaled fonts | Recovered crop shows nearly unreadable purple credits on dark background. Rebranding the historical logo is a design choice, not a runtime defect. |
| scaling-20 | confirmed-visual | Find Action popup is a fixed 680x440: results truncate at 2.0, low-contrast breadcrumb on selection, developer footer text, no scale/zoom results | Recovered 680x440 Find Action capture shows horizontal overflow and noisy highlight/footer. Scale/zoom action indexing not independently retested. |
| scaling-22 | confirmed-source | Auto-scale heuristic is screen-height/1000 above 1600 px only; ignores DPI and desktop scale; cannot go below 100% | Height heuristic applies only when Java2D device transform <=1. Source already detects platform scaling; claim it always ignores OS scale is incorrect. DPI/desktop intent and explicit-preference semantics need clarification. |
| scaling-27 | unverified | Colors page: swatch columns misaligned per group; black text-tool default on the dark theme; colour/color spelling mix | Colors page alignment/defaults not inspected in this bounded review. |
| shell-02 | confirmed-visual | FlatLaf metrics stay at 1x while fonts are forced to 1.6x: tiny accelerators, arrows, check marks, checkboxes, window buttons; clipped rows | Live Edit popup and Save dialog visibly mix large labels with small accelerators/icons; archived drawer also shows small captions. HEAD retains post-construction font scaling. Do not infer that every reported widget was retested, or prescribe a particular FlatLaf API without validating double scaling. |
| shell-05 | confirmed-visual | Panel widths and heights are fixed in unscaled pixels, so every panel is too narrow at 1.6x and truncates its content | Live inspector truncates names and font values at 1.6 scale; LayoutPrefs retains device-pixel defaults. Fresh Circuits width was wider and its heading readable, so not every panel is always truncated. Separate this sizing defect from the divider interaction defect. |
| shell-21 | duplicate | Circuits panel header is truncated to 'CI…' with its title misaligned against the action buttons | See shell-05. Header crowding is part of scale/minimum-width policy. Fresh 1.6 session displayed CIRCUITS fully, so the original truncation is configuration-dependent. |
| codeaudit-v-01 | duplicate | Table headers render column 1 at 22px and every other column at 13px (the Startup listener catches renderer components) | See scaling-08. Recovered native Statistics crop verifies inconsistent table-header fonts; source points to shared-renderer font mutation. File chooser case not rechecked. |
| codeaudit-v-04 | unverified | HDL editor line numbers are 22px on a 13px line pitch, so the gutter is an overlapping smear | HDL gutter smear not viewed or live tested here. Editor theme load is checked under codeaudit-07; gutter-specific mechanism requires editor reproduction. |
| codeaudit-v-09 | confirmed-source | 'Follow system' theme polls the desktop every 20 s by starting two gsettings processes on the event thread | Swing Timer invokes theme detection on EDT; SystemTheme.run reads to EOF before its timeout. UI freeze risk under a hung probe is credible but was not induced. |
| codeaudit-v-10 | confirmed-source | AppIcons.accented()/disabled() recolour the shared cached icon for every user of that glyph | accented/disabled mutate the cached base FlatSVGIcon. Repository search found no current callers; latent cache API defect, not an observed UI regression. |
| qa-new-01 | duplicate | Disabled and accented SVG variants mutate the shared regular icon | See codeaudit-v-10. Independent runtime corroboration of the recovered cached-icon mutation finding, not a second bug. |
| qa-new-02 | confirmed-runtime | System-theme timeout does not bound subprocess output reads | SystemTheme.run waits for readLine EOF before the timed waitFor. A silent three-second process completes successfully after 3004ms despite a two-second timeout. Theme's Swing Timer invokes this path on the EDT; an unresponsive desktop command can freeze the UI. |
| qa-new-03 | confirmed-source | Palette rebuilds retain discarded tiles through strong theme listeners | Each ComponentTile registers this::repaint in Theme's static strong listener list. ComponentPalette.rebuild removes tiles and constructs new ones without unregistering; palette and shell callbacks also need lifecycle ownership. Growth follows rebuilds; user-visible slowdown was not measured. |
| qa-new-04 | confirmed-source | Automatic OS-theme changes bypass the canvas palette refresh path | The System Theme timer calls Theme.apply, which changes LaF and fires listeners. AppPreferences.applyThemeColors and refreshProjectsForTheme are only called separately by the preference combo and startup; the automatic path has no equivalent palette update. |
## W3 — Picker, shell and navigation
| ID | Disposition | Observation | Review note |
| --- | --- | --- | --- |
| canvas-22 | unverified | Ctrl+D duplicates exactly on top of the original (looks like nothing happened) | Not independently reproduced, visually inspected, or source-traced in this bounded review. Retained as a candidate, not counted as a verified defect. |
| canvas-24 | unverified | Palette content jumps ~125 px after the first placement ('Recently used' inserted at top) | Not independently reproduced, visually inspected, or source-traced in this bounded review. Retained as a candidate, not counted as a verified defect. |
| canvas-25 | duplicate | Welcome 'New project' opens a second window and leaves the blank one stuck on the welcome page | See shell-09. Same startup Welcome/New project ownership mismatch. |
| canvas-26 | duplicate | Legacy wording and irrelevant items in the Edit menu / undo names | See shell-14. Same legacy Edit-menu wording and appearance-only command visibility. |
| canvas-29 | duplicate | Window title shows debug build ID plus a 💾 emoji plus '[UNSAVED]' | See shell-20. Same development title/dirty-indicator polish. |
| canvas-30 | duplicate | Canvas toolbar mixes legacy colour bitmaps with line icons; 'Add Register' icon unreadable; both pin tools say 'Add Pin' | See shell-12. Same mixed toolbar icon styles. Identical pin tooltips also overlap shell-13 and were not independently hovered. |
| canvas-33 | duplicate | Autosave recovery prompt is developer-worded, appears once per file, hides behind the splash, and writes dotfiles into $HOME | See shell-26. Same recovery/autosave behavior; original parallel sessions shared real user.home and may have contaminated frequency. |
| canvas-34 | duplicate | Splash screen is the old graffiti logo with tiny unscaled status text | See shell-27. Same splash artwork/style claim; canonical remains unverified in this bounded review. |
| canvas-36 | duplicate | Status bar and activity bar are pure #000000, clashing with #1E1F22 chrome and #292A2D panels | See shell-19. Same dark chrome tonal preference; no new defect. |
| canvas-37 | duplicate | Editor tab shows both a dirty dot and a close × next to the name | See shell-37. Same dirty-marker/close-button placement preference; both controls existing is not a functional bug. |
| codeaudit-01 | duplicate | Palette tiles are fixed 68x62 device px, so every component caption is cut in half and truncated to about 5 characters | See palette-01. Identical tile-size/caption-baseline root cause. |
| codeaudit-05 | duplicate | Tree and table rows are fixed at 24px (or literal 24/30) while their cell fonts are 22.4px, so row text is clipped | See palette-03. Fixed tree/table metric versus scaled content is substantiated on ProjectExplorer and Statistics. Do not infer every listed table clips. |
| codeaudit-14 | duplicate | 27 raster GIF component icons are bilinearly upscaled to 25.6px, blurry, and drawn for white backgrounds (the 'Do not connect' tile is a white box) | See palette-08. Raster artifacts are visible in palette. Exact GIF count and interpolation mode not re-audited. |
| codeaudit-15 | duplicate | Hand-painted tool/component icons use hard-coded BLACK outlines and saturated primaries | See palette-08. Mixed colored and monochrome glyphs visible; per-class repaint audit not repeated. |
| codeaudit-18 | confirmed-source | Activity bar shows no hover, selected or keyboard-focus background (the fill call is missing) | Activity state branch sets a color but paints no fill. Selection still has an accent stripe and glyph, so 'no selected state' would overstate the result. |
| codeaudit-28 | design-recommendation | Simulation controls float in the middle of the toolbar instead of the right edge | Simulation controls sit in the middle-right region in live capture; right-edge alignment is a layout choice, not a blocked workflow. |
| codeaudit-29 | duplicate | Window title contains debug build info, an emoji dirty marker and old phrasing | See scaling-16. Same dev-build title polish. Emoji behavior not independently retested. |
| codeaudit-36 | design-recommendation | Welcome screen leaves an empty Properties inspector, the palette, and a canvas status bar ('main', '100%') on screen | Empty inspector and main status are visually present on Welcome. Simplify startup context, but this alone does not prove failed editing. |
| critic-01 | duplicate | Every palette caption is cut in half; the palette cannot be read or scanned | See palette-01. Same fixed tile geometry and clipped captions. |
| critic-07 | duplicate | Two clashing icon families: new line icons next to legacy coloured Logisim icons | See codeaudit-15. Same legacy UI icon palette and inconsistent visual language. |
| critic-08 | confirmed-visual | Appearance-editor toolbar icons are dark navy on near-black and practically invisible | Lead inspected 39z-appearance-toolbar.png: dark blue drawing glyphs have poor contrast against the dark toolbar. |
| critic-14 | duplicate | The Properties panel cannot be reopened once closed | See shell-04. Same missing explicit reopen-Properties action. |
| critic-15 | duplicate | The STATE section of the inspector is a dead control or a bare table header | See shell-17. Same State section sizing and empty-state issue. |
| critic-16 | duplicate | Bottom drawer tools are old panels squeezed into 200 px: nested tabs, titled borders, clipped content | See shell-16. Same drawer sizing, nesting and tab-close behavior. |
| critic-17 | duplicate | Simulation controls appear three times and float at an arbitrary x in the toolbar | See shell-11. Same toolbar grouping and alignment concern; duplicated controls can be useful when contextually scoped. |
| critic-18 | duplicate | The Simulate side view and the library 'tree' view are verbatim old Logisim trees | See shell-24. Same simulation-tree metrics and presentation. |
| critic-19 | duplicate | Explorer panel: truncated header, redundant '(main)', identical icons, jarring selection styles | See shell-21. Same crowded circuit header and renderer hierarchy. |
| critic-25 | duplicate | First launch can look frozen: the autosave prompt is hidden behind the splash | See shell-26. Same recovery/splash ownership issue. Repeat under fully isolated user.home to avoid testing artifacts. |
| critic-27 | duplicate | Menus: inconsistent casing, legacy wording, duplicated items and a clashing shortcut | See shell-14. Same terminology and command consistency work. |
| critic-28 | duplicate | Title bar shows debug build IDs, a shouted '[UNSAVED]' and an emoji dirty marker | See shell-20. Same title/debug metadata clutter. |
| critic-29 | duplicate | Welcome and empty states: the welcome page overlays an open 'Untitled' project; blank canvas and inspector | See shell-09. Same welcome/project ambiguity. Recent list additionally reveals scratch test paths from historical unisolated QA. |
| critic-30 | duplicate | Find Action: undersized dialog, developer footer, harsh orange match highlight | See shell-23. Same action-search geometry and result presentation. |
| critic-33 | confirmed-source | Pure-black activity bar and status bar; duplicated and stale zoom readout | Frame.updateZoomStatus reads only layoutZoomModel while appearance editor installs its own zoom model. Black chrome is a separate design choice, not a correctness failure. |
| critic-35 | confirmed-visual | The appearance editor opens as a second tab with the same name; the toolbar height change shifts the layout | Lead inspected 39z-dup-tabs.png: circuit and appearance tabs share the same text and rely solely on the glyph to distinguish mode. Give appearance an explicit label. Toolbar jump remains an unreproduced subsidiary claim. |
| dialogs-17 | unverified | Circuits side list does not update when circuits are added or renamed | Stale list after add/rename was not rerun; original root-cause explanation is explicitly speculative. |
| inspector-02 | duplicate | The Properties panel cannot be resized: dragging the divider snaps back, and the divider is a 5 px unscaled target | See shell-03. Same SizedSplit drag snapback, independently reproduced on the inspector. |
| inspector-11 | duplicate | Closing the Properties panel is a one-way trip: no menu item or shortcut brings it back, 'Show Properties' does nothing, and the hidden state persists across restarts | See shell-04. Same missing direct Properties-panel restore path. |
| inspector-21 | duplicate | Tooltips for cut-off values are themselves cut off at the screen edge (and so is the close-button tooltip) | See shell-36. Same right-edge tooltip clipping claim. Canonical remains unverified because heavyweight popup bounds and harness composition were not isolated. |
| inspector-31 | duplicate | Other things noticed along the way: autosave dialog copy, Project Options scaling, splitter fan-out, appearance-view chrome, toolbar icon | See shell-26. Mixed catch-all: autosave repeats shell-26, icon style shell-12, options scaling shell-02. Splitter fan-out preserving existing mappings is not demonstrated faulty; appearance tab naming and options subclaims remain unverified. |
| light-19 | unverified | Explorer: right-click opens the circuit; list selection does not follow the active tab | Context-menu activation and tab/list selection synchronization not tested or source-audited here. |
| light-21 | confirmed-visual | Find Action misses core commands and matches scattered letters; debug wording | Recovered 'zoom' query returns an irrelevant TTL item and provider-count copy. Other query coverage and provider root cause not independently audited. |
| palette-01 | confirmed-visual | Every tile caption is clipped: unreadable at 1.6, invisible at 2.0, cut short at 1.0 | Live native crops show chopped captions at 1.6 and absent captions at 2.0. One geometry defect, not one bug per tile. |
| palette-02 | confirmed-visual | Dozens of tiles look identical, so the palette can't be scanned even with readable names | Recovered 1.0 crop visibly repeats Floating... labels; icons often indicate the operation but fail to distinguish integer from FP variants. Exact counts and all subcircuits were not re-counted. |
| palette-03 | confirmed-visual | "Show the library tree" opens the untouched 2005 Logisim JTree, broken at scale | Tree fallback clips/overlaps scaled text; source has fixed LaF rows and scaled icons/fonts. Styling age is not the failure criterion. |
| palette-04 | confirmed-source | The project's own subcircuits are buried at the very bottom, under an uppercased file name | Unknown/project libraries are appended after preseeded built-in categories. Exact wheel-notch count was not retested. |
| palette-05 | confirmed-runtime | Search is a plain substring match on the display name: no abbreviations, noisy matches, no ranking, no empty state | Live mux query returns an empty palette without explanation. Substring-only matching is confirmed. Cross-language matching is a proposal, not an existing promise. |
| palette-06 | confirmed-runtime | The side panel can't be widened by dragging, and its width and divider are fixed pixels | One live 2.0 divider drag did not widen the panel; doLayout restores the stored location before release saves it. This fresh session used a 320px migrated side width, not the report's universal 260px claim. |
| palette-07 | confirmed-source | Keyboard use is minimal: no arrow keys, a Tab stop per tile, focus scrolls off-screen | Tile keys only handle Enter/Space and focusGained only repaints; sections are mouse-only. Live Down/Right left focus on the first tile. The 35-Tab capture still had a visible focused tile and does not prove the report's offscreen claim. |
| palette-08 | confirmed-visual | Old Logisim bitmap icons sit beside the new line icons, and some vanish on the dark background | Live crops show white-backed raster icons and colored legacy marks alongside monochrome symbols; visibility varies. Not all claimed icon classes were individually verified. |
| palette-09 | confirmed-source | Recently used lags behind, duplicates pinned items, and the selection shows in two places | choose() mutates/persists recents without rebuilding; pin/recent/category independently render the same tool. Multiple highlights are consistent identity indicators, not multiple selections. |
| palette-10 | design-recommendation | The tile menu has one item, covers the tile, and a subcircuit tile can't open its circuit | A one-item pin menu and no double-click circuit editor are verified in source, but richer actions need an intentional product decision; use Circuits for editing today. |
| palette-11 | confirmed-source | Mixed terminology: "Pin to top" vs the Pin part, Library vs Components, old "Add …" tooltips, two parts both called PLA | Two different factories have the identical display label PLA. That ambiguity is actionable; Pin to top and Library terminology are editorial choices. |
| palette-12 | design-recommendation | The groups mix essential and exotic parts; there's no output pin, and TTL/Advanced are open by default | Catalog regrouping, collapsed advanced groups and an output-pin preset are design choices. Output search discoverability belongs to palette-05. |
| palette-13 | confirmed-source | Group headers: Pinned/Recent titles indented, no hover or count, low contrast, fold state forgotten | Collapse state is in-memory only and header has only a click listener; persisting collapse and adding hover/count are separate UX choices. Contrast is consolidated under codeaudit-16. |
| palette-14 | design-recommendation | The header's view-toggle icon is a folder, with no hover state and a small target | Folder glyph and no standard button fill are present. Replace with a named two-state view toggle for clarity; working toggle itself is not broken. |
| palette-15 | confirmed-visual | Search field: placeholder cut off, icon touching the border and text, faint clear button | Placeholder truncation at 2.0 and cramped leading icon are visible. At this fresh 320px width the 1.6 placeholder fits, so failure is width-dependent. |
| palette-16 | design-recommendation | Dragging a tile onto the canvas does nothing | Source exposes click-to-arm only; drag-to-place is not implemented. No new live drag-placement test or claim of a promised drag workflow. |
| palette-17 | duplicate | At scale 2.0 the palette falls apart: 2 columns, clipped star, truncated headers | See palette-01. High-scale tile and star clipping share fixed tile geometry. Our 320px panel retained three columns, so two columns is not universal. |
| palette-18 | design-recommendation | Tile states and grid are weak: 1 px focus ring, faint hover, ragged grid, tiny icons at 1.0 | Ragged fixed-width tiles and weak focus/hover styling are visible; selected stroke is 1.6f, not the claimed uniform 1px. Prefer measurable hit-target/contrast criteria. |
| palette-19 | confirmed-source | Found along the way: unnamed autosave files written to $HOME, and a startup prompt for each one | Loader and startup share user.home autosaves and Discard deletes the selected file. Harness interference is confirmed by design, not independently reproduced data loss. This run isolated user.home and never cleared real autosaves. |
| palette-20 | unverified | Found along the way: the palette is active on the welcome page but can't place anything; "New project" opens a second window | Welcome exposes palette and inspector in live capture, but failed placement and second-window creation were not retested; retain as workflow follow-up. |
| palette-21 | unverified | Found along the way: dark-theme mistakes on the canvas and in the properties table | Bundled canvas/inspector defects belong to other owners. HdlColorRenderer literals were checked separately; this pass did not visually verify the full canvas claim. |
| palette-22 | duplicate | Found along the way: Find Action and the palette search disagree and look different | See palette-05. Live palette mux miss plus visually inspected recovered Find Action mux hit substantiate the inconsistent search contract; presentation changes remain design work. |
| scaling-02 | duplicate | Parts picker tiles are fixed 68x62 px: captions clipped at 1.25/1.6, gone at 2.0/2.5, ambiguous at 1.0 | See palette-01. Same fixed-size tile/caption defect, including ambiguous names at 1.0. |
| scaling-04 | confirmed-source | First launch runs the legacy layout 'migration', so the side panel is permanently 25% of a half-screen window (170 px on 1366x768: one-column palette) | Migration checks only the migrated flag and imports default old fractions even without stored legacy settings. 1366px case not rerun. |
| scaling-05 | confirmed-runtime | First-launch window is half the screen width at the top-left corner, not maximized or centered; tiny on small screens | Fresh 2560x1600 session opened at (0,0), 1280x1600. Low-resolution behavior and physical screen insets were not tested. |
| scaling-09 | duplicate | Project Options > Toolbar / Mouse still use the legacy explorer tree: truncated bold names, overlapping rows at 2.0, dotted Metal tree lines, icons over labels | See palette-03. Shared ProjectExplorer row/font sizing defect; toolbar-list and Mouse-table subclaims were not separately verified. |
| scaling-13 | duplicate | Unnamed-autosave recovery dialog blocks every startup, even when opening a file; it names a hidden file in $HOME and its choices are unclear | See palette-19. Same shared-home autosave/recovery issue. 'Every startup' is conditional on pending files, not universal. |
| scaling-15 | duplicate | Welcome screen overlays an already-created 'Untitled' project; 'New project' opens a second window | See palette-20. Same untested welcome/new-window workflow; visual presence of an empty inspector alone does not prove the second-window behavior. |
| scaling-16 | design-recommendation | Window title carries debug build info and the old 'main of PC' pattern; truncated on small windows | Development build suffix and truncation are visible; debug metadata is explicitly conditional. A shorter document-first title is polish. |
| scaling-19 | design-recommendation | Old Swing file chooser (Metal layout, tiny icons, cramped list) instead of a native or modern chooser | A Swing chooser is not inherently a workflow bug. Specific small metrics share scaling-01; native portal replacement needs platform requirements and is not required by this audit. |
| scaling-24 | duplicate | Legacy pixel-art component and toolbar icons mixed with new line icons | See palette-08. Same raster/legacy icon visibility and consistency workstream. |
| scaling-32 | duplicate | Search/filter fields: magnifier icon butts against placeholder and caret; placeholders truncated | See palette-15. Same FilterField inset/placeholder issue. |
| shell-03 | confirmed-runtime | None of the three splitters (side panel, inspector, drawer) can be dragged | Side and inspector divider drags failed to retain the requested hundreds-of-pixels change; inspector shifted only about five pixels. doLayout reapplies stored size during drag. Drawer was not dragged live; it uses the same SizedSplit path. |
| shell-04 | confirmed-source | Once closed, the Properties panel can only come back through Preferences > Window > 'Reset window layout to Logisim's defaults' | The normal Show Properties path only changes the attribute model; inspector visibility true is restored by reset/initial preference restoration, not that command. No live hide/reset cycle was needed after source tracing. Missing direct restore blocks the normal inspector workflow until layout reset. |
| shell-07 | confirmed-visual | Editor tab overflow hides the active tab, with no scroll arrows or overflow list | Reviewed the original overflow strip: clipped tabs without usable overflow controls. HEAD sets scroll-button policy but not SCROLL_TAB_LAYOUT. Original active-ALU context is inherited from the report; no new 14-tab live reproduction. |
| shell-08 | confirmed-runtime | Closing the last tab leaves the circuit on screen with no tab; the circuit list selection goes stale | Closing the sole tab live removed its strip while leaving the gate editable and project title intact. Circuit-list staleness after Close Others was not independently reproduced. |
| shell-09 | confirmed-source | The welcome screen covers a project that is already open; 'New project' opens a second window; the project's own circuit can't be reached | Fresh startup visibly overlays an existing Untitled circuit with Welcome. New callback calls doNew while recent-file callback uses doOpenReplacingBlank. Second-window and circuit-click recovery details are source/reported evidence, not a clean independent live comparison. |
| shell-10 | confirmed-source | A new project starts with an invisible 'Load Library' undo step | Startup loads default libraries through proj.doAction, explaining a startup undo entry. No separate pristine Undo-history screenshot captured. |
| shell-11 | confirmed-visual | Simulation controls float in the middle of the toolbar and jump when tools change or the toolbar is hidden | Live full-window screenshots show simulation controls starting well before the right edge with large unused toolbar space. Hide-toolbar jump not retested; alignment is usability polish. |
| shell-12 | design-recommendation | Toolbar mixes 2005 pixel-art tool icons with thin line icons; simulation buttons have no hover and aren't focusable | Mixed legacy and line icon styles are visible. Replacement is a design decision; missing hover/focus behavior was not independently tested. |
| shell-13 | design-recommendation | Tooltip and terminology inconsistencies between the toolbar, the menus and the tooltips themselves | Unify command names, distinguish pin presets, and rename Auto to Fit to contents. Other tooltip/shortcut claims remain reported rather than independently inspected. |
| shell-14 | design-recommendation | Menus keep 2005-era wording, duplicates and inconsistent capitalisation | Live Edit popup confirms disabled appearance commands and verbose Undo wording. These are discoverability/copy choices, not blocked workflows. Other menu subclaims were not retoured. |
| shell-15 | unverified | Window > 'Show Navigation Pane' is out of sync with the activity bar; there are no toggles for the inspector, drawer or status bar | Not independently reproduced, visually inspected, or source-traced in this bounded review. Retained as a candidate, not counted as a verified defect. |
| shell-16 | confirmed-source | Bottom drawer: each tab's x hides the whole drawer, there is no drawer toggle, and the content is legacy (tabs inside tabs, titled borders) | BottomPanel close callback hides the entire drawer rather than removing its tab; archived nested controls are visible. The absolute claim that timing cannot reopen is too strong: the same Simulate command is an existing entry point. |
| shell-18 | confirmed-source | Status bar is almost empty: coordinates and messages are never set, simulation and tick-rate info never appears, and the zoom duplicates the pill | No callers of setCoordinates/setMessage were found; live bar stays sparse. Reject the blanket implication that simulation/tick information is never wired: Frame has explicit setTickRate/setSimulationState paths. |
| shell-19 | design-recommendation | Dark chrome layering: activity and status bars are pure #000; panels are lighter than the editor; five unrelated greys | Black activity/status strips are visible, but the preferred tonal hierarchy is subjective. Group theme polish; do not score darker chrome as a functional failure. |
| shell-20 | design-recommendation | Title bar shows the build hash, a shouted '[UNSAVED]', an invisible floppy emoji and the old 'main of Untitled' wording | Long development-build title and UNSAVED indicator are visible. Hiding debug metadata outside About is polish; a dev build ID is not intrinsically erroneous. |
| shell-22 | design-recommendation | Activity bar: Search and Settings open modal dialogs instead of views; no hover state; no shortcut hints | Bottom action icons may legitimately open dialogs while top icons switch views. Standardize affordances if desired; the behavior alone is not a bug. Hover/tooltip details not retested. |
| shell-23 | unverified | Find Action palette: small fixed window, a stray horizontal scrollbar, debug footer text, low-contrast selected row, garish orange match chips | Not independently reproduced, visually inspected, or source-traced in this bounded review. Retained as a candidate, not counted as a verified defect. |
| shell-24 | unverified | Simulate side view duplicates the toolbar controls and uses a raw JTree with unscaled overlapping icons | Not independently reproduced, visually inspected, or source-traced in this bounded review. Retained as a candidate, not counted as a verified defect. |
| shell-25 | unverified | Library 'tree' toggle uses a folder icon and opens a 2005-style JTree with overlapping icons and clipped names | Not independently reproduced, visually inspected, or source-traced in this bounded review. Retained as a candidate, not counted as a verified defect. |
| shell-26 | confirmed-source | Startup 'Autosave found' prompts: raw file names, unclear choices, hidden behind the splash, triggered by pristine blank projects | Unnamed autosaves target user.home; QA isolation failure amplifies recovered prompts. Per-file recovery/splash-overlap behavior was not independently replayed. Keep application recovery UX distinct from the harness defect. |
| shell-27 | unverified | Splash and About screens are the unchanged 2005 artwork; About credits are unreadable on the dark theme | Not independently reproduced, visually inspected, or source-traced in this bounded review. Retained as a candidate, not counted as a verified defect. |
| shell-28 | unverified | Help > User's Guide opens JavaHelp with Windows-XP-era screenshots and a legacy viewer | Not independently reproduced, visually inspected, or source-traced in this bounded review. Retained as a candidate, not counted as a verified defect. |
| shell-29 | design-recommendation | File > Open uses the stock Swing JFileChooser at 1x size: 3 visible rows, horizontal list, no places | Live Save chooser confirms compact legacy controls, but native places/sidebar/preview are feature requests. Open chooser's claimed row count was not independently tested. |
| shell-30 | confirmed-visual | First launch opens a half-width, full-height, non-maximised window at 0,0 on the Circuits view | Fresh isolated preferences produced a 1280x1600 window on a 2560x1600 private display at origin. This is a poor default layout preference, not a workflow blocker. |
| shell-32 | unverified | Preferences (seen along the way): content floats mid-page, tiny checkboxes, stray horizontal scrollbar, 'Zoom factor' means UI scale | Not independently reproduced, visually inspected, or source-traced in this bounded review. Retained as a candidate, not counted as a verified defect. |
| shell-34 | unverified | Welcome screen disappears (blank editor) while the Preferences window is open | Not independently reproduced, visually inspected, or source-traced in this bounded review. Retained as a candidate, not counted as a verified defect. |
| shell-35 | unverified | Auto-Tick (Ctrl+K) on a circuit without a clock opens a fixed 300x400 dialog with an empty list | Not independently reproduced, visually inspected, or source-traced in this bounded review. Retained as a candidate, not counted as a verified defect. |
| shell-36 | unverified | Tooltips near the right screen edge are cut off | Not independently reproduced, visually inspected, or source-traced in this bounded review. Retained as a candidate, not counted as a verified defect. |
| shell-37 | design-recommendation | Editor tabs and zoom pill: tiny low-contrast close x, dirty dot in the wrong place, no hover in the pill, 10% zoom steps | Dirty dot placement and 10-percent zoom steps are choices. Live tabs/pill exist and source confirms unfocusable, unfilled pill buttons; missing hover and empty-canvas scrollbar behavior were not retested. Group small-target and zoom usability work. |
| shell-38 | design-recommendation | Side-panel list and filter polish: placeholder touches its icon, redundant 'main (main)', weak selected-row contrast | Fresh screenshot shows close icon/placeholder spacing and main (main) redundancy. Treat this as list/filter copy and spacing polish; reported selected-row contrast ratio not independently measured. |
| codeaudit-v-02 | confirmed-source | Project explorer tree turns every row bold after the current circuit, and names get ellipsized despite free space | ProjectExplorer derives plainFont from mutable renderer.getFont(), preserving BOLD from a prior viewed row. Source-supported reused-renderer state leak; live tree is uniformly bold. |
| codeaudit-v-03 | duplicate | Tree icons are bigger than their rows: subcircuit icons stack into a ladder and simulation-tree icons overlap the labels | See palette-03. Library tree scaled icons exceed fixed rows in live scale-2 capture. Simulation renderer subclaim not independently reviewed. |
| codeaudit-v-06 | duplicate | Open/Save dialogs are the stock Swing JFileChooser at its unscaled default size (921x393 at 1.6) | See scaling-19. Same file-chooser redesign proposal; exact size and details-view clipping not independently verified in this pass. |
| codeaudit-v-12 | confirmed-source | The 'attribute halo' marker in the explorer tree is dead code (clip set and restored, nothing drawn) | Halo branch saves/clips/restores without drawing. A dead indicator path is confirmed from source; no standalone live halo test. |
| codeaudit-v-13 | design-recommendation | Search dialog copy is developer jargon: '21 result(s) · 5 provider(s)', 'ENTER to execute', 'Find Action…' | Recovered Find Action screenshot exposes provider count and awkward plurals. Copy polish, not blocked search. |
| remaining-simulation-01 | confirmed-visual | Oscillation stops propagation without synchronizing the run controls | Recovered images actually viewed; current source confirms missing state notification. Not freshly reproduced. |
## W4 — Property editing
| ID | Disposition | Observation | Review note |
| --- | --- | --- | --- |
| canvas-07 | design-recommendation | Rotating a component pivots about its anchor and disconnects every wire | Source confirms Facing-only rotation without rerouting. Reconnection is a feature decision with risk of unintended net changes; do not automatically rotate about center or reconnect nearest wires without a defined electrical-connectivity policy. |
| canvas-35 | duplicate | Inspector noise seen while editing: neon 'FPGA supported' row, amber 'Required fo…', truncated keys, raw coordinates | See inspector-03. Same saturated inspector status styling, with truncation already covered by shell-05 and padding by inspector-13. |
| critic-05 | design-recommendation | The Properties inspector is still the old Logisim attribute JTable | An attribute table is not intrinsically defective. Implement semantic grouping, descriptions and discoverable editors after the verified clipping defects are repaired. |
| critic-37 | unverified | Tooltips near the right screen edge are clipped instead of flipped | Lead saw a clipped tooltip crop, but the recovered shot compositor fixes canvas size and may clip popup windows. Reproduce with direct popup-window capture and on real desktop before assigning app root cause. |
| inspector-03 | confirmed-visual | Neon full-cell colour blocks: pure #00FF00 / #FF0000 FPGA row, orange 'Required f...', and every colour attribute painted as a saturated cell | Live full-cell green support status dominates the panel. HdlColorRenderer source confirms saturated status/required/color fills. Other color-attribute stacks were not independently viewed. |
| inspector-04 | confirmed-source | The 'FPGA supported' row is pinned first for everything, including wires, text labels, drawing shapes and mixed selections, where it is meaningless or wrong | HDL row queries compInst; mixed-selection title setup chooses one encountered component factory. It does not aggregate support across selected factories. Always-show styling is design; misleading aggregate status is the correctness concern. |
| inspector-05 | confirmed-runtime | The mouse wheel never scrolls the property list; over the value column it silently changes values (scroll-jacking) | Without clicking the value editor, two wheel-up notches over Facing changed East to North and rotated the gate. Table consumes wheel handling at the component level; long splitter-list scrolling was source-assessed, not live-reproduced. |
| inspector-06 | confirmed-source | Wheel gestures behave inconsistently: dropdown rows record one undo step per notch, and wheel direction is inverted between row types | Option-combo branch immediately applies each notch, numeric branch uses pending settle timer. Throttle ignores close events. Exact lost-notch count and pen-width direction were not independently replayed. |
| inspector-07 | confirmed-runtime | A half-typed value is silently discarded when the user clicks the canvas | Typed ScratchLabel was visible in the editor; clicking empty canvas then reselecting the gate left Label empty. The uncommitted draft is cancelled when the model changes before focusLost commits. No saved project content was lost. |
| inspector-08 | confirmed-source | Validation happens after the fact in modal dialogs; invalid input is thrown away and messages are inconsistent | AttributeSetTableModel exposes NumberFormatException messages; AttrTable shows modal warnings. Broad claim that every invalid field discards drafts or has the same icon was not live verified. |
| inspector-09 | design-recommendation | Error and validation copy is old-Logisim wording: shouting, duplicated 'Error:', missing spaces, invisible characters | The recovered validation wording merits plain-language revision, but individual error dialogs were not independently opened. Bundle with validation UX, not a separate functional bug. |
| inspector-10 | confirmed-visual | On a fresh window, clicking components shows a completely blank Properties panel (Poke tool is the default), with no empty state; files without a toolbar have no visible Select tool at all | Fresh window has active Poke tool and a blank bordered Properties panel without guidance. Missing Select tool in files with custom/empty toolbars was not independently tested. |
| inspector-12 | design-recommendation | The inspector is still the 2005 raw two-column JTable: no groups, no search, no descriptions, no editor affordances, booleans as Yes/No dropdowns | Live table lacks persistent editor affordances and grouping. Sections, search and property help are improvements; a two-column table itself is not a bug. |
| inspector-13 | confirmed-visual | Cells have no padding: text is flush to the cell edges and labels run into values ('Output Value0/1', 'Circuit Namemain') | Output Value0/1 and neighboring labels/values visibly run together. HdlColorRenderer removes cell borders/insets; fix padding separately from total panel width. |
| inspector-14 | design-recommendation | Heavy selection and focus styling: saturated full-width blue row bars and a blue rectangle around the whole table | Strong blue row/focus styling is visible during multi-edit, but heaviness is aesthetic. Retain visible keyboard focus while improving contrast and restraint. |
| inspector-15 | confirmed-source | Panel title uppercases everything (misrepresenting case-sensitive names), shows raw coordinates, truncates, and says 'VARIOUS ITEMS × 3' | PanelHeader uppercases user content as well as labels, so identifier casing is misrepresented. Coordinates and Various items wording are lower-priority design choices. |
| inspector-16 | confirmed-visual | In the Appearance editor the panel header is stale: it keeps the last layout selection ('LED (1170,970)') while showing circuit or shape attributes | Archived crop shows LED (1170,970) header over circuit attributes. HEAD appearance path sets AttrTable through its manager, bypassing the Frame method that updates Inspector title. No live appearance retest. |
| inspector-17 | design-recommendation | Any selection that includes a wire loses every shared property: rubber-band selecting pins + gates shows only the FPGA row | Source confirms intersection includes wire attributes. This is mathematically correct for all selected objects, but component-only aggregate editing may be more useful. Define scope explicitly before excluding wires; do not silently pretend a change applied to everything. |
| inspector-18 | confirmed-source | Multi-select editing: '(various)' looks like a real value, the editor pre-fills the first item's value, and labels are silently auto-numbered | Mixed values are displayed as a plain string and multi-label edits use AutoLabel. Correct the claimed cause: SelectionAttributes stores null on disagreement, not the first component's value; editor defaults can still turn opening/committing a mixed field into a concrete value. No independent multi-component live test. |
| inspector-19 | confirmed-runtime | Editing several table rows at once creates three undo entries, including an empty one | Two-row Yes commit required three Undos to restore No/No; observed sequence Yes/Yes -> Yes/No -> Yes/No -> No/No (the original report's no-op position differs). More seriously, Escape cancelling a No/Yes multi-edit changed it to No/No. One Undo restored the changed Yes. Same cancel-handler writes explain both symptoms. |
| inspector-20 | design-recommendation | Undo history is useless for property edits: every entry reads 'Change Selection Property' | Property actions share one generic label in source and the live menu. Improve names with attribute/selection scope; this is undo discoverability, not undo failure. |
| inspector-22 | unverified | Font picker is an unlabelled legacy dialog titled 'Select Value' with unscaled checkboxes and a clipped preview | Not independently reproduced, visually inspected, or source-traced in this bounded review. Retained as a candidate, not counted as a verified defect. |
| inspector-23 | unverified | Colour picker is a bulky modal colour-wheel dialog with no swatches, unlabelled tiny radio buttons and redundant controls | Not independently reproduced, visually inspected, or source-traced in this bounded review. Retained as a candidate, not counted as a verified defect. |
| inspector-24 | unverified | Property naming is inconsistent: Title Case vs sentence case, trailing colons, Java font names, instruction text as a value | Not independently reproduced, visually inspected, or source-traced in this bounded review. Retained as a candidate, not counted as a verified defect. |
| inspector-25 | confirmed-source | Keyboard editing barely works: no type-to-edit, F2 dead after clicking a label, no visible focused cell | CellEditor rejects typed KeyEvents except Space, confirming no normal type-to-edit. F2 on the noneditable label column is not itself proof of failure. Add a clear focus/edit path and retest keyboard-only workflow. |
| inspector-26 | design-recommendation | Tool defaults and a selected component look identical; nothing says you are editing defaults for new parts | Tool-default versus instance editing needs an explicit scope label. Source has a separate ToolAttributeAction route; no independent comparative screenshot of tool defaults. |
| inspector-27 | confirmed-source | The STATE section expands into an empty strip with no explanation | Register list filters on ATTR_SHOW_IN_TAB and reconstructs a header even when there are no rows. Missing explanatory empty state is supported; an actual opted-in register failing to appear was not established. |
| inspector-29 | design-recommendation | Editor types behave inconsistently on click: some dropdowns open immediately, the editable Data Bits combo does not, numbers are bare text | Editable numeric combo and finite-choice combo legitimately differ. Persistent affordances/range hints would help; different editor types alone are not a functional bug. |
| inspector-30 | design-recommendation | Labels must be HDL identifiers even for users who never target an FPGA ('my gate', 'Clock A', circuit 'main 2' rejected) | Separating display labels from HDL identifiers is a product/data-format decision. The report does not establish accidental regression; retain as a design proposal with export/name compatibility tests. |
| light-04 | unverified | Inspector is a raw legacy JTable: garish #00FF00/orange cells, no column gap, coordinates as title | Inspector cell fills, padding and coordinate headings not inspected in this bounded pass. |
| light-24 | unverified | Inspector STATE section expands to nothing: no rows, no empty state | Expanded STATE empty view and circuit-specific availability were not checked. |
| scaling-18 | duplicate | Inspector: neon #00FF00 'Supported' cell, raw coordinates in header, ambiguous truncated labels | See codeaudit-v-05. FPGA support-color claim overlaps checked renderer literals. Raw-coordinate and attribute-truncation subclaims not fully assessed here. |
| scaling-23 | confirmed-source | Panel header: title sits above the action icons' baseline and is the first thing dropped when space is short | PanelHeader title stack and full-width end actions compete without overflow policy. Exact title disappearance not reproduced in this 320px panel. |
| shell-06 | duplicate | Properties inspector table is a raw legacy JTable: neon-green 'Supported' cell, no padding, a blank box when empty, raw coordinates in the header | See inspector-03. Compound inspector styling claim: FPGA fill overlaps inspector-03; padding overlaps inspector-13 and empty state inspector-10. No separate shell defect. |
| shell-17 | duplicate | STATE section expands to nothing (or a bare 'Name \| Value' JTable header) with no empty state | See inspector-27. Same register-state empty-state claim, not another defect. |
| codeaudit-v-05 | confirmed-source | Properties inspector shows a neon #00FF00 'Supported' cell and neon-orange 'Required for FPGA' cells on every component | HdlColorRenderer explicitly uses GREEN/RED/ORANGE backgrounds. This does not apply to every component/state indiscriminately; inspector status treatment is a scoped contrast/design fix. |
| editing-new-01 | duplicate | Cancelling a multi-row attribute edit mutates differing values | See inspector-19. Extension of the same cancellation/undo root cause, not an additional independent bug count. |
## W5 — Canvas, component rendering and output
| ID | Disposition | Observation | Review note |
| --- | --- | --- | --- |
| canvas-02 | confirmed-visual | Text-tool annotations are drawn black on the dark canvas (effectively invisible) | Reviewed archived committed text: black on dark canvas is difficult to read. HEAD TextTool stamps a black default and does not register it as a themed color. Preserve explicit file colors when designing a theme-aware default/migration. |
| canvas-04 | confirmed-visual | Pin values: pure-blue radix letter and white-on-bright-green bit ovals are unreadable | Archived pin crop shows dark-blue radix letter and pale digit on bright green. HEAD hard-codes Color.BLUE and Color.WHITE. Exact contrast ratio not recomputed; legibility problem is visually clear. |
| canvas-08 | design-recommendation | Keyboard model is legacy: arrows re-face, no nudge, Escape doesn't deselect, no Ctrl+Y / Ctrl+0 / Ctrl+= | Arrow-key facing and alternative redo/zoom shortcuts are compatibility/discoverability choices. Add discoverable commands and optional aliases; do not call every departure from another editor a broken workflow. |
| canvas-09 | design-recommendation | Context menus are nearly empty, missing on empty canvas, and Ctrl+click opens a menu instead of toggling selection | Richer context menus and Ctrl-click additive selection are proposals. Saved mouse mappings must be respected; a configured context-menu gesture is not intrinsically defective. |
| canvas-10 | confirmed-visual | Grid rendering is inconsistent across zoom: two-level only at exactly 100%, square blobs when zoomed in, grey moiré wash when zoomed out | Reviewed archived grid comparison: hierarchy changes and low-zoom dense mesh are visible. Source has two-level rendering only at f==1.0 and no general screen-density threshold. |
| canvas-11 | design-recommendation | Zoom steps are linear 5/10/20 %: ~55 wheel notches from 100% to 1000%, and 5% minimum is useless | Additive zoom steps exist in the source; choosing multiplicative steps is usability work. The precise reported wheel count was not rerun. |
| canvas-12 | confirmed-visual | Zoom-to-fit hugs the top-left edge, keeps a huge scroll range, and is labelled just 'Auto' | Archived fit result has substantial unused right space and content near the left edge. Reject the alleged missing-centering call: ZoomControl calls setZoomFactorCenter, CanvasPane handles CENTER, and Canvas.center calculates offsets. Near-origin negative-scroll clamping and unchanged-factor skipping are candidates, not proven causes. |
| canvas-14 | unverified | Rubber-band live preview highlights wires and pins but not gates | Not independently reproduced, visually inspected, or source-traced in this bounded review. Retained as a candidate, not counted as a verified defect. |
| canvas-15 | unverified | Port hover ring leaves stale blue pixels after the mouse moves away | Not independently reproduced, visually inspected, or source-traced in this bounded review. Retained as a candidate, not counted as a verified defect. |
| canvas-16 | unverified | Splitter is an illegible 20 px blob with 7-unit bit labels printed over its own stubs | Not independently reproduced, visually inspected, or source-traced in this bounded review. Retained as a candidate, not counted as a verified defect. |
| canvas-18 | confirmed-source | Placement ghost of gates looks exactly like a placed gate | Gate paintGhost calls paintBase, whose color assignment overrides the requested ghost color. Archived ghost outline is the same bright family as a placed gate, but the provided placed crop is selected, so pixel-identical complete rendering is not established. |
| canvas-19 | design-recommendation | Components are unfilled wireframes – grid dots show through gate, pin and tunnel bodies | Transparent schematic symbols are a valid established design. Body fill is optional polish; do not count wireframe styling or visible grid inside gates as a defect. |
| canvas-20 | design-recommendation | Input and output pins look the same; unconnected output shows 'U'; pin labels cramped and bottom-aligned | Input/output differentiation and label spacing merit design review. U denotes undefined state, not an error in itself. No independent full pin-variant comparison. |
| canvas-23 | confirmed-source | No drag-and-drop from the parts palette to the canvas | ComponentTile arms tools on mousePressed and has no drag-transfer handlers. The promised drag/drop interaction is absent in that path; click-then-place remains usable. No live palette drag repeated. |
| canvas-28 | unverified | Tunnel label is crammed against the tunnel outline | Not independently reproduced, visually inspected, or source-traced in this bounded review. Retained as a candidate, not counted as a verified defect. |
| canvas-31 | unverified | Branching from a wire routes horizontal-first, overlapping the existing wire and cutting across others | Not independently reproduced, visually inspected, or source-traced in this bounded review. Retained as a candidate, not counted as a verified defect. |
| canvas-32 | design-recommendation | No hover affordances on the canvas: components don't highlight, ports/wires show no tooltip | Hover highlight and generic net-value tooltips are useful additions, not proof of an existing functional failure. Absence was not independently timed. |
| components-01 | design-recommendation | Canvas "100%" ignores the 1.6 interface scale, so everything on the canvas is drawn about 60% too small | Canvas geometry uses its own zoom. A physical-DPI contract has not been established, so the claimed blocker and assertion that 200% is really 125% are rejected. Crops cannot establish physical size. Do not automatically multiply by interface scale. |
| components-02 | confirmed-visual | Hard-coded 6/7/9-pt fonts make splitter indices, TTL pins, memory captions and POR/RTC text unreadable even at 200% | Small fixed captions and crowded splitter annotations are visible; 7-unit fonts are confirmed in source. The universal claim unreadable even at 200% is too strong: enlarged TTL captions are readable. Fix local caption geometry and sizing, independent of the base-zoom decision. |
| components-03 | confirmed-visual | Text component and the Text tool draw pure black text on the dark canvas | The existing annotation is black on dark canvas while the active editor remains legible. TextAttributes and the tool preference default to black. This is visual loss of legibility, not established loss of document data. Reject converting every stored black colour to auto. |
| components-04 | design-recommendation | In-place text editor is a pastel-yellow Metal-era box | Yellow editor, black text and caret are visible and readable. Restyling is reasonable but there is no demonstrated editing failure. |
| components-05 | confirmed-visual | Values and titles painted light-on-light and therefore invisible (Constant, RAM/ROM contents, POR, RTC, SoC bus trace) | Light foreground over white/light grey/yellow is directly visible for POR, Constant, ROM, RTC and bus trace placeholder. Current paint sites retain the same mismatch. RAM and Dual RAM breadth is source-inferred from the shared MemState painter, not independently visually checked here. |
| components-06 | design-recommendation | Glaring light-theme and skeuomorphic fills on the dark canvas (button, probe, value chips, oscilloscope, keypad, dot matrix, video) | Bright widget fills and bevels are visible. These do not establish broken I/O. Unknown/error matrix colours and a black video framebuffer can convey simulation state and must not be globally replaced with neutral decoration. Preserve explicit I/O colours. |
| components-07 | design-recommendation | 7-segment and hex display 'off' segments are near-white, so an idle display looks fully lit | Bright off segments are verified and source defaults are 220/220/220. The image also shows a red active digit distinguishable from grey off segments. This supports improving state emphasis, not an incorrect simulated digit or electrical state claim. |
| components-08 | confirmed-visual | Pure blue (#0000FF) text on the dark canvas: I/O labels, radix suffixes and the CPU 'Start' button | Blue Button/LED labels and small blue radix suffixes have poor dark-background contrast. The CPU Start control is a different foreground/background pair and is not evidence of blue-on-dark text. Literal user label colours must remain literal. |
| components-09 | confirmed-visual | Black strokes and text invisible on dark: TTL outlines and notch, SoC DMA captions; ground drawn in dim wire-0 green | DMA CTRL/SRC/DST captions are black on dark and deserve correction. TTL outline/notch remain visible against the grey package, so invisible is overstated. Ground is deliberately value-coloured and visible but subdued; changing that convention is a design decision. |
| components-10 | design-recommendation | Custom subcircuit appearances are not theme-adapted: the user's FULLADDERs are solid black holes and ALU/REG outlines vanish | Recovered user-circuit image shows black custom shapes. It does not establish that the shapes were unintended or data-corrupted. SVG missing fill resolves to black and existing custom colours are literal. Reject blanket mapping of existing black/white colours; offer new auto-colour shapes or an explicit display option. |
| components-11 | confirmed-visual | Internal text overflows fixed-size bodies and collides with strokes (plexers, arithmetic, bit extender, flip-flops, Telnet/Reptar, BFH, SoC) | Intrinsic caption collisions confirmed for plexers, arithmetic, bit extender, Telnet and DMA's three 100-unit status panels. Flip-flop K/R crowding is visible but less severe. Overlapping separate SoC components in the fixture are not proof of an intrinsic Nios/PIO layout defect; the report's full component inventory is not independently proven. |
| components-12 | confirmed-visual | Gate labels are drawn centred on top of the gate outline | Labels are centred inside shaped gates; the long label crosses the outline and ports. This is a distinct label-anchor defect within the caption-layout workstream. |
| components-14 | confirmed-visual | Load-time label-collision warning is hidden behind the splash screen and wrongly worded | Splash covers the warning text but OK remains visible; this is an obscured diagnostic, not a proven startup deadlock. Source clears matching component labels and opens a null-parent modal with placement-specific wording. The recovered image and source do not prove an overwritten saved file. |
| components-15 | confirmed-visual | Exported PNG/GIF/JPEG images are not anti-aliased (2–3 colours total) | Jagged raster edge verified. Recounted PNGs: 840x649 and 1680x1298, each exactly 3 colours. Export raster Graphics lacks the canvas AA setup. GIF/JPEG share the source path but were not independently exported here; physical printing is unverified. |
| components-16 | confirmed-visual | Export Image and Print dialogs are legacy JOptionPane forms (raw format string, unscaled controls, Metal file chooser, Swing print dialog) | Controls are small relative to text and the header field exposes undocumented format tokens. Dialog styling alone is P3. The slider precision, offscreen preselection, native printer placement and platform-specific chooser details were not reverified here. |
| components-17 | confirmed-visual | LED bar / dot-matrix circle dots are drawn at the wrong position (absolute coordinates multiplied by scale) | Recovered printer-view export shows detached ellipses. drawCircle rescales already absolute x/y; LedBar sets scaleY=3. Standard DotMatrix uses scaleX=scaleY=1, so it does not necessarily exhibit displacement. The live circle-shape path has the same source defect but was not exercised anew. |
| components-18 | confirmed-visual | Print-view render still contains pastel probes, grey labels, black slabs and dark-on-dark text | Confirmed printer-view PNG issues: black VGA status text on a dark strip and tight pin x1 badge geometry. Yellow probe and black framebuffer are visible styling/ink-use concerns, not inherently incorrect. No physical print was inspected. The original SocVgaShape citation targets dynamic appearance and is insufficient to explain the entire normal VGA body. |
| components-19 | confirmed-visual | Placement ghost is drawn at full component brightness, indistinguishable from placed parts | Ghost and placed AND outlines have similar brightness. AbstractGate.paintGhost delegates to paintBase, which overwrites the supplied ghost colour. This does not establish missing collision prevention or invalid circuit placement. |
| components-20 | design-recommendation | Buses have almost the same colour as component outlines, and stroke weights follow no system | Bus and symbol colours are similar and buses visually dominate, but widths deliberately encode net width. Source already centralizes rounded stroke construction. Review palette and hierarchy without flattening all widths or changing custom preferences. |
| components-21 | confirmed-visual | Input-pin value '1' is white on bright green (about 1.9:1) and about 9 px tall | White input glyph over bright green has low contrast; Pin explicitly selects Color.WHITE. The numeral is still visible, so this is readability rather than a lost value or broken poke action. |
| components-23 | design-recommendation | TTL chips are skeuomorphic DIP packages without pin numbers or pin names | Package view lacks displayed signal names in these images; that is a usability option, not proof of incorrect pin mapping. Preserve physical pin order/notch semantics; optional schematic labels are preferable to removing a meaningful package convention. Small text is already covered by components-02. |
| components-24 | confirmed-visual | Off-screen indicators are crude fixed-pixel brackets that collide with the zoom pill | The southeast indicator is occluded by the zoom overlay. The screenshot supports overlay layout collision; its aesthetic description is subjective. |
| components-25 | confirmed-visual | Component icons in the palette and toolbar are the old Logisim set (GIFs, garish literal colours) | Recovered image visibly clips palette captions. The icon redesign request is P3 and GIF use alone is not a defect. Exact effective scale and present sizing were not freshly measured by this reviewer; follow up with the palette/scaling owner without inferring a binary revision from stale title metadata. |
| components-26 | confirmed-visual | Inspector shows a pure #00FF00 'Supported' cell and truncated or run-together attribute names | Truncated names and missing visual gap between Output Value and 0/1 are visible. Neon green is primarily a styling issue; the cell text itself has strong contrast. HdlColorRenderer uses literal GREEN/RED. |
| components-27 | design-recommendation | Window title shows the build ID and timestamp and marks unsaved twice | Build ID is visible in the recovered title. Source limits build metadata to non-stable versions and intentionally uses two dirty markers. This is a development-build presentation choice, not a release or save-state defect. |
| components-28 | confirmed-visual | Circuit list does not follow the active tab, and its header is truncated to 'CI…' | Historical image shows gates tab/canvas with soc selected in the list, and the header clipped to CI.... Current source already registers ACTION_SET_CURRENT and syncSelection, so missing listener is rejected as the root cause. Exact sequence/current-HEAD recurrence remains unverified; retain symptom for a focused navigation test. |
| components-29 | duplicate | Startup splash is old Logisim-evolution branding and stays on top of dialogs | See components-14. Splash occlusion is the same incident as components-14. New artwork is a separate P3 design preference; do not count another startup bug. |
| components-30 | design-recommendation | Leftover placeholder and legacy text on components ('n/a', 'Decd', French TCL ports) | n/a, Decd and French example identifiers are visible. These are content conventions, not failed computation. Improve presentation/documentation, but do not rename existing TCL/HDL port identifiers and break users' scripts. |
| components-31 | confirmed-visual | Menu accelerator text is noticeably smaller than item text | Accelerator text is much smaller in the recovered menu. Startup scales menu component fonts, whereas Main's global font-family replacement retains per-key sizes. The precise FlatLaf accelerator-font resolution and effective scale were not freshly measured. Stale title metadata does not establish which source revision produced the screenshot. |
| components-32 | design-recommendation | Autosave recovery prompt is cryptic ('What should be done?' with Save / Save and load / Discard) | Recovery wording leaves restore intent unclear. The screenshot proves ambiguous copy only, not broken recovery or data loss. The original harness shared user.home, so provenance of the shown autosave cannot be assumed to be isolated test data. |
| critic-06 | duplicate | Neon status cells (#00FF00 / ORANGE / RED) in the inspector; select-all mislabels support | See components-26. Same hard-coded support-status colours; mixed selection support must be checked separately. |
| critic-09 | duplicate | Pin and probe radix letters ('b', 'h') are drawn pure blue on the dark canvas | See components-08. Same hard-coded blue radix and label colours. |
| critic-10 | duplicate | ROM/RAM contents grid: near-white text on a light-grey block (≈1.45:1) | See components-05. Lead independently viewed pale ROM text on pale cells in components-verify/09-rom-100-x2.png. |
| critic-11 | duplicate | The Text tool creates black labels on the dark canvas by default | See components-03. Lead independently viewed black canvas text in components/09-text-black.png. |
| critic-12 | design-recommendation | Legacy subcircuit appearances render as bright white cards in dark mode | Explicit document fill/stroke colours are user data. Offer a reversible theme-aware display option and readable new defaults; never silently recolour saved appearances. |
| critic-34 | design-recommendation | Context menus: destructive item first, missing common actions, ambiguous 'Image' and 'Pin' wording | Group context actions by task, separate deletion, clarify Image and Pin. Verify actual action semantics before changing labels or keyboard access. |
| inspector-28 | duplicate | Default colours shown and edited in the inspector are invisible on the dark canvas (#000000 text/pen, #0000FF LED label) | See canvas-02. Annotation black-on-dark is confirmed under canvas-02. LED-label and appearance-pen variants were not independently checked; do not expand the confirmed scope to all saved custom colors. |
| light-01 | confirmed-visual | Palette: every component caption cut in half; TTL/PC sections become rows of identical unlabeled tiles | Recovered light palette captions are visibly sliced below the icons. Fixed 68x62 tile plus scaled caption baseline explains it at HEAD. Blocks reliable visual part identification. |
| light-12 | design-recommendation | Canvas "100%" draws at 1x device pixels while the chrome is 1.6x, so circuits look tiny and faint | Independent canvas zoom is intentional unless product specifies physical-size matching. Small circuit is visible live, but 100% need not equal application UI scale. |
| light-13 | unverified | Zoom-to-fit (tooltip "Auto") clips the circuit and a second click does nothing | Fit-to-circuit clipping and second-click behavior not reproduced or source-audited in this bounded pass. |
| scaling-17 | unverified | Pin/probe radix subscript painted pure Color.BLUE: invisible on the dark canvas | Pin/probe radix contrast not inspected at native crop in this bounded pass; leave for component/canvas reviewer. |
| scaling-25 | design-recommendation | Duplicate zoom readouts: canvas zoom pill and status bar both show '100%' | Duplicate zoom display is visible but both are consistent. Consolidate only if product hierarchy benefits. |
| shell-33 | duplicate | Canvas at '100%' ignores the 1.6 interface scale: circuits render tiny, black labels vanish, white REG boxes and a neon ALU | See canvas-02. Compound canvas claim repeats annotation contrast (canvas-02) and default zoom/readability (canvas-01). Custom appearance colors in loaded files are not automatically theme bugs. |
| codeaudit-v-11 | confirmed-source | Palette previews are rasterised into a 1x BufferedImage and will be blurry on every OS-scaled display | ToolPreviewIcon caches one raster at app-scale size with theme-only invalidation; live 2->1 change keeps large previews. OS-scale blur is plausible, not tested, and default image at app scale 1 is 20x20, not the claimed universal 32x32. |
| remaining-keyboard-01 | confirmed-runtime | Ctrl+Tab and Ctrl+Shift+Tab do not cycle circuit tabs from the canvas | Fresh live forward/reverse checks; Ctrl+W positive control. |
## W6 — Simulation and docked tools
| ID | Disposition | Observation | Review note |
| --- | --- | --- | --- |
| analyzer-28 | duplicate | Window title shows debug build info and duplicate unsaved markers | See light-26. Build/dirty-title presentation repeats light-26. |
| canvas-03 | unverified | Inline canvas text editor is the legacy yellow sticky note (#FFFF99, black text) in dark mode, and leaves a stale halo | Not independently reproduced, visually inspected, or source-traced in this bounded review. Retained as a candidate, not counted as a verified defect. |
| light-02 | confirmed-source | None of the shell dividers can be dragged (side panel, inspector, bottom drawer) | SizedSplit.doLayout unconditionally reapplies stored divider size and saves only on mouse release, supporting snapback. No independent live drag retest; do not claim all dividers experimentally verified. |
| light-05 | duplicate | Bottom drawer opens at an unscaled 200 px and cannot be resized: timing diagram is unusable | See light-02. Drawer undersizing depends on fixed defaults and divider persistence in light-02/light-03. Timing-specific ruler overlap not independently reviewed. |
| light-14 | unverified | Every subcircuit icon contains hard-coded text "main"; tree icons overlap their labels and each other | Hardcoded main text and every tree icon slot not inspected; toolbar overlap shares dialogs-08 but this broader claim remains unchecked. |
| light-25 | design-recommendation | Empty surfaces with no guidance: blank Properties at start, always-present empty VHDL Console with an unlabeled dot | Empty Properties is visible live and would benefit from guidance. VHDL console lifecycle and dot were not checked; hiding it must preserve discovery for valid projects. |
| light-26 | design-recommendation | Five different 'unsaved' markers and build metadata in the title bar | Live dirty title plus tab dot and dev-build metadata are redundant. Metadata is conditional development-build information, not necessarily a release-title bug; other markers not reviewed. |
| light-27 | unverified | Secondary dialogs: Signal Selection is legacy, About ignores Escape, colour chooser controls are thin | Compound Signal Selection/About/color-dialog interaction claim not independently tested. Color chooser visuals are specifically covered by dialogs-24. |
| scaling-21 | unverified | Timing diagram bottom panel on small screens: nested tabs, titled-border groups, clipped buttons, about 150 px tall | Timing drawer small-screen workflow not exercised or its screenshots viewed in this pass. |
| scaling-28 | design-recommendation | Menu wording and duplication: 'Ctrl+Comma', mixed title/sentence case, repeated items, legacy terms | Ctrl+Comma is visible and platform-generated. Broader menu terminology audit was not repeated; copy consistency is editorial. |
| codeaudit-v-14 | confirmed-source | Timing-diagram error/unknown segment colours are fixed light pastels, independent of theme | Chrono error/unknown fills are static pastels. Contrast against actual waveforms in both themes not measured; retain source-supported theming follow-up, not confirmed unreadability. |
## W7 — Analysis, settings and secondary editors
| ID | Disposition | Observation | Review note |
| --- | --- | --- | --- |
| analyzer-02 | confirmed-visual | Overlines float ~8px above the letters and are shifted left, so negated variables are ambiguous | Personally inspected recovered overline crop: bars have excessive gap and mismatched horizontal spans. HEAD double-scales notSep; the precise horizontal metric failure remains a hypothesis. |
| analyzer-03 | confirmed-runtime | Analyzer opens as a small packed window (1473x492): 4–5 table rows visible, K-map and expression cut off | Live window measured 1473x492; five table rows and the Simplified expression below the visible viewport. Resizing or scrolling is a workaround. |
| analyzer-04 | confirmed-visual | At the window's own minimum width the action buttons overflow: Build Circuit and both Export buttons go off-screen; 'Help' menu clipped | Recovered 720px capture visibly omits trailing actions and clips title. Source uses nonwrapping BoxLayout at a smaller permitted minimum. Not retested live at that width. |
| analyzer-05 | confirmed-visual | K-map covers in dark theme: white digits on pale olive/tan covers at 1.9:1 contrast, muddy overlaps, cover box offset from its digit | Light digits on olive/tan covers are visibly weak in recovered and live maps. Original exact contrast ratios were not independently remeasured. |
| analyzer-06 | design-recommendation | K-map does not scale with the window; header labels shrunk to ~2/3 size; huge dead space | Live map remains small with reduced header type, but expansion to fill a large window is a design choice, not a demonstrated failure. |
| analyzer-07 | confirmed-source | No undo anywhere in the analyzer; K-map clicks silently edit the truth table and rewrite the expression | HEAD directly cycles truth-table entries on map clicks; no undo references found in analyze package. Did not independently reproduce all variable/expression edits or irreversible loss. |
| analyzer-08 | confirmed-source | With more than 6 inputs, the Expression and Simplified tabs are disabled without explanation, and the Simplify result can't be viewed anywhere | Tab enablement is solely gated on <=6 inputs; live 8-input table showed disabled tabs. Completed manual optimization and inability to view its result were not rerun. |
| analyzer-09 | confirmed-source | Optimizer: debug-log progress dialog, 'click here to close window' button, no Cancel for an 'hours'-long job; warning defaults to Yes | A running optimizer has DO_NOTHING_ON_CLOSE, hidden done button until completion, no cancellation path here, and Swing changes on raw threads. No hours-long optimization was run; severity applies if a long optimization is entered. |
| analyzer-10 | confirmed-visual | CSV import dialog is untitled, off-centre and edge-to-edge; a normal CSV is then rejected with jargon | Recovered CSV screenshot verifies untitled edge-touching form and 4x4 preview. HEAD centers before packing. Escape-to-close is implemented, so absence of a Cancel button does not prove no cancellation. General CSV incompatibility was not independently tested. |
| analyzer-11 | design-recommendation | Analyzer window carries the whole main menu bar: canvas commands, dead menus, and a Window>Show Toolbar that hides the MAIN window's toolbar | Live Analyzer has disabled Project/Simulate/FPGA menus. Context-specific menus are reasonable; global toolbar side effect and close-shortcut conflict were not retested. |
| analyzer-12 | design-recommendation | Analyzer doesn't say which circuit it shows and keeps stale data when the user switches circuits | Analyzer title lacks circuit identity in live captures. Keeping a separate analysis snapshot after a main-window switch can be intentional; automatic synchronization is not established as required. |
| analyzer-13 | confirmed-visual | Truth-table toolbar: unlabeled '-', '1', '0' buttons with no tooltips; zero-margin buttons whose text touches the border; centred FlowLayout strip | Live '- 1 0' strip and zero-space collapse button are cramped. Missing tooltips and no-op collapse feedback were not tested. |
| analyzer-14 | design-recommendation | A single click in an output cell selects the whole column below it | Source explicitly selects the output column from clicked row downward; this is intentional behavior. Make bulk fill explicit or single-cell selection the default; not a random drag bug. |
| analyzer-15 | design-recommendation | Truth table rendering looks old: narrow centred column in empty space, no zebra/hover, no bit grouping, off-theme selection and cursor colours | Narrow centered table is visible live; zebra stripes, hex mode and expansion are proposed enhancements. Off-theme cursor and selection measurements not revalidated. |
| analyzer-16 | confirmed-visual | Signals tab: no visible add/remove/reorder controls, no context menu, unscaled row metrics, English-only bit-width dropdown, cryptic error | Live Signals view lacks visible remove/reorder buttons and has compact editing rows. Its bit-width popup has 20 fully readable rows; do not infer blank-row failure. Keyboard reorder and localization were not retested. |
| analyzer-17 | unverified | Expression tab: monospace logical font with tiny fallback glyphs; editor switches notation and font; separate notation settings per tab | Logical fallback glyphs and notation changes during editing were not inspected in this bounded review. |
| analyzer-18 | design-recommendation | Simplified tab looks dated: boxed 'No group selected.' panel, ragged centred combos, whole-panel focus border, orphan diagonal in Lined style | Live Simplified view has ragged control widths and a whole-panel focus border. Lined-map orphan diagonal and selected-group rendering were not checked. |
| analyzer-19 | duplicate | Build Circuit dialog: label abuts combo, unscaled 13px checkboxes, low-contrast check mark, ragged field widths, question icon on a form | See dialogs-01. Small widgets are the same scaling issue as dialogs-01; form padding and explicit Build action belong in analyzer-01's dialog redesign. |
| analyzer-20 | unverified | Import/Export file choosers: 10px icons, 3-row list, open in home dir, bogus prefill, no success feedback | Chooser default directory, nonexistent prefill, export completion and success feedback were not exercised. Do not promote inherited narrative to runtime proof. |
| analyzer-21 | duplicate | Print from the analyzer opens the Swing cross-platform print dialog (etched titled borders) in the screen corner | See dialogs-14. Legacy print-dialog redesign repeats dialogs-14; no printer output or live printing tested. |
| analyzer-22 | confirmed-runtime | Modal 'Expression Not Determined' interrupts every analysis of arithmetic circuits; the 'Cannot Analyze' message lacks specifics | 8-input subtractor produced the modal 'Expression Not Determined' before analysis. CPU input-count error wording was not tested. |
| analyzer-23 | design-recommendation | Copy and wording problems across analyzer dialogs and files | Copy cleanup is editorial; parser diagnostics and exported-file typo were not independently checked. |
| analyzer-24 | unverified | Constant component paints a hard-coded light-grey box in dark theme (visible in circuits the analyzer builds) | Constant contrast capture and constant-generation placement were not inspected here; keep for component owner verification. |
| analyzer-25 | confirmed-source | Please-wait dialog has a fixed unscaled 300x70 size (code-verified) | Fixed 300x70 preferred size exists. Runtime clipping was not observed. Source explicitly calls setLocationRelativeTo(parentComponent), so the original owner-implies-wrong-centering inference is unsupported. |
| analyzer-26 | design-recommendation | Selection and primary-button styling inconsistent within the analyzer and between themes | Selection and primary-button consistency is a style recommendation, not a proven loss of interaction. Exact per-theme states not reviewed. |
| analyzer-27 | duplicate | Menu accelerator text is rendered much smaller than the menu item text | See dialogs-01. Live Edit menu shows small accelerators alongside large labels, sharing the split font/widget scaling cause. |
| canvas-06 | design-recommendation | Double-click opens a modal 'Edit/specify a components label' dialog, even on subcircuits, with a looping error dialog | Double-click navigation versus label editing is a convention choice. The modal-label workflow was not independently replayed; propose a deliberate shortcut policy, retaining access to label editing. |
| codeaudit-10 | unverified | Hard-coded light-theme colours in dialogs and popups break the dark theme | Broad collection of hard-coded dialog colors was not independently checked here. Literal colors alone are insufficient to assert each surface is unreadable. |
| codeaudit-11 | unverified | FPGA and SoC windows use saturated primary colours, black/blue text and unscaled 12px fonts | FPGA/SoC surface sweep outside this bounded pass. Confirmed inspector status colors are dispositioned separately under codeaudit-v-05; fixed 12px runtime text may be overwritten by listener. |
| codeaudit-13 | design-recommendation | Titled and etched borders (Metal-era group boxes) survive in FPGA, Logging, SoC and PLA dialogs | Titled/etched borders are not inherently broken. Restyle after correcting measured metric/contrast failures, avoiding an independent bug count per border. |
| codeaudit-21 | unverified | Fixed-size dialogs and panels in device px are ~60% of their intended size at 1.6 | Wide fixed-size-dialog inventory not independently checked. Statistics is confirmed separately, and not every literal Dimension is a defect. |
| codeaudit-22 | design-recommendation | Unscaled literal paddings (EmptyBorder/Insets 1-20px) in analyzer, logging, FPGA and preference forms give an uneven, cramped rhythm | Unscaled spacing inventory is a cleanup lead, not proof of a separate visible regression at every site. Prioritize forms with captured truncation. |
| codeaudit-30 | unverified | Help opens the JavaHelp 2.0 browser, a 2005-era viewer | JavaHelp viewer was not opened or its screenshots inspected in this pass. Age of toolkit alone does not establish P1/P2 severity. |
| critic-20 | duplicate | Preferences pages float in mid-air, clip at the right edge and grow scrollbars | See dialogs-03. Same sideways overflowing forms; lead inspected the clipped FPGA settings crop. |
| critic-21 | design-recommendation | Preferences and Project Options content and copy are still the old Logisim dialogs | Reorganize settings by task, normalize names and make per-setting search useful; legacy provenance alone is not proof of a defect. |
| critic-22 | duplicate | Tool windows open at 1x sizes, in the wrong place, with a full app menubar | See codeaudit-21. Same tool-window geometry. Lead viewed narrow Hex Editor with clipped menu labels. |
| critic-23 | design-recommendation | Circuit Analysis and Hex Editor interiors look like 2005 | Inspector tables and hex grids remain useful domain representations. Modernize spacing, controls, editors and feedback rather than replacing meaningful notation. |
| critic-31 | design-recommendation | FPGA Synthesize & Download window: no margins and mixed section styles | FPGA window needs consistent form hierarchy and actions; hardware synthesis and programming require a separate toolchain/device test. |
| critic-38 | design-recommendation | Escape and Ctrl+W close some windows but not others | Define consistent keyboard closing per window role. Escape should cancel editing/modals, not indiscriminately dispose document editors. |
| dialogs-01 | confirmed-visual | Text is scaled 1.6x but every widget stays at 1.0x: tiny checkboxes, radios, slider thumbs, chevrons, title-bar buttons, chooser icons | Tiny checkbox/radio boxes and arrows coexist with large 1.6x text in live Preferences and Build. HEAD scales fonts on component-add; it does not establish a unified widget metric scale. 'Every widget' is too broad. |
| dialogs-03 | confirmed-visual | Preference pages overflow sideways: Select…/Browse… buttons and combos pushed off-screen, horizontal scrollbars everywhere | Template selector is outside viewport in recovered image; live Software VHDL control and Browse edges clip. Horizontal scrolling offers a workaround; not categorically unreachable. |
| dialogs-04 | design-recommendation | Preference and Project Options pages use old GridBag/TableLayout forms: floating centred blocks, stretched buttons, spacer labels | Centered forms, full-width reset buttons and loose page hierarchy are visible. Consolidating layout is a design recommendation; GridBagLayout itself is not a defect. |
| dialogs-05 | confirmed-source | Hotkey capture: Escape throws 'Must contain the Ctrl key' and then closes Preferences, leaving the binding blank | Escape lacks a cancel case and can enter modifier validation. Persistent blank editor state and dismissal sequence not rerun; no evidence that a saved binding was erased. |
| dialogs-06 | confirmed-visual | Hotkey page is two tiny nested scroll boxes with clipped fields, truncated header and ASCII compass | Recovered hotkey page visibly clips subtitle, lower fields and lower rows inside nested scroll panes. No interaction retest. |
| dialogs-07 | confirmed-source | 'Filter settings' only matches page names; 'theme', 'font', 'zoom' return an empty list with no empty state | Filter compares title strings only and does not clear content for zero results. Keyboard transfer and German placeholder behavior not retested. |
| dialogs-08 | confirmed-visual | Toolbar/Mouse library trees: names truncated with '…', clipped rows, and the selected current circuit's name vanishes | Recovered tree labels clip despite free width; source changes renderer font and forces accent on active circuit even when selected. Selection invisibility itself was not clicked live. |
| dialogs-09 | design-recommendation | Project Options Toolbar and Mouse pages are the original Logisim editors: unlabeled icon column, raw 'Button1' JTable, hidden Remove, repaint garbage | Recovered Toolbar uses icon-only actions and ambiguous Pin labels. Mouse repaint debris and hidden Remove not inspected. |
| dialogs-10 | confirmed-visual | User's Guide / Library Reference is the old JavaHelp browser: navy links on dark, offset search highlights, XP screenshots, opens at 0,0 | Recovered guide has dark navy heading on dark background and obsolete screenshot. Offset search highlighting, exact color values and window origin not independently checked. |
| dialogs-11 | unverified | About dialog: credits drawn in dark purple/red on dark (unreadable); old logo, dead URL, Escape doesn't close | About credits, Escape handling, version availability and allegedly dead URL not checked. No network request made for URL validity. |
| dialogs-12 | confirmed-visual | File choosers are Swing's Metal-layout JFileChooser: cramped, tiny icons, no sidebar, truncated details view | Recovered file chooser shows small icons, short file pane and compact dimensions. Lack of places sidebar is an enhancement; persistence and chooser variants not retested. |
| dialogs-13 | unverified | Dialogs open in the wrong place: Open/Merge bottom-right, Statistics and Help at 0,0, Print at 50,50 | Multiple chooser/help/statistics/print positioning claims not reproduced; a cropped window image alone cannot establish screen origin. |
| dialogs-14 | design-recommendation | Printing is two old dialogs: a Print Parameters option pane with raw '%n (%p of %P)', then the JDK etched-border print dialog | Print UI modernization and human-readable header tokens are proposals. No independent print-dialog inspection or physical printing. |
| dialogs-16 | unverified | Circuit name validation is a second modal exposing a regex: '([a-zA-Z]+\w*)', 'Error: Detected invalid characters!' | Name-validation error and reprompt sequence not tested; no independent proof of regex exposure in this review. |
| dialogs-18 | confirmed-source | Dark theme inherits light-theme colours: black text-tool default, dark-red/peach/yellow width-error colours; 'Color blind colors' sets buses black | Preset writes BUS_COLOR=1 and applies immediately without a confirm path; this is a dark-contrast/preset consistency issue. Black saved annotations and all warning-color examples not inspected. |
| dialogs-19 | design-recommendation | Colors page: swatch columns misaligned between groups, no hex or per-row reset, colour/colour spelling mix, resets below the fold | Source builds independent swatch grids. Shared alignment, hex values and per-row reset are reasonable improvements; numeric x positions not measured here. |
| dialogs-20 | confirmed-source | Mouse-wheel scrolling in settings pages moves about 3 px per notch | Preferences wraps JPanel pages in ordinary JScrollPanes with no unit increment set here. Exact 3px/notch timing is inherited, not independently measured. |
| dialogs-21 | unverified | FPGA Commander Settings page: hard-coded black 2 px box, full-width board buttons, pure-RGB swatches glued to labels | FPGA board-box rendering and swatch spacing were not personally inspected; form clipping is already covered by dialogs-03. |
| dialogs-22 | unverified | Etched TitledBorders with tiny unscaled titles and zero window padding survive in FPGA and logging dialogs | FPGA/logging window title borders and progress layout were not inspected in this assigned bounded run. |
| dialogs-23 | confirmed-visual | Circuit Statistics is a raw JTable with mismatched header fonts and truncated cells in a tiny window | Recovered statistics window has mixed header sizes and truncated totals/column captions. Position at 0,0 was not verified by the cropped image. |
| dialogs-24 | confirmed-visual | Colour chooser: brightness thumb starts at the wrong end, tiny hollow-triangle thumb, unlabeled radios | Recovered chooser shows Brightness=100 with thumb at black end. Tiny radio/thumb visuals also visible; constructor timing and post-click repair remain unverified. |
| dialogs-25 | design-recommendation | Preferences organisation and wording carried over from old Logisim, with duplicates and misleading names | Live page opens on International and calls interface scale Zoom factor. Reorganization/copy cleanup proposed; German localization clauses not tested. |
| dialogs-26 | design-recommendation | Preferences chrome: page title is the weakest text on the page; boxed content; whole-list focus rectangle; pointless nav scrollbar | Live page title is visually secondary and nav has a horizontal scrollbar. Focus rectangles are accessibility affordances; do not remove them without a replacement. |
| dialogs-27 | design-recommendation | Menu and dialog wording inconsistencies: ellipsis on submenus, mixed case, duplicate entries | Terminology/ellipsis cleanup is editorial. Individual original menu clauses were not independently inspected. |
| light-07 | duplicate | FlatLaf UIScale never set: checkboxes, radios, accelerators, icons, tab close buttons and chooser icons stay 1x next to 1.6x text | See dialogs-01. Same split font/widget scaling issue as dialogs-01; does not independently establish every listed widget's size. |
| light-08 | duplicate | Preferences pages overflow horizontally: fields and Browse buttons cut off at the dialog edge | See dialogs-03. Same Preferences viewport overflow as dialogs-03. |
| light-09 | duplicate | Preferences pages still look like 2005 Logisim (floating centred GridBag blocks, raw lists, scary copy) | See dialogs-04. Same form organization/design concerns as dialogs-04; hotkey clipping has its own canonical dialogs-06. |
| light-10 | duplicate | "Filter settings" only matches page titles; searching "theme" shows an empty nav and a stale page | See dialogs-07. Same page-title-only filtering as dialogs-07; extra reopen-focus claim not retested. |
| light-15 | duplicate | Project Options Toolbar and Mouse pages are raw 2005 Swing (bold tree, overlapping rows, 'Button1' jargon) | See dialogs-08. Project Options clipping overlaps dialogs-08; icon-only toolbar design overlaps dialogs-09. Mouse-specific symptoms not reviewed. |
| light-16 | duplicate | Circuit Analysis opens as a cramped 1473x492 window with legacy chrome | See analyzer-03. Same packed Analyzer size as analyzer-03. Bottom row is BoxLayout at HEAD, not the claimed FlowLayout. |
| light-17 | unverified | Hex editor window is tiny, loses its title, and typing does not advance to the next byte | Hex editor size, title and nibble entry behavior not retested. Non-advancing entry may be an intentional editing model; do not call byte loss without checking semantics. |
| light-18 | duplicate | Dialogs open uncentred or undersized: Statistics at screen (0,0), file chooser 921x393 in Metal layout | See dialogs-23. Statistics clipping overlaps dialogs-23 and chooser dimensions dialogs-12; offscreen-origin component remains unverified. |
| light-22 | duplicate | Inconsistent terminology, capitalisation and old wording across menus, tooltips and settings | See dialogs-27. Glossary/capitalization work overlaps dialogs-27; detailed tooltip mapping not independently checked. |
| light-23 | design-recommendation | Legacy Logisim artwork is still everywhere (hand poke icon, gate glyphs, coloured bitmap-style palette icons, About splash) | Icon/artwork modernization is aesthetic. No blanket requirement to replace all functional schematic glyphs with monochrome SVGs is justified by this pass. |
| light-28 | duplicate | Colors and FPGA preference pages: swatch columns misaligned, inconsistent heading punctuation | See dialogs-19. Shared swatch alignment recommendation overlaps dialogs-19; FPGA heading clauses not checked. |
| light-29 | duplicate | Preferences pages scroll about 3px per wheel notch | See dialogs-20. Same default scroll increment issue as dialogs-20; 15-notch measurement not rerun. |
| scaling-11 | confirmed-visual | Preferences pages overflow sideways at 1.6, center their content vertically in large voids, and truncate instructions | Recovered Hotkey preferences shows clipped instructions, navigation ellipsis and horizontal scrollbars. Other pages in this bundled claim were not individually retested. |
| scaling-26 | design-recommendation | Preferences > Window page: legacy layout and wording (spacer rows, full-width reset buttons, missing gaps and colons, duplicate settings) | Live Window page shows excessive spacers, stretched controls and ambiguous Zoom factor wording. Layout polish; scaled checkbox discrepancy already covered. |
| scaling-29 | confirmed-runtime | Escape does not close Project Options: the auto-focused filter field swallows Escape even when empty | In Preferences, first Escape clears the filter and second Escape still leaves window open. Focused unconditional binding swallows the dialog action. Project Options shares field code but was not live retested. |
| scaling-30 | rejected | Fresh Preferences opens on 'International'; current language not highlighted; Gate shape filed under International | Broad no-current-language claim does not reproduce: English is visibly selected on this fresh-preference-derived run. Initial International page and gate-shape placement are design choices; no separate bug accepted. |
| scaling-31 | unverified | First click after a window appears or gains focus is ignored (needs a second click) | Focus/click swallowing may be a KWin/Xwayland automation artifact; no physical-desktop confirmation. |
| codeaudit-v-07 | duplicate | Page descriptions in Preferences and Project Options are one-line labels cut off mid-sentence; page titles are the smallest, dimmest text on the page | See scaling-11. Recovered Hotkey screenshot shows one-line instructions ending in ellipsis. Single-line PanelHeader implementation confirmed. |
| codeaudit-v-08 | duplicate | Preferences navigation list truncates 'FPGA Commander Setti...' and shows a useless horizontal scrollbar | See scaling-11. Same recovered preferences form/nav overflow. A bare HORIZONTAL_SCROLLBAR_NEVER would hide information unless width/wrapping is fixed as well. |
| codeaudit-v-15 | unverified | FPGA 'Synthesize & Download' window has no padding or gaps: controls touch the window edge and buttons stretch 750px | FPGA execution window not live tested or screenshot viewed; retain for FPGA/dialog owner. |
| remaining-hdl-02 | confirmed-visual | SoC transaction dialog identifies the target bus as null | Recovered native window capture viewed; exact current source cause identified. |
| remaining-hdl-03 | unverified | Recovered TCL/HDL editor open logs X11 Window must not be zero | Recovered stack inspected; not reproduced on this session or a normal desktop. |
## W8 — Keyboard access and visual completion
| ID | Disposition | Observation | Review note |
| --- | --- | --- | --- |
| codeaudit-19 | confirmed-source | Many new shell controls are mouse-only or explicitly non-focusable | Section headers only handle mouse clicks and Toolbox toggle is nonfocusable. Other listed controls not individually assessed; combine with palette keyboard work. |
| codeaudit-32 | confirmed-source | Hard-coded English strings in redesigned and legacy UI | WindowOptions contains literal English editor-theme labels; the broader localization sweep was not repeated. Preserve named themes; localize user-facing explanatory labels. |
Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 171 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 152 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 930 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 137 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 206 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 203 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

@@ -0,0 +1,12 @@
Diagnostic: ThemeLifecycleProbe.java, run against copied QA jar matching build/libs jar.
Both jar SHA256: c854edbbea34d6cfc0e53ac9cf70ef5b2a5dcf550a3959ff0ed99d852950d433
Isolated java.util.prefs.userRoot and user.home. Headless JVM, no document mutation.
Observed 2026-09-24:
regular_is_disabled_instance=true
regular_filter_mutated=true
later_regular_keeps_mutation=true
probe_elapsed_ms=3004
probe_returned=dark
The 2-second SystemTheme timeout failed to bound a 3-second silent child process.
This proves the timeout defect; it does not measure a real desktop theme probe hanging.
File diff suppressed because it is too large Load Diff
+121
View File
@@ -0,0 +1,121 @@
# Repair pass and verification
Implementation follow-up to the [original audit](../README.md). The original 381
observations remain historical evidence, not 381 distinct bugs. This report does
not mark every recommendation or unverified claim resolved. Changes are currently
uncommitted on `main` over `0a6226664`.
## Implemented repair families
| Area | Repair |
| --- | --- |
| Project safety | Close routes share explicit Save/Discard/Cancel policy. Escape, dismissal and failed/canceled Save do not close the project. Quit defers cleanup until all confirmations succeed. Replacing a file retires its old autosave writer before the new writer can run. Saves stage complete serialization before replacing existing files, and serializer errors preserve the last valid project/recovery instead of reporting success. |
| Properties | Cancel discards drafts without writes. Compatible multi-edit commits one undo action. Valid model/focus transfers keep the original target; invalid values remain editable. Ordinary wheel scrolls; Alt+wheel deliberately nudges in one transaction. Type-to-edit, mixed HDL status, padding and empty guidance are repaired. |
| Scaling and themes | FlatLaf owns font/control metrics; custom geometry uses the same scale once. Explicit scale is preserved; Auto consults advertised desktop DPI without a resolution heuristic. Theme discovery is off the EDT and bounded. Theme/scale tree refresh is deferred and coalesced so active combo and slider handlers retain their delegates. Explicitly styled help/slider fonts refresh on live scale changes. Icon variants have separate caches; transient theme subscriptions follow component lifetime. |
| Parts picker | Captions use measured two-line layouts, switching to compact rows in narrow panels. Immediate Enter uses the current query; aliases, keyboard traversal, no-results guidance and full-name access work. Rebuilding results no longer retains disposed tiles. Library-tree refresh events now carry tree-node paths, preventing inconsistent expansion state after UI reinstall. |
| Shell | Divider drags persist; logical dimensions survive scale changes. Narrow windows reserve editor space, temporarily compressing side panels without overwriting requested widths. Closed panels have direct reopen actions. Circuit-list listeners, tab overflow/selection and last-tab behavior are repaired. Starting work dismisses the welcome screen. Zoom status follows the active editor. |
| Circuit rendering | Document fonts are independent of UI zoom, fixing RAM/ROM overlaps; screen, export bounds and print use the same logical font. Automatic data displays and subcircuit outlines use paired theme/print colors; signal fills and explicit document colors remain intact. Printing default subcircuit shapes does not mutate the cached screen artwork. Ghost ink, matrix-dot placement, grid hierarchy and raster export antialiasing are corrected. |
| Simulation/tools | FPGA actions no longer cast SVG icons to obsolete classes; completion/error UI updates run on the EDT. Reptar is identified as hardware-only and drives unknown outputs instead of crashing propagation. Optimizer work is cancellable and applies complete results on the EDT. |
| Secondary UI | Settings search indexes controls and synonyms; empty results are explicit. Forms, code/gutter metrics, timing rows and Hex sizing are repaired. Clock selection reserves complete selectable rows, and timing Options reflows to stacked sections. Timing/Test drawers suspend safely while an HDL editor is active. Analyzer builds default to a unique name, with Cancel as the replacement default. About typography and keyboard dismissal are repaired. |
| QA infrastructure | Tests/probes use private preferences. The native runner freezes its jar, records provenance, copies circuits and owns its display/processes. No real user circuit or autosave is used. |
## Rendered and interactive evidence
Actual window captures and actual exports, not recreated mockups:
- [Readable picker and vector results at dark/2.0](evidence/picker-and-results-dark-2.png).
- [Compact picker after a real divider drag and immediate search](evidence/picker-narrow-search.png), dark/1.6.
- [Canceled Save leaves the same dirty circuit open](evidence/save-cancel-kept-dirty.png), dark/1.6. File Close → Escape was also checked; Ctrl+W closes an editor tab, Ctrl+Shift+W the project.
- [Independent property-edit native checks](attributes-native.md) passed: two-Escape cancellation retains mixed No/Yes; one Undo restores both committed rows; ordinary wheel leaves Facing unchanged; a label draft survives focus transfer and belongs to the original gate in saved scratch XML.
- [RAM/ROM document text at UI scale 2.0](evidence/document-font-dark-2.png): UI enlargement no longer enlarges fixed-coordinate internal text.
- [Two passing and two intentionally failing vector rows after resizing](evidence/test-results-resized-dark-2.png). The drawer followed the pointer and retained its height.
- Native File → Export Image produced [screen-palette PNG](evidence/main-screen-export.png) and [print-view PNG](evidence/main-print-export.png). Both were inspected at native 843×630 size. This is not physical-printer acceptance.
- [Constrained HDL editor at 1280×800 / 2.0](evidence/constrained-hdl-light-2.png): approximately 640px of editor width remains. [Native responsive-shell checks](responsive-shell-native.md) also verified real divider dragging, restoration on widening, and persistence of desired rather than compressed widths.
- [Timing history after HDL round trip](evidence/timing-history-return-dark-2.png): waveform time 54,999 ns and counter 5 survive switching to HDL and back. [Bounded timing report](timing-native.md) separates this passed check from the then-unverified completed-vector-results case.
- [Light picker after live scale/theme round trips](evidence/picker-light-1.6.png) and [dark picker](evidence/picker-dark-1.6.png). These captures establish readability, not clean-log live-switch acceptance: the same session exposed a UI-delegate reentrancy error, assigned for correction and another run.
[Save-safety details](save-safety.md) document failure injection and its limits.
Successful atomic replacement is not a power-loss/fsync guarantee; failed exports
may still leave a partial export artifact, unlike the guarded project/recovery paths.
[Core provenance](evidence/core-session.json) records the private jar hash and
worktree inventory. The [earlier editing session](evidence/editing-session.json)
predates immutable-jar freezing; only observations before replacement are retained.
Reviewers explicitly rejected contaminated captures after shared-jar replacement
rather than counting resulting class-loading errors as product regressions.
## Validation status
The integrated run on 2026-09-24 passed **1,030 tests with zero failures, errors or
skips**, production/test Checkstyle and the fat-jar build. The full `./gradlew build`
also passed, including distribution assembly. `git diff --check` and syntax checks
for both native-QA runner scripts passed.
Commands: `./gradlew test checkstyleMain checkstyleTest shadowJar`, then
`./gradlew build`. After native QA exposed a remaining test-result invalidation
defect, the narrow correction and four regressions were followed by another full
`./gradlew build`: tests, production/test Checkstyle and distribution assembly all
ran successfully. The earlier 1,026-test checkpoint is not the final count.
Verified candidate: `build/libs/logisim-evolution-5.1.0dev-all.jar`, SHA256
`50316d4a92230497b1c9486373333f3411580b0d9fec63c73f510b2c83e86908`.
It includes timing-to-HDL transitions, clock-selector chrome reservation, responsive
settings and shell allocation, automatic subcircuit screen/print colors, the library
tree event fix, and deferred theme/scale refresh. Late native rechecks use private,
immutable copies with hashes in each report. Forms/tree/theme rechecks below used
the preceding `f582284f…` jar; the only subsequent production edit is the narrow
test-result invalidation correction in `gui/test/Model.java`. Its native rerun uses
the final `50316d4a…` jar. A green unit run is not substituted for native checks.
Earlier regression failures were investigated, not excluded: two contaminated font
fixtures were isolated, the clock test was strengthened to measure actual viewport
space and prompted an additional chrome-reservation fix, and a genuine recursive
appearance-port matcher was corrected with dedicated comparisons. No tests are skipped.
The final [test-result repair](test-result-retention.md) ignores view-only
`ACTION_DISPLAY_CHANGE` notifications, preserving completed reports, counts and row
ordering through real Project HDL/circuit transitions. Actual component invalidation,
structure edits and vector replacement still clear results. The [native pre-fix failure](test-result-retention-before.md)
is preserved rather than hidden by the earlier successful build.
### Final-candidate native rechecks
- **PASS — responsive settings and live fonts:** the [focused forms report](forms-native-final.md)
verifies the entire Software validation caption at 1200px/2.0, reachable Browse actions,
new scale help, and Window/Software fonts updating in the same open window at 2.0→1.0.
[Wrapped caption](evidence/software-wrapped-dark-2.png) · [live scale 1.0](evidence/window-live-scale-1.png).
The application log was empty and all owned session processes were stopped.
- **PASS — event ordering and Welcome navigation:** [native UI-refresh report](ui-refresh-native.md)
confirms real keyboard Dark/Light choices and mouse slider releases at 2.0→1.0→1.6 with
a zero-byte application log. [Final light/1.6](evidence/theme-scale-final-light-1.6.png).
Creating HDL from Welcome opens [the editor directly](evidence/welcome-direct-hdl.png).
Theme changes may move focus; this check explicitly refocused the combo before the next key.
This supersedes the pre-fix exception log, rather than treating the older screenshots as acceptance.
- **PASS — library-tree fallback:** [native tree report](tree-native-final.md) verifies children
remain visible through live UI changes, actual Gates/Multiplexers collapse/expand, and Buffer/
Multiplexer selection with matching properties. [Initial light/1.6](evidence/tree-light-1.6.png)
· [returned light/1.59](evidence/tree-roundtrip-light-1.59.png). The mouse return landed at 1.59,
not exactly 1.6; this is tree-state acceptance, not an exact numeric slider-roundtrip claim.
Application log empty; owned session stopped.
- **PASS — completed test results survive HDL:** [final acceptance report](results-native-accepted.md)
uses the final `50316d4a…` jar. A real vector run produced 2 passes and 2 intentional failures;
switching to an already-existing HDL editor and back retained counts, statuses, ordering and
highlights without rerunning. [Returned results](evidence/test-results-retained-dark-2.png).
Application log empty; owned session stopped. The latest clock chooser also passed an actual
resize to [840×500 at scale 2.0](evidence/clock-chooser-resized-dark-2.png), retaining three
complete selectable rows and reachable Cancel/OK controls.
## Coverage limits
Physical 4K/mixed-monitor behavior, FPGA synthesis/programming, physical printing,
every library/localization and a complete keyboard-only end-to-end run are not
established. Explicit saved colors are not silently rewritten. Historical XML
label sanitization, document-specific caption geometry and remaining design
recommendations need their own compatibility or product decisions; a green test
count does not close them.
Known lower-priority visual scope still open includes white-backed legacy component
bitmap icons and intrinsic long-label/caption collisions in some component symbols.
The repaired UI-font inheritance is not a claim to have redesigned every symbol's
document geometry. Those cases, remaining product-design recommendations and unverified
audit claims are not silently marked closed by this repair pass.
@@ -0,0 +1,59 @@
# Bounded native attribute QA — 2026-09-24
Result: all four requested workflows PASS on the frozen runner-copied jar. No production edits,
Gradle, builds or unit-test execution. Source-review findings were delivered before this native pass.
## Provenance and isolation
- Private runner session: `/tmp/logisim-visual-qa-tz4cdx`; started 2026-09-24 17:10:06 UTC.
- Jar: `/tmp/logisim-visual-qa-tz4cdx/work/application.jar`, copied by the runner from the existing
`build/libs/logisim-evolution-5.1.0dev-all.jar` (19:00 local file timestamp).
- SHA256: `214cc5b2ed429a6a6c5eac0166ede2187e46964fda4b18d2017dae8eaf87a9ea`.
- Repository HEAD recorded by runner: `0a62266649937f3c2cbcb1ef495b6d9be6ba2d5a`; dirty workspace
listing is retained in session.json. The jar hash, not HEAD alone, identifies this runtime.
- Private KWin/Xwayland display 2560x1600, dark theme, UI scale 1.6, circuit zoom 100%; application
window 2304x1440. This is native Swing/window-manager QA on a virtual display, not physical HiDPI QA.
- Runner redirected `user.home`, user/system Java preferences and XDG state into this session.
The JVM's system properties were checked before stopping it. No real preferences/circuits/autosaves
were edited. The runner's initial ui-smoke fixture was a copy; it was left unchanged.
- Tested a scratch `work/attributes.circ`: one two-input, east-facing AND gate at (300,200), initially
Negate 1=No, Negate 2=Yes. Only this disposable fixture was saved during checks.
- Session stopped through the runner's identity-checked stop operation; evidence retained.
## Results
| Workflow | Native action and observed result |
| --- | --- |
| inspector-19 cancellation | Selected both negate label rows using Shift, opened Negate 1's combo (a popup window was observed), pressed Escape twice. Both rows remained selected and values remained No/Yes; gate retained only its lower inversion bubble and project remained clean. PASS. |
| Atomic multi-row commit / Undo | Changed the second row to No and saved the No/No baseline. Selected both labels, opened the first value, used Home/Enter to commit Yes. Both became Yes with both bubbles. Exactly one Ctrl+Z restored No/No and the saved clean state. PASS. |
| Ordinary hover wheel | After Undo, clicked the gate to leave canvas focus, hovered Facing without clicking it, and sent two ordinary wheel-up events. Facing remained East, geometry unchanged and project remained clean. PASS. |
| Valid label draft on focus/model transfer | Typed ScratchLabel into Label without Enter, clicked empty canvas, then reselected the original gate. Its inspector title/value and rendered label showed ScratchLabel. Saved scratch XML contains `<a name="label" val="ScratchLabel"/>` on the AND gate; negate defaults remain No/No. PASS. |
## Captures — all six independently viewed
All paths below are under `/tmp/logisim-visual-qa-tz4cdx/evidence/`:
1. `01-fixture.png`: loaded scratch AND and empty inspector before selection.
2. `02-mixed-baseline.png`: selected AND, East, No/Yes baseline.
3. `03-cancel-undo-menu.png`: after two Escapes, both selected negate rows still No/Yes, clean title.
Despite the filename, the heavyweight Edit menu is not included in the direct window image;
do not treat this as evidence of menu-enabled state or a direct measurement of undo depth.
4. `04-multi-commit.png`: both values Yes, both inversion bubbles and unsaved state.
5. `05-one-undo-and-ordinary-wheel.png`: after one Undo and two ordinary wheel-up events, No/No,
Facing East, no bubbles and clean saved state.
6. `06-label-focus-loss.png`: after empty-canvas click and reselection, ScratchLabel belongs to the
original gate and is shown both in the inspector and on canvas.
One root-window capture attempt failed without producing an image; it was retried as a direct
application-window capture. Six images total were produced and viewed. The sandbox image reader
failed with mountinfo; scoped base64 reads of these exact PNGs were used to view them instead.
The private application log was empty at completion.
## Limits / remaining scope
This pass does not retest high-resolution wheel input, Alt+wheel nudges, splitter scrolling/dragging,
invalid labels, cross-circuit/mixed-component edits, Redo, multiple UI scales, or physical monitors.
Cancellation preserves visible model and clean state; internal undo depth was not instrumented.
No new native regression was found in the four requested paths. Parent's separate native failures
are not cleared by these results. Prior source-review findings remain a separate report, not native
failures from this session.
Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

File diff suppressed because one or more lines are too long
Binary file not shown.

After

Width:  |  Height:  |  Size: 137 KiB

File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 145 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 145 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 KiB

Some files were not shown because too many files have changed in this diff Show More