Files
logos-logoscore-cli/flake.lock
Dario Gabriel LipicarandClaude Opus 5 4ba7aa1657 feat(shared-runtime): link the shared libraries, and delete the shim
PR-5 of the shared-runtime migration, logoscore-cli half. Both front-ends stop
emptying static archives and taking the runtime from liblogos_core, and link the
shared libraries that OWN those types instead.

DELETED: cmake/LogosSharedFromDll.cmake, its call, and LOGOS_SHARED_USE_DLL. The
shim made ld unable to pull an archive member that would redefine an imported
symbol; there is no second static copy left to suppress. The dllimport opt-in is
gone for the same reason -- the import is what the link now produces.

Takes the pin SET, not one pin: logos-protocol 2e3344a (#65), logos-plugin-qt
1aa3e31 (#22), logos-liblogos b2a9a0b (#182). Bumping one alone gives a
combination where the shared targets do not exist or do not match.

THE GATE NEEDED THE SAME TWO CORRECTIONS AS BASECAMP'S, plus one this repo
surfaced on its own. All three were the check measuring the wrong thing.

  * It hardcoded liblogos_core as THE provider. True while liblogos_core
    absorbed both archives; false now. Replaced with EXACTLY-ONE-DEFINER per
    type, which is provider-agnostic and survives ownership moving again.
  * The negative control planted a copy of liblogos_core as its "duplicate
    runtime". liblogos_core defines ZERO runtime symbols now, so it planted
    nothing and the control correctly reported itself vacuous. It plants a real
    DEFINER instead.
  * NEW HERE: this gate listed every lib/*.dylib as a CONSUMER, so it scanned
    the owners under "no consumer defines the runtime" and reported

        liblogos_protocol.dylib   35   SPLIT-BRAIN

    which is simply the library doing its job. Owners are now separated from
    consumers: counted in the exactly-one assertion, excluded from the
    nothing-else-defines-it scan. basecamp's gate never hit this because its
    consumer set is the exe plus plugins/, not lib/.

StoreRegistry stays out of the exactly-one list: token_manager.cpp defines
`static StoreRegistry r;` inside registry(), so it has a LOCAL symbol and no
external one. Requiring one definer of something never exported would fail
forever. It remains in the TIER 1 scan, where "no consumer defines it" is
meaningful precisely because it should never become external.

VERIFIED, aarch64-darwin:

  .#default                      PASS
  checks.tests                   PASS
  checks.symbol-gate             PASS
  checks.symbol-gate-negative    PASS

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 11:45:55 -03:00

27 MiB

The file is too large to be shown. View Raw