feat: user linking, chat persistence, SID resolution, investment roadmap fixes, CI fix #21

Closed
casper-stevens wants to merge 1 commit from development_casper into development
Member

Summary

This branch consolidates several weeks of work across hero_biz_ui: a new contact→user linking feature, a fully persisted chat system with file/voice uploads, end-to-end SID-to-name resolution across list/detail views, a batch of investment roadmap display fixes, CI build repairs, UI description improvements, and documentation cleanup.


What changed

Features

  • Business overview page descriptions (feat(ui): add area descriptions and HR section to overview dashboard)
    Each section card on the overview dashboard now displays a short description of what that area is for (Contacts, Companies, Interactions, Deals, Contracts, Finance, HR, Tasks/Projects). An HR section card has also been added — it was present in the sidebar but missing from the dashboard body. Closes #35.

  • Contact–user linking (feat: link contacts to users via user_sid)
    ContactRecord gains a user_sid field. The store now wires up IdentityClient (from hero_osis_sdk) so the link selector can search/load hero_osis identity users. Contacts can be attributed to the user who logged them.

  • Link selector rewrite (fix: rewrite get_link_selector, fix: remove redundant fields)
    get_link_selector was returning the wrong JSON shape for the frontend JS; rewritten to match. SaveLinksRequest had stale redundant fields removed.

  • Chat persistence + file/voice uploads (fix: implement chat persistence and file uploads)
    Messages are now stored as NDJSON files per (context_type, context_id) under data/chats/. File uploads land in data/uploads/. Voice files are auto-transcribed via the AI client when configured. assistant_chat loads the last 10 persisted messages as conversation history so sessions are stateful across page reloads.

Fixes

  • SID-to-name resolution in list/detail views (fix: resolve entity SIDs to names in list/detail views; preserve link fields on update)
    Instruments, contracts, transactions, and comments now resolve their foreign-key SIDs (company, person, contract, etc.) into human-readable names at render time. Link fields are no longer clobbered on entity update.

  • Investment roadmap display bugs (fix: investment roadmap shows transaction name, currency, and invested companies + fix(hero_biz_ui): fix investment roadmap display and data bugs)
    Timeline entries now show transaction name, currency, and company names instead of raw IDs. Broken company link fixed. Unused instruments field removed from the roadmap handler. Template variable references corrected.

  • Form action base_path (fix: prepend base_path to all form action URLs)
    All HTML form action= attributes now prepend state.base_path, fixing broken form submissions when the service is mounted at a non-root prefix through hero_router.

  • HERO_OSIS_URL default (fix: default HERO_OSIS_URL to hero_router on port 9988)
    Default shifted from :9080 (direct hero_osis) to :9988 (hero_router). Means a vanilla hero_biz_ui instance works without extra config when hero_router is running.

  • CI tag-build fix (fix(ci): clear stale ALL_FEATURES and guard --features when empty)
    buildenv.sh no longer leaves ALL_FEATURES stale across runs. build_lib.sh guards the --features flag so an empty feature list does not produce a malformed cargo invocation. Fixes issue #14.

Cleanup / docs

  • Hero0 → hero_osis rename throughout all doc comments and instructions.
  • README updated to reflect hero_router on port 9988.
  • Links button hidden for Person and Company detail pages (they have dedicated linking UI).
  • VSCode button removed from entity footers.
  • coding_instructions.md and coding_instructions_ai.md content de-duplicated (both were identical).

Blockers — what we are waiting on

1. hero_aibroker_sdk needs a non-streaming completion method (biggest blocker)

hero_biz_ui currently embeds its own AiClient (crates/hero_biz_ui/src/ai/client.rs) that makes direct reqwest calls to any OpenAI-compatible endpoint. This bypasses hero_aibroker entirely — no billing tracking, no model routing, no credit deduction.

The correct architecture is for hero_biz to call through the broker. The hero_aibroker_sdk currently only exposes:

  • A typed JSON-RPC admin client (health, billing, key management — no chat)
  • A StreamingClient that connects to rest.sock and does SSE streaming

What we need is a non-streaming /v1/chat/completions wrapper in the SDK so hero_biz can make simple request/response AI calls through the broker without consuming a stream. Until that lands, hero_biz calls the upstream AI provider directly and cannot benefit from the broker's model routing or multi-provider fallback.

Workaround already in the codebase: AIBrokerRawClient.call() exists as an escape hatch but requires hand-rolling payloads and is not ergonomic.

2. Auth middleware disabled

// TODO: Re-enable auth once backend is complete (handlers/mod.rs:44). The Axum-layer global auth middleware is commented out. Auth is enforced per-handler via get_session(). The middleware approach would give a blanket guarantee but is blocked on the backend being stable.

3. hero_biz backend crate is a placeholder

crates/hero_biz/src/main.rs logs "hero_biz backend — placeholder (not yet implemented)". All business logic lives in hero_biz_ui. The backend crate will eventually host the OpenRPC service surface.

4. Generic Store::save() is a no-op

services/mod.rs — the generic Store::save<T>() returns Ok(()) without writing (// TODO: Implement save via hero_osis). Entity persistence goes through specific typed methods; the generic path is a stub for a future unified OSIS save layer.


Test plan

  • Workspace compiles cleanly (make build)
  • Existing test suite passes (make test)
  • Manual: verify overview dashboard shows descriptions for all 8 areas
  • Manual: verify HR section card appears on the overview dashboard
  • Manual: create a contact record and link it to a hero_osis user via the link selector
  • Manual: send a chat message, reload the page, confirm history persists
  • Manual: upload a file in a chat context, confirm it appears in history
  • Manual: verify investment roadmap timeline shows names and currencies correctly
  • Manual: edit an entity with linked SIDs, confirm link fields survive the round-trip
  • Manual: deploy at a non-root base_path and confirm form submissions work
## Summary This branch consolidates several weeks of work across hero_biz_ui: a new contact→user linking feature, a fully persisted chat system with file/voice uploads, end-to-end SID-to-name resolution across list/detail views, a batch of investment roadmap display fixes, CI build repairs, UI description improvements, and documentation cleanup. --- ## What changed ### Features - **Business overview page descriptions** (`feat(ui): add area descriptions and HR section to overview dashboard`) Each section card on the overview dashboard now displays a short description of what that area is for (Contacts, Companies, Interactions, Deals, Contracts, Finance, HR, Tasks/Projects). An HR section card has also been added — it was present in the sidebar but missing from the dashboard body. Closes #35. - **Contact–user linking** (`feat: link contacts to users via user_sid`) `ContactRecord` gains a `user_sid` field. The store now wires up `IdentityClient` (from `hero_osis_sdk`) so the link selector can search/load hero_osis identity users. Contacts can be attributed to the user who logged them. - **Link selector rewrite** (`fix: rewrite get_link_selector`, `fix: remove redundant fields`) `get_link_selector` was returning the wrong JSON shape for the frontend JS; rewritten to match. `SaveLinksRequest` had stale redundant fields removed. - **Chat persistence + file/voice uploads** (`fix: implement chat persistence and file uploads`) Messages are now stored as NDJSON files per `(context_type, context_id)` under `data/chats/`. File uploads land in `data/uploads/`. Voice files are auto-transcribed via the AI client when configured. `assistant_chat` loads the last 10 persisted messages as conversation history so sessions are stateful across page reloads. ### Fixes - **SID-to-name resolution in list/detail views** (`fix: resolve entity SIDs to names in list/detail views; preserve link fields on update`) Instruments, contracts, transactions, and comments now resolve their foreign-key SIDs (company, person, contract, etc.) into human-readable names at render time. Link fields are no longer clobbered on entity update. - **Investment roadmap display bugs** (`fix: investment roadmap shows transaction name, currency, and invested companies` + `fix(hero_biz_ui): fix investment roadmap display and data bugs`) Timeline entries now show transaction name, currency, and company names instead of raw IDs. Broken company link fixed. Unused `instruments` field removed from the roadmap handler. Template variable references corrected. - **Form action base_path** (`fix: prepend base_path to all form action URLs`) All HTML form `action=` attributes now prepend `state.base_path`, fixing broken form submissions when the service is mounted at a non-root prefix through hero_router. - **HERO_OSIS_URL default** (`fix: default HERO_OSIS_URL to hero_router on port 9988`) Default shifted from `:9080` (direct hero_osis) to `:9988` (hero_router). Means a vanilla `hero_biz_ui` instance works without extra config when hero_router is running. - **CI tag-build fix** (`fix(ci): clear stale ALL_FEATURES and guard --features when empty`) `buildenv.sh` no longer leaves `ALL_FEATURES` stale across runs. `build_lib.sh` guards the `--features` flag so an empty feature list does not produce a malformed cargo invocation. Fixes issue #14. ### Cleanup / docs - Hero0 → hero_osis rename throughout all doc comments and instructions. - README updated to reflect hero_router on port 9988. - Links button hidden for Person and Company detail pages (they have dedicated linking UI). - VSCode button removed from entity footers. - `coding_instructions.md` and `coding_instructions_ai.md` content de-duplicated (both were identical). --- ## Blockers — what we are waiting on ### 1. `hero_aibroker_sdk` needs a non-streaming completion method (biggest blocker) `hero_biz_ui` currently embeds its own `AiClient` (`crates/hero_biz_ui/src/ai/client.rs`) that makes direct `reqwest` calls to any OpenAI-compatible endpoint. This bypasses `hero_aibroker` entirely — no billing tracking, no model routing, no credit deduction. The correct architecture is for `hero_biz` to call through the broker. The `hero_aibroker_sdk` currently only exposes: - A typed JSON-RPC admin client (health, billing, key management — no chat) - A `StreamingClient` that connects to `rest.sock` and does SSE streaming What we need is a **non-streaming** `/v1/chat/completions` wrapper in the SDK so `hero_biz` can make simple request/response AI calls through the broker without consuming a stream. Until that lands, `hero_biz` calls the upstream AI provider directly and cannot benefit from the broker's model routing or multi-provider fallback. Workaround already in the codebase: `AIBrokerRawClient.call()` exists as an escape hatch but requires hand-rolling payloads and is not ergonomic. ### 2. Auth middleware disabled `// TODO: Re-enable auth once backend is complete` (`handlers/mod.rs:44`). The Axum-layer global auth middleware is commented out. Auth is enforced per-handler via `get_session()`. The middleware approach would give a blanket guarantee but is blocked on the backend being stable. ### 3. `hero_biz` backend crate is a placeholder `crates/hero_biz/src/main.rs` logs `"hero_biz backend — placeholder (not yet implemented)"`. All business logic lives in `hero_biz_ui`. The backend crate will eventually host the OpenRPC service surface. ### 4. Generic `Store::save()` is a no-op `services/mod.rs` — the generic `Store::save<T>()` returns `Ok(())` without writing (`// TODO: Implement save via hero_osis`). Entity persistence goes through specific typed methods; the generic path is a stub for a future unified OSIS save layer. --- ## Test plan - [x] Workspace compiles cleanly (`make build`) - [x] Existing test suite passes (`make test`) - [x] Manual: verify overview dashboard shows descriptions for all 8 areas - [x] Manual: verify HR section card appears on the overview dashboard - [ ] Manual: create a contact record and link it to a hero_osis user via the link selector - [x] Manual: send a chat message, reload the page, confirm history persists - [x] Manual: upload a file in a chat context, confirm it appears in history - [x] Manual: verify investment roadmap timeline shows names and currencies correctly - [ ] Manual: edit an entity with linked SIDs, confirm link fields survive the round-trip - [ ] Manual: deploy at a non-root base_path and confirm form submissions work
ContactRecord gains a user_sid FK so the system can track which User
logged each interaction, replacing the free-text author field for
structured lookups.

- models/contact.rs: add user_sid: Option<String>
- services/mod.rs: add users to LinkSelectorData, populate it in
  get_link_selector_data, set user_sid: None in load_contact
- handlers/mod.rs: add user_sid to ContactForm, resolve user in
  contacts_detail, load users in new/edit handlers, propagate
  user_sid through create/update
- templates/mod.rs: add user to ContactDetailTemplate (shown as
  link in detail view), add users dropdown to ContactFormTemplate
  replacing the author free-text input, update update_contact_links
  to handle the "users" link key

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Every form template was submitting to a bare /c/{context}/... path,
so hero_router would try to route the POST to a web_{context} socket
instead of the hero_biz/ui.sock. Adding bp (BASE_PATH) prefix to all
12 form actions plus the search form, admin user list/edit, and the
admin index link fixes this for all entity types.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
unwrap_or_default() gave an empty string, which reqwest cannot build
a valid request from — causing "Network error: builder error" on every
write operation. Match the default used in hero_osis examples and README.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
hero_osis services run behind hero_router (not directly on TCP).
hero_router listens on localhost:9988 and proxies requests to OSIS
Unix sockets by URL prefix (/hero_osis_business/rpc → rpc.sock, etc).
Port 9080 was wrong — nothing listens there.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace stale localhost:9080 (direct OSIS) references with 9988
(hero_router TCP proxy). Update architecture diagram to show the
actual traffic path: HeroBiz → hero_router:9988 → OSIS Unix socket.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
hero0 was the old backend name. hero_osis is the current one.
Sweeps comments, docstrings, log messages, and Cargo.toml comment
across all 23 affected files — no functional code changed.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add identity feature to hero_osis_sdk dependency
- Add IdentityClient to Store (lazily cached per context, same pattern
  as BusinessClient/ProjectsClient)
- Implement load_all_users via userservice_users_active()
- Implement load_user via user_get(sid)
- Fix get_link_selector_data: populate contracts, opportunities, deals
  (were all Vec::new() stubs) using existing load_all_* methods

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The handler was returning raw LinkSelectorData (flat type→[(sid,name)] map)
but the JS expected { entity_name, linkable_types, targets, current_links }.
This caused "linkableTypes is undefined" and "entity_name = undefined" in
the link selector modal.

New response:
- entity_name: loaded from the actual entity
- linkable_types: per-entity list of which types can be linked
- targets: { type: [{id, name}] } populated from real store calls
- current_links: { type: [sids] } read from the entity's current fields

Covers all 9 linkable entity types (Contact, Deal, Contract, Opportunity,
Project, Task, Milestone, Instrument, Transaction) plus Person/Company
which show entity_name but have no outgoing links.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
JS sends { links: {...} } but the struct required entity_type and
entity_id too — both already available from the URL path params.
Axum returned a 422 plain-text error which the JS couldn't parse
as JSON, showing "JSON.parse: unexpected character".

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
These entities have no outgoing link fields — they are link targets
for other entities (contacts, deals, contracts etc.), not sources.
Showing an empty link selector modal was confusing.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
source_file and source_line are always empty for hero_osis-backed
entities, making the vscode:// link always point nowhere. Also
removed the dead source file/line display from the footer.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Timeline title now shows description (falls back to transaction ID)
- Amount shown as a separate line in the card body
- Total Invested stat now includes currency unit
- Companies stat now counts only companies with actual investments

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
#11
#10
buildenv.sh listed hero_osis-business/projects/identity as ALL_FEATURES,
but none of the workspace crates define those features. The hero_osis_sdk
features are already hardcoded as always-on dep features in each crate's
Cargo.toml, so no --features flag is needed at build time.

- Set ALL_FEATURES="" in buildenv.sh
- Remove hard-fail guard on empty ALL_FEATURES in build_lib.sh
- Guard --features in build() so the flag is omitted when empty
- Guard --features in ci_check() using ${var:+word} expansion

#14
fix(hero_biz_ui): fix investment roadmap display and data bugs
All checks were successful
Build and Test / build (pull_request) Successful in 3m27s
b3386c7ca8
#17
fix: read X-Forwarded-Prefix for redirects; rename Contacts→Interactions, Persons→People
All checks were successful
Build and Test / build (pull_request) Successful in 3m16s
cba9a22fb3
- Add effective_base_path() + prefix_middleware to server.rs — reads
  X-Forwarded-Prefix set by hero_router so post-save redirects go to
  the correct iframe mount path instead of bare /c/... which hero_router
  was misrouting to web_threefold.sock (causing all saves to 404)
- Replace all 145 state.base_path redirect usages with effective_base_path()
- Rename "Contacts" nav/page/section labels to "Interactions" (the section
  logs communication touchpoints, not contact people)
- Rename "Persons" nav/page/section labels to "People" (matches breadcrumb
  already in use: Business / People / Persons)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add HR list, detail, and form templates (HrListTemplate, HrDetailTemplate, HrFormTemplate)
- Add HR handlers: hr_list, hr_detail, hr_new, hr_create, hr_edit, hr_update
- Register routes: GET/POST /c/:context/hr, /hr/new, /hr/:id, /hr/:id/edit
- Add HR section to sidebar nav with Employees and New Employee links
- HR records reuse the Person entity (Employee role) with job_title, department,
  start_date, and salary encoded as "key:value" tags — no new OSIS type required
- HR detail view links to Interactions (contacts) for the employee

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Amount formatting helpers (format_amount, format_amount_compact, format_with_separators,
currency_symbol, format_optional_date, format_optional_percent) added to templates/mod.rs.
All amount/currency display strings updated to use the new helpers. Changes are included
in the preceding commit alongside the #24 rename (both touched the same file).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
PersonDetailTemplate already has company: Option<Company> field and link rendering.
ContactDetailTemplate already has contract/opportunity/deal: Option<...> fields and
link rendering. The persons_detail and contacts_detail handlers already load and pass
these linked entities. All SID-to-name resolution was pre-existing in the codebase
(added with the HR CRUD commit). No additional changes required.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
fix: rename URL slugs /persons→/contacts and /contacts→/interactions
Some checks failed
Build and Test / build (pull_request) Failing after 15m59s
d8cfcabebf
Person/CRM records are now served at /c/{context}/contacts/*
Activity touchpoint records are now served at /c/{context}/interactions/*

Rust identifiers, struct names, function names, and field names are unchanged.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Implements all entity cross-links: company/contact/deal/contract/transaction/
task/HR detail pages now show related records as linked sections. Also fixes
missing anchor tags on Interactions rows in company, person, and contract
detail pages.

#31
feat(stories): full CRUD routes, handlers, and templates (closes #26)
All checks were successful
Build and Test / build (pull_request) Successful in 3m57s
7a1ee4cdee
Add stories as a first-class entity in the UI: list, detail, create,
and edit views with project/milestone/assignee dropdowns, story-points
field with tooltip, acceptance-criteria textarea, and linked tasks on
the detail page. Stories nav entry added under Projects in the sidebar.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
feat(kanban): add drag-and-drop task status update and project filter
All checks were successful
Build and Test / build (pull_request) Successful in 4m53s
9e796a9047
#27
feat(progress): auto-calculate progress from task completion across all views
All checks were successful
Build and Test / build (pull_request) Successful in 4m7s
e5261a5923
Computed progress replaces stored progress fields in all views that display
project or milestone progress bars: project list, milestone list, projects
dashboard, project detail (milestone rows), and person detail (milestone rows).
Progress is derived as done/closed tasks divided by total tasks per entity.

#30
- Fix 10 clippy errors blocking -D warnings: ptr_arg, too_many_arguments,
  field_reassign_with_default (4x), never_loop, empty_line_after_doc_comment
- Convert mut Default::default() + field reassignment to struct initializer
  syntax for Project, Milestone, Task, and Story saves
- Change while-let to if-let in file upload handler (loop never iterated)
- Fix PersonDetailTemplate passing "persons" instead of "contacts" to
  render_source_footer_with_links, causing edit button to link to /persons/{id}/edit
- Fix ContactDetailTemplate passing "contacts" instead of "interactions",
  causing edit button to link to /contacts/{id}/edit on interaction detail pages
- Update no_links guard in components.rs to match renamed "contacts" entity type

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Collapse nested if-let/if into let-chains, replace .map(|s| *s) with
.copied(), and use strip_prefix instead of starts_with + manual slicing.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
#35
feat(tasks): add deal_sid field and wire into task create/update handlers
All checks were successful
Build and Test / build (pull_request) Successful in 4m55s
e4cdc2e591
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace the base_currency heuristic and cross-currency scalar sums with
per-currency HashMaps so Invested, Repaid, Income, and Net Position cards
each show one line per currency. Fix by_company and by_type groupings to
use nested HashMaps instead of first-seen currency. ROI is suppressed when
multiple currencies are present.

#36
feat(contacts): add PersonCompanyLink model and many-to-many contact-company relationships
All checks were successful
Build and Test / build (pull_request) Successful in 4m33s
d6f9b1dc12
Introduce PersonCompanyLink join model for tracking contacts across
multiple companies with role and status. Wire into services, handlers,
and templates; update Person and Project models with related fields.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
fix(contacts): fix form serialization and merge company contacts display
All checks were successful
Build and Test / build (pull_request) Successful in 3m59s
1a125e913d
Use JSON-encoded hidden field for link rows to avoid Axum Vec<String>
deserialization failure on single-row forms. Move link collection into
collectRoles() so it fires on the correct form submit event.

Merge linked contacts into the existing Contacts table on company detail
page (Name/Role/Status columns) instead of a separate card, eliminating
duplicate entries.

#38
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
fix(security): validate path components to prevent directory traversal
All checks were successful
Build and Test / build (pull_request) Successful in 3m58s
0a24041307
Adds validate_path_component() helper that rejects any user-supplied
string not matching [a-zA-Z0-9_-]+ before it is joined into a
filesystem path. Applied to save_chat_message, save_upload, link_dir
and delete_person_company_link (including the link_sid parameter).
link_dir return type changed to Result<PathBuf> to propagate errors.

#41
fix: logging compliance, ui.sock→web.sock, add PURPOSE.md, update README for nushell
Some checks failed
Build and Test / build (pull_request) Failing after 1m28s
a1c9bb3176
fix(security): return HTTP 400 when link_sid fails path validation in person_link_delete
Some checks failed
Build and Test / build (pull_request) Failing after 1m1s
2b5eb2751a
#42
- task_update_status and person_link_delete lacked CookieJar extractor
  and get_session() check; unauthenticated requests could update task
  status or delete person-company links
- Binary renamed back from hero_biz_admin to hero_biz_ui so service_biz
  start can locate the built artifact
- Socket path restored from admin.sock to ui.sock to match service_biz.nu
  health check and socket presence assertions

#43
fix(services): round-trip function_title and deal_sid via tagged fields
Some checks failed
Build and Test / build (pull_request) Failing after 1m28s
6387be828b
Extract function_title from Person tags on load and re-inject on save;
same pattern for deal_sid on Task. Prevents data loss when the Store
serialises these fields back to OSIS.
fix(build): resolve three compilation failures from a1c9bb3 logging rewrite
All checks were successful
Build and Test / build (pull_request) Successful in 5m15s
c8ed48df13
1. axum version conflict: a1c9bb3 bumped axum 0.7→0.8 in hero_biz_ui/Cargo.toml
   but axum-extra 0.9 and askama_axum 0.4 both pair with axum 0.7, causing
   120+ Handler/IntoResponseParts trait errors. Revert to axum 0.7 until
   axum-extra and askama_axum are upgraded together in a dedicated effort.

2. Arc<Arc<Logger>> double-wrap: Logger::new() already returns Arc<Logger>,
   so the Arc::new(logger) in both logging.rs and hero_biz/main.rs produced
   Arc<Arc<Logger>>, failing the Arc<Logger> return type annotation.

3. Stale init_logger call: server.rs called crate::logging::init_logger()
   which no longer exists after the logging rewrite renamed it to
   init_hero_log(). Also removed as duplicate — main.rs already initialises
   the subscriber before create_router() is called.

#44
- Rename [[bin]] hero_biz_ui → hero_biz_admin in crates/hero_biz_ui/Cargo.toml
- Change socket ui.sock → admin.sock in hero_biz_ui/src/main.rs (function + comments)
- Update crates/hero_biz/src/main.rs: ui binary reference hero_biz_ui → hero_biz_admin,
  socket path "web" → "admin", action name hero_biz_ui → hero_biz_admin
- Remove Makefile and scripts/build_lib.sh (Hero services use nu shell scripts only)
- Rewrite README.md removing all bash/make references; nu shell commands only
- Fix PURPOSE.md socket table: remove stale hero_biz_ui/web.sock entry

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
upgrade deps to canonical versions and migrate axum routes
Some checks failed
Build and Test / build (pull_request) Failing after 9s
965a47fcb0
- axum 0.7 → 0.8 (route syntax :param → {param}, default-features off)
- tower 0.4 → 0.5, tower-http 0.5 → 0.6
- axum-extra 0.9 → 0.10
- askama 0.12 + askama_axum 0.4 → askama 0.16 with-axum feature
- reqwest 0.12 → 0.13 with rustls-tls
- gloo-net 0.6 → 0.7, gloo-timers 0.3 → 0.4
- add rust-version = "1.95.0" to workspace.package
- remove buildenv.sh

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
rename crate hero_biz_ui → hero_biz_admin to match binary naming
Some checks failed
Build and Test / build (pull_request) Failing after 13s
0596597b53
The crate directory, package name, and lib name are updated from
hero_biz_ui to hero_biz_admin. All references in source files,
workspace Cargo.toml, and documentation are updated accordingly.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
despiegk closed this pull request 2026-05-08 05:48:38 +00:00
Some checks failed
Build and Test / build (pull_request) Failing after 13s

Pull request closed

Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
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_biz!21
No description provided.