diff --git a/docs/REVIEWER_TRUST_MAP.md b/docs/REVIEWER_TRUST_MAP.md index 81573189..cbee89f8 100644 --- a/docs/REVIEWER_TRUST_MAP.md +++ b/docs/REVIEWER_TRUST_MAP.md @@ -28,7 +28,7 @@ Recommended first paths: - I want the shortest public-facing overview: start with [`EXECUTIVE_SUMMARY.md`](EXECUTIVE_SUMMARY.md), then use [`PRODUCTION_READINESS_SUMMARY.md`](PRODUCTION_READINESS_SUMMARY.md) for the production-candidate snapshot, [`SRE_DEMO_HIGHLIGHTS.md`](SRE_DEMO_HIGHLIGHTS.md) for the product-value/guardrail one-pager, and [`DEMO_WALKTHROUGH.md`](DEMO_WALKTHROUGH.md) for a local demo script. - I want to verify tests and coverage: start with [`TESTING_COVERAGE.md`](TESTING_COVERAGE.md), then inspect the `jacoco-coverage-report` workflow artifact and CI skipped-test log output. - I want to verify real HTTP proxy behavior: start with [`REVERSE_PROXY_MODE.md`](REVERSE_PROXY_MODE.md), [`REVERSE_PROXY_HEALTH_AND_METRICS.md`](REVERSE_PROXY_HEALTH_AND_METRICS.md), [`REVERSE_PROXY_RESILIENCE.md`](REVERSE_PROXY_RESILIENCE.md), [`PROXY_OPERATOR_STATUS_UI.md`](PROXY_OPERATOR_STATUS_UI.md), the source-visible `LocalOnlyRealBackendProxyValidationTest`, and the reviewer export from `LocalProxyEvidenceExportTest` under `target/proxy-evidence/local-proxy-evidence.md`. -- I want to inspect request-level routing decisions: open `/routing-demo.html` and use the Reviewer Workflow Checklist, Evidence Associations, Association Legend, Routing Proof Summary, Scenario Comparison, Reviewer Confidence Signals, and Evidence Navigation reviewer path for selected scenario-to-decision mapping, selected strategy/backend, scenario-to-scenario what-changed notes, visible input signal deltas, unhealthy-candidate degradation/recovery notes, local verification commands, routing-to-evidence dashboard links, copyable association summary, an end-to-end reviewer walkthrough, and explicit not-proven limits. +- I want to inspect request-level routing decisions: open `/routing-demo.html` and use the Enterprise Lab Cockpit Monitor, How This Routing Decision Was Made, What This Lab Needs to Monitor, How to Reproduce and Explain This Lab Proof, How to Read Lab Edge Cases, Reviewer Workflow Checklist, Evidence Associations, Association Legend, Routing Proof Summary, Scenario Comparison, Reviewer Confidence Signals, and Evidence Navigation reviewer path for selected scenario-to-decision mapping, selected strategy/backend, scenario-to-scenario what-changed notes, visible input signal deltas, unhealthy-candidate degradation/recovery notes, local verification commands, routing-to-evidence dashboard links, copyable lab monitor explanation, copyable association summary, an end-to-end reviewer walkthrough, and explicit not-proven limits. - I want to run local proxy demos: start with [`PROXY_DEMO_STACK.md`](PROXY_DEMO_STACK.md), [`PROXY_DEMO_FIXTURE_LAUNCHER.md`](PROXY_DEMO_FIXTURE_LAUNCHER.md), and [`PROXY_STRATEGY_DEMO_LAB.md`](PROXY_STRATEGY_DEMO_LAB.md). - I want to adapt proxy mode to local/private backends: start with [`REAL_BACKEND_PROXY_EXAMPLES.md`](REAL_BACKEND_PROXY_EXAMPLES.md). - I want to choose the right run profile: start with [`OPERATOR_RUN_PROFILES.md`](OPERATOR_RUN_PROFILES.md) for local demo, packaged jar, prod API-key, cloud-sandbox API-key, OAuth2, proxy-loopback, and container recipes. @@ -61,7 +61,7 @@ Recommended first paths: | Page | Reviewer question it answers | Local API/path reference | | --- | --- | --- | -| `/routing-demo.html` | How do selected routing decisions, scenario deltas, evidence associations, and routing-to-evidence reviewer links fit together? | `POST /api/routing/compare`, static links to `/load-balancing-cockpit.html`, `/enterprise-lab-reviewer.html`, `/operator-evidence-dashboard.html`, `/evidence-timeline.html`, and `/evidence-export-packet.html` | +| `/routing-demo.html` | How does the Enterprise Lab cockpit monitor selected routing decisions, scenario deltas, evidence associations, edge cases, and routing-to-evidence reviewer links? | `POST /api/routing/compare`, static links to `/load-balancing-cockpit.html`, `/enterprise-lab-reviewer.html`, `/operator-evidence-dashboard.html`, `/evidence-timeline.html`, and `/evidence-export-packet.html` | | `/enterprise-lab-reviewer.html` | What is the posture and readiness summary? | `GET /api/enterprise-lab/reviewer-summary` | | `/operator-evidence-dashboard.html` | Where are local/CI evidence paths, smoke outputs, and verification commands? | `GET /api/enterprise-lab/operator-evidence-summary` | | `/evidence-timeline.html` | How do evidence stages and run templates compare across repeated runs? | `GET /api/enterprise-lab/evidence-timeline` | @@ -73,15 +73,23 @@ These pages are browser-local/static/read-only reviewer surfaces. They do not up ### Routing Cockpit Reviewer Workflow -Use `/routing-demo.html` when request-level routing proof is the reviewer starting point. The page now gives reviewers a compact workflow: load sample scenario, run routing comparison, inspect Routing Proof Summary, compare scenario deltas, follow Evidence Navigation links, copy reviewer proof note, and export/print packet from `/evidence-export-packet.html`. +Use `/routing-demo.html` when request-level routing proof is the reviewer starting point. The page now gives reviewers a compact workflow: load controlled lab scenario, run routing comparison, inspect Routing Proof Summary, compare scenario deltas, follow Evidence Navigation links, copy reviewer proof note, and export/print packet from `/evidence-export-packet.html`. -Reviewer Confidence Signals on the routing page summarize local repeatability, deterministic sample scenarios, same-origin API usage, static browser-only notes/copy actions, and the not-production-certified boundary. The end-to-end reviewer walkthrough is browser-local copy text only: no upload/share endpoint, no server-side export/PDF/ZIP generation, no production traffic proof, no live cloud proof, no real tenant proof, no registry publication proof, and no container signing proof. +Reviewer Confidence Signals on the routing page summarize local repeatability, deterministic lab scenarios, same-origin API usage, static browser-only notes/copy actions, and the not-production-certified boundary. The end-to-end reviewer walkthrough is browser-local copy text only: no upload/share endpoint, no server-side export/PDF/ZIP generation, no production traffic proof, no production telemetry proof, no live cloud proof, no real tenant proof, no registry publication proof, and no container signing proof. + +### Enterprise Lab Cockpit Monitoring and How-Question Guide + +Use `/routing-demo.html` as a strict Enterprise Lab proof cockpit, not a casual demo page. The cockpit monitors active lab scenario, routing comparison request status, selected strategy, selected backend/server, backend health state, visible latency/load/active connection/capacity/weight-style signals, scenario delta state, degradation/fallback/recovery state, evidence association path, reviewer handoff readiness, local lab boundary, and production proof gaps. + +The how-question panels answer how the selected backend was chosen, how strategy choice influenced the result, how visible lab input signals affect the proof, how unchanged backend/changed signals and changed backend/same strategy cases should be interpreted, how unhealthy/degraded/recovery states are represented, how to reproduce and explain the local lab proof, and how evidence pages support reviewer handoff. The copyable lab monitor explanation is browser-local text only and is bounded to controlled lab evidence, same-origin local API responses, visible page state, static evidence links, and no telemetry. + +This strict lab cockpit does not prove production traffic, production telemetry, live cloud behavior, real tenant behavior, SLA/SLO achievement, registry publication, container signing, governance-applied status, or production certification. It also does not create upload/share endpoints or server-side export/PDF/ZIP files. ### Cockpit Evidence Associations Use the Evidence Associations panel on `/routing-demo.html` to connect selected scenario -> routing decision -> selected strategy/backend -> key input signals -> scenario comparison delta -> supporting evidence pages -> export packet/reviewer handoff. The copyable evidence association summary is browser-local text only and stays bounded to visible page state, same-origin local API results, and static evidence page links. -The Association Legend keeps the proof language readable: scenario = demo input state, strategy = selected routing method, backend/server = selected local candidate from the sample response, signals = local/demo metrics used for explanation, and evidence pages = reviewer navigation aids, not production certification. This association map does not prove production traffic, live cloud behavior, real tenant behavior, registry publication, container signing, or production certification. +The Association Legend keeps the proof language readable: scenario = controlled lab input state, strategy = selected routing method, backend/server = selected local candidate from the lab response, signals = controlled lab metrics used for explanation, and evidence pages = reviewer navigation aids, not production certification. This association map does not prove production traffic, production telemetry, live cloud behavior, real tenant behavior, registry publication, container signing, or production certification. ## Reviewer Demo Path @@ -95,7 +103,7 @@ What can be proven quickly: 2. Operator evidence dashboard: open `http://localhost:8080/operator-evidence-dashboard.html` for local/CI evidence locations, smoke output paths, dry-run artifact metadata, and the local-only `GET /api/enterprise-lab/operator-evidence-summary` response. 3. Evidence timeline: open `http://localhost:8080/evidence-timeline.html` for local/CI evidence stages, generated evidence locations, the dry-run artifact name, and a reusable run template. 4. Evidence export packet: open `http://localhost:8080/evidence-export-packet.html` for the reviewer handoff checklist, packet template, reviewer packet share checklist, browser-local Markdown/JSON packet downloads, browser print/save-as-PDF styling, dashboard links, CI artifact name, not-proven boundaries, and the local-only `GET /api/enterprise-lab/evidence-export-packet` response. The downloads, print flow, and share checklist are generated in the browser and do not send, upload, or create server-side files, PDFs, or share artifacts. -5. Local routing/cockpit behavior: open `http://localhost:8080/routing-demo.html` for the Reviewer Workflow Checklist, Evidence Associations, Association Legend, Routing Proof Summary, Scenario Comparison, Reviewer Confidence Signals, Evidence Navigation reviewer path, selected scenario-to-decision mapping, selected strategy/backend, scenario-to-scenario what-changed notes, visible input signal deltas, degradation/recovery notes, local verification commands, routing-to-evidence dashboard links, copyable evidence association summary, copyable end-to-end reviewer walkthrough, and explicit not-proven boundaries; then open `http://localhost:8080/` and `http://localhost:8080/load-balancing-cockpit.html`. +5. Local routing/cockpit behavior: open `http://localhost:8080/routing-demo.html` for the Enterprise Lab Cockpit Monitor, How This Routing Decision Was Made, What This Lab Needs to Monitor, How to Reproduce and Explain This Lab Proof, How to Read Lab Edge Cases, Reviewer Workflow Checklist, Evidence Associations, Association Legend, Routing Proof Summary, Scenario Comparison, Reviewer Confidence Signals, Evidence Navigation reviewer path, selected scenario-to-decision mapping, selected strategy/backend, scenario-to-scenario what-changed notes, visible input signal deltas, degradation/recovery notes, local verification commands, routing-to-evidence dashboard links, copyable lab monitor explanation, copyable evidence association summary, copyable end-to-end reviewer walkthrough, and explicit not-proven boundaries; then open `http://localhost:8080/` and `http://localhost:8080/load-balancing-cockpit.html`. 6. Local proxy forwarding evidence: run `mvn -Dtest=LocalProxyEvidenceExportTest test`, then inspect `target/proxy-evidence/local-proxy-evidence.md` and `target/proxy-evidence/local-proxy-evidence.json`. 7. Private-network profile dry-run evidence: run `mvn -Dtest=PrivateNetworkProxyDryRunEvidenceTest test`, then inspect `target/proxy-evidence/private-network-validation-dry-run.md` and `target/proxy-evidence/private-network-validation-dry-run.json`. 8. Private-network live loopback proof: run `mvn -Dtest=PrivateNetworkLiveValidationExecutorTest test`, then inspect `target/proxy-evidence/private-network-live-loopback-validation.md` and `target/proxy-evidence/private-network-live-loopback-validation.json`. @@ -133,9 +141,10 @@ Safety boundaries preserved by this path: | Where is the visible operator evidence dashboard? | Static browser dashboard and local summary API | `/operator-evidence-dashboard.html`, `GET /api/enterprise-lab/operator-evidence-summary`, `src/main/resources/static/operator-evidence-dashboard.html` | Local/CI evidence paths, smoke output location, dry-run artifact metadata, verification commands, generated-output boundary, and not-proven limits | Operators can reproduce and inspect evidence without treating ignored `target/` output or CI artifacts as production certification | Production certification, registry publication, container signing, live cloud validation, real tenant proof, or GitHub settings mutation | | Where is the evidence timeline/history view? | Static browser dashboard and local summary API | `/evidence-timeline.html`, `GET /api/enterprise-lab/evidence-timeline`, `src/main/resources/static/evidence-timeline.html` | Evidence stages, generated evidence locations, dry-run artifact metadata, run template fields, and not-proven limits | Operators and reviewers can compare repeated evidence runs manually without inventing live telemetry or treating generated `target/` output as committed proof | Production certification, registry publication, container signing, live cloud validation, real tenant proof, live history telemetry, or GitHub settings mutation | | Where is the reviewer evidence export packet? | Static browser dashboard and local summary API | `/evidence-export-packet.html`, `GET /api/enterprise-lab/evidence-export-packet`, `src/main/resources/static/evidence-export-packet.html` | Reviewer handoff checklist, reviewer packet share checklist, browser-local Markdown/JSON downloads, browser print/save-as-PDF styling, copyable packet template, evidence paths, dashboard/API links, CI artifact metadata, not-proven boundaries, residual risks, and follow-up gates | Reviewers can assemble, download, print, or share-check a consistent human-readable handoff packet from existing local/CI evidence without server-side file creation, uploads, releases, signatures, registry publications, or production-readiness claims | Production certification, registry publication, container signing, live cloud validation, real tenant proof, server-side export/share artifact creation, or GitHub settings mutation | -| How do routing decisions connect to reviewer evidence pages? | Static browser routing demo association panels | `/routing-demo.html`, `RoutingDecisionDemoTest`, `src/main/resources/static/routing-demo.html` | Evidence Associations, Association Legend, copyable evidence association summary, selected scenario-to-decision mapping, selected strategy/backend mapping, key input signal mapping, scenario comparison delta, evidence page links, export packet handoff link, and local/demo-only not-proven boundaries | Reviewers can trace how a synthetic scenario, routing decision, selected backend, visible signals, scenario delta, evidence pages, timeline, and handoff packet relate without adding server-side exports or external calls | Production traffic proof, live cloud proof, real tenant proof, production certification, registry publication, container signing, upload/share endpoint behavior, or server-side export/PDF/ZIP generation | -| How should a reviewer walk the routing cockpit end-to-end? | Static browser routing demo workflow panels | `/routing-demo.html`, `RoutingDecisionDemoTest`, `src/main/resources/static/routing-demo.html` | Reviewer Workflow Checklist, Reviewer Confidence Signals, copyable end-to-end reviewer walkthrough, Evidence Navigation links, and local/demo-only not-proven boundaries | Reviewers can follow a repeatable local sequence from sample scenario to routing comparison, proof summary, scenario deltas, evidence dashboards, timeline, and evidence export packet without leaving static/browser-local surfaces | Production deployment certification, live cloud validation, real tenant traffic proof, production SLA/SLO evidence, upload/share endpoint behavior, server-side export/PDF/ZIP generation, registry publication, or container signing | -| How do routing proof scenarios compare? | Static browser routing demo and local compare API | `/routing-demo.html`, `RoutingDecisionDemoTest`, `src/main/resources/static/routing-demo.html` | Routing Proof Summary, Scenario Comparison, Evidence Associations, Evidence Navigation reviewer path, previous/current scenario names, selected strategy/backend delta, input signal deltas, degradation/recovery notes, routing-to-evidence dashboard links, copyable local reviewer summary, copyable evidence association summary, and copyable end-to-end reviewer walkthrough | Reviewers can compare the packaged normal-load baseline against edited local demo payloads using same-origin local API responses, browser-local copy text, and static links to the reviewer/operator/timeline/export packet pages | Production deployment certification, live cloud validation, real tenant traffic proof, production SLA/SLO evidence, server-side export/share artifact creation, registry publication, or container signing | +| How does the Enterprise Lab cockpit monitor and explain routing proof? | Strict local Enterprise Lab cockpit | `/routing-demo.html`, `RoutingDecisionDemoTest`, `src/main/resources/static/routing-demo.html` | Enterprise Lab Cockpit Monitor, How This Routing Decision Was Made, What This Lab Needs to Monitor, How to Reproduce and Explain This Lab Proof, How to Read Lab Edge Cases, copyable lab monitor explanation, selected strategy/backend, backend health state, visible latency/load/active connection/capacity/weight-style signals, scenario deltas, degradation/fallback/recovery state, evidence association path, and reviewer handoff readiness | Reviewers can interpret controlled lab routing proof, reproduce the same local lab evidence path, and explain edge cases before production claims are considered | No production traffic proof, no production telemetry proof, no live cloud proof, no real tenant proof, no SLA/SLO proof, no registry publication, no container signing, no governance-applied proof, no production certification, no upload/share endpoint behavior, and no server-side export/PDF/ZIP generation | +| How do routing decisions connect to reviewer evidence pages? | Static browser routing cockpit association panels | `/routing-demo.html`, `RoutingDecisionDemoTest`, `src/main/resources/static/routing-demo.html` | Evidence Associations, Association Legend, copyable evidence association summary, selected scenario-to-decision mapping, selected strategy/backend mapping, key input signal mapping, scenario comparison delta, evidence page links, export packet handoff link, and local lab-only not-proven boundaries | Reviewers can trace how a controlled lab scenario, routing decision, selected backend, visible signals, scenario delta, evidence pages, timeline, and handoff packet relate without adding server-side exports or external calls | Production traffic proof, production telemetry proof, live cloud proof, real tenant proof, production certification, registry publication, container signing, upload/share endpoint behavior, or server-side export/PDF/ZIP generation | +| How should a reviewer walk the routing cockpit end-to-end? | Static browser routing cockpit workflow panels | `/routing-demo.html`, `RoutingDecisionDemoTest`, `src/main/resources/static/routing-demo.html` | Reviewer Workflow Checklist, Reviewer Confidence Signals, copyable end-to-end reviewer walkthrough, Evidence Navigation links, and local lab-only not-proven boundaries | Reviewers can follow a repeatable local lab sequence from controlled lab scenario to routing comparison, proof summary, scenario deltas, evidence dashboards, timeline, and evidence export packet without leaving static/browser-local surfaces | Production deployment certification, live cloud validation, real tenant traffic proof, production SLA/SLO evidence, upload/share endpoint behavior, server-side export/PDF/ZIP generation, registry publication, or container signing | +| How do routing proof scenarios compare? | Static browser routing cockpit and local compare API | `/routing-demo.html`, `RoutingDecisionDemoTest`, `src/main/resources/static/routing-demo.html` | Routing Proof Summary, Scenario Comparison, Evidence Associations, Evidence Navigation reviewer path, previous/current scenario names, selected strategy/backend delta, input signal deltas, degradation/recovery notes, routing-to-evidence dashboard links, copyable local reviewer summary, copyable evidence association summary, and copyable end-to-end reviewer walkthrough | Reviewers can compare the packaged normal-load lab baseline against edited local lab payloads using same-origin local API responses, browser-local copy text, and static links to the reviewer/operator/timeline/export packet pages | No production deployment certification, no live cloud validation, no real tenant traffic proof, no production SLA/SLO evidence, no server-side export/share artifact creation, no registry publication, and no container signing | | What governance changes are prepared but manual? | Repo-side governance hardening packet | [`MANUAL_GITHUB_GOVERNANCE_HARDENING.md`](MANUAL_GITHUB_GOVERNANCE_HARDENING.md), [`../.github/CODEOWNERS`](../.github/CODEOWNERS) | CODEOWNERS coverage, current observed ruleset state, manual settings checklist, stale-review recommendation, and evidence expectations | Reviewers can see ownership and target governance decisions without assuming GitHub settings were changed | Applied ruleset mutation, required review enforcement, branch-protection mutation, or production governance certification | | Is this enterprise-ready? | Current enterprise-readiness audit | [`ENTERPRISE_READINESS_AUDIT.md`](ENTERPRISE_READINESS_AUDIT.md) | Current `main`/`v2.5.0` audit, GitHub ruleset and alert snapshot, Enterprise Lab transition decision, remaining gaps | Reviewers can distinguish Enterprise Lab readiness from production enterprise readiness | Production gateway certification, deployment approval, real IdP tenant proof, live cloud validation, or container signing | | Are tests and skipped-test checks visible? | CI Surefire parsing and coverage docs | [`TESTING_COVERAGE.md`](TESTING_COVERAGE.md) | CI logs, `target/surefire-reports`, `jacoco-coverage-report` | CI reports zero skipped tests and publishes coverage output for inspection | Complete behavioral proof for every deployment condition | diff --git a/src/main/resources/static/routing-demo.html b/src/main/resources/static/routing-demo.html index 398d969c..605c2d7f 100644 --- a/src/main/resources/static/routing-demo.html +++ b/src/main/resources/static/routing-demo.html @@ -293,11 +293,11 @@
-

Routing Decision Demo

+

Enterprise Lab Routing Proof Cockpit

- Compare LoadBalancerPro request-level routing strategies with safe packaged sample telemetry, - inspect selected servers, and copy a deterministic browser summary. This page calls the existing - local API only. + Monitor controlled lab routing decisions, inspect selected strategies and backends, trace visible + lab signals, and copy bounded reviewer explanations. This cockpit uses same-origin local APIs only. + It is an Enterprise Lab proof cockpit, not a casual demo page or production monitoring surface.

Copy status: idle.

@@ -305,13 +305,13 @@

Routing Decision Demo

-

Demo controls

+

Lab controls

- + - +
@@ -320,13 +320,13 @@

Demo controls

-
+
Health / readiness Not run
- Sample scenario + Lab scenario Not run
@@ -341,6 +341,79 @@

Demo controls

+
+
+

Enterprise Lab Cockpit Monitor

+
+ +
+
+
+

+ Strict local lab monitor for controlled scenario validation, reviewer trust, operator interpretation, + and pre-production evidence review. This is lab-bounded proof, not production monitoring. +

+
+
+ Active lab scenario +

No previous lab scenario has been captured yet.

+
+
+ Routing comparison request status +

Run Compare strategies to capture local lab API status.

+
+
+ Selected strategy +

Not run.

+
+
+ Selected backend/server +

Not run.

+
+
+ Backend health state +

Run Compare strategies to inspect selected backend health state.

+
+
+ Visible latency/load/connection/capacity signals +

Run Compare strategies to summarize visible lab signals.

+
+
+ Scenario delta state +

Run Compare strategies to compare lab scenario deltas.

+
+
+ Degradation/fallback/recovery state +

Static reviewer guidance remains available before a lab run.

+
+
+ Evidence association path +

+ /routing-demo.html -> /enterprise-lab-reviewer.html -> /operator-evidence-dashboard.html -> /evidence-timeline.html -> /evidence-export-packet.html +

+
+
+ Reviewer handoff readiness +

Reviewer packet handoff is browser-local; run the lab comparison before treating the proof note as ready.

+
+
+ Local lab boundary +

Controlled lab evidence only: same-origin local API responses, visible local payloads, and browser-local copy actions.

+
+
+ Production proof gaps +

No production traffic proof, production telemetry proof, live cloud proof, real tenant proof, SLA/SLO proof, registry publication proof, container signing proof, or production certification claim.

+
+
+

+ Copy boundary: the lab monitor explanation is assembled in the browser from visible local lab state only; + no server-side export/PDF/ZIP generation, no upload/share endpoint, no external calls, and no telemetry. +

+

Copyable lab monitor explanation

+
No previous lab scenario has been captured yet. Load a controlled lab scenario and run Compare strategies to generate the lab monitor explanation.
+
+
+

Reviewer Workflow Checklist

@@ -351,8 +424,8 @@

Reviewer Workflow Checklist

- 1. Load sample scenario -

Start with the packaged synthetic scenario so routing inputs are repeatable for review.

+ 1. Load controlled lab scenario +

Start with the packaged controlled lab scenario so routing inputs are repeatable for review.

2. Run routing comparison @@ -384,7 +457,7 @@

Reviewer Workflow Checklist

no server-side export/PDF/ZIP generation, and no external services.

Copyable end-to-end reviewer walkthrough

-
Load the sample scenario and run Compare strategies to generate the end-to-end reviewer walkthrough.
+
Load the controlled lab scenario and run Compare strategies to generate the end-to-end reviewer walkthrough.
@@ -397,10 +470,10 @@

Reviewer Confidence Signals

Local repeatability -

The page uses localhost commands and packaged synthetic inputs so reviewers can rerun the same local workflow.

+

The page uses localhost commands and packaged controlled lab inputs so reviewers can rerun the same local workflow.

- Deterministic sample scenarios + Deterministic lab scenarios

Packaged server names, weights, health states, load, and latency fields make the baseline scenario inspectable.

@@ -413,7 +486,7 @@

Reviewer Confidence Signals

Not-production-certified boundary -

Local/demo evidence only: no production traffic proof, no live cloud proof, no real tenant proof, no registry publication proof, and no container signing proof.

+

Controlled lab evidence only: no production traffic proof, no production telemetry proof, no live cloud proof, no real tenant proof, no registry publication proof, and no container signing proof.

@@ -430,7 +503,7 @@

Evidence Associations

Selected scenario -> routing decision -

Load the sample scenario and run Compare strategies to associate the visible scenario with a local routing decision.

+

Load the controlled lab scenario and run Compare strategies to associate the visible lab scenario with a local routing decision.

Routing decision -> selected strategy @@ -442,7 +515,7 @@

Evidence Associations

Selected backend/server -> key input signals -

Run Compare strategies to connect the selected backend/server to visible local/demo metrics.

+

Run Compare strategies to connect the selected backend/server to visible controlled lab metrics.

Scenario comparison -> what changed @@ -466,7 +539,7 @@

Evidence Associations

- Association boundary: local/demo evidence only; no production traffic proof, no live cloud proof, + Association boundary: controlled lab evidence only; no production traffic proof, no production telemetry proof, no live cloud proof, no real tenant proof, no registry publication proof, no container signing proof, and no production certification claim.

@@ -474,62 +547,158 @@

Evidence Associations

no upload/share endpoint, no server-side export/PDF/ZIP generation, and no external calls.

Copyable evidence association summary

-
Static guidance remains available before running a scenario. Evidence links are available even before running a scenario. Load the sample scenario and run Compare strategies to generate an evidence association summary.
+
Static reviewer guidance remains available before a lab run. Evidence links remain available before a lab run, but they do not certify production behavior. Load the controlled lab scenario and run Compare strategies to generate an evidence association summary.
-

How This Proof Works

- Reviewer/operator answers for common routing-proof questions. +

How This Routing Decision Was Made

+ Reviewer/operator answers for controlled lab routing-proof questions.
-
+
+
+ How was the selected backend chosen? +

The first returned comparison result is the primary controlled lab decision. It names the selected backend/server, includes returned reason text, and should be read against the visible candidate list.

+
+
+ How did the selected strategy influence the decision? +

The selected strategy applies its routing behavior to visible local lab candidates; exact production scoring is not claimed unless exposed by the API.

+
+
+ How did visible input signals influence the proof? +

The cockpit explains visible input signals from the local lab response: backend health, latency, load, active connections, capacity, weight, error rate, queue depth, and network-awareness fields when present.

+
- How the selected strategy affects the selected backend -

The first returned strategy is the primary local comparison result; its routing rule ranks the visible candidate servers and returns the selected backend/server plus reason text.

+ How should reviewers interpret close candidates? +

If multiple candidates appear close, compare returned reason text and visible signals; the cockpit explains observable lab evidence and does not invent hidden scoring.

- How input signals influence the routing proof -

Health, in-flight load, configured weight/capacity, p95 latency, error rate, queue depth, and network-awareness fields are summarized from the visible payload so reviewers can inspect why a backend was preferred or avoided.

+ How should unchanged backend with changed signals be read? +

The selected backend is unchanged, but visible lab signals changed; review the strategy reason and signal deltas before treating the result as equivalent.

- How scenario comparison deltas are summarized -

Deltas are browser-local summaries comparing packaged baseline metrics against the current editor payload: candidate count, healthy/unhealthy count, total in-flight load, max p95 latency, max error rate, and queue depth.

+ How should changed backend with same strategy be read? +

Backend changed but strategy stayed the same: visible health, load, latency, queue, capacity, or weight shifts can change which candidate the same strategy prefers.

- How degradation, unhealthy, and recovery states are represented -

Unhealthy backends are counted from healthy=false; all-unhealthy payloads are called out as a degradation boundary, while fewer unhealthy backends than the baseline are described as recovery.

+ How should changed strategy with same backend be read? +

Strategy changed but backend stayed the same: multiple strategies can still prefer the same controlled lab candidate.

- How to reproduce the same proof locally -

Run mvn spring-boot:run, open this page, load the sample scenario, run Compare strategies, and compare the visible response with the copyable curl and proof notes.

+ How are unhealthy/degraded backends represented? +

Unhealthy backends are counted from healthy=false; all-unhealthy payloads are treated as a degradation boundary, not production proof.

- How evidence pages relate to the proof -

The routing page explains the request-level decision; reviewer, operator, timeline, and export packet pages provide navigation, evidence locations, history context, and handoff text.

+ How does recovery change the evidence story? +

Recovery is represented when visible lab inputs show fewer unhealthy candidates or reduced pressure compared with the packaged baseline; it remains controlled lab evidence.

- How the copied association summary should be used -

Use the copied association summary as a reviewer note that points to visible local proof and evidence pages; it is not an audit artifact created by the server.

+ What can this controlled lab run prove? +

It can prove local reproducibility, same-origin compare API behavior, visible routing explanation, local scenario deltas, evidence association path, and browser-local reviewer handoff text.

- How local/demo proof differs from production proof -

Local/demo proof uses synthetic payloads, same-origin local API responses, and browser-local notes; it does not prove production traffic, live cloud behavior, real tenant behavior, registry publication, container signing, or production certification.

+ What can it not prove for production? +

It does not prove production traffic, production telemetry, live cloud behavior, real tenant behavior, SLA/SLO, registry publication, container signing, or production certification.

-

Edge-case reading guide

+

What This Lab Needs to Monitor

+
+
+ Backend health and availability +

Monitor healthy/unhealthy state, selected backend availability, and whether alternatives were avoided because they were unhealthy or degraded.

+
+
+ Latency, load, active connection, capacity, and weight signals +

Monitor p95 latency, in-flight load, queue depth, configured capacity, estimated concurrency, and weight when exposed by the local lab payload.

+
+
+ Overload, degradation, fallback, and recovery markers +

Monitor whether all backends are unhealthy, whether fallback guidance is visible, and whether scenario deltas show recovery from the baseline.

+
+
+ Selected strategy and selected backend/server +

Monitor the returned strategy/backend pair plus alternatives and reason text where the same-origin local API exposes it.

+
+
+ Scenario-to-scenario changes +

Monitor previous/current lab scenario names, strategy changes, backend changes, input signal changes, and degradation/recovery explanations.

+
+
+ Reproducibility, evidence association, and reviewer handoff +

Monitor whether reproduction steps, evidence association links, timeline, and export packet handoff are ready for reviewer use.

+
+
+ Production proof gaps +

These are the signals a lab cockpit should monitor before production claims are possible; this page does not claim live production telemetry exists.

+
+
+

How Strategy Choice Matters

+
+
+ Strategy affects routing behavior +

Strategy choice can alter how visible lab candidates are evaluated, but exact production scoring is not claimed unless exposed by the API.

+
+
+ Backend may remain unchanged when strategy changes +

The same backend can remain preferred if multiple strategies still select the same healthy local lab candidate.

+
+
+ Backend may change when signals change under the same strategy +

The same strategy can select a different backend when visible lab signals shift enough to change the preferred candidate.

+
+
+ Controlled lab guidance, not production certification +

Cockpit explanations are controlled lab guidance and reviewer evidence, not production certification.

+
+
+

How Evidence Supports the Decision

+
+
+ Routing Proof Summary shows the immediate controlled lab decision +

It shows selected strategy, selected backend/server, visible input signals, and local lab boundary for the current comparison.

+
+
+ Scenario Comparison shows controlled lab input changes +

It summarizes previous/current lab scenario names, strategy/backend deltas, signal deltas, and degradation or recovery notes.

+
+
+ Evidence Associations connect proof to reviewer pages +

Associations connect routing proof to reviewer dashboard, operator evidence dashboard, evidence timeline, and export packet handoff.

+
+
+ Timeline and export packet support local reviewer handoff +

The timeline shows evidence flow/history, and the export packet is a local reviewer handoff, not server-generated certification.

+
+
+

How to Reproduce and Explain This Lab Proof

+
    +
  1. Choose or load a controlled lab scenario.
  2. +
  3. Run routing comparison against the same-origin local /api/routing/compare endpoint.
  4. +
  5. Inspect selected strategy and selected backend/server.
  6. +
  7. Inspect visible input signals: health, latency, load, active connections, capacity, weight, errors, queue depth, and network-awareness fields when present.
  8. +
  9. Compare scenario deltas for strategy/backend changes, signal changes, and degradation/recovery interpretation.
  10. +
  11. Read lab edge-case and fallback guidance.
  12. +
  13. Follow evidence association links to reviewer dashboard, operator evidence dashboard, evidence timeline, and evidence export packet.
  14. +
  15. Copy proof, walkthrough, association, and lab monitor summaries from visible browser text.
  16. +
  17. Open timeline/export packet, then print/copy/export the browser-local reviewer packet.
  18. +
  19. Record what is proven in the lab and what is not proven for production.
  20. +
+

How to Read Lab Edge Cases

    -
  • No previous scenario has been captured yet; the packaged normal-load baseline remains the static reference.
  • -
  • Same scenario run twice or unchanged from baseline: strategy order and input signal totals should read as unchanged.
  • -
  • Selected backend unchanged but signals changed: review the strategy reason and visible scores/signals before treating the decision as equivalent.
  • +
  • Page loaded before interaction: static reviewer guidance remains available before a lab run.
  • +
  • No previous lab scenario has been captured yet.
  • +
  • Same lab scenario run twice or unchanged from baseline: strategy order and input signal totals should read as unchanged.
  • +
  • The selected backend is unchanged, but visible lab signals changed.
  • +
  • Backend changed but strategy stayed the same: visible lab signal deltas likely changed which candidate the same strategy preferred.
  • Strategy changed but backend stayed the same: the selected backend can remain preferred under multiple routing methods.
  • -
  • Backend changed but strategy stayed the same: input signal deltas likely changed which candidate the same strategy preferred.
  • -
  • All unhealthy/degraded scenario: every visible backend is unhealthy, so the page should show a degradation boundary instead of production proof.
  • -
  • Missing or empty comparison response: Local API returned an empty comparison response; static guidance remains available.
  • -
  • API error or unavailable local server: Local API response unavailable; static guidance remains available.
  • -
  • Copy-to-clipboard failure fallback: Copy failed; select the visible text and copy manually.
  • -
  • Static page loaded without prior interaction: static guidance and evidence links remain available before running a scenario.
  • +
  • All backends unhealthy/degraded: every visible backend is unhealthy, so treat the result as a degradation boundary instead of production proof.
  • +
  • Empty comparison response: The local lab API returned an empty comparison response; static reviewer guidance remains available.
  • +
  • Local API unavailable/error: The local lab API response is unavailable; static reviewer guidance remains available.
  • +
  • Clipboard copy failure: Copy failed; use the visible lab explanation as the fallback.
  • +
  • Evidence links available before running a scenario: Evidence links remain available before a lab run, but they do not certify production behavior.
  • +
  • Reviewer packet available as local/browser handoff, not server certification.
@@ -537,24 +706,24 @@

Edge-case reading guide

Association Legend

- How to read this proof without turning demo evidence into a production claim. + How to read this proof without turning controlled lab evidence into a production claim.
- scenario = demo input state -

The current request editor payload is the synthetic local state under review.

+ scenario = controlled lab input state +

The current request editor payload is the synthetic local lab state under review.

strategy = selected routing method

The first routing comparison result identifies the method returned by the local compare endpoint.

- backend/server = selected local candidate from the sample response + backend/server = selected local candidate from the lab response

The selected backend/server is a local candidate in the visible request and response pair.

- signals = local/demo metrics used for explanation + signals = controlled lab metrics used for explanation

Signals are visible health, load, latency, error, queue, and network-awareness fields.

@@ -568,7 +737,7 @@

Association Legend

Evidence Navigation

- Where to go next after routing proof review across local static evidence pages. + Where to go next after controlled lab routing proof review across local static evidence pages.
@@ -584,7 +753,7 @@

Evidence Navigation

2. Compare cockpit context

/load-balancing-cockpit.html
- Open the existing cockpit page for broader static load-balancing demo context. + Open the existing cockpit page for broader static load-balancing lab context.

@@ -617,12 +786,12 @@

Evidence Navigation

- Reviewer path after routing proof review: inspect the Enterprise Lab reviewer dashboard, + Reviewer path after controlled lab routing proof review: inspect the Enterprise Lab reviewer dashboard, check the Operator evidence dashboard, review the Evidence timeline, then export/copy/print the reviewer packet from the Evidence export packet page.

- Boundary: local/demo evidence only; no production traffic proof, no live cloud proof, + Boundary: controlled lab evidence only; no production traffic proof, no production telemetry proof, no live cloud proof, no real tenant proof, no registry publication proof, and no container signing proof.

@@ -652,11 +821,11 @@

Routing Proof Summary

Fallback/degradation -

The sample includes an unhealthy candidate so reviewers can verify it is not selected.

+

The controlled lab payload includes an unhealthy candidate so reviewers can verify it is not selected.

- Local/demo boundary -

Same-origin local API calls, synthetic request payloads, browser-only summaries, and no external services.

+ Local lab boundary +

Same-origin local API calls, controlled lab request payloads, browser-only summaries, and no external services.

What this proves @@ -719,12 +888,12 @@

Scenario Comparison

The baseline keeps one unhealthy backend visible so reviewers can compare degradation or recovery edits.

- Local/demo-only boundary -

Browser-local comparison of synthetic payloads and same-origin local API results only; no production traffic, live cloud validation, real tenant data, uploads, or server-side export/PDF/ZIP generation.

+ Local lab-only boundary +

Browser-local comparison of controlled lab payloads and same-origin local API results only; no production traffic, production telemetry, live cloud validation, real tenant data, uploads, or server-side export/PDF/ZIP generation.

Copyable scenario comparison

-
Run Compare strategies or edit the sample payload to generate scenario comparison text.
+
Run Compare strategies or edit the controlled lab payload to generate scenario comparison text.
@@ -825,17 +994,17 @@

6. Safety limitations

@@ -920,7 +1089,8 @@

6. Safety limitations

proofSummary: document.getElementById("proof-summary-output"), scenarioComparison: document.getElementById("scenario-comparison-output"), reviewerWalkthrough: document.getElementById("reviewer-walkthrough-output"), - evidenceAssociation: document.getElementById("evidence-association-output") + evidenceAssociation: document.getElementById("evidence-association-output"), + labMonitor: document.getElementById("lab-monitor-output") }; const proofFields = { strategy: document.getElementById("proof-strategy"), @@ -945,6 +1115,18 @@

6. Safety limitations

evidencePages: document.getElementById("association-evidence-pages"), handoff: document.getElementById("association-handoff") }; + const labMonitorFields = { + scenario: document.getElementById("lab-monitor-scenario"), + requestStatus: document.getElementById("lab-monitor-request-status"), + strategy: document.getElementById("lab-monitor-strategy"), + backend: document.getElementById("lab-monitor-backend"), + healthState: document.getElementById("lab-monitor-health-state"), + signals: document.getElementById("lab-monitor-signals"), + delta: document.getElementById("lab-monitor-delta"), + degradation: document.getElementById("lab-monitor-degradation"), + evidencePath: document.getElementById("lab-monitor-evidence-path"), + handoff: document.getElementById("lab-monitor-handoff") + }; const requestJson = document.getElementById("request-json"); const baseUrlInput = document.getElementById("base-url"); const copyStatus = document.getElementById("copy-status"); @@ -1032,8 +1214,8 @@

6. Safety limitations

payload = JSON.parse(requestJson.value); } catch (error) { lastRoutingBody = null; - lastRoutingError = "Malformed sample request JSON; static guidance remains available."; - renderJson(outputs.routing, { error: "Malformed sample request JSON." }); + lastRoutingError = "Malformed lab request JSON; static reviewer guidance remains available."; + renderJson(outputs.routing, { error: "Malformed lab request JSON." }); setBadge("compare-badge", "failed", "Failed"); renderSummary(); return; @@ -1052,9 +1234,9 @@

6. Safety limitations

lastRoutingBody = body; const results = body && Array.isArray(body.results) ? body.results : []; if (!response.ok) { - lastRoutingError = "Local API returned HTTP " + response.status + "; static guidance remains available."; + lastRoutingError = "Local lab API returned HTTP " + response.status + "; static reviewer guidance remains available."; } else if (results.length === 0) { - lastRoutingError = "Local API returned an empty comparison response; static guidance remains available."; + lastRoutingError = "The local lab API returned an empty comparison response; static reviewer guidance remains available."; } else { lastRoutingError = ""; } @@ -1063,7 +1245,7 @@

6. Safety limitations

setBadge("compare-badge", response.ok ? "passed" : "warning", response.ok ? "Passed" : "Warning"); } catch (error) { lastRoutingBody = null; - lastRoutingError = "Local API response unavailable; static guidance remains available. " + String(error.message || error); + lastRoutingError = "The local lab API response is unavailable; static reviewer guidance remains available. " + String(error.message || error); renderJson(outputs.routing, { error: lastRoutingError }); renderResults(null); setBadge("compare-badge", "failed", "Failed"); @@ -1080,7 +1262,7 @@

6. Safety limitations

cell.colSpan = 4; cell.className = "muted"; cell.textContent = lastRoutingError - || "No routing comparison result is available. Local API response unavailable; static guidance remains available."; + || "No routing comparison result is available. The local lab API response is unavailable; static reviewer guidance remains available."; row.appendChild(cell); resultRows.appendChild(row); return; @@ -1119,9 +1301,9 @@

6. Safety limitations

? lastRoutingBody.results : []; const lines = [ - "# Routing Decision Browser Demo", + "# Enterprise Lab Routing Proof Cockpit", "", - "mode: local browser same-origin demo", + "mode: local browser same-origin controlled lab", "endpoint: POST /api/routing/compare", "strategies: TAIL_LATENCY_POWER_OF_TWO, WEIGHTED_LEAST_LOAD, WEIGHTED_LEAST_CONNECTIONS, WEIGHTED_ROUND_ROBIN, ROUND_ROBIN", "", @@ -1130,7 +1312,7 @@

6. Safety limitations

if (results.length === 0) { lines.push("- NOT_RUN: Run Compare strategies to populate selected server output."); - lines.push("- fallback: " + (lastRoutingError || "No previous scenario has been captured yet; static guidance remains available.")); + lines.push("- fallback: " + (lastRoutingError || "No previous lab scenario has been captured yet; static reviewer guidance remains available.")); } else { results.forEach((result) => { lines.push("- " + result.strategyId + ": " @@ -1142,7 +1324,7 @@

6. Safety limitations

lines.push( "", "## Safety", - "- local/operator demo only", + "- local Enterprise Lab cockpit only", "- not certification", "- not benchmark proof", "- not legal compliance proof", @@ -1163,6 +1345,7 @@

6. Safety limitations

renderScenarioComparison(); renderEvidenceAssociations(); renderReviewerWalkthrough(); + renderLabMonitorExplanation(); } function currentRequestPayload() { @@ -1242,7 +1425,7 @@

6. Safety limitations

? ["No primary strategy change: " + currentStrategy + " remains first requested strategy."] : ["Primary strategy changed from " + previousStrategy + " to " + currentStrategy + "."]; if (sameAsBaseline) { - parts.push("Same scenario run twice or unchanged from baseline: strategy order matches the packaged sample."); + parts.push("Same lab scenario run twice or unchanged from baseline: strategy order matches the packaged lab scenario."); } if (added.length > 0) { parts.push("Added strategies: " + added.join(", ") + "."); @@ -1257,7 +1440,7 @@

6. Safety limitations

const baselineBackend = "edge-alpha"; if (results.length === 0) { return lastRoutingError - || "No previous scenario has been captured yet; run Compare strategies to see selected backend/server change against packaged baseline expectation " + baselineBackend + "."; + || "No previous lab scenario has been captured yet; run Compare strategies to see selected backend/server change against packaged lab baseline expectation " + baselineBackend + "."; } const primary = results[0]; const selectedBackend = primary.chosenServerId || "No server selected"; @@ -1301,11 +1484,11 @@

6. Safety limitations

"queueDepth " + previousMetrics.totalQueueDepth + " -> " + currentMetrics.totalQueueDepth ].join("; ") + "."; if (sameAsBaseline) { - return "Same scenario run twice or unchanged from baseline: strategy order and input signal totals should read as unchanged. " + summary; + return "Same lab scenario run twice or unchanged from baseline: strategy order and input signal totals should read as unchanged. " + summary; } const primary = results.length > 0 ? results[0] : null; if (primary && primary.chosenServerId === "edge-alpha" && metricsChanged(previousMetrics, currentMetrics)) { - return "Selected backend unchanged but signals changed: review the strategy reason and visible scores/signals before treating the decision as equivalent. " + summary; + return "The selected backend is unchanged, but visible lab signals changed. Review the strategy reason and visible scores/signals before treating the controlled lab decision as equivalent. " + summary; } return summary; } @@ -1321,14 +1504,14 @@

6. Safety limitations

return "Degradation pressure increased: more unhealthy backends are visible and healthy alternatives should be preferred when present."; } if (currentMetrics.unhealthyServers.length < previousMetrics.unhealthyServers.length) { - return "Recovery visible: fewer unhealthy backends than the packaged baseline are present."; + return "Recovery visible: fewer unhealthy backends than the packaged lab baseline are present."; } if (currentMetrics.totalInFlight > previousMetrics.totalInFlight || currentMetrics.maxP95Latency > previousMetrics.maxP95Latency || currentMetrics.totalQueueDepth > previousMetrics.totalQueueDepth) { return "Load pressure increased while health posture stayed comparable; compare selected backend and reason fields for the routing response."; } - return "Same degradation boundary as packaged baseline: edge-drain remains unhealthy and should not be selected while healthy alternatives exist."; + return "Same degradation boundary as packaged lab baseline: edge-drain remains unhealthy and should not be selected while healthy alternatives exist."; } function renderScenarioComparison() { @@ -1340,8 +1523,8 @@

6. Safety limitations

? lastRoutingBody.results : []; const previousName = results.length === 0 - ? "No previous scenario has been captured yet; packaged normal-load baseline remains the static reference" - : "Packaged normal-load baseline"; + ? "No previous lab scenario has been captured yet; packaged normal-load lab baseline remains the static reference" + : "Packaged normal-load lab baseline"; const currentName = scenarioName(currentMetrics); const strategySummary = strategyChangeSummary(previousMetrics, currentMetrics, sameAsBaseline); const backendSummary = backendChangeSummary(results, previousMetrics, currentMetrics); @@ -1364,8 +1547,8 @@

6. Safety limitations

"selectedBackendChange: " + backendSummary, "keyInputSignalChanges: " + signalSummary, "degradationRecoveryExplanation: " + degradationSummary, - "emptyOrUnavailableFallback: " + (lastRoutingError || "Local API response available when comparison results are present; static guidance remains available before running a scenario."), - "localOnlyDemoBoundary: browser-local comparison of synthetic payloads and same-origin local API results only", + "emptyOrUnavailableFallback: " + (lastRoutingError || "Local lab API response available when comparison results are present; static reviewer guidance remains available before running a lab scenario."), + "localLabBoundary: browser-local comparison of controlled lab payloads and same-origin local API results only", "", "## Not Proven", "- no production traffic proof", @@ -1404,15 +1587,15 @@

6. Safety limitations

if (results.length === 0) { proofFields.strategy.textContent = "Not run."; proofFields.backend.textContent = "Not run."; - proofFields.signals.textContent = "Run Compare strategies to summarize visible request fields. Static guidance remains available before running a scenario."; + proofFields.signals.textContent = "Run Compare strategies to summarize visible lab request fields. Static reviewer guidance remains available before running a lab scenario."; proofFields.degradation.textContent = - "The sample includes an unhealthy candidate so reviewers can verify it is not selected. " + (lastRoutingError || "No previous scenario has been captured yet."); + "The controlled lab scenario includes an unhealthy candidate so reviewers can verify it is not selected. " + (lastRoutingError || "No previous lab scenario has been captured yet."); outputs.proofSummary.textContent = [ "# Routing Proof Summary", "", "status: not run", "nextStep: run Compare strategies", - "fallback: " + (lastRoutingError || "Static page loaded without prior interaction; static guidance and evidence links remain available before running a scenario."), + "fallback: " + (lastRoutingError || "Static page loaded without prior interaction; static reviewer guidance and evidence links remain available before running a lab scenario."), "localOnly: true", "externalServices: false", "runtimeReportWritten: false" @@ -1432,7 +1615,7 @@

6. Safety limitations

+ " was returned with reason: " + (primary.reason || "no explanation returned") + "."; const degradationSummary = "Result statuses: " + statuses - + ". The packaged sample keeps edge-drain unhealthy so a reviewer can verify it is excluded."; + + ". The packaged lab scenario keeps edge-drain unhealthy so a reviewer can verify it is excluded."; proofFields.strategy.textContent = primary.strategyId || "No strategy returned."; proofFields.backend.textContent = selectedBackend; @@ -1449,7 +1632,7 @@

6. Safety limitations

"strategyEffectOnBackend: " + strategyEffectSummary, "keyInputSignals: " + signalSummary, "fallbackDegradationBoundary: " + degradationSummary, - "localOnlyDemoBoundary: same-origin local API, synthetic payloads, browser-only summary, no external services", + "localLabBoundary: same-origin local API, controlled lab payloads, browser-only summary, no external services", "", "## Not Proven", "- no production deployment proof", @@ -1467,14 +1650,14 @@

6. Safety limitations

const primary = results.length > 0 ? results[0] : null; const selectedStrategy = primary && primary.strategyId ? primary.strategyId : "not run"; const selectedBackend = primary && primary.chosenServerId ? primary.chosenServerId : "not run"; - const proofSignals = proofFields.signals.textContent || "Run Compare strategies to summarize visible request fields."; + const proofSignals = proofFields.signals.textContent || "Run Compare strategies to summarize visible lab request fields."; const scenarioSignals = scenarioFields.signals.textContent || "Run Compare strategies to compare input signals."; outputs.reviewerWalkthrough.textContent = [ "# End-to-End Routing Reviewer Walkthrough", "", "workflowChecklist:", - "1. load sample scenario", + "1. load controlled lab scenario", "2. run routing comparison", "3. inspect Routing Proof Summary", "4. compare scenario deltas", @@ -1502,7 +1685,8 @@

6. Safety limitations

"- no real tenant proof", "- no registry publication proof", "- no container signing proof", - "- no service-level agreement or service-level objective evidence" + "- no service-level agreement or service-level objective evidence", + "- no production telemetry proof" ].join("\n"); } @@ -1523,8 +1707,8 @@

6. Safety limitations

const routingDecision = primary ? (primary.status || "unknown") + " decision selecting " + selectedBackend : (lastRoutingError || "not run; run Compare strategies to generate a local routing decision"); - const reason = primary && primary.reason ? primary.reason : "No routing reason is available until Compare strategies runs. Local API response unavailable; static guidance remains available if the local server is not running."; - const inputSignals = proofFields.signals.textContent || "Run Compare strategies to summarize visible request fields."; + const reason = primary && primary.reason ? primary.reason : "No routing reason is available until Compare strategies runs. The local lab API response is unavailable; static reviewer guidance remains available if the local server is not running."; + const inputSignals = proofFields.signals.textContent || "Run Compare strategies to summarize visible lab request fields."; const comparisonDelta = scenarioFields.signals.textContent || "Run Compare strategies to compare scenario deltas."; const degradationDelta = scenarioFields.degradation.textContent || "Run Compare strategies to compare degradation or recovery notes."; const evidencePath = evidenceNavigationPath(); @@ -1572,6 +1756,7 @@

6. Safety limitations

"", "notProven:", "- no production traffic proof", + "- no production telemetry proof", "- no live cloud proof", "- no real tenant proof", "- no registry publication proof", @@ -1580,6 +1765,85 @@

6. Safety limitations

].join("\n"); } + function renderLabMonitorExplanation() { + const currentPayload = currentRequestPayload(); + const currentMetrics = scenarioMetrics(currentPayload); + const currentScenario = scenarioName(currentMetrics); + const results = lastRoutingBody && Array.isArray(lastRoutingBody.results) + ? lastRoutingBody.results + : []; + const primary = results.length > 0 ? results[0] : null; + const selectedStrategy = primary && primary.strategyId ? primary.strategyId : "not run"; + const selectedBackend = primary && primary.chosenServerId ? primary.chosenServerId : "not run"; + const selectedServer = primary && primary.chosenServerId ? selectedServerDetails(primary.chosenServerId) : null; + const backendHealthState = selectedServer + ? "healthy=" + Boolean(selectedServer.healthy) + "; availability=" + + (selectedServer.healthy ? "available in controlled lab payload" : "unhealthy/degraded in controlled lab payload") + : "No selected backend health state yet; run Compare strategies."; + const visibleSignals = selectedServer + ? formatServerSignals(selectedServer) + : (proofFields.signals.textContent || "Run Compare strategies to summarize visible lab signals."); + const requestStatus = results.length > 0 + ? "Local lab comparison completed with " + results.length + " strategy result(s)." + : (lastRoutingError || "Not run; static reviewer guidance remains available."); + const scenarioDelta = scenarioFields.signals.textContent || "Run Compare strategies to compare lab scenario deltas."; + const degradationState = scenarioFields.degradation.textContent || "Static reviewer guidance remains available before a lab run."; + const evidencePath = evidenceNavigationPath(); + const edgeCaseState = results.length > 0 + ? degradationState + : (lastRoutingError || "No previous lab scenario has been captured yet."); + const handoffStatus = results.length > 0 + ? "Reviewer handoff ready for browser-local copy/print/export packet review." + : "Reviewer handoff is not ready until a local lab comparison runs."; + + labMonitorFields.scenario.textContent = currentScenario + (results.length > 0 + ? "." + : "; No previous lab scenario has been captured yet."); + labMonitorFields.requestStatus.textContent = requestStatus; + labMonitorFields.strategy.textContent = selectedStrategy; + labMonitorFields.backend.textContent = selectedBackend; + labMonitorFields.healthState.textContent = backendHealthState; + labMonitorFields.signals.textContent = visibleSignals; + labMonitorFields.delta.textContent = scenarioDelta; + labMonitorFields.degradation.textContent = degradationState; + labMonitorFields.evidencePath.textContent = evidencePath; + labMonitorFields.handoff.textContent = handoffStatus; + + outputs.labMonitor.textContent = [ + "# Enterprise Lab Cockpit Monitor Explanation", + "", + "activeLabScenario: " + currentScenario, + "routingComparisonStatus: " + requestStatus, + "selectedStrategy: " + selectedStrategy, + "selectedBackend: " + selectedBackend, + "backendHealthState: " + backendHealthState, + "visibleInputSignals: " + visibleSignals, + "scenarioComparisonState: " + scenarioDelta, + "edgeCaseState: " + edgeCaseState, + "evidenceAssociationPath: " + evidencePath, + "", + "reproductionSteps:", + "1. choose or load a controlled lab scenario", + "2. run routing comparison against the same-origin local API", + "3. inspect selected strategy, selected backend/server, and visible input signals", + "4. compare scenario deltas and edge-case guidance", + "5. follow reviewer/operator/timeline/export evidence links", + "6. copy proof, walkthrough, association, and lab monitor summaries as browser-local reviewer notes", + "7. print/copy/export the browser-local reviewer packet from /evidence-export-packet.html", + "", + "fallbackGuidance:", + "- No previous lab scenario has been captured yet.", + "- The selected backend is unchanged, but visible lab signals changed.", + "- The local lab API response is unavailable; static reviewer guidance remains available.", + "- Copy failed; use the visible lab explanation as the fallback.", + "- Evidence links remain available before a lab run, but they do not certify production behavior.", + "", + "labProofBoundaries: controlled lab evidence from local payloads, same-origin local API responses, visible browser text, and static evidence links", + "productionNotProven: no production traffic proof; no production telemetry proof; no live cloud proof; no real tenant proof; no SLA/SLO proof; no registry publication proof; no container signing proof; no production certification claim", + "copyBoundary: browser-local copy action only; no upload/share endpoint; no server-side export/PDF/ZIP generation; no external calls; no telemetry" + ].join("\n"); + } + function resetDemo() { lastRoutingBody = null; lastRoutingError = ""; @@ -1608,7 +1872,7 @@

6. Safety limitations

throw new Error("Clipboard unavailable"); } } catch (error) { - copyStatus.textContent = "Copy failed; select the visible text and copy manually. Browser clipboard permission may be unavailable."; + copyStatus.textContent = "Copy failed; use the visible lab explanation as the fallback. Browser clipboard permission may be unavailable."; } } diff --git a/src/test/java/com/richmond423/loadbalancerpro/api/ReviewerTrustMapDocumentationTest.java b/src/test/java/com/richmond423/loadbalancerpro/api/ReviewerTrustMapDocumentationTest.java index 2c7083a3..5b848fda 100644 --- a/src/test/java/com/richmond423/loadbalancerpro/api/ReviewerTrustMapDocumentationTest.java +++ b/src/test/java/com/richmond423/loadbalancerpro/api/ReviewerTrustMapDocumentationTest.java @@ -109,6 +109,12 @@ void reviewerTrustMapCoversPrimaryEvidencePaths() throws Exception { "PROXY_DEMO_STACK.md", "PROXY_DEMO_FIXTURE_LAUNCHER.md", "routing-demo.html", + "Enterprise Lab Cockpit Monitor", + "How This Routing Decision Was Made", + "What This Lab Needs to Monitor", + "How to Reproduce and Explain This Lab Proof", + "How to Read Lab Edge Cases", + "copyable lab monitor explanation", "Reviewer Workflow Checklist", "Evidence Associations", "Association Legend", @@ -149,6 +155,11 @@ void reviewerDemoPathAnswersFastDemoQuestionsAndLocksEvidenceFiles() throws Exce assertTrue(demoPath.contains("http://localhost:8080/")); assertTrue(demoPath.contains("http://localhost:8080/routing-demo.html")); assertTrue(demoPath.contains("http://localhost:8080/load-balancing-cockpit.html")); + assertTrue(demoPath.contains("Enterprise Lab Cockpit Monitor")); + assertTrue(demoPath.contains("How This Routing Decision Was Made")); + assertTrue(demoPath.contains("What This Lab Needs to Monitor")); + assertTrue(demoPath.contains("How to Reproduce and Explain This Lab Proof")); + assertTrue(demoPath.contains("How to Read Lab Edge Cases")); assertTrue(demoPath.contains("Reviewer Workflow Checklist")); assertTrue(demoPath.contains("Evidence Associations")); assertTrue(demoPath.contains("Association Legend")); @@ -163,6 +174,7 @@ void reviewerDemoPathAnswersFastDemoQuestionsAndLocksEvidenceFiles() throws Exce assertTrue(demoPath.contains("degradation/recovery notes")); assertTrue(demoPath.contains("local verification commands")); assertTrue(demoPath.contains("routing-to-evidence dashboard links")); + assertTrue(demoPath.contains("copyable lab monitor explanation")); assertTrue(demoPath.contains("copyable evidence association summary")); assertTrue(demoPath.contains("copyable end-to-end reviewer walkthrough")); assertTrue(demoPath.contains("explicit not-proven boundaries")); @@ -230,8 +242,15 @@ void routingDemoScenarioComparisonTrustMapEntryIsDiscoverableAndBounded() throws assertTrue(matrix.contains("How should a reviewer walk the routing cockpit end-to-end?")); assertTrue(matrix.contains("How do routing decisions connect to reviewer evidence pages?")); assertTrue(matrix.contains("How do routing proof scenarios compare?")); + assertTrue(matrix.contains("How does the Enterprise Lab cockpit monitor and explain routing proof?")); assertTrue(matrix.contains("/routing-demo.html")); assertTrue(matrix.contains("RoutingDecisionDemoTest")); + assertTrue(matrix.contains("Enterprise Lab Cockpit Monitor")); + assertTrue(matrix.contains("How This Routing Decision Was Made")); + assertTrue(matrix.contains("What This Lab Needs to Monitor")); + assertTrue(matrix.contains("How to Reproduce and Explain This Lab Proof")); + assertTrue(matrix.contains("How to Read Lab Edge Cases")); + assertTrue(matrix.contains("copyable lab monitor explanation")); assertTrue(matrix.contains("Reviewer Workflow Checklist")); assertTrue(matrix.contains("Evidence Associations")); assertTrue(matrix.contains("Association Legend")); @@ -253,13 +272,15 @@ void routingDemoScenarioComparisonTrustMapEntryIsDiscoverableAndBounded() throws assertTrue(matrix.contains("copyable local reviewer summary")); assertTrue(matrix.contains("copyable end-to-end reviewer walkthrough")); assertTrue(matrix.contains("reviewer/operator/timeline/export packet pages")); - assertTrue(normalized.contains("sample scenario to routing comparison")); + assertTrue(normalized.contains("controlled lab scenario to routing comparison")); assertTrue(normalized.contains("evidence dashboards, timeline, and evidence export packet")); assertTrue(normalized.contains("without adding server-side exports or external calls")); - assertTrue(normalized.contains("packaged normal-load baseline")); - assertTrue(normalized.contains("edited local demo payloads")); + assertTrue(normalized.contains("packaged normal-load lab baseline")); + assertTrue(normalized.contains("edited local lab payloads")); assertTrue(normalized.contains("same-origin local api responses")); assertTrue(normalized.contains("browser-local copy text")); + assertTrue(normalized.contains("production telemetry proof")); + assertTrue(normalized.contains("governance-applied proof")); assertTrue(normalized.contains("upload/share endpoint behavior")); assertTrue(normalized.contains("server-side export/pdf/zip generation")); assertTrue(normalized.contains("production deployment certification")); @@ -271,6 +292,48 @@ void routingDemoScenarioComparisonTrustMapEntryIsDiscoverableAndBounded() throws assertTrue(normalized.contains("container signing")); } + @Test + void enterpriseLabCockpitMonitoringTrustMapSectionIsStrictAndBounded() throws Exception { + String trustMap = read(TRUST_MAP); + String section = section(trustMap, "### Enterprise Lab Cockpit Monitoring and How-Question Guide", + "### Cockpit Evidence Associations"); + String normalized = section.toLowerCase(Locale.ROOT); + + assertTrue(section.contains("strict Enterprise Lab proof cockpit")); + assertTrue(section.contains("not a casual demo page")); + assertTrue(section.contains("active lab scenario")); + assertTrue(section.contains("routing comparison request status")); + assertTrue(section.contains("selected strategy")); + assertTrue(section.contains("selected backend/server")); + assertTrue(section.contains("backend health state")); + assertTrue(section.contains("visible latency/load/active connection/capacity/weight-style signals")); + assertTrue(section.contains("scenario delta state")); + assertTrue(section.contains("degradation/fallback/recovery state")); + assertTrue(section.contains("evidence association path")); + assertTrue(section.contains("reviewer handoff readiness")); + assertTrue(section.contains("local lab boundary")); + assertTrue(section.contains("production proof gaps")); + assertTrue(section.contains("how the selected backend was chosen")); + assertTrue(section.contains("how strategy choice influenced the result")); + assertTrue(section.contains("how visible lab input signals affect the proof")); + assertTrue(section.contains("how to reproduce and explain the local lab proof")); + assertTrue(section.contains("copyable lab monitor explanation")); + assertTrue(normalized.contains("browser-local text only")); + assertTrue(normalized.contains("same-origin local api responses")); + assertTrue(normalized.contains("no telemetry")); + assertTrue(normalized.contains("does not prove production traffic")); + assertTrue(normalized.contains("production telemetry")); + assertTrue(normalized.contains("live cloud behavior")); + assertTrue(normalized.contains("real tenant behavior")); + assertTrue(normalized.contains("sla/slo achievement")); + assertTrue(normalized.contains("registry publication")); + assertTrue(normalized.contains("container signing")); + assertTrue(normalized.contains("governance-applied status")); + assertTrue(normalized.contains("production certification")); + assertTrue(normalized.contains("does not create upload/share endpoints")); + assertTrue(normalized.contains("server-side export/pdf/zip files")); + } + @Test void routingCockpitEvidenceAssociationsTrustMapSectionIsDiscoverableAndBounded() throws Exception { String trustMap = read(TRUST_MAP); @@ -288,15 +351,16 @@ void routingCockpitEvidenceAssociationsTrustMapSectionIsDiscoverableAndBounded() assertTrue(section.contains("export packet/reviewer handoff")); assertTrue(section.contains("copyable evidence association summary")); assertTrue(section.contains("Association Legend")); - assertTrue(section.contains("scenario = demo input state")); + assertTrue(section.contains("scenario = controlled lab input state")); assertTrue(section.contains("strategy = selected routing method")); - assertTrue(section.contains("backend/server = selected local candidate from the sample response")); - assertTrue(section.contains("signals = local/demo metrics used for explanation")); + assertTrue(section.contains("backend/server = selected local candidate from the lab response")); + assertTrue(section.contains("signals = controlled lab metrics used for explanation")); assertTrue(section.contains("evidence pages = reviewer navigation aids, not production certification")); assertTrue(normalized.contains("browser-local text only")); assertTrue(normalized.contains("same-origin local api results")); assertTrue(normalized.contains("static evidence page links")); assertTrue(normalized.contains("does not prove production traffic")); + assertTrue(normalized.contains("production telemetry")); assertTrue(normalized.contains("live cloud behavior")); assertTrue(normalized.contains("real tenant behavior")); assertTrue(normalized.contains("registry publication")); @@ -312,7 +376,7 @@ void routingCockpitReviewerWorkflowTrustMapSectionIsDiscoverableAndBounded() thr assertTrue(section.contains("Routing Cockpit Reviewer Workflow")); assertTrue(section.contains("/routing-demo.html")); - assertTrue(section.contains("load sample scenario")); + assertTrue(section.contains("load controlled lab scenario")); assertTrue(section.contains("run routing comparison")); assertTrue(section.contains("inspect Routing Proof Summary")); assertTrue(section.contains("compare scenario deltas")); @@ -321,7 +385,7 @@ void routingCockpitReviewerWorkflowTrustMapSectionIsDiscoverableAndBounded() thr assertTrue(section.contains("export/print packet from `/evidence-export-packet.html`")); assertTrue(section.contains("Reviewer Confidence Signals")); assertTrue(normalized.contains("local repeatability")); - assertTrue(normalized.contains("deterministic sample scenarios")); + assertTrue(normalized.contains("deterministic lab scenarios")); assertTrue(normalized.contains("same-origin api usage")); assertTrue(normalized.contains("static browser-only notes/copy actions")); assertTrue(normalized.contains("not-production-certified boundary")); @@ -329,6 +393,7 @@ void routingCockpitReviewerWorkflowTrustMapSectionIsDiscoverableAndBounded() thr assertTrue(normalized.contains("no upload/share endpoint")); assertTrue(normalized.contains("no server-side export/pdf/zip generation")); assertTrue(normalized.contains("no production traffic proof")); + assertTrue(normalized.contains("no production telemetry proof")); assertTrue(normalized.contains("no live cloud proof")); assertTrue(normalized.contains("no real tenant proof")); assertTrue(normalized.contains("no registry publication proof")); diff --git a/src/test/java/com/richmond423/loadbalancerpro/api/RoutingDecisionDemoTest.java b/src/test/java/com/richmond423/loadbalancerpro/api/RoutingDecisionDemoTest.java index 11c766ca..803074e9 100644 --- a/src/test/java/com/richmond423/loadbalancerpro/api/RoutingDecisionDemoTest.java +++ b/src/test/java/com/richmond423/loadbalancerpro/api/RoutingDecisionDemoTest.java @@ -56,7 +56,7 @@ void routingDemoPageExistsAndIsServed() throws Exception { mockMvc.perform(get("/routing-demo.html")) .andExpect(status().isOk()) .andExpect(content().contentTypeCompatibleWith(MediaType.TEXT_HTML)) - .andExpect(content().string(containsString("Routing Decision Demo"))) + .andExpect(content().string(containsString("Enterprise Lab Routing Proof Cockpit"))) .andExpect(content().string(containsString("data-action=\"compare\""))) .andExpect(content().string(containsString("/api/routing/compare"))); } @@ -77,7 +77,7 @@ void routingDemoPageContainsExpectedEndpointsControlsAndStrategyText() throws Ex assertTrue(page.contains("Selected backend/server")); assertTrue(page.contains("Key input signals")); assertTrue(page.contains("Fallback/degradation")); - assertTrue(page.contains("Local/demo boundary")); + assertTrue(page.contains("Local lab boundary")); assertTrue(page.contains("What this proves")); assertTrue(page.contains("What this does not prove")); assertTrue(page.contains("Copy proof summary")); @@ -85,9 +85,16 @@ void routingDemoPageContainsExpectedEndpointsControlsAndStrategyText() throws Ex assertTrue(page.contains("proof-summary-output")); assertTrue(page.contains("proof-commands")); assertTrue(page.contains("Reviewer Workflow Checklist")); + assertTrue(page.contains("Enterprise Lab Cockpit Monitor")); + assertTrue(page.contains("Copy lab monitor explanation")); + assertTrue(page.contains("lab-monitor-output")); + assertTrue(page.contains("How This Routing Decision Was Made")); + assertTrue(page.contains("What This Lab Needs to Monitor")); + assertTrue(page.contains("How to Reproduce and Explain This Lab Proof")); + assertTrue(page.contains("How to Read Lab Edge Cases")); assertTrue(page.contains("Copy end-to-end reviewer walkthrough")); assertTrue(page.contains("reviewer-walkthrough-output")); - assertTrue(page.contains("Load sample scenario")); + assertTrue(page.contains("Load lab scenario")); assertTrue(page.contains("Run routing comparison")); assertTrue(page.contains("Inspect Routing Proof Summary")); assertTrue(page.contains("Compare scenario deltas")); @@ -96,7 +103,7 @@ void routingDemoPageContainsExpectedEndpointsControlsAndStrategyText() throws Ex assertTrue(page.contains("Export/print packet from evidence export page")); assertTrue(page.contains("Reviewer Confidence Signals")); assertTrue(page.contains("Local repeatability")); - assertTrue(page.contains("Deterministic sample scenarios")); + assertTrue(page.contains("Deterministic lab scenarios")); assertTrue(page.contains("Same-origin API usage")); assertTrue(page.contains("Static browser-only notes/copy actions")); assertTrue(page.contains("Not-production-certified boundary")); @@ -110,21 +117,16 @@ void routingDemoPageContainsExpectedEndpointsControlsAndStrategyText() throws Ex assertTrue(page.contains("Scenario comparison -> what changed")); assertTrue(page.contains("Routing proof summary -> supporting evidence pages")); assertTrue(page.contains("Evidence pages -> export packet / reviewer handoff")); - assertTrue(page.contains("How This Proof Works")); - assertTrue(page.contains("How the selected strategy affects the selected backend")); - assertTrue(page.contains("How input signals influence the routing proof")); - assertTrue(page.contains("How scenario comparison deltas are summarized")); - assertTrue(page.contains("How degradation, unhealthy, and recovery states are represented")); - assertTrue(page.contains("How to reproduce the same proof locally")); - assertTrue(page.contains("How evidence pages relate to the proof")); - assertTrue(page.contains("How the copied association summary should be used")); - assertTrue(page.contains("How local/demo proof differs from production proof")); - assertTrue(page.contains("Edge-case reading guide")); + assertTrue(page.contains("How was the selected backend chosen?")); + assertTrue(page.contains("How did the selected strategy influence the decision?")); + assertTrue(page.contains("How did visible input signals influence the proof?")); + assertTrue(page.contains("How Strategy Choice Matters")); + assertTrue(page.contains("How Evidence Supports the Decision")); assertTrue(page.contains("Association Legend")); - assertTrue(page.contains("scenario = demo input state")); + assertTrue(page.contains("scenario = controlled lab input state")); assertTrue(page.contains("strategy = selected routing method")); - assertTrue(page.contains("backend/server = selected local candidate from the sample response")); - assertTrue(page.contains("signals = local/demo metrics used for explanation")); + assertTrue(page.contains("backend/server = selected local candidate from the lab response")); + assertTrue(page.contains("signals = controlled lab metrics used for explanation")); assertTrue(page.contains("evidence pages = reviewer navigation aids, not production certification")); assertTrue(page.contains("Scenario Comparison")); assertTrue(page.contains("Previous scenario")); @@ -143,18 +145,18 @@ void routingDemoPageContainsExpectedEndpointsControlsAndStrategyText() throws Ex assertTrue(page.contains("/evidence-timeline.html")); assertTrue(page.contains("/evidence-export-packet.html")); assertTrue(page.contains("Reviewer path")); - assertTrue(page.contains("Where to go next after routing proof review")); + assertTrue(page.contains("Where to go next after controlled lab routing proof review")); assertTrue(page.contains("Next: Enterprise Lab reviewer dashboard")); assertTrue(page.contains("Next: Operator evidence dashboard")); assertTrue(page.contains("Next: Evidence timeline")); assertTrue(page.contains("Finish: Evidence export packet")); - assertTrue(page.contains("after routing proof review")); + assertTrue(page.contains("after controlled lab routing proof review")); assertTrue(page.contains("Copy curl")); assertTrue(page.contains("Copy payload")); assertTrue(page.contains("Copy summary")); assertTrue(page.contains("Copy raw response")); - assertTrue(page.contains("Reset demo")); - assertTrue(page.contains("Load sample scenario")); + assertTrue(page.contains("Reset lab")); + assertTrue(page.contains("Load lab scenario")); assertTrue(page.contains("Compare strategies")); assertTrue(page.contains("TAIL_LATENCY_POWER_OF_TWO")); assertTrue(page.contains("WEIGHTED_LEAST_LOAD")); @@ -175,18 +177,19 @@ void routingDemoProofSummaryContainsLocalCommandsAndNotProvenBoundaries() throws assertTrue(page.contains("curl -fsS -X POST http://localhost:8080/api/routing/compare")); assertTrue(page.contains("--data-binary @routing-compare-request.json")); assertTrue(page.contains("same-origin local API")); - assertTrue(page.contains("synthetic request payloads")); + assertTrue(page.contains("controlled lab payloads")); assertTrue(page.contains("browser-only summaries")); assertTrue(page.contains("selectedStrategy: ")); assertTrue(page.contains("selectedBackend: ")); assertTrue(page.contains("keyInputSignals: ")); assertTrue(page.contains("fallbackDegradationBoundary: ")); - assertTrue(page.contains("localOnlyDemoBoundary: same-origin local API")); + assertTrue(page.contains("localLabBoundary: same-origin local API")); assertTrue(normalized.contains("no production deployment proof")); assertTrue(normalized.contains("no service-level agreement, service-level objective, or real tenant evidence")); assertTrue(normalized.contains("no live cloud validation, registry publication, or container signing evidence")); assertTrue(normalized.contains("no service-level agreement or service-level objective evidence")); assertTrue(normalized.contains("no registry publication or container signing evidence")); + assertTrue(normalized.contains("no production telemetry proof")); assertTrue(normalized.contains("runtimeReportWritten: false".toLowerCase(Locale.ROOT))); assertTrue(normalized.contains("externalServices: false".toLowerCase(Locale.ROOT))); } @@ -205,11 +208,11 @@ void routingDemoScenarioComparisonContainsLocalOnlyBoundariesAndCopyableDeltas() assertTrue(page.contains("keyInputSignalChanges: ")); assertTrue(page.contains("degradationRecoveryExplanation: ")); assertTrue(page.contains("emptyOrUnavailableFallback: ")); - assertTrue(page.contains("localOnlyDemoBoundary: browser-local comparison")); + assertTrue(page.contains("localLabBoundary: browser-local comparison")); assertTrue(page.contains("No primary strategy change")); - assertTrue(page.contains("Same scenario run twice or unchanged from baseline")); - assertTrue(page.contains("No previous scenario has been captured yet")); - assertTrue(page.contains("Selected backend unchanged but signals changed")); + assertTrue(page.contains("Same lab scenario run twice or unchanged from baseline")); + assertTrue(page.contains("No previous lab scenario has been captured yet")); + assertTrue(page.contains("The selected backend is unchanged, but visible lab signals changed")); assertTrue(page.contains("Strategy changed but backend stayed the same")); assertTrue(page.contains("Backend changed but strategy stayed the same")); assertTrue(page.contains("Selected backend changed after compare")); @@ -221,8 +224,9 @@ void routingDemoScenarioComparisonContainsLocalOnlyBoundariesAndCopyableDeltas() assertTrue(page.contains("Degradation pressure increased")); assertTrue(page.contains("Recovery visible")); assertTrue(page.contains("same-origin local API results only")); - assertTrue(normalized.contains("browser-local comparison of synthetic payloads")); + assertTrue(normalized.contains("browser-local comparison of controlled lab payloads")); assertTrue(normalized.contains("no production traffic")); + assertTrue(normalized.contains("production telemetry")); assertTrue(normalized.contains("no live cloud validation")); assertTrue(normalized.contains("no real tenant data")); assertTrue(normalized.contains("no upload, share endpoint, or server-side export/pdf/zip generation")); @@ -234,19 +238,20 @@ void routingDemoEvidenceNavigationIsLocalStaticAndBounded() throws Exception { String normalized = page.toLowerCase(Locale.ROOT); assertTrue(page.contains("id=\"routing-evidence-navigation-panel\"")); - assertTrue(page.contains("Where to go next after routing proof review across local static evidence pages.")); + assertTrue(page.contains("Where to go next after controlled lab routing proof review across local static evidence pages.")); assertTrue(page.contains("Use Routing Proof Summary and Scenario Comparison")); assertTrue(page.contains("Review Enterprise Lab posture")); assertTrue(page.contains("Check operator evidence locations")); assertTrue(page.contains("Compare local and CI evidence stages")); assertTrue(page.contains("Use the browser-local packet page")); - assertTrue(page.contains("Reviewer path after routing proof review")); + assertTrue(page.contains("Reviewer path after controlled lab routing proof review")); assertTrue(page.contains("inspect the Enterprise Lab reviewer dashboard")); assertTrue(page.contains("check the Operator evidence dashboard")); assertTrue(page.contains("review the Evidence timeline")); assertTrue(page.contains("Evidence export packet page")); - assertTrue(normalized.contains("local/demo evidence only")); + assertTrue(normalized.contains("controlled lab evidence only")); assertTrue(normalized.contains("no production traffic proof")); + assertTrue(normalized.contains("no production telemetry proof")); assertTrue(normalized.contains("no live cloud proof")); assertTrue(normalized.contains("no real tenant proof")); assertTrue(normalized.contains("registry publication proof")); @@ -270,7 +275,7 @@ void routingDemoReviewerWorkflowChecklistAndWalkthroughAreLocalAndBounded() thro assertTrue(page.contains("data-copy-target=\"reviewer-walkthrough-output\"")); assertTrue(page.contains("# End-to-End Routing Reviewer Walkthrough")); assertTrue(page.contains("workflowChecklist:")); - assertTrue(page.contains("1. load sample scenario")); + assertTrue(page.contains("1. load controlled lab scenario")); assertTrue(page.contains("2. run routing comparison")); assertTrue(page.contains("3. inspect Routing Proof Summary")); assertTrue(page.contains("4. compare scenario deltas")); @@ -287,6 +292,7 @@ void routingDemoReviewerWorkflowChecklistAndWalkthroughAreLocalAndBounded() thro assertTrue(normalized.contains("no server-side export/pdf/zip generation")); assertTrue(normalized.contains("no external services")); assertTrue(normalized.contains("no production traffic proof")); + assertTrue(normalized.contains("no production telemetry proof")); assertTrue(normalized.contains("no live cloud proof")); assertTrue(normalized.contains("no real tenant proof")); assertTrue(normalized.contains("no registry publication proof")); @@ -302,16 +308,17 @@ void routingDemoReviewerConfidenceSignalsAreStaticLocalAndNotOverclaimed() throw assertTrue(page.contains("id=\"reviewer-confidence-signals-panel\"")); assertTrue(page.contains("aria-label=\"Reviewer confidence signal cards\"")); assertTrue(page.contains("Local repeatability")); - assertTrue(page.contains("Deterministic sample scenarios")); + assertTrue(page.contains("Deterministic lab scenarios")); assertTrue(page.contains("Same-origin API usage")); assertTrue(page.contains("Static browser-only notes/copy actions")); assertTrue(page.contains("Not-production-certified boundary")); - assertTrue(normalized.contains("packaged synthetic inputs")); + assertTrue(normalized.contains("packaged controlled lab inputs")); assertTrue(normalized.contains("packaged server names, weights, health states, load, and latency fields")); assertTrue(normalized.contains("browser calls target local app paths")); assertTrue(normalized.contains("do not create server-side files")); - assertTrue(normalized.contains("local/demo evidence only")); + assertTrue(normalized.contains("controlled lab evidence only")); assertTrue(normalized.contains("no production traffic proof")); + assertTrue(normalized.contains("no production telemetry proof")); assertTrue(normalized.contains("no live cloud proof")); assertTrue(normalized.contains("no real tenant proof")); assertTrue(normalized.contains("no registry publication proof")); @@ -322,6 +329,44 @@ void routingDemoReviewerConfidenceSignalsAreStaticLocalAndNotOverclaimed() throw assertFalse(normalized.contains("governance-applied")); } + @Test + void routingDemoEnterpriseLabMonitorExplainsSignalsBoundariesAndCopyText() throws Exception { + String page = Files.readString(ROUTING_DEMO_PAGE, StandardCharsets.UTF_8); + String normalized = page.toLowerCase(Locale.ROOT); + + assertTrue(page.contains("id=\"enterprise-lab-cockpit-monitor-panel\"")); + assertTrue(page.contains("Enterprise Lab Cockpit Monitor")); + assertTrue(page.contains("This is lab-bounded proof, not production monitoring.")); + assertTrue(page.contains("It is an Enterprise Lab proof cockpit, not a casual demo page or production monitoring surface.")); + assertTrue(page.contains("data-copy-target=\"lab-monitor-output\"")); + assertTrue(page.contains("# Enterprise Lab Cockpit Monitor Explanation")); + assertTrue(page.contains("activeLabScenario: ")); + assertTrue(page.contains("routingComparisonStatus: ")); + assertTrue(page.contains("selectedStrategy: ")); + assertTrue(page.contains("selectedBackend: ")); + assertTrue(page.contains("backendHealthState: ")); + assertTrue(page.contains("visibleInputSignals: ")); + assertTrue(page.contains("scenarioComparisonState: ")); + assertTrue(page.contains("edgeCaseState: ")); + assertTrue(page.contains("evidenceAssociationPath: ")); + assertTrue(page.contains("reproductionSteps:")); + assertTrue(page.contains("labProofBoundaries: controlled lab evidence")); + assertTrue(page.contains("productionNotProven: no production traffic proof; no production telemetry proof; no live cloud proof; no real tenant proof; no SLA/SLO proof; no registry publication proof; no container signing proof; no production certification claim")); + assertTrue(page.contains("copyBoundary: browser-local copy action only; no upload/share endpoint; no server-side export/PDF/ZIP generation; no external calls; no telemetry")); + assertTrue(page.contains("Evidence links remain available before a lab run, but they do not certify production behavior.")); + assertTrue(page.contains("No previous lab scenario has been captured yet.")); + assertTrue(page.contains("The local lab API response is unavailable; static reviewer guidance remains available.")); + assertTrue(page.contains("Copy failed; use the visible lab explanation as the fallback.")); + assertTrue(normalized.contains("backend health state")); + assertTrue(normalized.contains("visible latency/load/connection/capacity signals")); + assertTrue(normalized.contains("scenario delta state")); + assertTrue(normalized.contains("degradation/fallback/recovery state")); + assertTrue(normalized.contains("reviewer handoff readiness")); + assertFalse(normalized.contains("production monitoring proof")); + assertFalse(normalized.contains("live production telemetry is available")); + assertFalse(normalized.contains("server-side lab monitor export")); + } + @Test void routingDemoEvidenceAssociationsMapProofToEvidencePath() throws Exception { String page = Files.readString(ROUTING_DEMO_PAGE, StandardCharsets.UTF_8); @@ -348,8 +393,9 @@ void routingDemoEvidenceAssociationsMapProofToEvidencePath() throws Exception { assertTrue(page.contains("/operator-evidence-dashboard.html")); assertTrue(page.contains("/evidence-timeline.html")); assertTrue(page.contains("/evidence-export-packet.html")); - assertTrue(normalized.contains("association boundary: local/demo evidence only")); + assertTrue(normalized.contains("association boundary: controlled lab evidence only")); assertTrue(normalized.contains("no production traffic proof")); + assertTrue(normalized.contains("no production telemetry proof")); assertTrue(normalized.contains("no live cloud proof")); assertTrue(normalized.contains("no real tenant proof")); assertTrue(normalized.contains("no registry publication proof")); @@ -387,6 +433,7 @@ void routingDemoEvidenceAssociationSummaryIsBrowserLocalAndBounded() throws Exce assertTrue(page.contains("copyBoundary: browser-local copy action only; no upload/share endpoint; no server-side export/PDF/ZIP generation; no external calls")); assertTrue(page.contains("notProven:")); assertTrue(normalized.contains("no production traffic proof")); + assertTrue(normalized.contains("no production telemetry proof")); assertTrue(normalized.contains("no live cloud proof")); assertTrue(normalized.contains("no real tenant proof")); assertTrue(normalized.contains("no registry publication proof")); @@ -400,23 +447,31 @@ void routingDemoHowToAndEdgeCasesAreExplicitReviewerGuidance() throws Exception String normalized = page.toLowerCase(Locale.ROOT); assertTrue(page.contains("id=\"reviewer-how-to-panel\"")); - assertTrue(page.contains("aria-label=\"Reviewer how-to explanation cards\"")); - assertTrue(page.contains("The first returned strategy is the primary local comparison result")); - assertTrue(page.contains("its routing rule ranks the visible candidate servers")); - assertTrue(page.contains("Health, in-flight load, configured weight/capacity, p95 latency, error rate, queue depth, and network-awareness fields")); - assertTrue(page.contains("Deltas are browser-local summaries comparing packaged baseline metrics against the current editor payload")); - assertTrue(page.contains("candidate count, healthy/unhealthy count, total in-flight load, max p95 latency, max error rate, and queue depth")); + assertTrue(page.contains("aria-label=\"How this routing decision was made cards\"")); + assertTrue(page.contains("How was the selected backend chosen?")); + assertTrue(page.contains("The first returned comparison result is the primary controlled lab decision")); + assertTrue(page.contains("How did the selected strategy influence the decision?")); + assertTrue(page.contains("exact production scoring is not claimed unless exposed by the API")); + assertTrue(page.contains("How did visible input signals influence the proof?")); + assertTrue(page.contains("backend health, latency, load, active connections, capacity, weight, error rate, queue depth, and network-awareness fields")); + assertTrue(page.contains("If multiple candidates appear close, compare returned reason text and visible signals")); + assertTrue(page.contains("What This Lab Needs to Monitor")); + assertTrue(page.contains("Monitor healthy/unhealthy state, selected backend availability")); + assertTrue(page.contains("Monitor p95 latency, in-flight load, queue depth, configured capacity, estimated concurrency, and weight")); assertTrue(page.contains("Unhealthy backends are counted from healthy=false")); - assertTrue(page.contains("all-unhealthy payloads are called out as a degradation boundary")); - assertTrue(page.contains("fewer unhealthy backends than the baseline are described as recovery")); - assertTrue(page.contains("Run mvn spring-boot:run")); - assertTrue(page.contains("reviewer, operator, timeline, and export packet pages provide navigation")); - assertTrue(page.contains("Use the copied association summary as a reviewer note")); - assertTrue(page.contains("it is not an audit artifact created by the server")); - assertTrue(page.contains("Local/demo proof uses synthetic payloads, same-origin local API responses, and browser-local notes")); + assertTrue(page.contains("all-unhealthy payloads are treated as a degradation boundary")); + assertTrue(page.contains("Recovery is represented when visible lab inputs show fewer unhealthy candidates")); + assertTrue(page.contains("How to Reproduce and Explain This Lab Proof")); + assertTrue(page.contains("Run routing comparison against the same-origin local /api/routing/compare endpoint")); + assertTrue(page.contains("Follow evidence association links to reviewer dashboard, operator evidence dashboard, evidence timeline, and evidence export packet")); + assertTrue(page.contains("How Strategy Choice Matters")); + assertTrue(page.contains("How Evidence Supports the Decision")); + assertTrue(page.contains("Timeline and export packet support local reviewer handoff")); assertTrue(normalized.contains("does not prove production traffic")); + assertTrue(normalized.contains("production telemetry")); assertTrue(normalized.contains("live cloud behavior")); assertTrue(normalized.contains("real tenant behavior")); + assertTrue(normalized.contains("sla/slo")); assertTrue(normalized.contains("registry publication")); assertTrue(normalized.contains("container signing")); assertTrue(normalized.contains("production certification")); @@ -427,24 +482,24 @@ void routingDemoEdgeCaseFallbackTextIsSpecificAndBrowserLocal() throws Exception String page = Files.readString(ROUTING_DEMO_PAGE, StandardCharsets.UTF_8); String normalized = page.toLowerCase(Locale.ROOT); - assertTrue(page.contains("No previous scenario has been captured yet; the packaged normal-load baseline remains the static reference.")); - assertTrue(page.contains("Same scenario run twice or unchanged from baseline: strategy order and input signal totals should read as unchanged.")); - assertTrue(page.contains("Selected backend unchanged but signals changed: review the strategy reason and visible scores/signals before treating the decision as equivalent.")); + assertTrue(page.contains("No previous lab scenario has been captured yet; packaged normal-load lab baseline remains the static reference")); + assertTrue(page.contains("Same lab scenario run twice or unchanged from baseline: strategy order and input signal totals should read as unchanged.")); + assertTrue(page.contains("The selected backend is unchanged, but visible lab signals changed.")); assertTrue(page.contains("Strategy changed but backend stayed the same: the selected backend can remain preferred under multiple routing methods.")); - assertTrue(page.contains("Backend changed but strategy stayed the same: input signal deltas likely changed which candidate the same strategy preferred.")); - assertTrue(page.contains("All unhealthy/degraded scenario: every visible backend is unhealthy, so the page should show a degradation boundary instead of production proof.")); - assertTrue(page.contains("Missing or empty comparison response: Local API returned an empty comparison response; static guidance remains available.")); - assertTrue(page.contains("API error or unavailable local server: Local API response unavailable; static guidance remains available.")); - assertTrue(page.contains("Copy-to-clipboard failure fallback: Copy failed; select the visible text and copy manually.")); - assertTrue(page.contains("Static page loaded without prior interaction: static guidance and evidence links remain available before running a scenario.")); - assertTrue(page.contains("Local API returned HTTP ")); - assertTrue(page.contains("Local API returned an empty comparison response; static guidance remains available.")); - assertTrue(page.contains("Local API response unavailable; static guidance remains available.")); - assertTrue(page.contains("Malformed sample request JSON; static guidance remains available.")); - assertTrue(page.contains("Static page loaded without prior interaction; static guidance and evidence links remain available before running a scenario.")); + assertTrue(page.contains("Backend changed but strategy stayed the same: visible lab signal deltas likely changed which candidate the same strategy preferred.")); + assertTrue(page.contains("All backends unhealthy/degraded: every visible backend is unhealthy, so treat the result as a degradation boundary instead of production proof.")); + assertTrue(page.contains("Empty comparison response: The local lab API returned an empty comparison response; static reviewer guidance remains available.")); + assertTrue(page.contains("Local API unavailable/error: The local lab API response is unavailable; static reviewer guidance remains available.")); + assertTrue(page.contains("Clipboard copy failure: Copy failed; use the visible lab explanation as the fallback.")); + assertTrue(page.contains("Page loaded before interaction: static reviewer guidance remains available before a lab run.")); + assertTrue(page.contains("Local lab API returned HTTP ")); + assertTrue(page.contains("The local lab API returned an empty comparison response; static reviewer guidance remains available.")); + assertTrue(page.contains("The local lab API response is unavailable; static reviewer guidance remains available.")); + assertTrue(page.contains("Malformed lab request JSON; static reviewer guidance remains available.")); + assertTrue(page.contains("Static page loaded without prior interaction; static reviewer guidance and evidence links remain available before running a lab scenario.")); assertTrue(page.contains("Browser clipboard permission may be unavailable.")); - assertTrue(page.contains("Evidence links are available even before running a scenario.")); - assertTrue(normalized.contains("browser-local summaries")); + assertTrue(page.contains("Evidence links remain available before a lab run, but they do not certify production behavior.")); + assertTrue(normalized.contains("browser-local copy")); assertTrue(normalized.contains("no upload/share endpoint")); assertTrue(normalized.contains("no server-side export/pdf/zip generation")); assertFalse(normalized.contains("server-side association export")); @@ -458,12 +513,12 @@ void routingDemoAssociationLegendExplainsProofTermsWithoutCertificationClaim() t assertTrue(page.contains("id=\"association-legend-panel\"")); assertTrue(page.contains("aria-label=\"Association legend cards\"")); - assertTrue(page.contains("scenario = demo input state")); + assertTrue(page.contains("scenario = controlled lab input state")); assertTrue(page.contains("strategy = selected routing method")); - assertTrue(page.contains("backend/server = selected local candidate from the sample response")); - assertTrue(page.contains("signals = local/demo metrics used for explanation")); + assertTrue(page.contains("backend/server = selected local candidate from the lab response")); + assertTrue(page.contains("signals = controlled lab metrics used for explanation")); assertTrue(page.contains("evidence pages = reviewer navigation aids, not production certification")); - assertTrue(normalized.contains("synthetic local state under review")); + assertTrue(normalized.contains("synthetic local lab state under review")); assertTrue(normalized.contains("method returned by the local compare endpoint")); assertTrue(normalized.contains("local candidate in the visible request and response pair")); assertTrue(normalized.contains("visible health, load, latency, error, queue, and network-awareness fields")); @@ -478,17 +533,17 @@ void routingDemoPageContainsSafetyLimitationsAndPostmanParity() throws Exception String normalized = page.toLowerCase(Locale.ROOT); assertTrue(page.contains("Postman parity: run the Routing Decision Demo folder")); - assertTrue(normalized.contains("local/operator demo only")); + assertTrue(normalized.contains("local enterprise lab cockpit only")); assertTrue(normalized.contains("not certification")); assertTrue(normalized.contains("not benchmark proof")); assertTrue(normalized.contains("not legal compliance proof")); assertTrue(normalized.contains("not identity proof")); assertTrue(normalized.contains("no cloud mutation")); - assertTrue(normalized.contains("no cloudmanager required for routing demo")); + assertTrue(normalized.contains("no cloudmanager required for routing lab cockpit")); assertTrue(normalized.contains("no external services/dependencies")); assertTrue(normalized.contains("no external scripts/cdns")); - assertTrue(normalized.contains("api server required for browser/postman demo")); - assertTrue(normalized.contains("no runtime reports or demo transcripts are written")); + assertTrue(normalized.contains("api server required for browser/postman lab review")); + assertTrue(normalized.contains("no runtime reports or lab transcripts are written")); } @Test