[META] Standardize Hero service architecture — template, hero_rpc alignment, framework hoist, skills #262

Open
opened 2026-05-18 14:40:33 +00:00 by timur · 17 comments
Owner

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 development on every relevant repo before reading code — many are mid-refactor.

Why this work

From team meeting (2026-05-13):

We cannot keep solving everything by engineering more. First we need a clean template, clean skills, and disciplined use of agents. Once that works, the agents can multiply the team's productivity — but only if the standards are clear and everyone follows them.

  • One human + AI agents can move 50× faster — but only when the standards are codified. Otherwise agents amplify drift.
  • Services today hand-roll socket setup, hand-write SDKs, hand-template admin UIs. Every new service starts from a different baseline.
  • Hero needs a single "clone-me" starting point, generated by tooling that bakes in the conventions.
  • Skills are the durable AI context that makes agents respect those conventions automatically.

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 in hero_website_framework/crates/hero_admin_lib/static/js/api-docs.js. The meeting's #1 hoist target is already there.
  • WorkspaceScaffolder in hero_rpc/crates/generator/src/build/scaffold.rs (1208 lines). Today's output naming is wrong (_ui, _client) and incomplete (no _admin crate, no service.toml, ships a Makefile that shouldn't exist). #54 is now "fix and extend" this, not "build from scratch."
  • Legacy unix_server surface partly cleanedhero_rpc/crates/osis/src/rpc/server.rs was reduced by 755 lines. Some legacy file (unix_server.rs) still exists; verify its role before final cleanup.
  • hero_admin_lib already provides standard admin routes (/health, /.well-known/heroservice.json), socket helpers, middleware, embedded assets — at hero_website_framework/crates/hero_admin_lib/src/{routes,socket,middleware,assets}.rs. Build new admin features on this, not from scratch.
  • Skills reorganized into hero_skills/skills/hero/{service,proc,ui,config,networkprotocol}/. Service skills at skills/hero/service/ (file paths unchanged).

The plan

Four workstreams, 9 issues (one closed):

  1. hero_rpc — extend the existing WorkspaceScaffolder to align with current standards. Update codegen to read service.toml (single source of truth), vendor hero_rpc2 for transport + Rust-client codegen, add Python SDK target, rename crates/service/ to crates/hero_lifecycle/ to free the hero_service name, modularize the 2653-line generator, upgrade example/recipe_server as the end-to-end demo.
  2. hero_website_framework — hoist remaining reusable admin components from existing service UIs into hero_admin_lib. (Alias-drop issue #5 was closed as wrong premise — see below.)
  3. hero_web_template — centralize shared stylesheets.
  4. hero_skills — add AI context skills for scaffold/check/refactor; refresh existing service skills; bootstrap canonical hero_service template repo.

Architectural decisions — locked

Settled in child-issue comment threads. Do not violate without flagging back here.

Source of truth

  • service.toml is 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.
  • Schema source is OSchema (.oschema files). OSchema is the input to codegen for types, OSIS storage, OpenRPC spec, and all SDK targets.

Runtime + RPC

  • Hybrid hero_rpc + hero_rpc2 (Path C from #55):
    • OSchema codegen produces Rust traits annotated with hero_rpc2's #[rpc(server, client)] macros.
    • hero_rpc2 owns wire protocol, UDS transports, and the auto-generated Rust client.
    • hero_rpc2 is vendored in place as hero_rpc/crates/hero_rpc2/ (copy-over, no fork relationship, no upstream PR).
    • OSchema codegen still produces: OSIS storage layer (OsisObject, DBTyped<T>, SmartID), OpenRPC spec, JS/TS + Rhai + Python SDK targets. Python is new.
  • One socket per service. Context via the X-Hero-Context HTTP header. No per-context socket dirs anywhere — legacy mentions must be removed.
  • Context routing in hero_rpc2: add a header-lift extension that materialises configured headers (X-Hero-Context, X-Hero-Claims) into a typed HeroRequestContext. Trait methods take ctx: Option<HeroRequestContext> as the first arg so they work over both line and HTTP transports.

Lifecycle + service identity

  • Canonical lifecycle path: herolib_core::base + service_base!() macro + lab tool. The lab crate (in hero_skills/crates/lab/) is the single tool for install/start/stop/status across all services.
  • Rename hero_rpc/crates/service/hero_rpc/crates/hero_lifecycle/ (package name hero_servicehero_lifecycle). Recent commits show this crate is actively developed, so rename rather than delete. Frees the hero_service name for the template repo. (Earlier "delete" decision flipped — see #55 latest comment.)
  • --info flag is NOT deprecated — it prints the embedded service.toml (TOML or JSON). Mandatory on every binary, served by herolib_core::base::handle_info_flag. lab infocheck validates it.
  • No Makefile, no scripts/*.sh, no service_<name>.nulab handles all lifecycle (ADR-0001). The current scaffolder generates a Makefile; that has to go.

Naming (no exceptions, per hero_service_check_fix.md)

  • Server: hero_<name>_server
  • Admin UI: hero_<name>_admin (never _ui; current scaffolder emits _ui and must be fixed)
  • SDK: hero_<name>_sdk (lib crate; current scaffolder emits _client and must be fixed)
  • CLI: hero_<name> — only if non-trivial; bare selfstart CLIs must be removed
  • End-user web (Askama): hero_<name>_web
  • End-user app (Dioxus): hero_<name>_app
  • Examples: hero_<name>_examples (currently not generated; must be added)

Templating

  • Askama by default (compile-time, type-checked).
  • Tera only when templates must be loaded/edited at runtime (user-editable blog posts, document templates).
  • hero_website_lib uses Tera (full website framework). hero_admin_lib is Axum + rust-embed, Askama-friendly. New admin components go into hero_admin_lib with Askama.

Framework structure (corrected)

  • Two crates, intentionally separate in 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 _admin crate (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 own demo_website example today.
    • (Earlier umbrella claimed there was one crate with an alias. Wrong. hero_website_framework#5 closed as wrong premise.)
  • Shared CSS / theme tokens live in hero_web_template, referenced by both framework crates.

Reference services

  • hero_proc — canonical wiring reference. hero_proc_server/src/main.rs uses service_base!(), validate_service_toml, handle_info_flag exactly as required. Its hero_proc_admin is the model admin binary.
  • hero_compute — workspace layout + hero_rpc OSchema dep set. (Its _server main.rs uses an older subcommand pattern — do NOT mimic that.)
  • hero_inspector is out-of-date and explicitly NOT a reference.

Open decisions — waiting on Timur

  • lab service new <subcommand> — exposing hero_rpc scaffold as a lab subcommand. Out of scope for this batch; should be its own follow-up issue.
  • Framework Tera → Askama migration — does hero_website_lib migrate its existing Tera templates to Askama, or stay hybrid? Separate follow-up issue if migration is desired.
  • SDK output crate layout — where does each language target land? hero_<name>_sdk is the Rust crate. JS/TS, Rhai, Python: separate crates? subdirs of sdk/? Single mono-SDK with feature flags? Needs a design comment on hero_rpc#55.
  • hero_rpc2 vendor logistics — who copies what, when. Confirm with @delandtj if any heads-up needed.

Child issues

hero_rpc (4)

  • #54Extend WorkspaceScaffolder to current standards (naming fixes, service.toml, admin crate, Python SDK, drop Makefile, examples crate).
  • #55Codegen alignment + hero_rpc2 vendor + Python SDK + rename crates/service/ to hero_lifecycle.
  • #56Modularize 2653-line generator/src/build/build.rs (refactor; public API stable).
  • #57Upgrade example/recipe_server to the new end-to-end pattern.

hero_website_framework (1 active + 1 closed)

  • #4Hoist remaining reusable admin components into hero_admin_lib (connection-status, live logs, jobs viewer, markdown viewer). OpenRPC explorer already landed.
  • #5CLOSED as wrong premise (two crates are intentionally separate, no alias).

hero_web_template (1)

  • #4Centralize shared stylesheets.

hero_skills (2)

  • #260Scaffold/check/refactor context skills + refresh existing service skills (no Tera/Askama inversion — Askama stays the default).
  • #261Bootstrap hero_service template repo (decision B locked).

Suggested execution order

Tier Issues Why parallel-safe
1 (start now) #56, #4 (hoist remaining components), web_template#4, #260 (cleanup pass only — Askama-default audit, drop hero_inspector references) No open decisions block; pure refactor / hoist / cleanup.
2 (after tier-1 lands) #55 (rename, then codegen alignment + hero_rpc2 vendor) Decisions locked; just need the action.
3 (consumes tier 2) #54 (extend scaffolder), #260 (write new skills) Needs codegen alignment + framework cleanup done.
4 (consumes tier 3) #57 (recipe_server upgrade), #261 (template repo bootstrap) Pure end-to-end consumers.

Reference materials

When working on a child issue, start here:

For agents picking up a child issue

  1. Run git fetch && git pull --rebase origin development on every repo you'll touch. Don't trust prior-session memory of file sizes / structure / crate inventories.
  2. Read this issue + the child issue and all its comments. Decisions iterate in comments — the issue body may be stale until the consolidation pass.
  3. Authority order: child-issue comments > this umbrella > skills in hero_skills/skills/hero/service/ > reference services (hero_proc, hero_compute) > anything else.
  4. If a locked decision no longer makes sense, comment here before deviating. Never silently choose differently.
  5. Update progress as comments on the child issue, not the body.

Status board

  • hero_rpc#54 — extend scaffolder
  • hero_rpc#55 — codegen alignment + hero_rpc2 vendor + rename crates/service/
  • hero_rpc#56 — modularize generator build.rs
  • hero_rpc#57 — upgrade recipe_server
  • hero_website_framework#4 — hoist remaining components
  • hero_website_framework#5 — drop alias (closed, wrong premise)
  • hero_web_template#4 — shared CSS
  • hero_skills#260 — scaffold/check/refactor skills
  • hero_skills#261 — bootstrap hero_service template repo (decision B locked)
## 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 `development` on every relevant repo before reading code — many are mid-refactor. ## Why this work From team meeting (2026-05-13): > *We cannot keep solving everything by engineering more. First we need a clean template, clean skills, and disciplined use of agents. Once that works, the agents can multiply the team's productivity — but only if the standards are clear and everyone follows them.* - One human + AI agents can move 50× faster — but only when the standards are codified. Otherwise agents amplify drift. - Services today hand-roll socket setup, hand-write SDKs, hand-template admin UIs. Every new service starts from a different baseline. - Hero needs a single "clone-me" starting point, generated by tooling that bakes in the conventions. - Skills are the durable AI context that makes agents respect those conventions automatically. ## 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](https://forge.ourworld.tf/lhumina_code/hero_website_framework/commit/630f702)) — lives in `hero_website_framework/crates/hero_admin_lib/static/js/api-docs.js`. The meeting's #1 hoist target is already there. - **`WorkspaceScaffolder`** in `hero_rpc/crates/generator/src/build/scaffold.rs` (1208 lines). Today's output naming is wrong (`_ui`, `_client`) and incomplete (no `_admin` crate, no `service.toml`, ships a `Makefile` that shouldn't exist). [#54](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/54) is now "fix and extend" this, not "build from scratch." - **Legacy `unix_server` surface partly cleaned** — `hero_rpc/crates/osis/src/rpc/server.rs` was reduced by 755 lines. Some legacy file (`unix_server.rs`) still exists; verify its role before final cleanup. - **`hero_admin_lib` already provides standard admin routes** (`/health`, `/.well-known/heroservice.json`), socket helpers, middleware, embedded assets — at `hero_website_framework/crates/hero_admin_lib/src/{routes,socket,middleware,assets}.rs`. Build new admin features on this, not from scratch. - **Skills reorganized** into `hero_skills/skills/hero/{service,proc,ui,config,networkprotocol}/`. Service skills at `skills/hero/service/` (file paths unchanged). ## The plan Four workstreams, 9 issues (one closed): 1. **hero_rpc** — extend the existing `WorkspaceScaffolder` to align with current standards. Update codegen to read `service.toml` (single source of truth), vendor `hero_rpc2` for transport + Rust-client codegen, add Python SDK target, rename `crates/service/` to `crates/hero_lifecycle/` to free the `hero_service` name, modularize the 2653-line generator, upgrade `example/recipe_server` as the end-to-end demo. 2. **hero_website_framework** — hoist remaining reusable admin components from existing service UIs into `hero_admin_lib`. (Alias-drop issue #5 was closed as wrong premise — see below.) 3. **hero_web_template** — centralize shared stylesheets. 4. **hero_skills** — add AI context skills for scaffold/check/refactor; refresh existing service skills; bootstrap canonical `hero_service` template repo. ## Architectural decisions — locked Settled in child-issue comment threads. **Do not violate without flagging back here.** ### Source of truth - **`service.toml`** is 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. - Schema source is **OSchema** (`.oschema` files). OSchema is the input to codegen for types, OSIS storage, OpenRPC spec, and all SDK targets. ### Runtime + RPC - **Hybrid hero_rpc + hero_rpc2** ([Path C from #55](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/55#issuecomment-33680)): - OSchema codegen produces Rust traits annotated with hero_rpc2's `#[rpc(server, client)]` macros. - **hero_rpc2** owns wire protocol, UDS transports, and the auto-generated Rust client. - hero_rpc2 is **vendored in place** as `hero_rpc/crates/hero_rpc2/` (copy-over, no fork relationship, no upstream PR). - OSchema codegen still produces: OSIS storage layer (`OsisObject`, `DBTyped<T>`, SmartID), OpenRPC spec, **JS/TS + Rhai + Python** SDK targets. Python is new. - **One socket per service.** Context via the `X-Hero-Context` HTTP header. **No per-context socket dirs anywhere** — legacy mentions must be removed. - **Context routing in hero_rpc2:** add a header-lift extension that materialises configured headers (`X-Hero-Context`, `X-Hero-Claims`) into a typed `HeroRequestContext`. Trait methods take `ctx: Option<HeroRequestContext>` as the first arg so they work over both line and HTTP transports. ### Lifecycle + service identity - Canonical lifecycle path: **`herolib_core::base` + `service_base!()` macro + `lab` tool**. The `lab` crate (in `hero_skills/crates/lab/`) is the single tool for install/start/stop/status across all services. - **Rename `hero_rpc/crates/service/` → `hero_rpc/crates/hero_lifecycle/`** (package name `hero_service` → `hero_lifecycle`). Recent commits show this crate is actively developed, so rename rather than delete. Frees the `hero_service` name for the template repo. (Earlier "delete" decision flipped — see [#55](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/55#issuecomment-33720) latest comment.) - **`--info` flag is NOT deprecated** — it prints the embedded `service.toml` (TOML or JSON). Mandatory on every binary, served by `herolib_core::base::handle_info_flag`. `lab infocheck` validates it. - No `Makefile`, no `scripts/*.sh`, no `service_<name>.nu` — `lab` handles all lifecycle (ADR-0001). The current scaffolder generates a `Makefile`; that has to go. ### Naming (no exceptions, per [`hero_service_check_fix.md`](https://forge.ourworld.tf/lhumina_code/hero_skills/src/branch/development/skills/hero/service/hero_service_check_fix.md)) - Server: `hero_<name>_server` - Admin UI: `hero_<name>_admin` (never `_ui`; current scaffolder emits `_ui` and must be fixed) - SDK: `hero_<name>_sdk` (lib crate; current scaffolder emits `_client` and must be fixed) - CLI: `hero_<name>` — only if non-trivial; bare `selfstart` CLIs must be removed - End-user web (Askama): `hero_<name>_web` - End-user app (Dioxus): `hero_<name>_app` - Examples: `hero_<name>_examples` (currently not generated; must be added) ### Templating - **Askama by default** (compile-time, type-checked). - **Tera** only when templates must be loaded/edited at runtime (user-editable blog posts, document templates). - `hero_website_lib` uses Tera (full website framework). `hero_admin_lib` is Axum + rust-embed, Askama-friendly. New admin components go into `hero_admin_lib` with Askama. ### Framework structure (corrected) - **Two crates, intentionally separate** in `hero_website_framework`: - **[`hero_admin_lib`](https://forge.ourworld.tf/lhumina_code/hero_website_framework/src/branch/development/crates/hero_admin_lib)** — admin-dashboard shared assets, middleware, routes, socket helpers. Axum + rust-embed, no Tera, no SQLite. **Consumed by every service's `_admin` crate** (`hero_proc_admin`, `hero_osis_admin`, …). - **[`hero_website_lib`](https://forge.ourworld.tf/lhumina_code/hero_website_framework/src/branch/development/crates/hero_website_lib)** — full public-facing website framework with Tera, SQLite, auth, blog, docs. Only used by the framework's own `demo_website` example today. - (Earlier umbrella claimed there was one crate with an alias. Wrong. [hero_website_framework#5](https://forge.ourworld.tf/lhumina_code/hero_website_framework/issues/5) closed as wrong premise.) - Shared CSS / theme tokens live in **`hero_web_template`**, referenced by both framework crates. ### Reference services - **[`hero_proc`](https://forge.ourworld.tf/lhumina_code/hero_proc)** — canonical wiring reference. `hero_proc_server/src/main.rs` uses `service_base!()`, `validate_service_toml`, `handle_info_flag` exactly as required. Its `hero_proc_admin` is the model admin binary. - **[`hero_compute`](https://forge.ourworld.tf/lhumina_code/hero_compute)** — workspace layout + hero_rpc OSchema dep set. (Its `_server` main.rs uses an older subcommand pattern — do NOT mimic that.) - **`hero_inspector`** is out-of-date and explicitly NOT a reference. ## Open decisions — waiting on Timur - **`lab service new <subcommand>`** — exposing `hero_rpc scaffold` as a `lab` subcommand. Out of scope for this batch; should be its own follow-up issue. - **Framework Tera → Askama migration** — does `hero_website_lib` migrate its existing Tera templates to Askama, or stay hybrid? Separate follow-up issue if migration is desired. - **SDK output crate layout** — where does each language target land? `hero_<name>_sdk` is the Rust crate. JS/TS, Rhai, Python: separate crates? subdirs of `sdk/`? Single mono-SDK with feature flags? Needs a design comment on [hero_rpc#55](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/55). - **hero_rpc2 vendor logistics** — who copies what, when. Confirm with @delandtj if any heads-up needed. ## Child issues ### hero_rpc (4) - [#54](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/54) — **Extend `WorkspaceScaffolder`** to current standards (naming fixes, service.toml, admin crate, Python SDK, drop Makefile, examples crate). - [#55](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/55) — **Codegen alignment** + hero_rpc2 vendor + Python SDK + **rename** `crates/service/` to `hero_lifecycle`. - [#56](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/56) — **Modularize 2653-line `generator/src/build/build.rs`** (refactor; public API stable). - [#57](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/57) — **Upgrade `example/recipe_server`** to the new end-to-end pattern. ### hero_website_framework (1 active + 1 closed) - [#4](https://forge.ourworld.tf/lhumina_code/hero_website_framework/issues/4) — **Hoist remaining reusable admin components** into `hero_admin_lib` (connection-status, live logs, jobs viewer, markdown viewer). OpenRPC explorer already landed. - ~~[#5](https://forge.ourworld.tf/lhumina_code/hero_website_framework/issues/5)~~ — **CLOSED** as wrong premise (two crates are intentionally separate, no alias). ### hero_web_template (1) - [#4](https://forge.ourworld.tf/lhumina_code/hero_web_template/issues/4) — **Centralize shared stylesheets**. ### hero_skills (2) - [#260](https://forge.ourworld.tf/lhumina_code/hero_skills/issues/260) — **Scaffold/check/refactor context skills** + refresh existing service skills (no Tera/Askama inversion — Askama stays the default). - [#261](https://forge.ourworld.tf/lhumina_code/hero_skills/issues/261) — **Bootstrap `hero_service` template repo** (decision B locked). ### Suggested execution order | Tier | Issues | Why parallel-safe | |---|---|---| | **1 (start now)** | #56, #4 (hoist remaining components), web_template#4, #260 (cleanup pass only — Askama-default audit, drop hero_inspector references) | No open decisions block; pure refactor / hoist / cleanup. | | **2 (after tier-1 lands)** | #55 (rename, then codegen alignment + hero_rpc2 vendor) | Decisions locked; just need the action. | | **3 (consumes tier 2)** | #54 (extend scaffolder), #260 (write new skills) | Needs codegen alignment + framework cleanup done. | | **4 (consumes tier 3)** | #57 (recipe_server upgrade), #261 (template repo bootstrap) | Pure end-to-end consumers. | ## Reference materials When working on a child issue, start here: - **Skills bundle** — [`hero_skills/skills/hero/service/`](https://forge.ourworld.tf/lhumina_code/hero_skills/src/branch/development/skills/hero/service): - [`hero_service.md`](https://forge.ourworld.tf/lhumina_code/hero_skills/src/branch/development/skills/hero/service/hero_service.md) — startup banner, `--info`, `--help`. - [`hero_service_toml_info.md`](https://forge.ourworld.tf/lhumina_code/hero_skills/src/branch/development/skills/hero/service/hero_service_toml_info.md) — service.toml schema, `service_base!()` macro. - [`hero_service_check_fix.md`](https://forge.ourworld.tf/lhumina_code/hero_skills/src/branch/development/skills/hero/service/hero_service_check_fix.md) — `lab infocheck` contract, naming, socket rules. - `herolib_base` skill — `print_startup_banner`, `prepare_sockets` API. - `hero_sockets` skill — `HERO_SOCKET_DIR` layout and router homepage card naming rule. - **Reference services**: [`hero_proc`](https://forge.ourworld.tf/lhumina_code/hero_proc) (wiring + `hero_proc_admin` admin model), [`hero_compute`](https://forge.ourworld.tf/lhumina_code/hero_compute) (workspace layout). - **Framework crates**: [`hero_admin_lib`](https://forge.ourworld.tf/lhumina_code/hero_website_framework/src/branch/development/crates/hero_admin_lib) (admin shared), [`hero_website_lib`](https://forge.ourworld.tf/lhumina_code/hero_website_framework/src/branch/development/crates/hero_website_lib) (full website). - **Existing scaffolder** to extend: [`hero_rpc/crates/generator/src/build/scaffold.rs`](https://forge.ourworld.tf/lhumina_code/hero_rpc/src/branch/development/crates/generator/src/build/scaffold.rs). - **Lab tool**: `hero_skills/crates/lab/`. - **hero_rpc2**: [`delandtj/hero_rpc2`](https://forge.ourworld.tf/delandtj/hero_rpc2) — to be vendored. ## For agents picking up a child issue 1. Run `git fetch && git pull --rebase origin development` on every repo you'll touch. Don't trust prior-session memory of file sizes / structure / crate inventories. 2. Read this issue + the child issue **and all its comments**. Decisions iterate in comments — the issue body may be stale until the consolidation pass. 3. Authority order: **child-issue comments > this umbrella > skills in `hero_skills/skills/hero/service/` > reference services (`hero_proc`, `hero_compute`) > anything else**. 4. If a locked decision no longer makes sense, **comment here** before deviating. Never silently choose differently. 5. Update progress as comments on the child issue, not the body. ## Status board - [ ] hero_rpc#54 — extend scaffolder - [ ] hero_rpc#55 — codegen alignment + hero_rpc2 vendor + rename `crates/service/` - [ ] hero_rpc#56 — modularize generator build.rs - [ ] hero_rpc#57 — upgrade recipe_server - [ ] hero_website_framework#4 — hoist remaining components - [x] ~~hero_website_framework#5 — drop alias~~ (closed, wrong premise) - [ ] hero_web_template#4 — shared CSS - [ ] hero_skills#260 — scaffold/check/refactor skills - [ ] hero_skills#261 — bootstrap hero_service template repo (decision B locked)
Author
Owner

Tier-1 progress (2026-05-19)

Done & pushed

Issue Commit Notes
hero_rpc#56 — modularize generator/src/build/build.rs 8a8d66d 2653 LOC split into 12 sub-500 files. recipe_server builds unchanged. Tests + clippy green.
hero_website_framework#4 — hoist admin components f6af8ab, 9d80616, 8df3330 3 components added (<hero-logs-viewer>, <hero-jobs-viewer>, <hero-markdown-viewer>). Total 5 components in hero_admin_lib. Skill docs in progress (separate agent, hero_skills commit pending).

Done locally, not yet pushed

Issue Commit Status
hero_skills#260 — cleanup pass on existing service skills 2a05555 (local) Awaiting push authorization. New scaffold/check/refactor skills held back pending hero_rpc#54/#55.

Not started

Issue Status
hero_web_template#4 — centralize shared stylesheets No agent assigned yet. Last tier-1 work outstanding.

Deviations & follow-ups flagged by agents

  1. hero_rpc#56 scope clarification (comment 33741). The original META said "extract per-target emitters (rust_types, rust_rpc, openrpc, js, rhai, python) into build/emit/." In reality those emitters live in crate::generate::Generator, not build.rs. Agent split what build.rs actually owns (bins, server-crate mods, SDK scaffolding, docs index). Per-target emission refactor needs a separate, larger follow-up issue against Generator — out of scope for #56's "no behaviour change" rule. To file.
  2. hero_website_framework#4 cross-repo follow-up (comment 33847). hero_proc_admin still hand-rolls its API tab; should migrate to the now-canonical <hero-api-docs> component. Belongs in a hero_proc issue. To file.
  3. UI component skill location (in flight). hero_website_framework#4 acceptance asks for skills at hero_skills/skills/web/. The existing precedent (hero_ui_connection_status.md) lives at skills/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

  • hero_rpc#56 — modularize generator build.rs (pushed)
  • hero_website_framework#4 — hoist components (components pushed; skill docs in flight)
  • hero_skills#260 — cleanup pass on existing service skills (local, pending push)
  • hero_web_template#4 — shared CSS (not started)

Next steps

  • Authorize push of hero_skills 2a05555.
  • File the two follow-up issues (Generator refactor in hero_rpc; API-tab migration in hero_proc). I'll do this once you confirm.
  • Assign hero_web_template#4 to an agent.
  • Unblock tier 2 by kicking off hero_rpc#55 — all decisions locked (rename crates/service/hero_lifecycle/, vendor hero_rpc2, Python SDK, OschemaBuildConfig reads service.toml).
## Tier-1 progress (2026-05-19) ### Done & pushed | Issue | Commit | Notes | |---|---|---| | [hero_rpc#56](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/56) — modularize `generator/src/build/build.rs` | [`8a8d66d`](https://forge.ourworld.tf/lhumina_code/hero_rpc/commit/8a8d66d) | 2653 LOC split into 12 sub-500 files. recipe_server builds unchanged. Tests + clippy green. | | [hero_website_framework#4](https://forge.ourworld.tf/lhumina_code/hero_website_framework/issues/4) — hoist admin components | [`f6af8ab`](https://forge.ourworld.tf/lhumina_code/hero_website_framework/commit/f6af8ab), [`9d80616`](https://forge.ourworld.tf/lhumina_code/hero_website_framework/commit/9d80616), [`8df3330`](https://forge.ourworld.tf/lhumina_code/hero_website_framework/commit/8df3330) | 3 components added (`<hero-logs-viewer>`, `<hero-jobs-viewer>`, `<hero-markdown-viewer>`). Total 5 components in `hero_admin_lib`. Skill docs in progress (separate agent, hero_skills commit pending). | ### Done locally, not yet pushed | Issue | Commit | Status | |---|---|---| | [hero_skills#260](https://forge.ourworld.tf/lhumina_code/hero_skills/issues/260) — cleanup pass on existing service skills | `2a05555` (local) | Awaiting push authorization. New scaffold/check/refactor skills held back pending hero_rpc#54/#55. | ### Not started | Issue | Status | |---|---| | [hero_web_template#4](https://forge.ourworld.tf/lhumina_code/hero_web_template/issues/4) — centralize shared stylesheets | No agent assigned yet. Last tier-1 work outstanding. | ### Deviations & follow-ups flagged by agents 1. **hero_rpc#56 scope clarification** ([comment 33741](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/56#issuecomment-33741)). The original META said "extract per-target emitters (`rust_types`, `rust_rpc`, `openrpc`, `js`, `rhai`, `python`) into `build/emit/`." In reality those emitters live in `crate::generate::Generator`, not `build.rs`. Agent split what `build.rs` actually owns (bins, server-crate mods, SDK scaffolding, docs index). Per-target emission refactor needs a **separate, larger follow-up issue against `Generator`** — out of scope for #56's "no behaviour change" rule. To file. 2. **hero_website_framework#4 cross-repo follow-up** ([comment 33847](https://forge.ourworld.tf/lhumina_code/hero_website_framework/issues/4#issuecomment-33847)). `hero_proc_admin` still hand-rolls its API tab; should migrate to the now-canonical `<hero-api-docs>` component. **Belongs in a `hero_proc` issue.** To file. 3. **UI component skill location** (in flight). `hero_website_framework#4` acceptance asks for skills at `hero_skills/skills/web/`. The existing precedent (`hero_ui_connection_status.md`) lives at `skills/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 - [x] hero_rpc#56 — modularize generator build.rs (pushed) - [x] hero_website_framework#4 — hoist components (components pushed; skill docs in flight) - [ ] hero_skills#260 — cleanup pass on existing service skills (local, pending push) - [ ] hero_web_template#4 — shared CSS (not started) ### Next steps - **Authorize push** of `hero_skills` `2a05555`. - **File the two follow-up issues** (Generator refactor in hero_rpc; API-tab migration in hero_proc). I'll do this once you confirm. - **Assign hero_web_template#4** to an agent. - **Unblock tier 2** by kicking off [hero_rpc#55](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/55) — all decisions locked (rename `crates/service/` → `hero_lifecycle/`, vendor hero_rpc2, Python SDK, OschemaBuildConfig reads service.toml).
Author
Owner

Follow-up issues filed

  • hero_rpc#59 — Refactor crate::generate::Generator per-target emission into modules (continuation of #56; behaviour-preserving).
  • hero_proc#108 — Migrate 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

  • hero_rpc#56 — modularize generator build.rs (pushed)
  • hero_website_framework#4 — hoist components (component code pushed; 4 UI skill docs in progress in hero_skills)
  • hero_skills#260 — cleanup pass (local; awaiting push) + new scaffold/check/refactor skills (blocked on tier-2)
  • hero_web_template#4 — shared CSS (in flight; agent assigned)
  • hero_rpc#55 — codegen alignment + hero_rpc2 vendor + rename crates/service/ (tier-2 in flight)
  • hero_rpc#59 — Generator per-target refactor (new, ready to assign)
  • hero_proc#108 — <hero-api-docs> migration (new, ready to assign)
  • hero_rpc#54 — extend WorkspaceScaffolder (tier-3; blocked on #55)
  • hero_rpc#57 — upgrade recipe_server (tier-4; blocked on #54+#55+#56)
  • hero_skills#261 — bootstrap hero_service template repo (tier-4; blocked on #54)
## Follow-up issues filed - [hero_rpc#59](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/59) — Refactor `crate::generate::Generator` per-target emission into modules (continuation of #56; behaviour-preserving). - [hero_proc#108](https://forge.ourworld.tf/lhumina_code/hero_proc/issues/108) — Migrate `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 - [x] hero_rpc#56 — modularize generator build.rs (pushed) - [x] hero_website_framework#4 — hoist components (component code pushed; 4 UI skill docs in progress in hero_skills) - [ ] hero_skills#260 — cleanup pass (local; awaiting push) + new scaffold/check/refactor skills (blocked on tier-2) - [ ] hero_web_template#4 — shared CSS (in flight; agent assigned) - [ ] hero_rpc#55 — codegen alignment + hero_rpc2 vendor + rename `crates/service/` (tier-2 in flight) - [ ] hero_rpc#59 — Generator per-target refactor (new, ready to assign) - [ ] hero_proc#108 — `<hero-api-docs>` migration (new, ready to assign) - [ ] hero_rpc#54 — extend WorkspaceScaffolder (tier-3; blocked on #55) - [ ] hero_rpc#57 — upgrade recipe_server (tier-4; blocked on #54+#55+#56) - [ ] hero_skills#261 — bootstrap `hero_service` template repo (tier-4; blocked on #54)
Author
Owner

#55 landed on issue-55-codegen-alignment (review-ready)

All 6 sections covered, 141 tests green, workspace clean.

§ Status Highlight
§1 from_service_toml recipe_server/build.rs 41 → 5 lines
§2 hero_rpc2 hybrid SDK rails (vendor + HeroRequestContext); 2 method-translators scoped out → [new issue filed below]
§3 _admin scaffold uses hero_admin_lib Drops HeroUiServer
§4 rename hero_servicehero_lifecycle + coordinated branches on 7 downstream repos
§5 generated main.rs boilerplate Matches hero_proc_server pattern
§6 naming suffixes _admin / _sdk everywhere

Cross-repo branches awaiting hero_rpc PR merge

Branches issue-55-hero-lifecycle-rename pushed 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 from branch = "issue-55-codegen-alignment" back to branch = "development".

development_wip side-branches archived dirty state on hero_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

  • hero_rpc#55 — codegen alignment + hero_rpc2 vendor + rename (review-ready on branch)
  • hero_rpc#54 — extend scaffolder (now unblocked — gating tier-3/4)
  • hero_rpc#59 — Generator per-target refactor (now unblocked; defer until #60 lands to avoid conflict)
  • hero_rpc#60 — §2 method translators (new, ready to assign)
  • hero_skills#260 — new scaffold/check/refactor skills (now unblocked — scaffolder shape is known)
  • hero_rpc#57 — upgrade recipe_server (blocked on #54)
  • hero_skills#261 — bootstrap hero_service template repo (blocked on #54)

Open Timur actions

  • Review + merge the hero_rpc#55 PR (and the matching downstream branches).
  • Push the still-local hero_skills cleanup commit 2a05555 (from #260 tier-1).
## #55 landed on `issue-55-codegen-alignment` (review-ready) All 6 sections covered, 141 tests green, workspace clean. | § | Status | Highlight | |---|---|---| | §1 `from_service_toml` | ✅ | `recipe_server/build.rs` 41 → 5 lines | | §2 hero_rpc2 hybrid SDK | ✅ rails (vendor + HeroRequestContext); 2 method-translators scoped out → [new issue filed below] | | §3 `_admin` scaffold uses `hero_admin_lib` | ✅ | Drops `HeroUiServer` | | §4 rename `hero_service` → `hero_lifecycle` | ✅ | + coordinated branches on 7 downstream repos | | §5 generated `main.rs` boilerplate | ✅ | Matches `hero_proc_server` pattern | | §6 naming suffixes | ✅ | `_admin` / `_sdk` everywhere | ### Cross-repo branches awaiting hero_rpc PR merge Branches `issue-55-hero-lifecycle-rename` pushed 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 from `branch = "issue-55-codegen-alignment"` back to `branch = "development"`. `development_wip` side-branches archived dirty state on `hero_os`, `hero_voice`, `hero_foundry`. ### Follow-up filed [hero_rpc#60](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/60) — OSchema → Rust trait methods + Python dataclass methods translators (clean rails-on, no architectural decisions left). ### Updated status board - [x] hero_rpc#55 — codegen alignment + hero_rpc2 vendor + rename (review-ready on branch) - [ ] **hero_rpc#54 — extend scaffolder** (now unblocked — gating tier-3/4) - [ ] hero_rpc#59 — Generator per-target refactor (now unblocked; defer until #60 lands to avoid conflict) - [ ] hero_rpc#60 — §2 method translators (new, ready to assign) - [ ] hero_skills#260 — new scaffold/check/refactor skills (now unblocked — scaffolder shape is known) - [ ] hero_rpc#57 — upgrade recipe_server (blocked on #54) - [ ] hero_skills#261 — bootstrap hero_service template repo (blocked on #54) ### Open Timur actions - Review + merge the hero_rpc#55 PR (and the matching downstream branches). - Push the still-local `hero_skills` cleanup commit `2a05555` (from #260 tier-1).
Author
Owner

Timur actions — done

hero_skills cleanup pushed

Commit 2a05555 was sitting local since the #260 tier-1 pass. Cherry-picked onto current origin/development (which had since gained the 4 UI component skills from 707e7a7 — direct push would have nuked them) and pushed as 0634d4d. Diff: 2 files changed, 9 insertions, 4 deletions.

hero_rpc#55 PR merged

PR #61 — squash-merged as cbc2821b.

7 downstream hero_lifecycle rename PRs merged

Each got a one-line pin flip (branch = "issue-55-codegen-alignment"branch = "development") on top of the rename branch, then a squash merge to development:

Repo PR Pin-flip commit
hero_proxy #54 6e340c8
hero_osis #63 f66afd9
hero_index_ui_old #4 49549e9
hero_compute #112 bd9684b
hero_os #149 297e4020
hero_router #107 3a22aff
hero_voice #35 f0c53c5

All merges HTTP 200; all branches mergeable: True before merge. No conflicts encountered.

Status board

  • hero_rpc#55 — merged + 7 downstream rename PRs merged
  • hero_skills cleanup commit pushed
  • hero_rpc#54 — extend scaffolder (in flight per dispatched agent)
  • hero_rpc#59 — Generator per-target refactor (defer until #60)
  • hero_rpc#60 — §2 method translators (in flight)
  • hero_skills#260 — new scaffold/check/refactor skills (in flight)
  • hero_rpc#57 — upgrade recipe_server (blocked on #54)
  • hero_skills#261 — bootstrap hero_service template repo (blocked on #54)

Agents dispatched in parallel against development (now containing the merged #55 work) — they no longer need to coordinate against the feature branch.

## Timur actions — done ### hero_skills cleanup pushed Commit `2a05555` was sitting local since the #260 tier-1 pass. Cherry-picked onto current `origin/development` (which had since gained the 4 UI component skills from `707e7a7` — direct push would have nuked them) and pushed as [`0634d4d`](https://forge.ourworld.tf/lhumina_code/hero_skills/commit/0634d4d). Diff: 2 files changed, 9 insertions, 4 deletions. ### hero_rpc#55 PR merged [PR #61](https://forge.ourworld.tf/lhumina_code/hero_rpc/pulls/61) — squash-merged as [`cbc2821b`](https://forge.ourworld.tf/lhumina_code/hero_rpc/commit/cbc2821b). ### 7 downstream `hero_lifecycle` rename PRs merged Each got a one-line pin flip (`branch = "issue-55-codegen-alignment"` → `branch = "development"`) on top of the rename branch, then a squash merge to `development`: | Repo | PR | Pin-flip commit | |---|---|---| | `hero_proxy` | [#54](https://forge.ourworld.tf/lhumina_code/hero_proxy/pulls/54) | `6e340c8` | | `hero_osis` | [#63](https://forge.ourworld.tf/lhumina_code/hero_osis/pulls/63) | `f66afd9` | | `hero_index_ui_old` | [#4](https://forge.ourworld.tf/lhumina_code/hero_index_ui_old/pulls/4) | `49549e9` | | `hero_compute` | [#112](https://forge.ourworld.tf/lhumina_code/hero_compute/pulls/112) | `bd9684b` | | `hero_os` | [#149](https://forge.ourworld.tf/lhumina_code/hero_os/pulls/149) | `297e4020` | | `hero_router` | [#107](https://forge.ourworld.tf/lhumina_code/hero_router/pulls/107) | `3a22aff` | | `hero_voice` | [#35](https://forge.ourworld.tf/lhumina_code/hero_voice/pulls/35) | `f0c53c5` | All merges HTTP 200; all branches `mergeable: True` before merge. No conflicts encountered. ### Status board - [x] hero_rpc#55 — merged + 7 downstream rename PRs merged - [x] hero_skills cleanup commit pushed - [ ] hero_rpc#54 — extend scaffolder (in flight per dispatched agent) - [ ] hero_rpc#59 — Generator per-target refactor (defer until #60) - [ ] hero_rpc#60 — §2 method translators (in flight) - [ ] hero_skills#260 — new scaffold/check/refactor skills (in flight) - [ ] hero_rpc#57 — upgrade recipe_server (blocked on #54) - [ ] hero_skills#261 — bootstrap hero_service template repo (blocked on #54) Agents dispatched in parallel against `development` (now containing the merged #55 work) — they no longer need to coordinate against the feature branch.
Author
Owner

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:

  • _examples crate generation
  • Dropped Makefile + buildenv.sh (ADR-0001)
  • PURPOSE.md modelled on hero_proc/PURPOSE.md (Binary/Crate tables + Key Features + lab-only Service Management)
  • README.md with lab service ... lifecycle only — no make, no bash, no nu
  • .gitignore
  • .forgejo/workflows/build-linux.yaml per forge-release-workflow skill (self-contained Rust variant, ADR-0001-compatible — no build_lib.sh)

Plus one bonus: pre-#54 the core + _sdk crates had no src/lib.rs, so cargo metadata errored before lab infocheck could validate anything. Added 2-line stubs that the OSchema generator enriches on first build.

lab infocheck clean, zero manual edits

repo: $TMP
crates discovered: 2
  ok   $TMP/crates/hero_demo_admin
  ok   $TMP/crates/hero_demo_server
summary: 2 crate(s) clean, 0 crate(s) with issues, 0 finding(s) total

Test impact

cargo test -p hero_rpc_generator → 110 → 121 passed. 10 new tests against on-disk scaffold artefacts. cargo fmt --check clean.

Branch / merge order

issue-54-scaffold-extend, branched off issue-55-codegen-alignment per the META's authority order. Merge sequence is #55 → development first, then #54 → development (or rebase #54 once #55 lands).

Updated status board

  • hero_rpc#55 — codegen alignment + hero_rpc2 vendor + rename (review-ready on branch)
  • hero_rpc#54 — extend scaffolder (review-ready on branch)
  • hero_rpc#59 — Generator per-target refactor (unblocked; defer until #60 lands)
  • hero_rpc#60 — §2 method translators
  • hero_skills#260 — new scaffold/check/refactor skills (now fully unblocked — scaffolder shape is final)
  • hero_rpc#57 — upgrade recipe_server (unblocked by #54)
  • hero_skills#261 — bootstrap hero_service template repo (unblocked by #54)

Open Timur actions

  • Review + merge hero_rpc#55 (and the matching downstream branches).
  • Review + merge hero_rpc#54 after #55 lands.
  • Push the still-local hero_skills cleanup commit 2a05555 from #260 tier-1.
## Tier-3 #54 landed on `issue-54-scaffold-extend` (review-ready) Full writeup on [hero_rpc#54](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/54#issuecomment-34033). Single commit, ~760 LOC in `crates/generator/src/build/scaffold.rs`. ### What landed All six items in the META's #54 scope: - `_examples` crate generation - Dropped `Makefile` + `buildenv.sh` (ADR-0001) - `PURPOSE.md` modelled on `hero_proc/PURPOSE.md` (Binary/Crate tables + Key Features + lab-only Service Management) - `README.md` with `lab service ...` lifecycle only — no `make`, no bash, no nu - `.gitignore` - `.forgejo/workflows/build-linux.yaml` per `forge-release-workflow` skill (self-contained Rust variant, ADR-0001-compatible — no `build_lib.sh`) Plus one bonus: pre-#54 the core + `_sdk` crates had no `src/lib.rs`, so `cargo metadata` errored before `lab infocheck` could validate anything. Added 2-line stubs that the OSchema generator enriches on first build. ### `lab infocheck` clean, zero manual edits ``` repo: $TMP crates discovered: 2 ok $TMP/crates/hero_demo_admin ok $TMP/crates/hero_demo_server summary: 2 crate(s) clean, 0 crate(s) with issues, 0 finding(s) total ``` ### Test impact `cargo test -p hero_rpc_generator` → 110 → **121 passed**. 10 new tests against on-disk scaffold artefacts. `cargo fmt --check` clean. ### Branch / merge order [`issue-54-scaffold-extend`](https://forge.ourworld.tf/lhumina_code/hero_rpc/src/branch/issue-54-scaffold-extend), branched off `issue-55-codegen-alignment` per the META's authority order. Merge sequence is **#55 → development first, then #54 → development** (or rebase #54 once #55 lands). ### Updated status board - [x] hero_rpc#55 — codegen alignment + hero_rpc2 vendor + rename (review-ready on branch) - [x] **hero_rpc#54 — extend scaffolder (review-ready on branch)** - [ ] hero_rpc#59 — Generator per-target refactor (unblocked; defer until #60 lands) - [ ] hero_rpc#60 — §2 method translators - [ ] hero_skills#260 — new scaffold/check/refactor skills (now fully unblocked — scaffolder shape is final) - [ ] hero_rpc#57 — upgrade recipe_server (unblocked by #54) - [ ] hero_skills#261 — bootstrap hero_service template repo (unblocked by #54) ### Open Timur actions - Review + merge hero_rpc#55 (and the matching downstream branches). - Review + merge hero_rpc#54 after #55 lands. - Push the still-local `hero_skills` cleanup commit `2a05555` from #260 tier-1.
Author
Owner

3-agent round merged + cleanup

Just landed on development

Issue PR Squash commit Highlight
#54 — extend scaffolder #62 0a5236d _examples crate, drops Makefile, generates PURPOSE.md/README/CI workflow. lab infocheck clean on fresh scaffold; 121 tests pass.
#60 — method translators #63 13dde8f OSchema → #[method] async trait with HeroRequestContext. OSchema → Python @dataclass + async SDK via UDS transport. Python system.ping round-trips e2e.
#260 — new service skills #264 3b04435 hero_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 from issue-55-codegen-alignment before 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

  • hero_rpc#54 — extend scaffolder
  • hero_rpc#55 — codegen alignment + hero_rpc2 vendor + rename
  • hero_rpc#56 — modularize generator build.rs
  • hero_rpc#60 — method translators
  • hero_proc#108 — API-tab migration
  • hero_website_framework#4 — hoist components
  • hero_skills#260 — scaffold/check/refactor skills + cleanup
  • hero_rpc#57 — upgrade example/recipe_server (now unblocked)
  • hero_rpc#59 — Generator per-target refactor (now unblocked)
  • hero_skills#261 — bootstrap hero_service template repo (now unblocked)
  • hero_web_template#4 — shared CSS (still no progress on this one)

Three of the four remaining are now ready to assign — only hero_web_template#4 needs a (re-)assignment.

## 3-agent round merged + cleanup ### Just landed on `development` | Issue | PR | Squash commit | Highlight | |---|---|---|---| | #54 — extend scaffolder | [#62](https://forge.ourworld.tf/lhumina_code/hero_rpc/pulls/62) | `0a5236d` | `_examples` crate, drops Makefile, generates PURPOSE.md/README/CI workflow. `lab infocheck` clean on fresh scaffold; 121 tests pass. | | #60 — method translators | [#63](https://forge.ourworld.tf/lhumina_code/hero_rpc/pulls/63) | `13dde8f` | OSchema → `#[method]` async trait with `HeroRequestContext`. OSchema → Python `@dataclass` + async SDK via UDS transport. Python `system.ping` round-trips e2e. | | #260 — new service skills | [#264](https://forge.ourworld.tf/lhumina_code/hero_skills/pulls/264) | `3b04435` | `hero_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 from `issue-55-codegen-alignment` before 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 - [x] hero_rpc#54 — extend scaffolder - [x] hero_rpc#55 — codegen alignment + hero_rpc2 vendor + rename - [x] hero_rpc#56 — modularize generator build.rs - [x] hero_rpc#60 — method translators - [x] hero_proc#108 — API-tab migration - [x] hero_website_framework#4 — hoist components - [x] hero_skills#260 — scaffold/check/refactor skills + cleanup - [ ] **hero_rpc#57 — upgrade `example/recipe_server` (now unblocked)** - [ ] **hero_rpc#59 — Generator per-target refactor (now unblocked)** - [ ] **hero_skills#261 — bootstrap `hero_service` template repo (now unblocked)** - [ ] hero_web_template#4 — shared CSS (still no progress on this one) Three of the four remaining are now ready to assign — only `hero_web_template#4` needs a (re-)assignment.
Author
Owner

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.

  • Branch: issue-59-generate-modular (off development)
  • Commit: 9b1d6b4
  • Comment: #59 c34230

Acceptance hit: byte-for-byte identical regeneration of recipe_server + petstore_server, all 125 generator tests pass, public Generator API 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)
  • Aux: examples, e2e, tests_emit, wasm_build_script

python.rs is the empty per-target slot for when the hero_rpc2-driven Python codegen migrates out of build::emit::python_sdk into the Generator orchestration path.

## 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. - Branch: `issue-59-generate-modular` (off `development`) - Commit: [`9b1d6b4`](https://forge.ourworld.tf/lhumina_code/hero_rpc/commit/9b1d6b4) - Comment: [#59 c34230](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/59#issuecomment-34230) Acceptance hit: byte-for-byte identical regeneration of `recipe_server` + `petstore_server`, all 125 generator tests pass, public `Generator` API 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) - Aux: `examples`, `e2e`, `tests_emit`, `wasm_build_script` `python.rs` is the empty per-target slot for when the hero_rpc2-driven Python codegen migrates out of `build::emit::python_sdk` into the `Generator` orchestration path.
Author
Owner

Workstream complete

Every original deliverable from the 2026-05-13 meeting is now on development. Six PRs landed this round, all squash-merged.

Final landing

PR Repo Highlight
#64 hero_rpc Generator split into 12 per-target modules (#59 — byte-identical output)
#66 hero_rpc example/recipe_server regenerated as 5-crate end-to-end demo (#57)
#266 hero_skills hero_service registered in lab's SERVICE_MAP
#5 hero_web_template New hero_theme crate — shared Hero CSS
#6 hero_website_framework Framework consumes hero_theme; inline admin CSS dropped
(in lhumina_code/hero_service) hero_service The template repo exists at 518448c

The deliverable you originally asked for

forge.ourworld.tf/lhumina_code/hero_service — the canonical template repo. Bootstrapped by running the now-complete hero_rpc scaffolder against a small services OSchema. cargo build --workspace clean. lab infocheck zero findings. lab service hero_service --install + --start work 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, then cargo build && lab service <name> --start.

Follow-up issues filed from the work

  • hero_rpc#67 — OSchema marker parser substring matching
  • hero_rpc#68 — Domain name collision with hand-impl placeholder (e.g. services)
  • hero_rpc#69OServer::run_cli ignores service.toml socket paths
  • hero_proc#109 — Managed daemons don't inherit PATH_ROOT from supervisor

All discovered while building the template; none block the canonical path. Ready to dispatch to agents whenever convenient.

Final status board

  • hero_rpc#54 — extend scaffolder
  • hero_rpc#55 — codegen alignment + hero_rpc2 vendor + rename
  • hero_rpc#56 — modularize generator build.rs
  • hero_rpc#57 — upgrade recipe_server
  • hero_rpc#59 — Generator per-target refactor
  • hero_rpc#60 — method translators
  • hero_proc#108 — <hero-api-docs> migration
  • hero_website_framework#4 — hoist components
  • hero_web_template#4 — shared CSS
  • hero_skills#260 — scaffold/check/refactor skills + cleanup
  • hero_skills#261 — bootstrap hero_service template repo

Meta tracker closing.

Open follow-ups (not blocking anyone): hero_rpc#67, #68, #69; hero_proc#109.

## Workstream complete Every original deliverable from the 2026-05-13 meeting is now on `development`. Six PRs landed this round, all squash-merged. ### Final landing | PR | Repo | Highlight | |---|---|---| | [#64](https://forge.ourworld.tf/lhumina_code/hero_rpc/pulls/64) | hero_rpc | Generator split into 12 per-target modules (#59 — byte-identical output) | | [#66](https://forge.ourworld.tf/lhumina_code/hero_rpc/pulls/66) | hero_rpc | `example/recipe_server` regenerated as 5-crate end-to-end demo (#57) | | [#266](https://forge.ourworld.tf/lhumina_code/hero_skills/pulls/266) | hero_skills | `hero_service` registered in lab's SERVICE_MAP | | [#5](https://forge.ourworld.tf/lhumina_code/hero_web_template/pulls/5) | hero_web_template | New `hero_theme` crate — shared Hero CSS | | [#6](https://forge.ourworld.tf/lhumina_code/hero_website_framework/pulls/6) | hero_website_framework | Framework consumes `hero_theme`; inline admin CSS dropped | | (in `lhumina_code/hero_service`) | hero_service | **The template repo exists** at [`518448c`](https://forge.ourworld.tf/lhumina_code/hero_service/src/branch/development) | ### The deliverable you originally asked for **[`forge.ourworld.tf/lhumina_code/hero_service`](https://forge.ourworld.tf/lhumina_code/hero_service)** — the canonical template repo. Bootstrapped by running the now-complete `hero_rpc` scaffolder against a small `services` OSchema. `cargo build --workspace` clean. `lab infocheck` zero findings. `lab service hero_service --install` + `--start` work 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, then `cargo build && lab service <name> --start`. ### Follow-up issues filed from the work - [hero_rpc#67](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/67) — OSchema marker parser substring matching - [hero_rpc#68](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/68) — Domain name collision with hand-impl placeholder (e.g. `services`) - [hero_rpc#69](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/69) — `OServer::run_cli` ignores `service.toml` socket paths - [hero_proc#109](https://forge.ourworld.tf/lhumina_code/hero_proc/issues/109) — Managed daemons don't inherit `PATH_ROOT` from supervisor All discovered while building the template; none block the canonical path. Ready to dispatch to agents whenever convenient. ### Final status board - [x] hero_rpc#54 — extend scaffolder - [x] hero_rpc#55 — codegen alignment + hero_rpc2 vendor + rename - [x] hero_rpc#56 — modularize generator build.rs - [x] hero_rpc#57 — upgrade recipe_server - [x] hero_rpc#59 — Generator per-target refactor - [x] hero_rpc#60 — method translators - [x] hero_proc#108 — `<hero-api-docs>` migration - [x] hero_website_framework#4 — hoist components - [x] hero_web_template#4 — shared CSS - [x] hero_skills#260 — scaffold/check/refactor skills + cleanup - [x] hero_skills#261 — bootstrap `hero_service` template repo Meta tracker closing. **Open follow-ups (not blocking anyone):** hero_rpc#67, #68, #69; hero_proc#109.
timur closed this issue 2026-05-19 15:31:15 +00:00
timur reopened this issue 2026-05-20 00:15:53 +00:00
Author
Owner

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

  • hero_rpc#71 — drop docs/schemas/ generation (PRs #76 + hero_skills#267)
  • hero_rpc#74 — fold WASM types into unified types_generated.rs via cfg (PR #77, commit 155768b; 127 tests pass)
  • hero_rpc#75 — drop empty 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:

  • hero_rpc#67 — OSchema marker parser substring matching
  • hero_rpc#69OServer::run_cli ignores service.toml socket paths
  • hero_proc#109 — managed daemons don't inherit PATH_ROOT

Round 3 — structural cleanups (queued after round 2)

  • hero_rpc#73 — relocate openrpc.jsondecision locked: docs/openrpc.json (workspace root). Ready to dispatch.
  • hero_rpc#72 — stop regenerating herolib_core::base ServiceToml types per-service. Needs new OSchema syntax for external-type refs; agent should propose design in a comment first.
  • hero_rpc#70 — restructure SDK outputs to sdk/{rust,python,rhai,js}/. Biggest of the round; do last so it builds on the cleaner shape.

Parallel side-track

  • hero_logic#41 — audit hero_logic main against current hero_skills + assess OSchema migration. Agent dispatched against the main branch (Kristof's alignment commits already there). Read-only assessment for the migration question.

Decisions locked in this round

  • openrpc.json lives at docs/openrpc.json (workspace root). Distinct from the docs/schemas/ trees dropped in #71 — this is the API contract consumed by every SDK target.
  • Concurrent agents on the same repo must use git worktree. Standard line in every prompt now. Triggered by 5-agent collision on hero_rpc on 2026-05-20.

Status board

  • Original 11-issue workstream — fully closed
  • Round 1 feedback cleanups — 3/3 merged
  • Round 2 bug-fix sweep — 0/3 dispatched
  • Round 3 structural cleanups — 0/3 dispatched
  • hero_logic#41 audit — dispatched, in progress

Will reopen comments here as each lands so the parent stays the single place to see overall state.

## Reopened — feedback round in progress After the [hero_service template repo](https://forge.ourworld.tf/lhumina_code/hero_service) 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 - [x] [hero_rpc#71](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/71) — drop `docs/schemas/` generation (PRs #76 + hero_skills#267) - [x] [hero_rpc#74](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/74) — fold WASM types into unified `types_generated.rs` via cfg (PR #77, commit 155768b; 127 tests pass) - [x] [hero_rpc#75](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/75) — drop empty `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: - [ ] [hero_rpc#67](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/67) — OSchema marker parser substring matching - [ ] [hero_rpc#69](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/69) — `OServer::run_cli` ignores `service.toml` socket paths - [ ] [hero_proc#109](https://forge.ourworld.tf/lhumina_code/hero_proc/issues/109) — managed daemons don't inherit `PATH_ROOT` ### Round 3 — structural cleanups (queued after round 2) - [ ] [hero_rpc#73](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/73) — relocate `openrpc.json` — **decision locked: `docs/openrpc.json`** (workspace root). Ready to dispatch. - [ ] [hero_rpc#72](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/72) — stop regenerating `herolib_core::base` `ServiceToml` types per-service. Needs new OSchema syntax for external-type refs; agent should propose design in a comment first. - [ ] [hero_rpc#70](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/70) — restructure SDK outputs to `sdk/{rust,python,rhai,js}/`. Biggest of the round; do last so it builds on the cleaner shape. ### Parallel side-track - [ ] [hero_logic#41](https://forge.ourworld.tf/lhumina_code/hero_logic/issues/41) — audit `hero_logic` `main` against current hero_skills + assess OSchema migration. Agent dispatched against the `main` branch (Kristof's alignment commits already there). Read-only assessment for the migration question. ### Decisions locked in this round - **`openrpc.json` lives at `docs/openrpc.json`** (workspace root). Distinct from the `docs/schemas/` trees dropped in #71 — this is the API contract consumed by every SDK target. - **Concurrent agents on the same repo must use `git worktree`.** Standard line in every prompt now. Triggered by 5-agent collision on hero_rpc on 2026-05-20. ### Status board - [x] Original 11-issue workstream — fully closed - [x] Round 1 feedback cleanups — 3/3 merged - [ ] Round 2 bug-fix sweep — 0/3 dispatched - [ ] Round 3 structural cleanups — 0/3 dispatched - [ ] hero_logic#41 audit — dispatched, in progress Will reopen comments here as each lands so the parent stays the single place to see overall state.
Author
Owner

Round 2 + audit findings landed

Round 2 — small bugs merged

  • hero_rpc#67 — OSchema marker parser delimiter-aware (PR #78)
  • hero_rpc#69OServer::run_cli honors service.toml socket paths (PR #79)
  • hero_proc#109 — supervisor loads ~/hero/cfg/env/*.env at 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

  • hero_logic#43 — Post-audit cleanup bundle (stale src/, canonical CI, README, lints, version, inspector feature)
  • hero_logic#44 — Upgrade to hero_service template codegen pattern (HeroLifecycle + new OschemaBuildConfig). Gated on #43.
  • hero_skills#271 — Add hero_logic to lab SERVICE_MAP
  • hero_skills#272 — Document lab user init PATH_ROOT prerequisite in service skills
  • hero_rpc#80 — OServer should register system.ping builtin (decision needed: implement or update skill §7)

Round 3 — structural cleanups (still queued)

  • hero_rpc#73 — Relocate openrpc.json to docs/openrpc.json (decision locked, ready to dispatch)
  • hero_rpc#72 — Stop regenerating ServiceToml types (needs new OSchema syntax for external-type refs)
  • hero_rpc#70 — SDK restructure to sdk/{rust,python,rhai,js}/ (biggest; last)

Status board

  • Original 11-issue workstream — closed
  • Round 1 feedback cleanups — 3/3 merged (#71, #74, #75)
  • Round 2 small bugs — 3/3 merged (#67, #69, #109)
  • hero_logic audit (#41) — closed, 5 follow-ups filed
  • Round 3 structural cleanups (hero_rpc #70/#72/#73) — 0/3 dispatched
  • hero_logic follow-up sweep (#43, #44, hero_skills #271/#272, hero_rpc #80) — 0/5 dispatched
## Round 2 + audit findings landed ### Round 2 — small bugs merged - [x] [hero_rpc#67](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/67) — OSchema marker parser delimiter-aware (PR #78) - [x] [hero_rpc#69](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/69) — `OServer::run_cli` honors `service.toml` socket paths (PR #79) - [x] [hero_proc#109](https://forge.ourworld.tf/lhumina_code/hero_proc/issues/109) — supervisor loads `~/hero/cfg/env/*.env` at startup so daemons inherit PATH_ROOT (PR #110) ### hero_logic audit closed [hero_logic#41](https://forge.ourworld.tf/lhumina_code/hero_logic/issues/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 - [ ] [hero_logic#43](https://forge.ourworld.tf/lhumina_code/hero_logic/issues/43) — Post-audit cleanup bundle (stale `src/`, canonical CI, README, lints, version, inspector feature) - [ ] [hero_logic#44](https://forge.ourworld.tf/lhumina_code/hero_logic/issues/44) — Upgrade to hero_service template codegen pattern (HeroLifecycle + new OschemaBuildConfig). Gated on #43. - [ ] [hero_skills#271](https://forge.ourworld.tf/lhumina_code/hero_skills/issues/271) — Add `hero_logic` to lab SERVICE_MAP - [ ] [hero_skills#272](https://forge.ourworld.tf/lhumina_code/hero_skills/issues/272) — Document `lab user init` PATH_ROOT prerequisite in service skills - [ ] [hero_rpc#80](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/80) — OServer should register `system.ping` builtin (decision needed: implement or update skill §7) ### Round 3 — structural cleanups (still queued) - [ ] [hero_rpc#73](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/73) — Relocate `openrpc.json` to `docs/openrpc.json` (decision locked, ready to dispatch) - [ ] [hero_rpc#72](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/72) — Stop regenerating ServiceToml types (needs new OSchema syntax for external-type refs) - [ ] [hero_rpc#70](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/70) — SDK restructure to `sdk/{rust,python,rhai,js}/` (biggest; last) ### Status board - [x] Original 11-issue workstream — closed - [x] Round 1 feedback cleanups — 3/3 merged (#71, #74, #75) - [x] Round 2 small bugs — 3/3 merged (#67, #69, #109) - [x] hero_logic audit (#41) — closed, 5 follow-ups filed - [ ] Round 3 structural cleanups (hero_rpc #70/#72/#73) — 0/3 dispatched - [ ] hero_logic follow-up sweep (#43, #44, hero_skills #271/#272, hero_rpc #80) — 0/5 dispatched
Author
Owner

Round 3 in flight — 2 of 3 landed

Just merged

Still in flight

  • hero_logic#43 — bundled audit cleanup (agent reported done but branch not yet on origin; waiting)

New follow-up filed

  • hero_skills#274 — out-of-scope items from #73: update hero_service_scaffold.md skill for the new openrpc.json location + regenerate the hero_service template repo to match. Small.

Remaining queue

  • hero_rpc#72 — drop ServiceToml regeneration (needs design-first comment)
  • hero_rpc#70 — SDK restructure to sdk/{rust,python,rhai,js}/ (biggest)
  • hero_rpc#80 — OServer system.ping (decision needed: A implement, B update skill §7)
  • hero_skills#272 — document lab user init PATH_ROOT prerequisite
  • hero_skills#274 — openrpc.json skill + template regen (just filed)
  • hero_logic#44 — template-pattern codegen upgrade (gated on #43)
## Round 3 in flight — 2 of 3 landed ### Just merged - [x] [hero_rpc#73](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/73) — `docs/openrpc.json` at workspace root (PR #81) - [x] [hero_skills#271](https://forge.ourworld.tf/lhumina_code/hero_skills/issues/271) — lab SERVICE_MAP entry for hero_logic (PR #273) ### Still in flight - [ ] [hero_logic#43](https://forge.ourworld.tf/lhumina_code/hero_logic/issues/43) — bundled audit cleanup (agent reported done but branch not yet on origin; waiting) ### New follow-up filed - [ ] [hero_skills#274](https://forge.ourworld.tf/lhumina_code/hero_skills/issues/274) — out-of-scope items from #73: update `hero_service_scaffold.md` skill for the new openrpc.json location + regenerate the `hero_service` template repo to match. Small. ### Remaining queue - [ ] [hero_rpc#72](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/72) — drop ServiceToml regeneration (needs design-first comment) - [ ] [hero_rpc#70](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/70) — SDK restructure to `sdk/{rust,python,rhai,js}/` (biggest) - [ ] [hero_rpc#80](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/80) — OServer `system.ping` (decision needed: A implement, B update skill §7) - [ ] [hero_skills#272](https://forge.ourworld.tf/lhumina_code/hero_skills/issues/272) — document `lab user init` PATH_ROOT prerequisite - [ ] [hero_skills#274](https://forge.ourworld.tf/lhumina_code/hero_skills/issues/274) — openrpc.json skill + template regen (just filed) - [ ] [hero_logic#44](https://forge.ourworld.tf/lhumina_code/hero_logic/issues/44) — template-pattern codegen upgrade (gated on #43)
Author
Owner

hero_logic#43 cleanup merged

  • hero_logic#43 — bundled audit cleanup (PR #45). All 7 items landed in one PR; cargo build --workspace clean with 0 warnings, lab infocheck 0 findings.

Newly unblocked

  • hero_logic#44 — template-pattern codegen upgrade. Was gated on #43; now ready to dispatch. Big (~1–2 days).

Remaining queue

  • hero_skills#274hero_service_scaffold skill update + hero_service template regen (small)
  • hero_skills#272lab user init PATH_ROOT prerequisite docs + optional path_root() fallback (small)
  • hero_rpc#72 — drop ServiceToml regeneration (medium; design-first)
  • hero_rpc#70 — SDK restructure to sdk/{rust,python,rhai,js}/ (biggest; save for last)
  • hero_rpc#80 — OServer system.ping (decision needed)
  • hero_logic#44 — template-pattern upgrade (newly unblocked; big)
## hero_logic#43 cleanup merged - [x] [hero_logic#43](https://forge.ourworld.tf/lhumina_code/hero_logic/issues/43) — bundled audit cleanup (PR #45). All 7 items landed in one PR; `cargo build --workspace` clean with 0 warnings, `lab infocheck` 0 findings. ### Newly unblocked - [hero_logic#44](https://forge.ourworld.tf/lhumina_code/hero_logic/issues/44) — template-pattern codegen upgrade. Was gated on #43; now ready to dispatch. Big (~1–2 days). ### Remaining queue - [ ] [hero_skills#274](https://forge.ourworld.tf/lhumina_code/hero_skills/issues/274) — `hero_service_scaffold` skill update + `hero_service` template regen (small) - [ ] [hero_skills#272](https://forge.ourworld.tf/lhumina_code/hero_skills/issues/272) — `lab user init` PATH_ROOT prerequisite docs + optional `path_root()` fallback (small) - [ ] [hero_rpc#72](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/72) — drop ServiceToml regeneration (medium; design-first) - [ ] [hero_rpc#70](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/70) — SDK restructure to `sdk/{rust,python,rhai,js}/` (biggest; save for last) - [ ] [hero_rpc#80](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/80) — OServer `system.ping` (decision needed) - [ ] [hero_logic#44](https://forge.ourworld.tf/lhumina_code/hero_logic/issues/44) — template-pattern upgrade (newly unblocked; big)
Author
Owner

Big merge round

Merged this batch

Issue PR Highlight
hero_rpc#82 #84 Multi-domain openrpc.json: aggregate at docs/openrpc.json + per-domain at docs/<domain>/openrpc.json
hero_skills#274 #276 Scaffold skill documents both aggregate + per-domain spec outputs
(hero_service template regen) direct (af96639) Pre-#73 generated artefacts removed, new layout in place
hero_rpc#83 #86 Typed handler error category survives dispatch: Invalid → -32602, NotFound → -32602, PermissionDenied → -32000, Internal → -32603. No more misleading 'Redis operation error' prefix
hero_rpc#85 #87 Generator validation no longer rejects root objects without a literal sid: field (struct emitter already auto-injects). Unblocks hero_skills#275
hero_service#1 #2 ServiceDefinition = {name, description, interfaces} — no ServiceToml mirroring. ServiceCatalog exposes real queries + mocked bootstrap/refactor/check/verify ops
hero_rpc#72 Closed as superseded by #85 / #1 (external-type-refs no longer needed — collapsing the schema was the real fix)

hero_service#2 needed a rebase + manual conflict resolution (Cargo.lock + the regenerated catalog osis_server_generated.rs — took theirs from issue-1 since the agent's verification was on that side).

Status board

  • Round 3 cleanups — #71, #74, #75, #67, #69, #109, #73, #271 all merged earlier
  • Round 4 — multi-domain (#82, #274), error categories (#83), sid drop (#85), meta-service (#1), superseded (#72)
  • hero_skills#275 — skill text update about sid/created_at/updated_at auto-injection. Newly unblocked by #85. Ready to dispatch.
  • hero_skills#272path_root() panic message improvement (agent in flight)
  • hero_rpc#70 — SDK restructure to sdk/{rust,python,rhai,js}/ (biggest; held)
  • hero_rpc#80 — OServer system.ping (decision needed)
  • hero_logic#43 — bundled audit cleanup (merged)
  • hero_logic#44 — template-pattern upgrade (agent in flight)
## Big merge round ### Merged this batch | Issue | PR | Highlight | |---|---|---| | [hero_rpc#82](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/82) | [#84](https://forge.ourworld.tf/lhumina_code/hero_rpc/pulls/84) | Multi-domain `openrpc.json`: aggregate at `docs/openrpc.json` + per-domain at `docs/<domain>/openrpc.json` | | [hero_skills#274](https://forge.ourworld.tf/lhumina_code/hero_skills/issues/274) | [#276](https://forge.ourworld.tf/lhumina_code/hero_skills/pulls/276) | Scaffold skill documents both aggregate + per-domain spec outputs | | (hero_service template regen) | direct (`af96639`) | Pre-#73 generated artefacts removed, new layout in place | | [hero_rpc#83](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/83) | [#86](https://forge.ourworld.tf/lhumina_code/hero_rpc/pulls/86) | Typed handler error category survives dispatch: `Invalid → -32602`, `NotFound → -32602`, `PermissionDenied → -32000`, `Internal → -32603`. No more misleading 'Redis operation error' prefix | | [hero_rpc#85](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/85) | [#87](https://forge.ourworld.tf/lhumina_code/hero_rpc/pulls/87) | Generator validation no longer rejects root objects without a literal `sid:` field (struct emitter already auto-injects). Unblocks hero_skills#275 | | [hero_service#1](https://forge.ourworld.tf/lhumina_code/hero_service/issues/1) | [#2](https://forge.ourworld.tf/lhumina_code/hero_service/pulls/2) | `ServiceDefinition = {name, description, interfaces}` — no ServiceToml mirroring. ServiceCatalog exposes real queries + mocked bootstrap/refactor/check/verify ops | | [hero_rpc#72](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/72) | — | Closed as superseded by #85 / #1 (external-type-refs no longer needed — collapsing the schema was the real fix) | hero_service#2 needed a rebase + manual conflict resolution (`Cargo.lock` + the regenerated catalog `osis_server_generated.rs` — took theirs from issue-1 since the agent's verification was on that side). ### Status board - [x] Round 3 cleanups — `#71, #74, #75, #67, #69, #109, #73, #271` all merged earlier - [x] Round 4 — multi-domain (`#82, #274`), error categories (`#83`), sid drop (`#85`), meta-service (`#1`), superseded (`#72`) - [ ] **hero_skills#275** — skill text update about sid/created_at/updated_at auto-injection. Newly unblocked by #85. Ready to dispatch. - [ ] **hero_skills#272** — `path_root()` panic message improvement (agent in flight) - [ ] **hero_rpc#70** — SDK restructure to `sdk/{rust,python,rhai,js}/` (biggest; held) - [ ] **hero_rpc#80** — OServer `system.ping` (decision needed) - [ ] **hero_logic#43** — bundled audit cleanup (merged) - [ ] **hero_logic#44** — template-pattern upgrade (agent in flight)
Author
Owner

Latest landings + scope correction

Merged

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_service template 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

  • hero_rpc#90OSIS → hero_rpc2 migration (the big one; review body before dispatching).
  • hero_skills#275 — oschema skill text (drop manual sid/created_at/updated_at).
  • hero_skills#272path_root() panic message (agent dispatched, status pending).
  • 3 upstream hero_rpc follow-ups flagged in hero_logic#46 PR body — to be filed (build.rs post-processing the codegen-emitted openrpc.json + restoring server lib.rs modules).
## Latest landings + scope correction ### Merged - [x] [hero_rpc#70](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/70) — SDK restructure to `sdk/{rust,rhai,python,js}/` (PR #89) - [x] [hero_logic#44](https://forge.ourworld.tf/lhumina_code/hero_logic/issues/44) — template-pattern codegen upgrade (PR #46 on `main`) ### Scope correction — closing the META hybrid loop [#80](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/80) (system.ping builtin) closed as supplanted by **[#90](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/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_service` template 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 - [ ] [hero_rpc#90](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/90) — **OSIS → hero_rpc2 migration** (the big one; review body before dispatching). - [ ] [hero_skills#275](https://forge.ourworld.tf/lhumina_code/hero_skills/issues/275) — oschema skill text (drop manual sid/created_at/updated_at). - [ ] [hero_skills#272](https://forge.ourworld.tf/lhumina_code/hero_skills/issues/272) — `path_root()` panic message (agent dispatched, status pending). - 3 upstream hero_rpc follow-ups flagged in hero_logic#46 PR body — to be filed (build.rs post-processing the codegen-emitted openrpc.json + restoring server lib.rs modules).
Author
Owner

Phase 1 of the migration LANDED + UI scaffolding gap captured

Just merged

  • hero_rpc#90 Phase 1OServer hard-cut; hero_rpc2 is now the dispatch path. crates/server/ deleted (3,362 LoC). hero_rpc2 transport gained POST /rpc + GET /health + /openrpc.json + /.well-known/heroservice.json + auto-registered rpc.health builtin. Generator's scaffolder defaults flipped to hero_rpc2; legacy SDK + bin emitters + recipe_sdk_rpc2 parallel example deleted. recipe_server migrated end-to-end — single canonical demo on the new path. 27 hero_rpc2 uds-http tests + the workspace test suite green.

Newly filed

  • hero_rpc#98scaffolder emits working UI for _admin + _web that 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 _admin has been a placeholder shell and _web wasn't scaffolded at all. Per-root-object list/detail/create pages introspected from the OSchema; reuses hero_admin_lib + hero_web_template's hero_theme. Design-first.
  • hero_rpc#96 (filed earlier today) — generated/ subfolders + gitignore. Friend feedback: it's hard to tell what's generated vs handwritten. Move all codegen output into generated/ subdirs + gitignore them so git status after cargo build is empty.

Migration phases 2–4 (now unblocked)

Phase 1 (just landed) was the framework cutover. The per-service migrations are next:

  • Phase 2: migrate hero_service template to hero_rpc2 dispatch — validates the path on the canonical reference everyone clones.
  • Phase 3: sweep hero_logic, hero_compute, hero_db, others — one PR per repo.
  • Phase 4: cleanup — delete legacy rust_rpc.rs emitter (still kept behind a flag for migration purposes).

Each gets its own prompt when ready.

Open queue summary

  • hero_rpc#90 phases 2–4 — per-service hero_rpc2 dispatch migration
  • hero_rpc#96 — generated/ subfolders + gitignore (design-first; prompt drafted)
  • hero_rpc#98 — UI scaffolds for _admin + _web (design-first; prompt drafted)
  • hero_skills#272 — path_root panic msg (agent in flight; verify status)
  • hero_skills#275 — oschema skill text (drop manual sid/created_at/updated_at)
## Phase 1 of the migration LANDED + UI scaffolding gap captured ### Just merged - [x] [hero_rpc#90 Phase 1](https://forge.ourworld.tf/lhumina_code/hero_rpc/pulls/97) — **OServer hard-cut**; hero_rpc2 is now the dispatch path. `crates/server/` deleted (3,362 LoC). hero_rpc2 transport gained POST `/rpc` + GET `/health` + `/openrpc.json` + `/.well-known/heroservice.json` + auto-registered `rpc.health` builtin. Generator's scaffolder defaults flipped to hero_rpc2; legacy SDK + bin emitters + `recipe_sdk_rpc2` parallel example deleted. `recipe_server` migrated end-to-end — single canonical demo on the new path. 27 hero_rpc2 uds-http tests + the workspace test suite green. ### Newly filed - [ ] [hero_rpc#98](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/98) — **scaffolder emits working UI for `_admin` + `_web`** that 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 `_admin` has been a placeholder shell and `_web` wasn't scaffolded at all. Per-root-object list/detail/create pages introspected from the OSchema; reuses `hero_admin_lib` + `hero_web_template`'s `hero_theme`. Design-first. - [ ] [hero_rpc#96](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/96) (filed earlier today) — **`generated/` subfolders + gitignore**. Friend feedback: it's hard to tell what's generated vs handwritten. Move all codegen output into `generated/` subdirs + gitignore them so `git status` after `cargo build` is empty. ### Migration phases 2–4 (now unblocked) Phase 1 (just landed) was the framework cutover. The per-service migrations are next: - **Phase 2**: migrate `hero_service` template to hero_rpc2 dispatch — validates the path on the canonical reference everyone clones. - **Phase 3**: sweep `hero_logic`, `hero_compute`, `hero_db`, others — one PR per repo. - **Phase 4**: cleanup — delete legacy `rust_rpc.rs` emitter (still kept behind a flag for migration purposes). Each gets its own prompt when ready. ### Open queue summary - [ ] [hero_rpc#90 phases 2–4](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/90) — per-service hero_rpc2 dispatch migration - [ ] [hero_rpc#96](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/96) — generated/ subfolders + gitignore (design-first; prompt drafted) - [ ] [hero_rpc#98](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/98) — UI scaffolds for _admin + _web (design-first; prompt drafted) - [ ] [hero_skills#272](https://forge.ourworld.tf/lhumina_code/hero_skills/issues/272) — path_root panic msg (agent in flight; verify status) - [ ] [hero_skills#275](https://forge.ourworld.tf/lhumina_code/hero_skills/issues/275) — oschema skill text (drop manual sid/created_at/updated_at)
Author
Owner

Round 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

  • hero_rpc#90 phases 1–4 — every OSIS service runs on hero_rpc2 dispatch. OServer deleted (3,362 LoC). Legacy rust_rpc.rs emitter deleted. rpc2_adapter bridges every generated OSIS handler. PRs hero_rpc#97 / #99 / #100 / #102, hero_service#5, hero_logic#47 — hero_compute + hero_db were no-ops.
  • hero_rpc#103 — closes #98. Scaffolder emits working _admin + _web UIs per root object on the typed SDK. Reuses hero_admin_lib + hero_web_template's hero_theme. CRUD methods (new, get, set, delete, list, list_full, exists) emitted into the typed SDK trait + OpenRPC spec; rpc2_adapter registers new + list_full.

Generated-vs-handwritten separation

  • hero_rpc#101 — closes #96. All codegen output moves into per-domain generated/ subfolders, gitignored. git status clean after cargo build. Drops the _generated.rs suffix.
  • hero_rpc#114 — drops generate_wasm + emits a single wasm-compat types.rs (was parallel types_generated.rs + types_wasm_generated.rs).

Generator: single source of truth

  • hero_rpc#117 — Unify SDK ↔ server types and seeding. <Name> / <Name>Input split, new(input) → sid / set(sid, input) → () CRUD shape, typed-SDK seed::{blank, random, from_dir}, canonical hero_rpc_osis::rpc::bootstrap. crates/osis/src/seed/ deleted upstream. ADR 002 captures the design.
  • hero_rpc#108[rootobject] marker required for codegen to treat a type as a root.
  • hero_rpc#112OSCHEMA_SOURCE deterministic via sorted read_dir().

End-to-end tests scaffold

  • hero_rpc#119 — closes #115. Workspace-root 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, _server dispatch (generated/tests.rs), workspace E2E.

Template re-validation

  • hero_service#7 — closes hero_rpc#122. Template regenerated against post-#117/#119 layout. Adds a bench domain with IndexedSingle / IndexedMulti / IndexedNone / IndexedReference rootobjects — the canonical benchmark surface.

Benchmark harness + perf finding

  • hero_rpc#125crates/osis_benches/ Criterion harness + impl ClientT for hero_rpc2::Client. Headline number from BENCH_RESULTS.md:

    Arm (5 000 rows) Mean
    shadow_indexed.title (HashMap built from indexed_fields()) 1.349 ms
    full_scan.title (list_full() + filter()) 121.98 ms

    ~90× gap — OSIS storage never consults indexed_fields(), and the SDK trait emits no _find_* method. @index is metadata-only today.

Walkthrough / examples / skills

  • hero_rpc#105 / #107 / #110 / #111example/01_walkthrough.rs as the canonical end-to-end demo (stable on-disk path, python SDK wired, gated types_wasm).
  • hero_rpc#116 — examples restructure; per-service _examples placeholder dropped.
  • hero_skills#279 — scaffold skill documents UI scaffolds + --no-web.
  • hero_skills#283 — scaffold skill links ADR 002 (#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 --json as a subprocess. One bootstrap codepath in the stack, period.

Scope refined twice in-thread — final shape (no lab_fixture crate; 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 on lhumina_code/hero_skills (lab --ephemeral / --json / --pid / --test) and lhumina_code/hero_service (template re-validation).

hero_rpc#123 — OSIS @index integration

Wire find_* through hero_indexer (Tantivy) with typed FindParams. Direct payoff: the 90× gap from #125 collapses once DBTyped<T>::set consults indexed_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)

  • hero_rpc#120rpc.rs use super::*; does not propagate OTime / OCur / OLocation / OAddress imports. One-line emitter fix.
  • hero_rpc#109check_socket_or_die calls std::process::exit; should return Result.
  • hero_rpc#104 — osis example fails: DBTyped::new_with_index removed but examples/ still references it.
  • hero_rpc#74 — likely superseded by #114; needs close.
  • hero_skills#272path_root() panic message — direction locked, never dispatched.

Out-of-workstream (lab tooling, separately tracked)

The next big landings

Once #126 lands, the lifecycle pattern is canonical and #113 (per-root-object SDK benches) folds into it. Once #123 lands, @index becomes load-bearing and the find_* row in the canonical CRUD-seven becomes the eighth method on every typed SDK. After that the standardization arc is complete.

## Round 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 - [x] **[hero_rpc#90 phases 1–4](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/90)** — every OSIS service runs on hero_rpc2 dispatch. OServer deleted (3,362 LoC). Legacy `rust_rpc.rs` emitter deleted. `rpc2_adapter` bridges every generated OSIS handler. PRs hero_rpc#97 / #99 / #100 / #102, hero_service#5, hero_logic#47 — `hero_compute` + `hero_db` were no-ops. - [x] **[hero_rpc#103](https://forge.ourworld.tf/lhumina_code/hero_rpc/pulls/103)** — closes [#98](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/98). Scaffolder emits working `_admin` + `_web` UIs per root object on the typed SDK. Reuses `hero_admin_lib` + `hero_web_template`'s `hero_theme`. CRUD methods (`new`, `get`, `set`, `delete`, `list`, `list_full`, `exists`) emitted into the typed SDK trait + OpenRPC spec; `rpc2_adapter` registers `new` + `list_full`. #### Generated-vs-handwritten separation - [x] **[hero_rpc#101](https://forge.ourworld.tf/lhumina_code/hero_rpc/pulls/101)** — closes [#96](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/96). All codegen output moves into per-domain `generated/` subfolders, gitignored. `git status` clean after `cargo build`. Drops the `_generated.rs` suffix. - [x] **[hero_rpc#114](https://forge.ourworld.tf/lhumina_code/hero_rpc/pulls/114)** — drops `generate_wasm` + emits a single wasm-compat `types.rs` (was parallel `types_generated.rs` + `types_wasm_generated.rs`). #### Generator: single source of truth - [x] **[hero_rpc#117](https://forge.ourworld.tf/lhumina_code/hero_rpc/pulls/118)** ⭐ — Unify SDK ↔ server types and seeding. `<Name>` / `<Name>Input` split, `new(input) → sid` / `set(sid, input) → ()` CRUD shape, typed-SDK `seed::{blank, random, from_dir}`, canonical `hero_rpc_osis::rpc::bootstrap`. `crates/osis/src/seed/` deleted upstream. ADR 002 captures the design. - [x] **[hero_rpc#108](https://forge.ourworld.tf/lhumina_code/hero_rpc/pulls/108)** — `[rootobject]` marker required for codegen to treat a type as a root. - [x] **[hero_rpc#112](https://forge.ourworld.tf/lhumina_code/hero_rpc/pulls/111)** — `OSCHEMA_SOURCE` deterministic via sorted `read_dir()`. #### End-to-end tests scaffold - [x] **[hero_rpc#119](https://forge.ourworld.tf/lhumina_code/hero_rpc/pulls/119)** — closes [#115](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/115). Workspace-root `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, `_server` dispatch (`generated/tests.rs`), workspace E2E. #### Template re-validation - [x] **[hero_service#7](https://forge.ourworld.tf/lhumina_code/hero_service/pulls/7)** — closes [hero_rpc#122](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/122). Template regenerated against post-#117/#119 layout. **Adds a `bench` domain with `IndexedSingle` / `IndexedMulti` / `IndexedNone` / `IndexedReference` rootobjects** — the canonical benchmark surface. #### Benchmark harness + perf finding - [x] **[hero_rpc#125](https://forge.ourworld.tf/lhumina_code/hero_rpc/pulls/125)** — `crates/osis_benches/` Criterion harness + `impl ClientT for hero_rpc2::Client`. Headline number from `BENCH_RESULTS.md`: | Arm (5 000 rows) | Mean | |---|---:| | `shadow_indexed.title` (HashMap built from `indexed_fields()`) | **1.349 ms** | | `full_scan.title` (`list_full() + filter()`) | **121.98 ms** | **~90× gap** — OSIS storage never consults `indexed_fields()`, and the SDK trait emits no `_find_*` method. `@index` is metadata-only today. #### Walkthrough / examples / skills - [x] [hero_rpc#105](https://forge.ourworld.tf/lhumina_code/hero_rpc/pulls/105) / [#107](https://forge.ourworld.tf/lhumina_code/hero_rpc/pulls/107) / [#110](https://forge.ourworld.tf/lhumina_code/hero_rpc/pulls/110) / [#111](https://forge.ourworld.tf/lhumina_code/hero_rpc/pulls/111) — `example/01_walkthrough.rs` as the canonical end-to-end demo (stable on-disk path, python SDK wired, gated `types_wasm`). - [x] [hero_rpc#116](https://forge.ourworld.tf/lhumina_code/hero_rpc/pulls/116) — examples restructure; per-service `_examples` placeholder dropped. - [x] [hero_skills#279](https://forge.ourworld.tf/lhumina_code/hero_skills/pulls/279) — scaffold skill documents UI scaffolds + `--no-web`. - [x] [hero_skills#283](https://forge.ourworld.tf/lhumina_code/hero_skills/pulls/283) — scaffold skill links ADR 002 (`#117`). ### Active strategic work #### [hero_rpc#124 — lifecycle alignment](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/124) ⭐ **Lab is the only bootstrap.** Cargo tests, criterion benches, and nushell scripts all invoke `lab service <name> --start --ephemeral --json` as a subprocess. One bootstrap codepath in the stack, period. Scope refined twice in-thread — final shape (no `lab_fixture` crate; subprocess only) is in the current issue body. **[PR #126](https://forge.ourworld.tf/lhumina_code/hero_rpc/pulls/126) open** (+1592 / -673) — `MultiDomainBuilder` + scaffolder subprocess-driver tests + nu skeletons + `docs/testing.md`. Sibling PRs expected on `lhumina_code/hero_skills` (lab `--ephemeral` / `--json` / `--pid` / `--test`) and `lhumina_code/hero_service` (template re-validation). #### [hero_rpc#123 — OSIS `@index` integration](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/123) Wire `find_*` through `hero_indexer` (Tantivy) with typed `FindParams`. Direct payoff: the **90× gap** from #125 collapses once `DBTyped<T>::set` consults `indexed_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) - [ ] [hero_rpc#120](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/120) — `rpc.rs` `use super::*;` does not propagate `OTime` / `OCur` / `OLocation` / `OAddress` imports. One-line emitter fix. - [ ] [hero_rpc#109](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/109) — `check_socket_or_die` calls `std::process::exit`; should return `Result`. - [ ] [hero_rpc#104](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/104) — osis example fails: `DBTyped::new_with_index` removed but `examples/` still references it. - [ ] [hero_rpc#74](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/74) — likely superseded by #114; needs close. - [ ] [hero_skills#272](https://forge.ourworld.tf/lhumina_code/hero_skills/issues/272) — `path_root()` panic message — direction locked, never dispatched. ### Out-of-workstream (lab tooling, separately tracked) - [hero_skills#281](https://forge.ourworld.tf/lhumina_code/hero_skills/issues/281) / [#282](https://forge.ourworld.tf/lhumina_code/hero_skills/issues/282) — lab onboarding gaps on Ubuntu 24 - [hero_skills#269](https://forge.ourworld.tf/lhumina_code/hero_skills/issues/269) — per-repo cleanup blocking `lab-publish` CI on 14 / 31 wired repos - [hero_skills#268](https://forge.ourworld.tf/lhumina_code/hero_skills/issues/268) — auto-publish `lab-latest` from CI - [hero_skills#265](https://forge.ourworld.tf/lhumina_code/hero_skills/issues/265) — `lab infocheck` false positives ### The next big landings Once **#126** lands, the lifecycle pattern is canonical and `#113` (per-root-object SDK benches) folds into it. Once **#123** lands, `@index` becomes load-bearing and the `find_*` row in the canonical CRUD-seven becomes the eighth method on every typed SDK. After that the standardization arc is complete.
Author
Owner

Linking back from hero_rpc:

  • hero_rpc#131 — Verify methods-only oschema path end-to-end (no rootobjects). Prerequisite for the migration.
  • hero_rpc#132 — META: Migrate legacy openrpc_client! services to oschema-driven codegen. Six services in scope (hero_indexer first); 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 (OsisIndexer sync-facade-over-async, panics inside #[tokio::test]) is the motivating example — would have been impossible end-to-end with oschema codegen.

Linking back from hero_rpc: - **[hero_rpc#131](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/131)** — Verify methods-only oschema path end-to-end (no rootobjects). Prerequisite for the migration. - **[hero_rpc#132](https://forge.ourworld.tf/lhumina_code/hero_rpc/issues/132)** — META: Migrate legacy `openrpc_client!` services to oschema-driven codegen. Six services in scope (`hero_indexer` first); 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 (`OsisIndexer` sync-facade-over-async, panics inside `#[tokio::test]`) is the motivating example — would have been impossible end-to-end with oschema codegen.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
lhumina_code/hero_skills#262
No description provided.