- strip QAbstractItemModel/QAction/signals-slots from UndoStack (UI
concerns belong to the app layer), index_changed becomes a
std::function callback
- decouple UndoCommand from Project via an optional modified-flag
callback pair
- add pure C ABI in include/undo + src/undo/c_api (oakundo_ prefix,
vtable-based command wrapper, OAKUNDO_E_* error codes)
- fix three engine-side defects: jump(0) infinite loop,
MultiUndoCommand child leak, push_pre_executed not undoable
- add gtest suites (22 cases) and a standalone build driver
- riir.md: split project file read/write into standalone oakstorage
module (pluggable backend, DB-replaceable); add Mermaid data flow
diagram of all modules; adjust batch table and milestones
- riir/04-interfaces.md: new provides/consumes contract matrix for
all modules
- riir/M10-oakstorage.md: new manual with frozen C API (typed opaque
handles, manual vtable for storage backends, URI addressing)
- riir/01: codify pure-C OO interface rules (typed handles instead of
void*, init/free pairs, manual vtables, no C++ objects or member
calls across shared library boundaries); upper layers issue commands
only, no module-to-module event subscriptions (async task callbacks
excepted)
- sync 00/02/03 and M2-M9 manuals: remove subscribe APIs, replace
void* with typed handles, update tests accordingly