Skip to content

ladder: shared infrastructure, docs, and framework prerequisites (rung 0) - #88

Open
Yaraslaut wants to merge 2 commits into
masterfrom
ladder-foundation
Open

ladder: shared infrastructure, docs, and framework prerequisites (rung 0)#88
Yaraslaut wants to merge 2 commits into
masterfrom
ladder-foundation

Conversation

@Yaraslaut

Copy link
Copy Markdown
Member

What

The first slice of the application ladder (previously all bundled in #41, 236 files / 32.8k insertions): the shared foundation every rung builds on, with no rung's application code included. Pastebin, bookmarks, and polls land as their own follow-up PRs against this one.

Per LADDER.md's own framing, rung 0 has no app of its own — this is rung 0.

Contents

  • CI/CMake: .github/workflows/ci.yml, wasm-ladder.yml, cmake/morph_add_rung.cmake, cmake/compiler_options.cmake, codecov.yml, and the top-level CMakeLists.txt/vcpkg.json changes needed to build an opt-in ladder (-DMORPH_BUILD_LADDER=ON) alongside existing example/test targets, without disturbing them.
  • Cross-rung docs: examples/LADDER.md, IMPLEMENTATION.md, TESTING.md, FINDINGS.md — the two binding companion documents every rung is held to, plus the finding pipeline's scoreboard/triage process.
  • Design-annex README stubs: examples/{crm,forge,kanban,ledger,lims}/README.md — rungs 4–8, each a finished requirements study. Docs only, no code; building any of them is a separate decision per LADDER.md's program-scope note.
  • Shared examples/common: the GUI presenter base (presenter.hpp), AppContext (LocalBackend/QtWebSocketBackend/WASM mode switch), the injectable clock, and the full testkit (BackendRig, the DbFixture family, fault-injection proxy, strand interleaver, event poller) every rung's tests depend on — with its own unit tests (ladder_common_tests).
  • Framework prerequisites: registry.hpp/remote.hpp changes the rungs needed, exercised by tests/test_quantity_forms.cpp and the new tests/test_remote_execute_ordering.cpp.
  • The lint-gate scripts/tests already merged via ci+scripts: lint gate for file-scope test type name collisions #85, carried forward.

Verification

Configured and built standalone (-DMORPH_BUILD_LADDER=ON -DMORPH_BUILD_QT=ON) with no rung directories presentexamples/CMakeLists.txt's rung-selection loop already tolerates this ("no rung exists yet at rung 0" is a real code path, not a placeholder).

  • morph_tests: 9773 assertions pass
  • morph_qt_tests: 496 assertions pass
  • ladder_common_tests: 212 assertions pass (against its SQLite default)
  • check_spec_citations.sh, check_test_type_names.sh, check_deprecated_markers.sh: all clean

Sequencing

This targets master. The per-rung PRs (pastebin, bookmarks, polls) will target this branch (or be rebased onto master once this merges) and are marked draft where they depend on it.

…g 0)

Split out of the application-ladder branch (236 files, 32.8k insertions)
into its own reviewable PR, per LADDER.md's own framing: rung 0 has no
app of its own, only the shared foundation every later rung builds on.
This is that foundation, with no rung's application code (pastebin,
bookmarks, polls) included -- those land as their own follow-up PRs.

Contents:
- CI/CMake: .github/workflows/ci.yml, wasm-ladder.yml, cmake/morph_add_rung.cmake,
  cmake/compiler_options.cmake, codecov.yml, top-level CMakeLists.txt/vcpkg.json
  changes needed to build an opt-in ladder (MORPH_BUILD_LADDER) alongside
  the existing example/test targets without disturbing them.
- Cross-rung docs: examples/LADDER.md, IMPLEMENTATION.md, TESTING.md,
  FINDINGS.md -- the two binding companion documents (how apps are
  written, how they're tested) every rung is held to, plus the finding
  pipeline's scoreboard/triage process.
- Design-annex README stubs: examples/{crm,forge,kanban,ledger,lims}/README.md
  -- rungs 4-8, each a finished requirements study; building any of them
  is a separate decision taken after rung 4, per LADDER.md's own program
  scope note. No code, docs only.
- Shared examples/common: the GUI presenter base (presenter.hpp, non-
  template QObject bookkeeping every rung's presenters build on),
  AppContext (LocalBackend/QtWebSocketBackend/WASM mode switch), the
  injectable clock, and the full testkit (BackendRig, DbFixture family,
  fault-injection proxy, strand interleaver, event poller) every rung's
  test suite depends on -- all covered by its own unit tests
  (ladder_common_tests).
- Framework prerequisites the rungs needed and that landed here first:
  registry.hpp/remote.hpp changes, exercised by tests/test_quantity_forms.cpp
  and the new tests/test_remote_execute_ordering.cpp.
- The lint-gate scripts/tests already merged via #85 (check_test_type_names.sh
  + its test fixtures), carried forward from the earlier merge into this
  branch.

Verified standalone: configures and builds with -DMORPH_BUILD_LADDER=ON
-DMORPH_BUILD_QT=ON against master's examples/CMakeLists.txt loop, which
already tolerates rung 1+ directories not existing yet ("no rung exists
yet at rung 0" is a real, working code path, not a placeholder). Full
suite passes standalone: morph_tests (9773 assertions), morph_qt_tests
(496 assertions), ladder_common_tests (212 assertions against its SQLite
default). Spec-citation, banned-terminology, and test-type-name lints
all pass.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The foundation PR (this branch) deliberately ships no rung code -- the
per-rung PRs (pastebin/bookmarks/polls) land separately, based on this
branch. wasm-ladder.yml's "build every rung's WASM client by name"
tripwire step hardcoded all three targets unconditionally, so the job
failed here with "ninja: error: unknown target 'ladder_pastebin_gui_wasm'"
-- there is no examples/pastebin on this branch to produce that target.

Fix: each named target now only builds if its rung's directory exists in
the checkout. This is the same "no rung exists yet" case
morph_add_rung.cmake's own header comment already documents as a silent,
expected outcome (a rung with no gui_wasm/ yet simply gets no
ladder_<rung>_gui_wasm target) -- not the regression this tripwire exists
to catch. Once a rung's directory is present (every other branch/PR,
including once the per-rung PRs merge here), the tripwire is unchanged:
morph_add_rung() skipping a rung's gui_wasm target for any other reason
(missing gui_lib, missing QML module, MORPH_BUILD_FORMS_QML off) still
fails the job.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant