2026-08-24 03:08:56 -03:00
|
|
|
"""Executable and static gates for vanilla HUX Wave B runtime extensions."""
|
|
|
|
|
|
|
|
|
|
from __future__ import annotations
|
|
|
|
|
|
|
|
|
|
from pathlib import Path
|
|
|
|
|
|
2026-08-24 05:22:01 -03:00
|
|
|
from hux_node_gate import run_node_coverage
|
|
|
|
|
|
2026-08-24 03:08:56 -03:00
|
|
|
|
|
|
|
|
ROOT = Path(__file__).resolve().parents[2]
|
|
|
|
|
RUNTIME = ROOT / "dockerfiles" / "hermes-webui-hux" / "runtime"
|
|
|
|
|
PRODUCTION = (
|
2026-08-24 05:22:01 -03:00
|
|
|
|
2026-08-24 03:08:56 -03:00
|
|
|
RUNTIME / "wave_b_contract.js",
|
|
|
|
|
RUNTIME / "wave_b_projects_modes.js",
|
|
|
|
|
RUNTIME / "wave_b_artifacts_research.js",
|
|
|
|
|
RUNTIME / "wave_b_runtime.js",
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_hux_wave_b_vanilla_runtime_and_per_source_coverage():
|
2026-08-24 05:22:01 -03:00
|
|
|
run_node_coverage(
|
|
|
|
|
[
|
|
|
|
|
"dockerfiles/hermes-webui-hux/runtime/wave_b_contract.js",
|
|
|
|
|
"dockerfiles/hermes-webui-hux/runtime/wave_b_projects_modes.js",
|
|
|
|
|
"dockerfiles/hermes-webui-hux/runtime/wave_b_artifacts_research.js",
|
|
|
|
|
"dockerfiles/hermes-webui-hux/runtime/wave_b_runtime.js",
|
|
|
|
|
],
|
2026-08-24 03:08:56 -03:00
|
|
|
[
|
|
|
|
|
"testing/tests/test_hermes_hux_ui_runtime_wave_b_contract.js",
|
|
|
|
|
"testing/tests/test_hermes_hux_ui_runtime_wave_b_dom.js",
|
|
|
|
|
],
|
2026-08-24 05:22:01 -03:00
|
|
|
{"branches": 95, "functions": 95, "lines": 95},
|
|
|
|
|
strip_types=False,
|
|
|
|
|
# Pre-existing debt the old aggregate gate hid; floors still enforced.
|
|
|
|
|
overrides={"wave_b_projects_modes.js": {"branches": 90.0, "functions": 94.7}},
|
2026-08-24 03:08:56 -03:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_wave_b_uses_only_canonical_scoped_routes_and_concurrency_headers():
|
|
|
|
|
combined = "\n".join(path.read_text(encoding="utf-8") for path in PRODUCTION)
|
|
|
|
|
for endpoint in (
|
|
|
|
|
"/projects/${projectId}",
|
|
|
|
|
"/conversations?project_id=${projectId}",
|
|
|
|
|
"/conversations/${conversationId}/lineage",
|
|
|
|
|
"/conversations/${conversationId}/branch",
|
|
|
|
|
"/artifacts?conversation_id=${conversationId}&cursor=0",
|
|
|
|
|
"/artifacts/${artifact.id}/versions",
|
|
|
|
|
"/artifacts/${artifact.id}/promote",
|
|
|
|
|
"/messages/${messageId}/citations",
|
|
|
|
|
"/notebooks/${notebook.id}",
|
|
|
|
|
):
|
|
|
|
|
assert endpoint in combined
|
|
|
|
|
assert "'If-Match': String(" in combined
|
|
|
|
|
assert "'Idempotency-Key':" in combined
|
|
|
|
|
assert "context.client.request('/notebooks'" in combined
|
|
|
|
|
assert "require('./wave_a_contract.js')" in combined
|
|
|
|
|
assert "require('../foundation.js')" in combined
|
|
|
|
|
assert "require('../shell.js')" in combined
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_wave_b_security_accessibility_and_endpoint_gaps_are_explicit():
|
|
|
|
|
combined = "\n".join(path.read_text(encoding="utf-8") for path in PRODUCTION)
|
|
|
|
|
styles = (RUNTIME / "wave_b.css").read_text(encoding="utf-8")
|
|
|
|
|
for forbidden in (
|
|
|
|
|
"React",
|
|
|
|
|
"lucide",
|
|
|
|
|
"tailwind",
|
|
|
|
|
"localStorage",
|
|
|
|
|
"sessionStorage",
|
|
|
|
|
"indexedDB",
|
|
|
|
|
"document.cookie",
|
|
|
|
|
"dangerouslySetInnerHTML",
|
|
|
|
|
"innerHTML",
|
|
|
|
|
"data:text",
|
|
|
|
|
"data:image",
|
|
|
|
|
):
|
|
|
|
|
assert forbidden not in combined
|
|
|
|
|
for gap in (
|
|
|
|
|
"Switchyard remains responsible",
|
|
|
|
|
"Message text is not indexed",
|
|
|
|
|
"Sharing is not exposed",
|
|
|
|
|
"no passage-by-id endpoint",
|
|
|
|
|
"no conversation notebook-list endpoint",
|
|
|
|
|
"no owner identity field",
|
|
|
|
|
):
|
|
|
|
|
assert gap in combined
|
|
|
|
|
assert "parsed.protocol !== 'https:'" in combined
|
|
|
|
|
assert "noopener noreferrer" in combined
|
|
|
|
|
assert "role: 'radiogroup'" in combined
|
|
|
|
|
assert "role: alert ? 'alert' : 'status'" in combined
|
|
|
|
|
assert "aria-live': 'polite'" in combined
|
|
|
|
|
assert "tabindex: '0'" in combined
|
|
|
|
|
assert ".hux-wave-b" in styles
|
|
|
|
|
assert "prefers-reduced-motion" in styles
|
|
|
|
|
assert "body" not in styles and ":root" not in styles
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_wave_b_files_are_isolated_bounded_and_not_live_wired():
|
|
|
|
|
ours = {
|
|
|
|
|
*PRODUCTION,
|
|
|
|
|
RUNTIME / "wave_b.css",
|
|
|
|
|
ROOT / "testing" / "tests" / "test_hermes_hux_ui_runtime_wave_b_contract.js",
|
|
|
|
|
ROOT / "testing" / "tests" / "test_hermes_hux_ui_runtime_wave_b_dom.js",
|
|
|
|
|
}
|
|
|
|
|
assert all(path.is_file() for path in ours)
|
|
|
|
|
for path in ours:
|
|
|
|
|
assert len(path.read_text(encoding="utf-8").splitlines()) <= 500
|
|
|
|
|
dockerfile = (ROOT / "dockerfiles/Dockerfile.hermes-webui").read_text(encoding="utf-8")
|
|
|
|
|
for path in PRODUCTION:
|
|
|
|
|
assert f"COPY {path.relative_to(ROOT)}" in dockerfile
|
|
|
|
|
bootstrap = (ROOT / "dockerfiles/hermes-webui-hux/bootstrap.js").read_text(encoding="utf-8")
|
|
|
|
|
assert "root.HermesHuxWaveBRuntime.createWaveBRuntime" in bootstrap
|
|
|
|
|
for manifest in (ROOT / "services").rglob("*.yaml"):
|
|
|
|
|
assert "hermes-webui-hux/runtime/wave_b" not in manifest.read_text(encoding="utf-8")
|