Sprint Backlog 04
Sprint Mission
- code review all code using LLMs
- implement claude code skills for common functionality.
Stories
Active
| Tags | Headline | Time | % | ||
|---|---|---|---|---|---|
| Total time | 1:48 | 100.0 | |||
| Stories | 1:48 | 100.0 | |||
| Active | 1:48 | 100.0 | |||
| infra | Update doxygen main page | 0:23 | 21.3 | ||
| code | Improve UML diagrams | 1:25 | 78.7 |
| Tags | Headline | Time | % | ||
|---|---|---|---|---|---|
| Total time | 80:16 | 100.0 | |||
| Stories | 80:16 | 100.0 | |||
| Active | 80:16 | 100.0 | |||
| agile | Sprint and product backlog refinement | 3:41 | 4.6 | ||
| code | Clean up client parser | 0:10 | 0.2 | ||
| code | Add connect command line argument | 1:19 | 1.6 | ||
| infra | Install Windows package on Windows machine | 2:09 | 2.7 | ||
| code | Ignore warnings on windows and osx | 0:33 | 0.7 | ||
| code | Ensure applications work under OSX using github images | 0:14 | 0.3 | ||
| infra | Create a splash screen and gray background | 2:26 | 3.0 | ||
| code | Use fluent icons | 0:37 | 0.8 | ||
| code | Add export functionality for currencies | 1:30 | 1.9 | ||
| code | Add currency editing support | 2:45 | 3.4 | ||
| code | Add about to menu | 1:02 | 1.3 | ||
| code | Create a history dialog for currencies | 1:27 | 1.8 | ||
| code | Allow MDI windows outside main window | 1:35 | 2.0 | ||
| code | Add edit menu and export menu | 0:34 | 0.7 | ||
| code | Implement adding new currencies | 3:17 | 4.1 | ||
| code | Clean up product website | 4:42 | 5.9 | ||
| code | Create a skill for plant uml documentation | 2:48 | 3.5 | ||
| infra | Add CMake targets for site and skills | 0:17 | 0.4 | ||
| infra | Generalise the skill setup for ORE Studio | 3:45 | 4.7 | ||
| infra | Restructure components to follow the dogen approach | 2:54 | 3.6 | ||
| infra | Generate PlantUML diagrams for all components | 1:05 | 1.3 | ||
| analysis | Weaving skills and documentation together | 0:46 | 1.0 | ||
| code | Consider adding tags to catch2 tests | 0:34 | 0.7 | ||
| code | Split JSON based operator<< from domain type |
0:53 | 1.1 | ||
| code | Add a table representation of domain types | 2:05 | 2.6 | ||
| code | Add a comint based emacs mode for the client | 0:24 | 0.5 | ||
| code | Fix the valgrind leaks reported on sqlgen | 4:54 | 6.1 | ||
| code | Review all code created so far with an LLM | 16:13 | 20.2 | ||
| code | Fix broken windows build due to local time | 0:24 | 0.5 | ||
| code | Resolve crash on shutdown problem | 0:50 | 1.0 | ||
| code | Split main window class | 0:48 | 1.0 | ||
| infra | Update doxygen main page | 0:23 | 0.5 | ||
| code | Improve UML diagrams | 1:25 | 1.8 | ||
| code | Make UI/UX look more professional | 11:07 | 13.8 | ||
| code | Current issues with package install in debian | 0:40 | 0.8 |
COMPLETED Sprint and product backlog refinement agile
Updates to sprint and product backlog.
COMPLETED CTest shows only one test per test suite code
We need to be able to see individual tests and the reasons for their failures.
Notes:
- raised an issue with CMake.
Links:
COMPLETED Clean up client parser code
It should use common infrastructure and read variables from the environment.
COMPLETED Add connect command line argument code
To avoid leaking secrets it should be possible to supply a --connect in the
client. We still need a connect in case we want to reconnect.
Notes:
- clean up parser in client, not using common logging.
- add environment mapping to client.
Links:
COMPLETED Install Windows package on Windows machine infra
We need to install and run the windows package and make sure it works. Check console and GUI start. Also, check we can connect against local service and against remove service.
Notes:
- application fails to start because QT6 DLLs are not in bin folder. It is also missing libssl. Adding vcpkg to presets copied a lot of the DLLs:
{
"version": 3,
"configurePresets": [
{
"name": "default",
"generator": "Visual Studio 17 2022",
"architecture": "x64",
"toolchainFile": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake",
"binaryDir": "build",
"cacheVariables": {
"X_VCPKG_APPLOCAL_DEPS_INSTALL": true
}
}
]
}
- services are now running and connecting to postgres. Managed to connect from Linux to Windows and log in. However, Qt UI won't start due to missing DLLs. Installed Qt from online downloader, need to figure out what is missing. Open a separate story to handle Qt issues.
Links:
BLOCKED Ignore warnings on windows and osx code
At present we have a number of spurious warnings on both windows and OSX. Try to see if we can get CDash to ignore them.
Notes:
- Raised a Kitware ticket.
Links:
BLOCKED Ensure applications work under OSX using github images code
We need to install the DMG and run the app.
We think the package does not have all of the dependencies, but this did not work:
if(APPLE)
install(CODE "
# make sure the bundle is already on disk
set(BU_CHMOD_BUNDLE_ITEMS TRUE)
include(BundleUtilities)
# full path to the real executable inside the bundle
set(app_exe \"\${CMAKE_INSTALL_PREFIX}/OreStudio.app/Contents/MacOS/OreStudio\")
# directory where 3rd-party libraries will be copied
set(libs_dir \"\${CMAKE_INSTALL_PREFIX}/OreStudio.app/Contents/Frameworks\")
# discover all prerequisites and copy/fix them
fixup_bundle(\"\${app_exe}\" \"\" \"\${libs_dir}\")
" COMPONENT Runtime)
endif()
We should ask someone with an OSX machine to test this.
Links:
COMPLETED Create a splash screen and gray background infra
We need to replace the basic splash with something that looks slightly better. We also need some kind of background for the initial screen when nothing is selected, a bit like visual studio code.
COMPLETED Use fluent icons code
These seem to be a bit better than the current icons we have:
COMPLETED Add export functionality for currencies code
We need to be able to export to ORE XML and to CSV.
COMPLETED Add currency editing support code
We need to be able to open up individual currencies and edit them. We also need to be able to select multiple currencies and delete them.
Notes:
- add toolbar for crud operations. Not clear how we know what they apply to. Ideally you select multiple currencies and then press delete.
- separate the connection part of the toolbar from ref data and from crud.
- add a version string to the splash screen.
COMPLETED Add about to menu code
We need an about describing the project.
COMPLETED Create a history dialog for currencies code
Users should be able to see a list of all the changes to a given currency.
Notes:
- valid to in edit dialog is still equal to valid from.
- create a history dialog showing the history of changes including modified by.
COMPLETED Currency details is always on top code
It should work like any other MDI window.
COMPLETED Do not auto maximise windows code
Every time we select currencies or history the new window is maximised. If there is a previous window we should just reuse it. In addition if we ask for history of the same currency twice, it should reuse the existing window.
COMPLETED Allow MDI windows outside main window code
If possible we should allow windows to exist outside main window so users can manage their workspace themselves.
Notes:
- currency details do not show up in window menu. Done
- currency detail is always detached. Done.
- windows are not sized correctly. Done.
- if a window is already open, we should reuse window. Done.
COMPLETED Add edit menu and export menu code
Need a edit menu with all of the crud operations. At present these are only in the toolbar. We also need one for export.
COMPLETED Implement adding new currencies code
At present you cannot add new currencies from the UI.
Notes:
- UI goes black if you close and reopen. Done.
- need a way to save the new currency to trigger sending message to server side.
- we should be able to send a message to create more than one currency in one go.
- it should be possible to clone a currency. It goes into new currency dialog with all fields filed in except for ISO code - maybe set to clone?
- add new message to repl.
COMPLETED Create an icon for the application infra
We copied the Dogen icon to get us going. We should really grab our own logo.
COMPLETED Add packaging support for images infra
Rationale: we are now packaging the images with the binary via Qt resources.
At present we are not adding images to packages.
COMPLETED Clean up product website code
As per weaving analysis we need to tidy-up our org-mode documents to build up towards the setup needed for skills etc. Tidy up the product website, removing things such as build instructions etc into it's own documents.
COMPLETED Create a skill for plant uml documentation code
Add a org mode document which generates a claude skill to document components in plant uml format. Add a target to generate the skill.
COMPLETED Add CMake targets for site and skills infra
Make it easier to run those targets from emacs.
COMPLETED Generalise the skill setup for ORE Studio infra
It would be nice to be able to create skills quickly that model the common activities we have. These roughly map to facets in MASD (Model Assisted Software Development) world. We haven't got enough time to do a proper taxonomic and morphological analysis of the system, but we can use the primitives defined in MASD to guide skill creation (including meta-skill creation) and then create new skills as we face new tasks. For now, setup a simple skill framework with a meta-skill which makes skill management easier.
COMPLETED Restructure components to follow the dogen approach infra
We started by splitting tests from regular code. However, now we are introducing models it is becoming very unwieldy. We need to follow the same structure as dogen:
componentsrcmodelingtests
We do not need public/private includes for now so leave that under src.
Notes:
- create a skill describing expected project structure.
- update existing skills to take this change into account.
COMPLETED Generate PlantUML diagrams for all components infra
We need an easy way to see the structure of the components. Use the new skill to create diagrams.
COMPLETED Generate a pie chart for tasks in org via R code
Ask the LLM on how to replicate the calc pie chart we previously had.
COMPLETED Weaving skills and documentation together analysis
Following on from the ideas on Model Assisted Software Development (MASD), we should weave together all of the project assets so that they simultaneously generate:
- human level documentation, accessible via org-roam. This should also include diagrams to enable humans to understand the code structure.
- external documentation for website.
- LLM instructions, including skills.
Source code remains the only source of truth, but documentation is a projection of the source code. The same documentation is simultaneously used by developers and LLMs to understand the system.
Notes:
- generate a new
index.orgwhich is a more user friendly main page. - split the existing
readmeinto specialised pages which document aspects of the system such as building etc. - create a
skillsfolder under doc which are org mode documents that export into claude skills. Create CMake targets which generate the skills directory. Symlink it to the project directory.claude/skills. - add a cmake target to generate the site. This should just generate HTML for the skills.
- add plantuml diagrams at the component level. These should leave under
modeling. - add plantuml diagram at the project level. Each component should have a link to the plantuml diagram of the component.
- teach claude how to generate a org-mode model of the component which documents each class. For comms, it should also generate an interaction diagram explaining how the client and server communicate.
- in the claude skills, explain that whenever adding domain entities, it needs to update
- perform a taxonomic analysis of how to break down existing code into skills. These will follow on from MASD's logical-physical space,
- it should also be possible to generate a PDF with all of the documentation, readable as a book.
COMPLETED Consider adding tags to catch2 tests code
It would be nice to run say repository tests when we do a DB change, or comms tests etc. Catch supports tags for this. The problem is we need to manually add CMake targets for each tag.
function(add_catch2_tag_target test_exe tag)
string(REPLACE "[" "" clean_tag "${tag}")
string(REPLACE "]" "" clean_tag "${clean_tag}")
add_custom_target(test-${clean_tag}
COMMAND ${test_exe} "${tag}"
DEPENDS ${test_exe}
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
)
# Optional: register with CTest
add_test(NAME ${test_exe}_${clean_tag} COMMAND ${test_exe} "${tag}")
endfunction()
# Usage:
add_catch2_tag_target(my_app_tests "[repository]")
add_catch2_tag_target(my_app_tests "[comms]")
COMPLETED Split JSON based operator<< from domain type code
At present you can only dump a type to stream as JSON. However, we may want to
dump it into other formats (such as a table). We should not bind a domain type
to a specific dumping format in operator<<.
COMPLETED Add a table representation of domain types code
Dumping JSON in the client is not very helpful. Ideally we want a simple table.
COMPLETED Add a comint based emacs mode for the client code
It would be nice not to have to start a shell to run the client but have access to the usual emacs facilities for running external processes.
COMPLETED Fix the valgrind leaks reported on sqlgen code
We have a number of valgrind leaks which appear to be real leaks. Get to the bottom of these and produce a fix.
Links:
COMPLETED Review all code created so far with an LLM code
Current code review prompt:
Perform a fast, focused code review on the code I’ll show you.
Look for:
- Obvious bugs or logic errors
- Missed opportunities to use C++23 features
- Incorrect or unclear comments (improve them if needed)
- Security issues or unsafe patterns
- Inappropriate or missing logging (check log level and message clarity)
- Any other clear improvements worth noting
- For unit tests, ensure they are named correctly and have enough coverage
Be succinct — prefer clarity over grammar.
Output a short list of actionable items, ideally with suggested fixes.
The system uses Data-Oriented design for finance.
I’ll show you the header and implementation (if any) separately — comment on them separately.
- reviewed
ores.accounts. Done core library, missing tests. - reviewed
ores.cli. - reviewed
ores.risk.
COMPLETED Fix broken windows build due to local time code
Getting the following error:
[99/283] Building CXX object projects/ores.accounts/src/CMakeFiles/ores.accounts.lib.dir/domain/login_info_table_io.cpp.obj
FAILED: [code=1] projects/ores.accounts/src/CMakeFiles/ores.accounts.lib.dir/domain/login_info_table_io.cpp.obj
C:\PROGRA~1\LLVM\bin\CLANG_~1.EXE -DBOOST_ATOMIC_DYN_LINK -DBOOST_ATOMIC_NO_LIB -DBOOST_CHRONO_DYN_LINK -DBOOST_CHRONO_NO_LIB -DBOOST_CONTAINER_DYN_LINK -DBOOST_CONTAINER_NO_LIB -DBOOST_DATE_TIME_DYN_LINK -DBOOST_DATE_TIME_NO_LIB -DBOOST_FILESYSTEM_DYN_LINK=1 -DBOOST_FILESYSTEM_NO_LIB -DBOOST_LOG_DYN_LINK -DBOOST_LOG_NO_LIB -DBOOST_PROGRAM_OPTIONS_DYN_LINK -DBOOST_PROGRAM_OPTIONS_NO_LIB -DBOOST_THREAD_DYN_LINK -DBOOST_THREAD_NO_LIB -DBOOST_THREAD_USE_DLL -DBOOST_USE_WINAPI_VERSION=0xa00 -DYYJSON_IMPORTS -D_WIN32_WINNT=0xa00 -Dores_accounts_lib_EXPORTS -I/.../OreStudio/projects/ores.accounts/include -I/.../OreStudio/projects/ores.comms/include -I/.../OreStudio/projects/ores.utility/include -isystem /.../OreStudio/build/output/windows-clang-debug/vcpkg_installed/x64-windows/include -isystem /.../OreStudio/build/output/windows-clang-debug/vcpkg_installed/x64-windows/include/server -O0 -std=c++23 -D_DEBUG -D_DLL -D_MT -Xclang --dependent-lib=msvcrtd -g -Xclang -gcodeview -Werror -MD -MT projects/ores.accounts/src/CMakeFiles/ores.accounts.lib.dir/domain/login_info_table_io.cpp.obj -MF projects\ores.accounts\src\CMakeFiles\ores.accounts.lib.dir\domain\login_info_table_io.cpp.obj.d @projects\ores.accounts\src\CMakeFiles\ores.accounts.lib.dir\domain\login_info_table_io.cpp.obj.modmap -o projects/ores.accounts/src/CMakeFiles/ores.accounts.lib.dir/domain/login_info_table_io.cpp.obj -c /.../OreStudio/projects/ores.accounts/src/domain/login_info_table_io.cpp
projects/ores.accounts/src/domain/login_info_table_io.cpp:41:34: error: 'localtime' is deprecated: This function or variable may be unsafe. Consider using localtime_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. [-Werror,-Wdeprecated-declarations]
41 | ss << std::put_time(std::localtime(&last_login_time), "%Y-%m-%d %H:%M:%S");
|
Suggested Gemini fix:
inline std::tm* safe_localtime(const std::time_t* time, std::tm* result) { #ifdef _WIN32 return localtime_s(result, time) == 0 ? result : nullptr; #else return localtime_r(time, result); #endif }
COMPLETED Resolve crash on shutdown problem code
At present the app crashes when shutting down. This is due to the attach / detach logic. We need to workout a plan for managing this. K2:
Yes — but only if you **keep the same ownership rule in both states** (attached *and* detached).
The moment you let Qt parent the widget **and** still keep it in a container that you later `delete`, you again have **two owners**, and the double-delete will come back as soon as the user re-attaches the window and then quits the program.
Below is the minimal change that lets the user detach/reattach as often as he wants **and** guarantees that the object is destroyed **exactly once**.
--------------------------------------------------------
1. Pick one unique owner
--------------------------------------------------------
Make **MainWindow** the unique owner.
That means:
- Never give the widget a parent (pass `nullptr` in the constructor).
- Always insert it into one of the four containers.
- Delete it **only** from those containers (or when the user explicitly closes
it).
- When the widget is *attached* to the MDI area, use
**QMdiArea::addSubWindow()**; this only sets the **QMdiSubWindow** as parent
of the **internal viewport**, **not** of your custom widget, so your widget
stays parent-less.
Code sketch:
```cpp
// create
auto w = new CurrencyMdiWindow(nullptr); // no parent
mdiArea->addSubWindow(w); // only the QMdiSubWindow gets a parent
currencyDetailWindows_.insert(iso, w);
allDetachableWindows_.append(w);
```
--------------------------------------------------------
2. Remove it from the lists at the right moment
--------------------------------------------------------
As soon as the widget dies (user presses ×, or you programmatically close it) you must **erase the pointer** from every container; otherwise you will dereference a dangling pointer when you later iterate over the lists.
Connect once, right after creation:
```cpp
connect(w, &QObject::destroyed, this, [this, w](QObject* o) {
Q_UNUSED(o)
currencyDetailWindows_.remove(w->isoCode());
allDetachableWindows_.removeAll(w);
/* same for the other three maps/lists */
});
```
--------------------------------------------------------
3. Detach / re-attach implementation
--------------------------------------------------------
Detaching simply reparents to **nullptr** and shows the widget as top-level:
```cpp
void MainWindow::detachWindow(QWidget* w)
{
w->setParent(nullptr);
w->show();
}
```
Re-attaching puts it back into the MDI area:
```cpp
void MainWindow::attachWindow(QWidget* w)
{
w->setParent(nullptr); // make sure it is still parent-less
mdiArea->addSubWindow(w);
w->show();
}
```
Because the widget **never** had a Qt parent, Qt will **never** auto-delete it; only your own code (or the user closing the top-level window while `Qt::WA_DeleteOnClose` is set) can trigger the `destroyed()` signal, and that signal already removed the pointer from the lists.
--------------------------------------------------------
4. Destructor becomes trivial
--------------------------------------------------------
```cpp
MainWindow::~MainWindow()
{
// delete every widget that is still alive
qDeleteAll(currencyDetailWindows_);
qDeleteAll(currencyHistoryWindows_);
delete currencyListWindow_;
qDeleteAll(allDetachableWindows_);
}
```
Each widget is deleted **once**, the `destroyed()` lambda runs immediately and clears the lists, so when the next container is destroyed its `qDeleteAll` sees only `nullptr`s (or the map is already empty).
--------------------------------------------------------
5. Optional extra safety
--------------------------------------------------------
If you want to be 100 % sure, store **QPointer** in the containers instead of raw pointers:
```cpp
QMap<QString, QPointer<DetachableMdiSubWindow>> currencyDetailWindows_;
```
Now the destructor can even be written as
```cpp
for (auto it = currencyDetailWindows_.begin(); it != currencyDetailWindows_.end(); ++it)
delete it.value(); // safe: delete nullptr is a no-op
```
but this is **not required**—the design above is already bullet-proof.
--------------------------------------------------------
Summary
--------------------------------------------------------
- Pick **one** owner (MainWindow).
- Keep widgets **parent-less**.
- Add / remove them from the lists **synchronously** via `destroyed()`.
- Detach/reattach only changes **visual** parent, not ownership.
With these rules you can detach and re-attach as often as you like, and the
program will still shut down without the heap corruption you are seeing now.
COMPLETED Assets are not being packaged code
Rationale: All assets are now interned into resources.
[marco@lovelace bin]$ ./ores.qt qt.svg: Cannot open file '/opt/OreStudio/0.0.4/bin/ic_fluent_currency_dollar_euro_20_filled.svg', because: No such file or directory qt.svg: Cannot open file '/opt/OreStudio/0.0.4/bin/ic_fluent_history_20_regular.svg', because: No such file or directory qt.svg: Cannot open file '/opt/OreStudio/0.0.4/bin/ic_fluent_plug_disconnected_20_filled.svg', because: No such file or directory qt.svg: Cannot open file '/opt/OreStudio/0.0.4/bin/ic_fluent_plug_connected_20_filled.svg', because: No such file or directory qt.svg: Cannot open file '/opt/OreStudio/0.0.4/bin/ic_fluent_edit_20_filled.svg', because: No such file or directory qt.svg: Cannot open file '/opt/OreStudio/0.0.4/bin/ic_fluent_delete_20_filled.svg', because: No such file or directory qt.svg: Cannot open file '/opt/OreStudio/0.0.4/bin/ic_fluent_save_20_filled.svg', because: No such file or directory qt.svg: Cannot open file '/opt/OreStudio/0.0.4/bin/ic_fluent_document_table_20_regular.svg', because: No such file or directory qt.svg: Cannot open file '/opt/OreStudio/0.0.4/bin/ic_fluent_document_code_16_regular.svg', because: No such file or directory qt.svg: Cannot open file '/opt/OreStudio/0.0.4/bin/ic_fluent_star_20_regular.svg', because: No such file or directory qt.svg: Cannot open file '/opt/OreStudio/0.0.4/bin/ic_fluent_plug_connected_20_filled.svg', because: No such file or directory qt.svg: Cannot open file '/opt/OreStudio/0.0.4/bin/ic_fluent_plug_disconnected_20_filled.svg', because: No such file or directory qt.svg: Cannot open file '/opt/OreStudio/0.0.4/bin/ic_fluent_plug_connected_20_filled.svg', because: No such file or directory qt.svg: Cannot open file '/opt/OreStudio/0.0.4/bin/ic_fluent_plug_disconnected_20_filled.svg', because: No such file or directory qt.svg: Cannot open file '/opt/OreStudio/0.0.4/bin/ic_fluent_currency_dollar_euro_20_filled.svg', because: No such file or directory qt.svg: Cannot open file '/opt/OreStudio/0.0.4/bin/ic_fluent_save_20_filled.svg', because: No such file or directory qt.svg: Cannot open file '/opt/OreStudio/0.0.4/bin/ic_fluent_edit_20_filled.svg', because: No such file or directory qt.svg: Cannot open file '/opt/OreStudio/0.0.4/bin/ic_fluent_delete_20_filled.svg', because: No such file or directory qt.svg: Cannot open file '/opt/OreStudio/0.0.4/bin/ic_fluent_document_table_20_regular.svg', because: No such file or directory qt.svg: Cannot open file '/opt/OreStudio/0.0.4/bin/ic_fluent_document_code_16_regular.svg', because: No such file or directory qt.svg: Cannot open file '/opt/OreStudio/0.0.4/bin/ic_fluent_star_20_regular.svg', because: No such file or directory qt.svg: Cannot open file '/opt/OreStudio/0.0.4/bin/ic_fluent_history_20_regular.svg', because: No such file or directory
COMPLETED Split main window class code
At present the code in main window is very complex. We need to add a lot of windows, and it is not scalable.
COMPLETED Move base32_encode to utilities code
Rationale: refactor has been done. Created new story for tests in utilities.
Add tests. Also move host_to_network_32, read_uint16, etc.
COMPLETED Add multi-selection support to currencies code
Users should be able to select multiple currencies and delete them. Maybe we should do like gmail and have check boxes?
COMPLETED Update readme with UI screenshots code
Now that we have a basic UI up and running, add it to docs.
COMPLETED Update doxygen main page infra
It should be a bit more informative.
COMPLETED Improve UML diagrams code
After the extensive refactor, we need to update the Qt class diagram. We also need to generate a system level component diagram.
POSTPONED Make UI/UX look more professional code
Links:
Analysis from Gemini:
To make your Qt application look like an advanced trading system—even for a
simple CRUD operation screen—requires moving beyond basic desktop application
styles toward the dense, high-contrast, data-rich aesthetic of platforms like
Bloomberg or professional broker terminals.
The current look (a dark table with simple data rows) is a great foundation.
Here are targeted suggestions for your Qt UI to elevate it to a professional,
advanced trading system aesthetic:
## I. Color and Contrast (The Dark Theme)
Your current dark gray background is good, but trading systems use specific
contrast to highlight data significance.
1. **Define a Palette:** Adopt a limited, functional color palette:
* **Primary Background:** A very dark, near-black charcoal (`#1A1A1A` or
`#1E1E1E`). This is the foundation.
* **Foreground/Text:** Clean white or light gray (`#F0F0F0`).
* **Accent Color (Neutral):** A subdued corporate blue/cyan (`#007ACC` or
a subtle green/gold from your branding) for selected rows, borders, and
input focus.
* **Data Status Colors:**
* **Positive (Gains):** Bright, high-contrast green (`#00C853`).
* **Negative (Losses):** High-contrast red (`#FF3333`).
* *(While CRUD isn't about gains/losses, you can use these colors for
status, like 'Active' vs. 'Inactive' currencies).*
2. **Subtle Depth:** Avoid flat black. Use a slightly lighter shade of gray
(`#2A2A2A`) for embedded panels, sidebars, and control areas to create
visual segmentation, giving the impression of modularity.
## II. Typography and Data Presentation
Trading UIs prioritize density and scannability.
1. **Monospace Font:** For the currency codes and numerical columns, switch to
a clear, legible **monospace font** (like Consolas, Fira Code, or a custom
font in Qt). Monospace fonts ensure that all numbers align perfectly in
columns, which is essential for rapid data comparison.
2. **Font Sizing:** Use a small, consistent font size (e.g., 10pt or 11pt) to
fit more data on screen. Use bolding sparingly, primarily for the Currency
Code (e.g., USD, EUR).
3. **Visual Alignment:**
* **Text Columns** (Currency Name): Left-aligned.
* **Code Columns** (ISO Code, Symbol): Center-aligned.
* **Numerical Columns** (Rounding, Precision): Right-aligned. **This is
critical** for financial UIs, as it allows users to compare magnitude
instantly.
## III. Advanced Table View Enhancements (QTableView/QTableWidget)
Since the core of this screen is a table, focus on making the table look
high-tech.
1. **Header Styling:**
* Make column headers slightly stand out with a subtle dark gradient or a
distinct, slightly brighter background color (e.g., `#282828`).
* Ensure the header font is crisp (perhaps slightly bolder than the row
data).
* Add tiny, clear **sort indicators** to show the current sort direction.
2. **Row Selection:**
* The selected row should use your accent color (e.g., a thin blue left
border or a light blue background fill) with white or light gray text
for high visibility.
* Introduce **subtle, faint horizontal rules** (1px in a color like
`#333333`) to separate rows, which aids readability in dense tables.
3. **Interactive Elements (Hover):** Implement a very subtle change on row
hover (e.g., the background darkens by 5%) to indicate interactivity, even
if clicking doesn't change the view.
## IV. UI Layout and Modularity
Advanced UIs are rarely monolithic; they are built from modular panels.
1. **Toolbar (Top):** Create a clean, dedicated toolbar area at the top for
your CRUD operations (`Add`, `Edit`, `Delete`) and your system icons
(Connection, Reference Data).
* Use the Fluent UI System Icons you researched (`globe-32-regular`,
`money-32-regular`).
* Buttons should be flat, high-contrast text or icons only. On hover, they
should reveal a subtle gray background or a thin accent border.
2. **Side Panel (Right or Left):** Instead of a simple dialog for *editing*,
use a dedicated side panel that slides out or appears next to the table when
a row is selected.
* This panel would house the detail view for the selected currency. This
makes the UI feel like a single workspace rather than navigating modal
windows.
* Give this panel a slightly different background shade (`#2A2A2A`).
3. **Status Bar (Bottom):** Add a sleek, minimal status bar at the bottom. This
is where you would place your connection status icon (using your proposed
`globe-32-regular` or `plug-connected-32-regular` icon). It reinforces the
"system is live" feel.
## V. Qt-Specific Implementation via Stylesheets
In Qt, you achieve this professional look primarily through **QSS (Qt Style
Sheets)**. You will be targeting specific widgets (like `QTableView`,
`QPushButton`, `QLineEdit`) with CSS-like rules.
```css
/* Example QSS Snippets for the Trading Look */
QTableView {
/* Base style for the data area */
background-color: #1A1A1A; /* Primary Background */
gridline-color: #333333; /* Faint row separators */
color: #F0F0F0;
border: 1px solid #007ACC; /* Subtle border using accent color */
selection-background-color: #007ACC; /* Accent Color for selection */
selection-color: white;
}
QHeaderView::section {
/* Style for Column Headers */
background-color: #282828; /* Slightly lighter shade for headers */
color: #FFFFFF;
border: none;
padding: 6px;
font-size: 11pt;
font-weight: bold;
}
QLineEdit {
/* Style for input fields (e.g., in the side panel or search) */
background-color: #1A1A1A;
border: 1px solid #444444;
color: #F0F0F0;
padding: 5px;
}
QPushButton {
/* Flat button style for toolbar */
background-color: transparent;
border: none;
color: #F0F0F0;
padding: 8px 12px;
}
QPushButton:hover {
/* Hover effect */
background-color: #2A2A2A;
border: 1px solid #007ACC;
}
```
POSTPONED Current issues with package install in debian code
At present we have several issues with packaging:
- debs are built on ubuntu so they cannot install on latest debian testing as the t64 migration has been completed. Error:
root@lovelace:~# apt install /home/marco/Downloads/orestudio_0.0.4_amd64.deb You might want to run 'apt --fix-broken install' to correct these. Unsatisfied dependencies: orestudio : Depends: libqt6gui6t64 (>= 6.1.2) but it is not installable Depends: libqt6widgets6t64 (>= 6.1.2) but it is not installable Error: Unmet dependencies. Try 'apt --fix-broken install' with no packages (or specify a solution). root@lovelace:~# apt install libqt6widgets6t64 libqt6gui6t64 Package libqt6gui6t64 is not available, but is referred to by another package. This may mean that the package is missing, has been obsoleted, or is only available from another source However the following packages replace it: libqt6gui6:i386 libqt6gui6 Package libqt6widgets6t64 is not available, but is referred to by another package. This may mean that the package is missing, has been obsoleted, or is only available from another source However the following packages replace it: libqt6widgets6:i386 libqt6widgets6 Error: Package 'libqt6widgets6t64' has no installation candidate Error: Package 'libqt6gui6t64' has no installation candidate
- when starting the package from a directory, it tries to create the log relative to that directory:
[marco@lovelace ~]$ /opt/OreStudio/0.0.4/bin/ores.qt terminate called after throwing an instance of 'boost::filesystem::filesystem_error' what(): boost::filesystem::create_directories: Permission denied [system:13]: "/home/marco/../log", "/home/marco/../log" Aborted /opt/OreStudio/0.0.4/bin/ores.qt
When investigating a crash we noticed the app is not exiting cleanly. Fix all of these crashes before we go any further.
AI Generated Sprint Summary
# **OreStudio Sprint 4 – Release Notes** *November 2025* This sprint focused on **stabilizing the core application**, **improving developer workflows**, and **laying the foundation for AI-assisted development** using LLMs and Claude skills. --- ## ✅ **Highlights** - **LLM-powered code review completed** across core modules (`ores.accounts`, `ores.cli`, `ores.risk`), identifying bugs, modern C++ improvements, and security patterns. - **Claude skills framework implemented** to automate documentation, code generation, and system analysis using structured prompts and PlantUML. - **UI/UX modernization** with Fluent UI icons, professional dark theme styling, and MDI window flexibility. - **Critical crash on shutdown resolved** via improved Qt ownership model and lifecycle management. - **Build and packaging improvements** on Windows and Linux, including CMake targets for docs/skills and better dependency handling. --- ## 🛠️ **Key Improvements** ### **Developer Experience** - Added CMake targets for `site` and `skills` to streamline documentation and AI skill generation. - Restructured components to follow Dogen conventions: `component/src`, `modeling`, `tests`. - Generated PlantUML diagrams for all components; integrated into documentation pipeline. - Created reusable meta-skills for modeling, documentation, and code generation. ### **Code Quality & Stability** - Fixed memory leaks in `sqlgen` backend (valgrind-clean). - Resolved Windows build errors (deprecated `localtime` → `localtime_s`). - Split monolithic `MainWindow` class for maintainability. - Decoupled JSON serialization from domain types; added table-based output. ### **UI & UX** - Implemented currency CRUD: add, edit, delete, clone, multi-select. - Added export to CSV and ORE XML. - Detachable MDI windows for flexible workspace layout. - Splash screen, about dialog, and history viewer added. - Started professional styling (dark theme, monospace fonts, aligned columns) — further work postponed. ### **Infrastructure** - Windows packaging now includes required Qt and OpenSSL DLLs via `vcpkg`. - Assets (icons) now bundled via Qt resources and properly packaged. - Debian package issues identified (t64 migration); fix postponed pending stable Qt6.8 on Debian. --- ## ⚠️ **Known Issues & Postponed** - **Debian package installation fails** due to `t64`-suffixed Qt6 dependencies not available. Target: fix after Qt6.8+ lands in Debian. - **Full UI professional styling** (side panels, hover effects, status bar) postponed — will resume using Claude skills for design suggestions. --- ## 📊 **Time Summary** - **Total effort**: 80h 16m - **Code**: 52% | **Infra**: 21% | **Agile/Analysis**: 6% - Top tasks: LLM code review (16h), UI/UX polish (11h), crash fix & window management (8h) --- *Next sprint: Focus on test tagging, CI/CD improvements, and expanding LLM skills for automated testing and documentation.*
Footer
| Previous: Version Zero |