[META] Standardize Hero service architecture — template, hero_rpc alignment, framework hoist, skills #262
Labels
No labels
prio_critical
prio_low
type_bug
type_contact
type_issue
type_lead
type_question
type_story
type_task
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
lhumina_code/hero_skills#262
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
TL;DR
The Hero ecosystem has too much divergence across service repos: different layouts, different lifecycle paths, hand-written SDKs, duplicated admin UIs, inconsistent socket conventions. This umbrella tracks the work to fix that — landing a canonical service template, aligning hero_rpc to current standards (incl. vendoring hero_rpc2 for transport+Rust client), hoisting reusable admin components into hero_website_framework, and writing the skills that let AI agents reproduce the pattern reliably.
Agents picking up any child issue: read this issue first, including the child's full comment thread. Decisions iterate in comments, not in issue bodies. The locked-decisions list below is canonical. Pull
developmenton every relevant repo before reading code — many are mid-refactor.Why this work
From team meeting (2026-05-13):
Already in
development(don't redo)Avoid reinventing — these have landed and are referenced by child issues:
<hero-api-docs>OpenRPC explorer web component (commit 630f702) — lives inhero_website_framework/crates/hero_admin_lib/static/js/api-docs.js. The meeting's #1 hoist target is already there.WorkspaceScaffolderinhero_rpc/crates/generator/src/build/scaffold.rs(1208 lines). Today's output naming is wrong (_ui,_client) and incomplete (no_admincrate, noservice.toml, ships aMakefilethat shouldn't exist). #54 is now "fix and extend" this, not "build from scratch."unix_serversurface partly cleaned —hero_rpc/crates/osis/src/rpc/server.rswas reduced by 755 lines. Some legacy file (unix_server.rs) still exists; verify its role before final cleanup.hero_admin_libalready provides standard admin routes (/health,/.well-known/heroservice.json), socket helpers, middleware, embedded assets — athero_website_framework/crates/hero_admin_lib/src/{routes,socket,middleware,assets}.rs. Build new admin features on this, not from scratch.hero_skills/skills/hero/{service,proc,ui,config,networkprotocol}/. Service skills atskills/hero/service/(file paths unchanged).The plan
Four workstreams, 9 issues (one closed):
WorkspaceScaffolderto align with current standards. Update codegen to readservice.toml(single source of truth), vendorhero_rpc2for transport + Rust-client codegen, add Python SDK target, renamecrates/service/tocrates/hero_lifecycle/to free thehero_servicename, modularize the 2653-line generator, upgradeexample/recipe_serveras the end-to-end demo.hero_admin_lib. (Alias-drop issue #5 was closed as wrong premise — see below.)hero_servicetemplate repo.Architectural decisions — locked
Settled in child-issue comment threads. Do not violate without flagging back here.
Source of truth
service.tomlis the single source of truth for a service's identity (name, binaries, sockets, deps, env). Written at scaffold time, read by codegen (OschemaBuildConfig::from_service_toml()). Codegen NEVER overwrites it..oschemafiles). OSchema is the input to codegen for types, OSIS storage, OpenRPC spec, and all SDK targets.Runtime + RPC
#[rpc(server, client)]macros.hero_rpc/crates/hero_rpc2/(copy-over, no fork relationship, no upstream PR).OsisObject,DBTyped<T>, SmartID), OpenRPC spec, JS/TS + Rhai + Python SDK targets. Python is new.X-Hero-ContextHTTP header. No per-context socket dirs anywhere — legacy mentions must be removed.X-Hero-Context,X-Hero-Claims) into a typedHeroRequestContext. Trait methods takectx: Option<HeroRequestContext>as the first arg so they work over both line and HTTP transports.Lifecycle + service identity
herolib_core::base+service_base!()macro +labtool. Thelabcrate (inhero_skills/crates/lab/) is the single tool for install/start/stop/status across all services.hero_rpc/crates/service/→hero_rpc/crates/hero_lifecycle/(package namehero_service→hero_lifecycle). Recent commits show this crate is actively developed, so rename rather than delete. Frees thehero_servicename for the template repo. (Earlier "delete" decision flipped — see #55 latest comment.)--infoflag is NOT deprecated — it prints the embeddedservice.toml(TOML or JSON). Mandatory on every binary, served byherolib_core::base::handle_info_flag.lab infocheckvalidates it.Makefile, noscripts/*.sh, noservice_<name>.nu—labhandles all lifecycle (ADR-0001). The current scaffolder generates aMakefile; that has to go.Naming (no exceptions, per
hero_service_check_fix.md)hero_<name>_serverhero_<name>_admin(never_ui; current scaffolder emits_uiand must be fixed)hero_<name>_sdk(lib crate; current scaffolder emits_clientand must be fixed)hero_<name>— only if non-trivial; bareselfstartCLIs must be removedhero_<name>_webhero_<name>_apphero_<name>_examples(currently not generated; must be added)Templating
hero_website_libuses Tera (full website framework).hero_admin_libis Axum + rust-embed, Askama-friendly. New admin components go intohero_admin_libwith Askama.Framework structure (corrected)
hero_website_framework:hero_admin_lib— admin-dashboard shared assets, middleware, routes, socket helpers. Axum + rust-embed, no Tera, no SQLite. Consumed by every service's_admincrate (hero_proc_admin,hero_osis_admin, …).hero_website_lib— full public-facing website framework with Tera, SQLite, auth, blog, docs. Only used by the framework's owndemo_websiteexample today.hero_web_template, referenced by both framework crates.Reference services
hero_proc— canonical wiring reference.hero_proc_server/src/main.rsusesservice_base!(),validate_service_toml,handle_info_flagexactly as required. Itshero_proc_adminis the model admin binary.hero_compute— workspace layout + hero_rpc OSchema dep set. (Its_servermain.rs uses an older subcommand pattern — do NOT mimic that.)hero_inspectoris out-of-date and explicitly NOT a reference.Open decisions — waiting on Timur
lab service new <subcommand>— exposinghero_rpc scaffoldas alabsubcommand. Out of scope for this batch; should be its own follow-up issue.hero_website_libmigrate its existing Tera templates to Askama, or stay hybrid? Separate follow-up issue if migration is desired.hero_<name>_sdkis the Rust crate. JS/TS, Rhai, Python: separate crates? subdirs ofsdk/? Single mono-SDK with feature flags? Needs a design comment on hero_rpc#55.Child issues
hero_rpc (4)
WorkspaceScaffolderto current standards (naming fixes, service.toml, admin crate, Python SDK, drop Makefile, examples crate).crates/service/tohero_lifecycle.generator/src/build/build.rs(refactor; public API stable).example/recipe_serverto the new end-to-end pattern.hero_website_framework (1 active + 1 closed)
hero_admin_lib(connection-status, live logs, jobs viewer, markdown viewer). OpenRPC explorer already landed.#5— CLOSED as wrong premise (two crates are intentionally separate, no alias).hero_web_template (1)
hero_skills (2)
hero_servicetemplate repo (decision B locked).Suggested execution order
Reference materials
When working on a child issue, start here:
hero_skills/skills/hero/service/:hero_service.md— startup banner,--info,--help.hero_service_toml_info.md— service.toml schema,service_base!()macro.hero_service_check_fix.md—lab infocheckcontract, naming, socket rules.herolib_baseskill —print_startup_banner,prepare_socketsAPI.hero_socketsskill —HERO_SOCKET_DIRlayout and router homepage card naming rule.hero_proc(wiring +hero_proc_adminadmin model),hero_compute(workspace layout).hero_admin_lib(admin shared),hero_website_lib(full website).hero_rpc/crates/generator/src/build/scaffold.rs.hero_skills/crates/lab/.delandtj/hero_rpc2— to be vendored.For agents picking up a child issue
git fetch && git pull --rebase origin developmenton every repo you'll touch. Don't trust prior-session memory of file sizes / structure / crate inventories.hero_skills/skills/hero/service/> reference services (hero_proc,hero_compute) > anything else.Status board
crates/service/hero_website_framework#5 — drop alias(closed, wrong premise)hero_rpc scaffold) #54generator/src/build/build.rs#56example/recipe_serverto end-to-end demo of new pattern #57hero_website_lib#4hero_admin_libalias — standardize onhero_website_lib#5hero_servicetemplate repo (toy domain: managing Hero services) #261hero_rpc scaffold) #54Tier-1 progress (2026-05-19)
Done & pushed
generator/src/build/build.rs8a8d66df6af8ab,9d80616,8df3330<hero-logs-viewer>,<hero-jobs-viewer>,<hero-markdown-viewer>). Total 5 components inhero_admin_lib. Skill docs in progress (separate agent, hero_skills commit pending).Done locally, not yet pushed
2a05555(local)Not started
Deviations & follow-ups flagged by agents
rust_types,rust_rpc,openrpc,js,rhai,python) intobuild/emit/." In reality those emitters live incrate::generate::Generator, notbuild.rs. Agent split whatbuild.rsactually owns (bins, server-crate mods, SDK scaffolding, docs index). Per-target emission refactor needs a separate, larger follow-up issue againstGenerator— out of scope for #56's "no behaviour change" rule. To file.hero_proc_adminstill hand-rolls its API tab; should migrate to the now-canonical<hero-api-docs>component. Belongs in ahero_procissue. To file.hero_website_framework#4acceptance asks for skills athero_skills/skills/web/. The existing precedent (hero_ui_connection_status.md) lives atskills/hero/ui/. Going with the existing on-disk convention — 4 new skills (hero_ui_api_docs,hero_ui_logs_viewer,hero_ui_jobs_viewer,hero_ui_markdown_viewer) being added there. Acceptance reading: aspirational path, real convention wins.Tier-1 status board
Next steps
hero_skills2a05555.crates/service/→hero_lifecycle/, vendor hero_rpc2, Python SDK, OschemaBuildConfig reads service.toml).crate::generate::Generatorper-target emission into modules #59hero_proc_adminto<hero-api-docs>web component #108Follow-up issues filed
crate::generate::Generatorper-target emission into modules (continuation of #56; behaviour-preserving).hero_proc_admin's hand-rolled API tab to the new<hero-api-docs>component.Both are agent-ready, no decision risk, no dependency on tier-2.
Status board update
crates/service/(tier-2 in flight)<hero-api-docs>migration (new, ready to assign)hero_servicetemplate repo (tier-4; blocked on #54)#55 landed on
issue-55-codegen-alignment(review-ready)All 6 sections covered, 141 tests green, workspace clean.
from_service_tomlrecipe_server/build.rs41 → 5 lines_adminscaffold useshero_admin_libHeroUiServerhero_service→hero_lifecyclemain.rsboilerplatehero_proc_serverpattern_admin/_sdkeverywhereCross-repo branches awaiting hero_rpc PR merge
Branches
issue-55-hero-lifecycle-renamepushed on:hero_proxy,hero_osis,hero_index_ui_old,hero_compute,hero_os,hero_router,hero_voice. After the hero_rpc PR merges, a one-line sweep per repo flips the pin frombranch = "issue-55-codegen-alignment"back tobranch = "development".development_wipside-branches archived dirty state onhero_os,hero_voice,hero_foundry.Follow-up filed
hero_rpc#60 — OSchema → Rust trait methods + Python dataclass methods translators (clean rails-on, no architectural decisions left).
Updated status board
Open Timur actions
hero_skillscleanup commit2a05555(from #260 tier-1).Timur actions — done
hero_skills cleanup pushed
Commit
2a05555was sitting local since the #260 tier-1 pass. Cherry-picked onto currentorigin/development(which had since gained the 4 UI component skills from707e7a7— direct push would have nuked them) and pushed as0634d4d. Diff: 2 files changed, 9 insertions, 4 deletions.hero_rpc#55 PR merged
PR #61 — squash-merged as
cbc2821b.7 downstream
hero_lifecyclerename PRs mergedEach got a one-line pin flip (
branch = "issue-55-codegen-alignment"→branch = "development") on top of the rename branch, then a squash merge todevelopment:hero_proxy6e340c8hero_osisf66afd9hero_index_ui_old49549e9hero_computebd9684bhero_os297e4020hero_router3a22affhero_voicef0c53c5All merges HTTP 200; all branches
mergeable: Truebefore merge. No conflicts encountered.Status board
Agents dispatched in parallel against
development(now containing the merged #55 work) — they no longer need to coordinate against the feature branch.Tier-3 #54 landed on
issue-54-scaffold-extend(review-ready)Full writeup on hero_rpc#54. Single commit, ~760 LOC in
crates/generator/src/build/scaffold.rs.What landed
All six items in the META's #54 scope:
_examplescrate generationMakefile+buildenv.sh(ADR-0001)PURPOSE.mdmodelled onhero_proc/PURPOSE.md(Binary/Crate tables + Key Features + lab-only Service Management)README.mdwithlab service ...lifecycle only — nomake, no bash, no nu.gitignore.forgejo/workflows/build-linux.yamlperforge-release-workflowskill (self-contained Rust variant, ADR-0001-compatible — nobuild_lib.sh)Plus one bonus: pre-#54 the core +
_sdkcrates had nosrc/lib.rs, socargo metadataerrored beforelab infocheckcould validate anything. Added 2-line stubs that the OSchema generator enriches on first build.lab infocheckclean, zero manual editsTest impact
cargo test -p hero_rpc_generator→ 110 → 121 passed. 10 new tests against on-disk scaffold artefacts.cargo fmt --checkclean.Branch / merge order
issue-54-scaffold-extend, branched offissue-55-codegen-alignmentper the META's authority order. Merge sequence is #55 → development first, then #54 → development (or rebase #54 once #55 lands).Updated status board
Open Timur actions
hero_skillscleanup commit2a05555from #260 tier-1.3-agent round merged + cleanup
Just landed on
development0a5236d_examplescrate, drops Makefile, generates PURPOSE.md/README/CI workflow.lab infocheckclean on fresh scaffold; 121 tests pass.13dde8f#[method]async trait withHeroRequestContext. OSchema → Python@dataclass+ async SDK via UDS transport. Pythonsystem.pinground-trips e2e.3b04435hero_service_scaffold.md,hero_service_check.md,hero_service_refactor.md— full coverage for new + audit + migrate flows.Each was cherry-picked from the agent's working branch onto a clean head of
origin/development, then squash-merged (the original branches had the #55 history riding along since they branched fromissue-55-codegen-alignmentbefore its merge).Tidied up
Four issues whose work had already landed but didn't auto-close were closed with explanatory comments: hero_rpc#56, hero_proc#108, hero_website_framework#4, hero_skills#260.
Updated status board
example/recipe_server(now unblocked)hero_servicetemplate repo (now unblocked)Three of the four remaining are now ready to assign — only
hero_web_template#4needs a (re-)assignment.Status update: hero_rpc#59 done
crates/generator/src/generate.rs(1785 LOC monolith) →crates/generator/src/generate/directory with 12 per-target modules, each ≤500 LOC.issue-59-generate-modular(offdevelopment)9b1d6b4Acceptance hit: byte-for-byte identical regeneration of
recipe_server+petstore_server, all 125 generator tests pass, publicGeneratorAPI unchanged, every module ≤500 LOC. Pure refactor, no behaviour change.Per-target slots now in place:
rust_types,rust_server,rust_rpc(legacy),openrpc,js,rhai,python(stub)examples,e2e,tests_emit,wasm_build_scriptpython.rsis the empty per-target slot for when the hero_rpc2-driven Python codegen migrates out ofbuild::emit::python_sdkinto theGeneratororchestration path.servicesdomain) #68OServer::run_cliignoresservice.tomlsocket paths — falls back to defaults #69PATH_ROOT— daemons panic at startup #109Workstream complete
Every original deliverable from the 2026-05-13 meeting is now on
development. Six PRs landed this round, all squash-merged.Final landing
example/recipe_serverregenerated as 5-crate end-to-end demo (#57)hero_serviceregistered in lab's SERVICE_MAPhero_themecrate — shared Hero CSShero_theme; inline admin CSS droppedlhumina_code/hero_service)518448cThe deliverable you originally asked for
forge.ourworld.tf/lhumina_code/hero_service— the canonical template repo. Bootstrapped by running the now-completehero_rpcscaffolder against a smallservicesOSchema.cargo build --workspaceclean.lab infocheckzero findings.lab service hero_service --install+--startwork end-to-end. Server binds RPC socket, serves/health,/openrpc.json(6 methods), JSON-RPC dispatch. Admin binds admin socket, serves/health+/.well-known/heroservice.json.From here, future Hero services start with
git clone hero_service(or run the scaffolder fresh), edit the schema + the preserved trait impl, thencargo build && lab service <name> --start.Follow-up issues filed from the work
services)OServer::run_cliignoresservice.tomlsocket pathsPATH_ROOTfrom supervisorAll discovered while building the template; none block the canonical path. Ready to dispatch to agents whenever convenient.
Final status board
<hero-api-docs>migrationhero_servicetemplate repoMeta tracker closing.
Open follow-ups (not blocking anyone): hero_rpc#67, #68, #69; hero_proc#109.
Reopened — feedback round in progress
After the hero_service template repo landed, the user audited the scaffolded output and flagged six cleanup items. Tracking them here so dispatch + status stay visible.
Round 1 — small cleanups merged
docs/schemas/generation (PRs #76 + hero_skills#267)types_generated.rsvia cfg (PR #77, commit 155768b; 127 tests pass)src/services/placeholder (closes #68 as side effect)Round 2 — small bugs (ready to dispatch)
All three are agent-ready, parallel-safe (different code areas), with worktree isolation in the prompts:
OServer::run_cliignoresservice.tomlsocket pathsPATH_ROOTRound 3 — structural cleanups (queued after round 2)
openrpc.json— decision locked:docs/openrpc.json(workspace root). Ready to dispatch.herolib_core::baseServiceTomltypes per-service. Needs new OSchema syntax for external-type refs; agent should propose design in a comment first.sdk/{rust,python,rhai,js}/. Biggest of the round; do last so it builds on the cleaner shape.Parallel side-track
hero_logicmainagainst current hero_skills + assess OSchema migration. Agent dispatched against themainbranch (Kristof's alignment commits already there). Read-only assessment for the migration question.Decisions locked in this round
openrpc.jsonlives atdocs/openrpc.json(workspace root). Distinct from thedocs/schemas/trees dropped in #71 — this is the API contract consumed by every SDK target.git worktree. Standard line in every prompt now. Triggered by 5-agent collision on hero_rpc on 2026-05-20.Status board
Will reopen comments here as each lands so the parent stays the single place to see overall state.
Round 2 + audit findings landed
Round 2 — small bugs merged
OServer::run_clihonorsservice.tomlsocket paths (PR #79)~/hero/cfg/env/*.envat startup so daemons inherit PATH_ROOT (PR #110)hero_logic audit closed
hero_logic#41 closed. §1 fixes landed directly on
main(8f51afd,8d035e4,6499aac). §2 divergences + §3 migration assessment broken out into 5 follow-ups (see below).Follow-ups from the audit
src/, canonical CI, README, lints, version, inspector feature)hero_logicto lab SERVICE_MAPlab user initPATH_ROOT prerequisite in service skillssystem.pingbuiltin (decision needed: implement or update skill §7)Round 3 — structural cleanups (still queued)
openrpc.jsontodocs/openrpc.json(decision locked, ready to dispatch)sdk/{rust,python,rhai,js}/(biggest; last)Status board
Round 3 in flight — 2 of 3 landed
Just merged
docs/openrpc.jsonat workspace root (PR #81)Still in flight
New follow-up filed
hero_service_scaffold.mdskill for the new openrpc.json location + regenerate thehero_servicetemplate repo to match. Small.Remaining queue
sdk/{rust,python,rhai,js}/(biggest)system.ping(decision needed: A implement, B update skill §7)lab user initPATH_ROOT prerequisitehero_logic#43 cleanup merged
cargo build --workspaceclean with 0 warnings,lab infocheck0 findings.Newly unblocked
Remaining queue
hero_service_scaffoldskill update +hero_servicetemplate regen (small)lab user initPATH_ROOT prerequisite docs + optionalpath_root()fallback (small)sdk/{rust,python,rhai,js}/(biggest; save for last)system.ping(decision needed)Big merge round
Merged this batch
openrpc.json: aggregate atdocs/openrpc.json+ per-domain atdocs/<domain>/openrpc.jsonaf96639)Invalid → -32602,NotFound → -32602,PermissionDenied → -32000,Internal → -32603. No more misleading 'Redis operation error' prefixsid:field (struct emitter already auto-injects). Unblocks hero_skills#275ServiceDefinition = {name, description, interfaces}— no ServiceToml mirroring. ServiceCatalog exposes real queries + mocked bootstrap/refactor/check/verify opshero_service#2 needed a rebase + manual conflict resolution (
Cargo.lock+ the regenerated catalogosis_server_generated.rs— took theirs from issue-1 since the agent's verification was on that side).Status board
#71, #74, #75, #67, #69, #109, #73, #271all merged earlier#82, #274), error categories (#83), sid drop (#85), meta-service (#1), superseded (#72)path_root()panic message improvement (agent in flight)sdk/{rust,python,rhai,js}/(biggest; held)system.ping(decision needed)Latest landings + scope correction
Merged
sdk/{rust,rhai,python,js}/(PR #89)main)Scope correction — closing the META hybrid loop
#80 (system.ping builtin) closed as supplanted by #90 — Migrate OSIS services off OServer onto hero_rpc2 trait/dispatch.
The parent META always intended the hybrid hero_rpc + hero_rpc2 path (codegen rails landed in #55 + #60), but no one filed the actual migration after the rails work. #80 was treating the symptom (smoke test fails on OServer) when the real path is to move services to hero_rpc2, which registers
system.*natively.#90 outlines a 4-phase migration: (1) hero_rpc framework path (gap audit, OServer deprecation, scaffolder default flip), (2)
hero_servicetemplate as first migration, (3) sweep hero_logic / hero_compute / hero_db / others, (4) drop legacy (OServer + rust_rpc.rs + recipe_sdk_rpc2 parallel example).This closes the loop the META opened — OSIS services finally run on the unified RPC stack.
Remaining open
path_root()panic message (agent dispatched, status pending).generated/subfolders + gitignore #96_admin+_webthat drive the generated SDK end-to-end #98Phase 1 of the migration LANDED + UI scaffolding gap captured
Just merged
crates/server/deleted (3,362 LoC). hero_rpc2 transport gained POST/rpc+ GET/health+/openrpc.json+/.well-known/heroservice.json+ auto-registeredrpc.healthbuiltin. Generator's scaffolder defaults flipped to hero_rpc2; legacy SDK + bin emitters +recipe_sdk_rpc2parallel example deleted.recipe_servermigrated end-to-end — single canonical demo on the new path. 27 hero_rpc2 uds-http tests + the workspace test suite green.Newly filed
_admin+_webthat drives the generated SDK end-to-end. Closes the META loop on "unify the web UIs of admin and web of hero services" — until now_adminhas been a placeholder shell and_webwasn't scaffolded at all. Per-root-object list/detail/create pages introspected from the OSchema; reuseshero_admin_lib+hero_web_template'shero_theme. Design-first.generated/subfolders + gitignore. Friend feedback: it's hard to tell what's generated vs handwritten. Move all codegen output intogenerated/subdirs + gitignore them sogit statusaftercargo buildis empty.Migration phases 2–4 (now unblocked)
Phase 1 (just landed) was the framework cutover. The per-service migrations are next:
hero_servicetemplate to hero_rpc2 dispatch — validates the path on the canonical reference everyone clones.hero_logic,hero_compute,hero_db, others — one PR per repo.rust_rpc.rsemitter (still kept behind a flag for migration purposes).Each gets its own prompt when ready.
Open queue summary
_admin+_webthat drive the generated SDK end-to-end #98tests/) #115Round 5 status — major landings + new strategic threads in flight (2026-05-22)
Two days of parallel agent work has reshaped the workstream. Catching the META up against what's actually on
development.Landed since the last update
Hybrid hero_rpc + hero_rpc2 — fully closed
rust_rpc.rsemitter deleted.rpc2_adapterbridges every generated OSIS handler. PRs hero_rpc#97 / #99 / #100 / #102, hero_service#5, hero_logic#47 —hero_compute+hero_dbwere no-ops._admin+_webUIs per root object on the typed SDK. Reuseshero_admin_lib+hero_web_template'shero_theme. CRUD methods (new,get,set,delete,list,list_full,exists) emitted into the typed SDK trait + OpenRPC spec;rpc2_adapterregistersnew+list_full.Generated-vs-handwritten separation
generated/subfolders, gitignored.git statusclean aftercargo build. Drops the_generated.rssuffix.generate_wasm+ emits a single wasm-compattypes.rs(was paralleltypes_generated.rs+types_wasm_generated.rs).Generator: single source of truth
<Name>/<Name>Inputsplit,new(input) → sid/set(sid, input) → ()CRUD shape, typed-SDKseed::{blank, random, from_dir}, canonicalhero_rpc_osis::rpc::bootstrap.crates/osis/src/seed/deleted upstream. ADR 002 captures the design.[rootobject]marker required for codegen to treat a type as a root.OSCHEMA_SOURCEdeterministic via sortedread_dir().End-to-end tests scaffold
tests/crate scaffolded per root object — full CRUD lifecycle round-trip over real UDS socket via the typed SDK. Three test layers now distinct: inline unit,_serverdispatch (generated/tests.rs), workspace E2E.Template re-validation
benchdomain withIndexedSingle/IndexedMulti/IndexedNone/IndexedReferencerootobjects — the canonical benchmark surface.Benchmark harness + perf finding
hero_rpc#125 —
crates/osis_benches/Criterion harness +impl ClientT for hero_rpc2::Client. Headline number fromBENCH_RESULTS.md:shadow_indexed.title(HashMap built fromindexed_fields())full_scan.title(list_full() + filter())~90× gap — OSIS storage never consults
indexed_fields(), and the SDK trait emits no_find_*method.@indexis metadata-only today.Walkthrough / examples / skills
example/01_walkthrough.rsas the canonical end-to-end demo (stable on-disk path, python SDK wired, gatedtypes_wasm)._examplesplaceholder dropped.--no-web.#117).Active strategic work
hero_rpc#124 — lifecycle alignment ⭐
Lab is the only bootstrap. Cargo tests, criterion benches, and nushell scripts all invoke
lab service <name> --start --ephemeral --jsonas a subprocess. One bootstrap codepath in the stack, period.Scope refined twice in-thread — final shape (no
lab_fixturecrate; subprocess only) is in the current issue body. PR #126 open (+1592 / -673) —MultiDomainBuilder+ scaffolder subprocess-driver tests + nu skeletons +docs/testing.md. Sibling PRs expected onlhumina_code/hero_skills(lab--ephemeral/--json/--pid/--test) andlhumina_code/hero_service(template re-validation).hero_rpc#123 — OSIS
@indexintegrationWire
find_*throughhero_indexer(Tantivy) with typedFindParams. Direct payoff: the 90× gap from #125 collapses onceDBTyped<T>::setconsultsindexed_fields()and the generated SDK trait grows_find_<field>methods. Open, design-first, not yet dispatched.Small open bugs (drop into next round if anyone has cycles)
rpc.rsuse super::*;does not propagateOTime/OCur/OLocation/OAddressimports. One-line emitter fix.check_socket_or_diecallsstd::process::exit; should returnResult.DBTyped::new_with_indexremoved butexamples/still references it.path_root()panic message — direction locked, never dispatched.Out-of-workstream (lab tooling, separately tracked)
lab-publishCI on 14 / 31 wired reposlab-latestfrom CIlab infocheckfalse positivesThe next big landings
Once #126 lands, the lifecycle pattern is canonical and
#113(per-root-object SDK benches) folds into it. Once #123 lands,@indexbecomes load-bearing and thefind_*row in the canonical CRUD-seven becomes the eighth method on every typed SDK. After that the standardization arc is complete.Linking back from hero_rpc:
openrpc_client!services to oschema-driven codegen. Six services in scope (hero_indexerfirst); this is the final closeout of this meta.Audit captured in #132: 5 services on pure
openrpc_client!, 1 hybrid (hero_books), 1 already canonical (hero_drive). The architectural footgun in hero_rpc#127 (OsisIndexersync-facade-over-async, panics inside#[tokio::test]) is the motivating example — would have been impossible end-to-end with oschema codegen.