No description
Find a file
Scott Yeager 078a6592f8 Merge branch 'main' into development
# Conflicts:
#	README.md
2026-06-10 15:36:13 +00:00
crates chore: align deps to development branch 2026-06-06 08:52:25 +02:00
.gitignore Vendor frozen herolib stack (derive, oschema, openrpc, core) from hero_lib@9657556a; repo now fully self-contained 2026-06-05 20:02:31 +00:00
Cargo.lock chore: update cargo dependencies 2026-06-06 08:17:09 +02:00
Cargo.toml Re-cut old stack from pre-bridge d31c7b6 (self-contained hero_rpc2); rename frozen herolib_derive->hero_derive; drop unneeded vendored runtime crates 2026-06-05 22:04:15 +00:00
README.md README: add today's five pristine mirrors + tail consumers to the branch map 2026-06-09 23:52:04 +00:00

hero_macros_previous

Frozen, known-good snapshots of the previous macro + OpenRPC stack (the hero_rpc / hero_blueprint crates and the pre-rename herolib_derive). Service repos pin these instead of the live hero_lib / hero_blueprint repos, so the codegen/scaffolding refactor can continue there without breaking anyone. See issue #1 for the original mandate.

Nothing here is developed. Fixes land only when a consumer needs them; the live successors are hero_lib (runtime + new derive) and hero_blueprint (scaffolder). Each service repo migrates onto the new stack one at a time, on its own schedule, once that stack stabilizes.

Why multiple branches?

The fleet's committed code was generated across several incompatible "eras" of the old stack. Generated OSIS/server code from one era is byte-incompatible with another era's hero_rpc_osis (type-identity errors like expected hero_rpc_osis::herolib_sid::SmartId, found herolib_sid::SmartId). A repo must therefore pin the era its committed code was generated in. Each branch below is one such era. Consolidating branches would require regenerating consumers' committed code — that is exactly the per-repo migration being deferred until the new stack stabilizes, at which point these branches get deleted wholesale.

Branch map

Branch Source snapshot What it provides Consumers (development_freeze)
main hero_blueprint@d31c7b6 (2026-05-28) + hero_derive cut from hero_lib@9657556a Old-stack client crates (hero_rpc_derive, hero_rpc2, hero_rpc_openrpc, hero_rpc_client) + frozen new derive hero_derive (alias target for herolib_derive) ~28 repos: aibroker, browser, code, codescalers, collab, db, demo, editor, gpu, indexer, matrixchat, office, orchestrator, planner, proc, proxy, redis, shrimp, skills, slides, sync_webdav, voice, wallet, zinit, …
osis_main hero_blueprint@efb3a609 (2026-06-07, new-serving) Full OSIS cluster (hero_rpc_osis, oschema, generator, derive emitting ::herolib_openrpc::); herolib runtime pinned 9657556a, indexer b3a2f1e3 agent, biz, coordinator, embedder_provider, logic, osis, voice_provider
osis_oldserving hero_blueprint@f6509f9c (2026-06-05, old-serving) OSIS cluster with vendored old-transport hero_rpc_derive livekit
osis_oserver hero_blueprint@df2f8b1b (2026-05-18, old-serving) OSIS cluster made fully herolib-free (vendored frozen_osis_sid/otoml/base) — zero external git deps compute (pinned by rev=43a19c5)
frozen_73ff6220 pristine byte-mirror of hero_blueprint@73ff6220 Whole-tree mirror (pre-oserver-deletion) consumed via [patch] drive, mycelium
frozen_d7aa082e pristine byte-mirror of hero_blueprint@d7aa082e Whole-tree mirror books
frozen_d31c7b63 pristine byte-mirror of hero_blueprint@d31c7b63 Whole-tree mirror (SDK era) books
frozen_9b1e0d54 pristine byte-mirror of hero_blueprint@9b1e0d54 Whole-tree mirror (herolib_proc_rhai transport era) ledger
frozen_8681589e pristine byte-mirror of hero_blueprint@8681589e Whole-tree mirror (hero_service/HeroUiServer era) auth, indexer_ui (archived; freezes local-only)
frozen_8429b07b pristine byte-mirror of hero_blueprint@8429b07b Whole-tree mirror (hero_os era; hero_rpc_osis additionally vendored+era-fixed inside hero_os) os
frozen_7b2c2abf pristine byte-mirror of hero_blueprint@7b2c2abf Whole-tree mirror my_compute_holo
frozen_1e11292f pristine byte-mirror of hero_blueprint@1e11292f Whole-tree mirror projectmycelium_marketplace_backend
frozen_1f883c00 pristine byte-mirror of hero_blueprint@1f883c00 Whole-tree mirror znzfreezone_backend
frozen_herolib_e519cb1 pristine byte-mirror of hero_lib@e519cb14 (2026-03-09) Contemporary herolib for no-lock mirror consumers mycelium
development main variant with hero_derive cut from hero_lib@d1383f58 Unused — zero consumers. Its one substantive fix (socket-dir placeholder, 3237bae) is cherry-picked to main. Do not base work here: it floats branch=development deps and deleted its Cargo.lock.

Two kinds of branches:

  • Cluster branches (main, osis_main, osis_oldserving, osis_oserver): curated, blueprint-free crate sets with upstream deps pinned by rev=. Consumers repoint individual crates here (git = …, branch = …).
  • Pristine mirrors (frozen_*): unmodified single-commit byte-copies of an exact upstream rev, consumed via [patch."…/hero_rpc.git"] (or hero_blueprint.git / hero_lib.git). Byte-identity is the point: the consumer's committed generated code keeps matching, with zero code changes. These must never receive commits — a commit breaks byte-identity for every consumer.

What's on main

Old-stack crates lifted verbatim from hero_blueprint@d31c7b6 (the last self-contained pre-bridge rev: client macros emit ::hero_rpc2::, herolib-free), workspace version 0.6.0, Rust 1.96:

crate (path) package purpose
crates/derive hero_rpc_derive openrpc_client!, openrpc_proxy!, rhai_openrpc! proc macros (old stack)
crates/hero_rpc2 hero_rpc2 JSON-RPC 2.0 runtime over UDS; owns the OpenRPC transport (folds in the retired hero_rpc_openrpc per hero_rpc#146)
crates/openrpc hero_rpc_openrpc Deprecated re-export shim; kept so older consumers still resolve
crates/openrpc_http_client_lib hero_rpc_client Cross-platform OpenRPC HTTP client (native + wasm)
crates/hero_derive hero_derive Frozen copy of the NEW derive (herolib_derive@9657556a, renamed so new-stack repos can alias it without a dup-crate clash)
crates/herolib_oschema herolib_oschema Vendored schema parser the derives build against

The scaffolder crates (generator, blueprinter) are intentionally not on main — they are the "too new" parts being decoupled from. The OSIS cluster branches carry what OSIS repos need.

How consumers use it

Old-stack client repos repoint the old dependency:

# before — moving target on hero_blueprint / hero_rpc
hero_rpc_derive = { git = "https://forge.ourworld.tf/lhumina_code/hero_rpc.git", branch = "development" }

# after — frozen, stable
hero_rpc_derive = { git = "https://forge.ourworld.tf/lhumina_code/hero_macros_previous.git", branch = "main" }
hero_rpc2       = { git = "https://forge.ourworld.tf/lhumina_code/hero_macros_previous.git", branch = "main", features = ["client", "uds-http", "openrpc-transport"] }

New-stack repos freeze only the codegen and float the runtime:

herolib_derive = { package = "hero_derive", git = "https://forge.ourworld.tf/lhumina_code/hero_macros_previous.git", branch = "main", version = "0.6.0" }
# herolib_core / herolib_openrpc / hero_lifecycle: pin hero_lib rev=9657556a

Mirror consumers use [patch]:

[patch."https://forge.ourworld.tf/lhumina_code/hero_rpc.git"]
hero_rpc_osis = { git = "https://forge.ourworld.tf/lhumina_code/hero_macros_previous.git", branch = "frozen_73ff6220" }

Freeze rules (learned the hard way)

  1. Pin by rev=, never branch=, in any repo that other repos consume as a git dependency — cargo ignores a git dep's Cargo.lock and re-resolves its branch= specs at today's tip.
  2. Commit Cargo.lock in every consumer and never delete it; plain cargo build honors it. Never run cargo generate-lockfile / cargo update wholesale on a frozen repo — targeted cargo update -p <crate> only.
  3. The one external coupling of the cluster branches is hero_lib at rev=9657556a — do not float it.

Build / test

cargo build --workspace
cargo test  --workspace --all-features

Both are green on main. One carried-over SSE test is quarantined — see crates/derive/tests/README.md.