v1.0 customer-readiness gate (post-D-26) #18

Closed
opened 2026-05-23 12:18:57 +00:00 by mik-tf · 2 comments
Owner

Tracks the v1.0 readiness criteria against the post-D-26 Askama + Unpoly + SSE stack. Supersedes the closed v0.2.0 / v0.3.1 customer-readiness gate at #7, whose scope (Dioxus desktop walkthrough plus the 4-port browser-deployable scheme) D-26 retired.

Acceptance:

  • CLI orchestrator (hero_assistance --start) spawns the three long-running daemons (closed via #16, squash-merged as 49ea76a7)
  • _admin and _ui health checks stop restart-looping the daemons so they stay alive between probes (closed via #21, squash-merged as ee2be7d3 — switched both action specs from http_url: "http://localhost/health" to openrpc_socket: Some(<their UDS path>) mirroring _server's working pattern; live verify confirmed all 3 daemons stayed in running phase for 5.5 minutes under hero_proc with the same PIDs)
  • Operator Admin tab loads. The ui.* interception on _admin's /rpc proxy was already in place at crates/hero_assistance_admin/src/routes.rs lines 198-257; the missing piece was hero_router routing /<service>/admin/rpc to _admin's admin.sock instead of _server's rpc.sock. Closed via hero_router commit 0682283 on development (see lhumina_code/hero_router#109). Live curl through the router now returns the AdminList JSON correctly.
  • Operator Logs tab points at hero_proc, not _server (closed via hero_website_framework lhumina_code/hero_website_framework#7, squash-merged as f7540ae5 — added logs-rpc-url attribute on <hero-logs-viewer> defaulting to /hero_proc/rpc; followed by hero_assistance commit 9566c70 dropping the explicit rpc-url override on the admin template so the new default kicks in)
  • Operator Docs tab respects host data-bs-theme (closed via hero_website_framework lhumina_code/hero_website_framework#8, squash-merged as f7540ae5 — swept 37 --bg-* / --text-* / --border-color custom-property references in <hero-api-docs> to Bootstrap 5.3 tokens --bs-body-bg / --bs-secondary-bg / --bs-tertiary-bg / --bs-body-color / --bs-secondary-color / --bs-border-color so the chrome flips with data-bs-theme; 16 brand --accent-* references intentionally left as-is)
  • docs/dev/e2e_checklist.md Sections A through D row bodies rewritten against the Askama + Unpoly + SSE shape (closed via PR #24, squash-merged as 0221fe19 — Sections A, B, C, D, E all re-cited; SPA-only behaviours flip to a new [skip: D-26-RETIRED] REASON registered in the row-state schema; wire-level rows stay green throughout since the OpenRPC surface is byte-stable through D-26)
  • docs/dev/e2e_checklist.md Sections F, G, H, I, M reviewed and either rewritten or removed (closed via PR #24, squash-merged as 0221fe19 — F shrunk from 20 to 6 rows (server-side multipart upload + GET + claim/cleanup only); G, H, I, M removed entirely with row IDs catalogued in a new Retired sections appendix per process invariant 4; original row tables preserved inside HTML comment blocks at their original positions for git-history traceability; Section K rows touching phase13_demo.sh / 4-port browser scheme / e2e_journey shell rewritten against lab service hero_assistance --install --start + the router-fronted URLs; K-18 / L-06 flipped from skip to fully green since L-06 was closed at s34)
  • README.md and docs/dev/e2e_checklist.md dead links to decisions/D-NN-*.md and limitations/L-NN-*.md cleaned up (closed via PR #24, squash-merged as 0221fe19 — 7 dead links in README converted to plain-text decision/limitation name references with the s2-021 Phase-Z survival path documented inline; 3 live inline link refs in e2e_checklist also converted; historic audit-log entries left untouched since they record state-at-the-time)
  • Live Rule-6 walkthrough of customer enrol, file ticket, and cross-tab SSE conversation against a router-fronted deployment, with stamps in the rewritten checklist (closed via PR #25, squash-merged as 3b66a1a)

Walkthrough today (2026-05-23) confirmed the customer UI itself is operationally functional: enrolment loads, ticket list renders, ticket detail page wires the /tickets/{id}/_messages SSE channel which gates correctly on identity. The router fix landed today unblocks the operator-admin half. The remaining open item is the final Rule-6 walkthrough — queued for s2-028 (next session).

Doc-rewrite outcome (post-PR #24): e2e_checklist.md 698 → 687 lines; row inventory 315 → 247 live rows with 79 retired IDs catalogued in the appendix. Pre-merge gate clean (cargo fmt + clippy --release --workspace --all-targets -- -D warnings + build --workspace --release); test posture 255 pass / 2 fail / 14 ignored byte-stable vs s2-026 baseline (both fails documented pre-existing flakes).

Closes: nothing automatically. This is a tracker; each acceptance row closes via its own fix-out commit.

See also the meta alignment issue #15 for the Phase A through E history that landed the post-D-26 stack.

Final-walkthrough outcome (post-PR #25): All 3 daemons stable 9:24+ minutes under hero_proc supervision, exceeding the s2-025 UDS-connect-probe 5.5-min baseline. Customer cross-tab SSE conversation proven decisively via two router-fronted SSE subscribers (Alice + Bob via X-Hero-User on GET /hero_assistance/app/tickets/1/_messages) plus three sequential comment.create posts; both subscribers received event/id/data frames for every comment with D-20 viewpoint customisation manifesting as own-class plus you for author vs user #N for non-author on the same broadcast envelope. D-27 wire shape intact end-to-end. Operator 8-tab admin walk via headless hero_browser MCP confirmed three earlier closures live: ui.getAccessList resolves cleanly (hero_router#109 fix), Logs hits /hero_proc/rpc by default (hero_website_framework#7), Docs chrome flips with data-bs-theme (hero_website_framework#8). Acceptance: 9 of 9 rows ticked. v1.0 tag follows.

Tracks the v1.0 readiness criteria against the post-D-26 Askama + Unpoly + SSE stack. Supersedes the closed v0.2.0 / v0.3.1 customer-readiness gate at #7, whose scope (Dioxus desktop walkthrough plus the 4-port browser-deployable scheme) D-26 retired. Acceptance: - [x] CLI orchestrator (`hero_assistance --start`) spawns the three long-running daemons (closed via #16, squash-merged as 49ea76a7) - [x] `_admin` and `_ui` health checks stop restart-looping the daemons so they stay alive between probes (closed via #21, squash-merged as ee2be7d3 — switched both action specs from `http_url: "http://localhost/health"` to `openrpc_socket: Some(<their UDS path>)` mirroring `_server`'s working pattern; live verify confirmed all 3 daemons stayed in `running` phase for 5.5 minutes under hero_proc with the same PIDs) - [x] Operator Admin tab loads. The `ui.*` interception on `_admin`'s `/rpc` proxy was already in place at `crates/hero_assistance_admin/src/routes.rs` lines 198-257; the missing piece was hero_router routing `/<service>/admin/rpc` to `_admin`'s `admin.sock` instead of `_server`'s `rpc.sock`. Closed via hero_router commit 0682283 on `development` (see https://forge.ourworld.tf/lhumina_code/hero_router/issues/109). Live curl through the router now returns the AdminList JSON correctly. - [x] Operator Logs tab points at hero_proc, not `_server` (closed via hero_website_framework https://forge.ourworld.tf/lhumina_code/hero_website_framework/issues/7, squash-merged as f7540ae5 — added `logs-rpc-url` attribute on `<hero-logs-viewer>` defaulting to `/hero_proc/rpc`; followed by hero_assistance commit 9566c70 dropping the explicit `rpc-url` override on the admin template so the new default kicks in) - [x] Operator Docs tab respects host `data-bs-theme` (closed via hero_website_framework https://forge.ourworld.tf/lhumina_code/hero_website_framework/issues/8, squash-merged as f7540ae5 — swept 37 `--bg-*` / `--text-*` / `--border-color` custom-property references in `<hero-api-docs>` to Bootstrap 5.3 tokens `--bs-body-bg` / `--bs-secondary-bg` / `--bs-tertiary-bg` / `--bs-body-color` / `--bs-secondary-color` / `--bs-border-color` so the chrome flips with `data-bs-theme`; 16 brand `--accent-*` references intentionally left as-is) - [x] `docs/dev/e2e_checklist.md` Sections A through D row bodies rewritten against the Askama + Unpoly + SSE shape (closed via PR #24, squash-merged as 0221fe19 — Sections A, B, C, D, E all re-cited; SPA-only behaviours flip to a new `[skip: D-26-RETIRED]` REASON registered in the row-state schema; wire-level rows stay green throughout since the OpenRPC surface is byte-stable through D-26) - [x] `docs/dev/e2e_checklist.md` Sections F, G, H, I, M reviewed and either rewritten or removed (closed via PR #24, squash-merged as 0221fe19 — F shrunk from 20 to 6 rows (server-side multipart upload + GET + claim/cleanup only); G, H, I, M removed entirely with row IDs catalogued in a new Retired sections appendix per process invariant 4; original row tables preserved inside HTML comment blocks at their original positions for git-history traceability; Section K rows touching `phase13_demo.sh` / 4-port browser scheme / e2e_journey shell rewritten against `lab service hero_assistance --install --start` + the router-fronted URLs; K-18 / L-06 flipped from skip to fully green since L-06 was closed at s34) - [x] `README.md` and `docs/dev/e2e_checklist.md` dead links to `decisions/D-NN-*.md` and `limitations/L-NN-*.md` cleaned up (closed via PR #24, squash-merged as 0221fe19 — 7 dead links in README converted to plain-text decision/limitation name references with the s2-021 Phase-Z survival path documented inline; 3 live inline link refs in e2e_checklist also converted; historic audit-log entries left untouched since they record state-at-the-time) - [x] Live Rule-6 walkthrough of customer enrol, file ticket, and cross-tab SSE conversation against a router-fronted deployment, with stamps in the rewritten checklist (closed via PR #25, squash-merged as 3b66a1a) Walkthrough today (2026-05-23) confirmed the customer UI itself is operationally functional: enrolment loads, ticket list renders, ticket detail page wires the `/tickets/{id}/_messages` SSE channel which gates correctly on identity. The router fix landed today unblocks the operator-admin half. The remaining open item is the final Rule-6 walkthrough — queued for s2-028 (next session). **Doc-rewrite outcome (post-PR #24):** e2e_checklist.md 698 → 687 lines; row inventory 315 → 247 live rows with 79 retired IDs catalogued in the appendix. Pre-merge gate clean (cargo fmt + clippy --release --workspace --all-targets -- -D warnings + build --workspace --release); test posture 255 pass / 2 fail / 14 ignored byte-stable vs s2-026 baseline (both fails documented pre-existing flakes). Closes: nothing automatically. This is a tracker; each acceptance row closes via its own fix-out commit. See also the meta alignment issue #15 for the Phase A through E history that landed the post-D-26 stack. **Final-walkthrough outcome (post-PR #25):** All 3 daemons stable 9:24+ minutes under hero_proc supervision, exceeding the s2-025 UDS-connect-probe 5.5-min baseline. Customer cross-tab SSE conversation proven decisively via two router-fronted SSE subscribers (Alice + Bob via X-Hero-User on GET /hero_assistance/app/tickets/1/_messages) plus three sequential comment.create posts; both subscribers received event/id/data frames for every comment with D-20 viewpoint customisation manifesting as own-class plus you for author vs user #N for non-author on the same broadcast envelope. D-27 wire shape intact end-to-end. Operator 8-tab admin walk via headless hero_browser MCP confirmed three earlier closures live: ui.getAccessList resolves cleanly (hero_router#109 fix), Logs hits /hero_proc/rpc by default (hero_website_framework#7), Docs chrome flips with data-bs-theme (hero_website_framework#8). Acceptance: 9 of 9 rows ticked. v1.0 tag follows.
mik-tf reopened this issue 2026-05-23 17:35:55 +00:00
Author
Owner

PR #24 merge auto-closed this issue because the merge commit body opened with Closes #18 rows 6, 7, 8 — Forgejo parsed Closes #18 as a full-issue close trigger and ignored the rows 6, 7, 8 qualifier. Reopened just now; row 9 (final live Rule-6 walkthrough + v1.0 tag) remains queued for s2-028. Body PATCH ticked rows 6, 7, 8 with SHA 0221fe19; 8 of 9 acceptance rows now done.

PR #24 merge auto-closed this issue because the merge commit body opened with `Closes #18 rows 6, 7, 8` — Forgejo parsed `Closes #18` as a full-issue close trigger and ignored the `rows 6, 7, 8` qualifier. Reopened just now; row 9 (final live Rule-6 walkthrough + v1.0 tag) remains queued for s2-028. Body PATCH ticked rows 6, 7, 8 with SHA `0221fe19`; 8 of 9 acceptance rows now done.
Author
Owner

Closing v1.0 customer-readiness gate. All 9 acceptance rows ticked.

Final walkthrough (2026-05-23, post-PR #25 3b66a1a)

Stack brought up via lab service hero_assistance --install --start. Three daemons (_server, _admin, _ui) stable 9:24+ minutes under hero_proc with same PIDs throughout, which exceeds the 5.5-minute UDS-connect-probe stability baseline from PR #22.

Customer cross-tab SSE conversation proven decisively. Two router-fronted SSE subscribers (Alice and Bob via X-Hero-User on GET /hero_assistance/app/tickets/1/_messages) plus three sequential comment.create posts (Alice id=1, Bob id=2, Carol id=3) via POST /hero_assistance/app/rpc. Both Alice and Bob received event: message frames with monotonic id: <seq> and data: payload containing the Askama-rendered

  • fragment for every comment. The D-20 per-recipient privacy invariant manifested as viewpoint-customised rendering: own-class plus you for the author's own message vs default-class plus user #N for non-author viewers on the same broadcast envelope. D-27 wire shape (event, id, data lines plus match_ticket_message pure-function filter) intact end-to-end.

    Operator 8-tab admin walk via headless hero_browser MCP rendered against the post-D-26 Askama plus hero_admin_lib shell. Three earlier closures verified live:

    • Admin tab resolves ui.getAccessList cleanly and renders the ADMIN_SECRETS whitelist (2 entries: 192.0.2.10 and 127.0.0.1) plus Maintenance controls (hero_router#109 fix live)
    • Logs tab is hitting /hero_proc/rpc by default with multi-service log rows visible (hero_website_framework#7 fix live; hero_website_framework#10 schema mismatch reproduces with empty content and timestamp columns, non-blocking cosmetic gap)
    • Docs tab chrome flips with data-bs-theme dark to light to dark (hero_website_framework#8 fix live)

    Customer-side /hero_assistance/app/ renders the ticket list and ticket detail (/tickets/1) with all 3 newly-posted comments persisted, rendered, and the inline EventSource(...) wiring present in HTML. Console emits zero errors on the ticket detail page.

    Doc stamps landed in PR #25 (e2e_checklist.md +12/-8). Audit-log entry plus 8 Human? stamps on the rows the walkthrough directly proved (M1-C-19, M1-C-20, M1-D-4, M1-D-5, M1-D-8, M1-D-14, M1-K-1, M1-K-20).

    v1.0 tag follows on development at 3b66a1a.

  • Closing v1.0 customer-readiness gate. All 9 acceptance rows ticked. **Final walkthrough (2026-05-23, post-PR #25 3b66a1a)** Stack brought up via `lab service hero_assistance --install --start`. Three daemons (_server, _admin, _ui) stable 9:24+ minutes under hero_proc with same PIDs throughout, which exceeds the 5.5-minute UDS-connect-probe stability baseline from PR #22. Customer cross-tab SSE conversation proven decisively. Two router-fronted SSE subscribers (Alice and Bob via X-Hero-User on GET /hero_assistance/app/tickets/1/_messages) plus three sequential comment.create posts (Alice id=1, Bob id=2, Carol id=3) via POST /hero_assistance/app/rpc. Both Alice and Bob received `event: message` frames with monotonic `id: <seq>` and `data:` payload containing the Askama-rendered <li> fragment for every comment. The D-20 per-recipient privacy invariant manifested as viewpoint-customised rendering: own-class plus you for the author's own message vs default-class plus user #N for non-author viewers on the same broadcast envelope. D-27 wire shape (event, id, data lines plus match_ticket_message pure-function filter) intact end-to-end. Operator 8-tab admin walk via headless hero_browser MCP rendered against the post-D-26 Askama plus hero_admin_lib shell. Three earlier closures verified live: - Admin tab resolves ui.getAccessList cleanly and renders the ADMIN_SECRETS whitelist (2 entries: 192.0.2.10 and 127.0.0.1) plus Maintenance controls (hero_router#109 fix live) - Logs tab is hitting /hero_proc/rpc by default with multi-service log rows visible (hero_website_framework#7 fix live; hero_website_framework#10 schema mismatch reproduces with empty content and timestamp columns, non-blocking cosmetic gap) - Docs tab chrome flips with data-bs-theme dark to light to dark (hero_website_framework#8 fix live) Customer-side /hero_assistance/app/ renders the ticket list and ticket detail (/tickets/1) with all 3 newly-posted comments persisted, rendered, and the inline EventSource(...) wiring present in HTML. Console emits zero errors on the ticket detail page. Doc stamps landed in PR #25 (e2e_checklist.md +12/-8). Audit-log entry plus 8 Human? stamps on the rows the walkthrough directly proved (M1-C-19, M1-C-20, M1-D-4, M1-D-5, M1-D-8, M1-D-14, M1-K-1, M1-K-20). v1.0 tag follows on development at 3b66a1a.
    Sign in to join this conversation.
    No labels
    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_assistance#18
    No description provided.