diff --git a/ROADMAP.md b/ROADMAP.md index c70d0aa34b2..71ed597ba24 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -85,7 +85,6 @@ This window = a few days of STABILITY — shrink the fail-open surface, don't "l A flaky or green-but-broken floor means no gate protects anything — so CI is upstream of every §0 claim. CI is also the one workload that flexes *every* substrate layer at once (execution · scheduling · caching · secrets/effects · emission), so it is the forcing function that turns each modeled-but-inert abstraction load-bearing. **Deliverable = shared abstractions proven by CI consuming them** (one Materialization kernel · one Placement authority · one secrets model); faster CI falls *out* of that, it is not the goal (§6 — price the lane in displaced cost, "move with confidence", not elegance). → [charter: causal-chain gap analysis](docs/plans/ci-process-end-to-end.md) — what's on `.dag` today vs not, push→execute. -→ [CI humming](docs/plans/ci-humming.md) — the throughput/wall-clock/reliability operations plan for the **▸ NOW** milestone: un-throttle runner slots from the modeled budget (fix the build-pool double-count), verified-effective caps, the carrier, SessionSliceEnforcement, oomd demoted to backstop. → [CI humming](docs/plans/ci-humming.md) — the throughput/wall-clock/reliability operations plan for the **▸ NOW** milestone: un-throttle runner slots from the modeled budget (fix the build-pool double-count), verified-effective caps, the carrier, SessionSliceEnforcement, oomd demoted to backstop. diff --git a/docs/plans/emission-ingestion-inverse.md b/docs/plans/emission-ingestion-inverse.md index 1eb388c3457..a3ebde0a71b 100644 --- a/docs/plans/emission-ingestion-inverse.md +++ b/docs/plans/emission-ingestion-inverse.md @@ -96,7 +96,7 @@ The §5 guard catches a module *importing* a target AST it shouldn't. But there | GitHub Actions `${{ }}` expression language | **opaque `String`** (🟡 scaffold) — worst | `actions.dag` `*Expression { expression: String }`; inline `${{ runner.temp }}`/`${{ hashFiles(…) }}` in `ci_workflow.dag` | | CI YAML structure + shell-in-`run:` | partly modeled, values strings; **three nested unmodeled languages** (YAML + GHA-expr + shell) all grepped | `ci_yaml_serializer_witness_test.dag`, `ci_runner_seam_witness_test.dag` | | bash intent (`program.dag`) | sidecar AST, 11 importers | the §5 guard's existing target | -| **markup** (react/html/markdown) | **modeled with escape semantics + MODEL-level discriminating witnesses** — the target state | `react_markup_witness_test.dag` checks the *reject behavior* (`escape_url`, std/markup SECURITY SCOPE), not a grep | +| **markup** (react/html/markdown) | **modeled with escape semantics + MODEL-level discriminating witnesses** — the target state | `html_emit_witness_test.dag` checks the *reject behavior* (`escape_url`, std/markup SECURITY SCOPE), not a grep | Markup already does it right; the CI YAML is the same problem three layers deep, still strings. diff --git a/dsl/examples/gunbhub_serve_program/gunbhub_serve_program.dag b/dsl/examples/gunbhub_serve_program/gunbhub_serve_program.dag new file mode 100644 index 00000000000..316356dbb5a --- /dev/null +++ b/dsl/examples/gunbhub_serve_program/gunbhub_serve_program.dag @@ -0,0 +1,78 @@ +module examples.gunbhub_serve_program + +import gunbc.gunbhub_serve { + GunbhubServeRequest, + GunbhubPageSource, + ReactPage, + Served, + RenderRejectedBeforeServe, + RouteNotFound, + MethodNotAllowed, + gunbhub_hostile_page, + serve_gunbhub_request, + serve_gunbhub_page_source, +} +import extdeps.languages.html { + try_serialize_html_source, + EmitOk, + EmitRejected, +} +import std.process { ProcessExit, ExitSuccess, ExitFailure, exit_code_general_error } +import std.types { GET } + +fn wa_unknown_path_is_not_found() -> Bool { + match serve_gunbhub_request( + req: GunbhubServeRequest { method: GET, path: "/unknown/nonexistent" } + ) { + RouteNotFound => true + Served { response: _ } => false + RenderRejectedBeforeServe { reason: _ } => false + MethodNotAllowed => false + } +} + +fn wb_unsafe_href_is_rejected() -> Bool { + match try_serialize_html_source(node: gunbhub_hostile_page()) { + EmitRejected { reason: _ } => true + EmitOk { html: _ } => false + } +} + +fn wb_unsafe_href_rejected_before_serve() -> Bool { + match serve_gunbhub_page_source( + source: ReactPage { node: gunbhub_hostile_page() } + ) { + RenderRejectedBeforeServe { reason: _ } => true + Served { response: _ } => false + RouteNotFound => false + MethodNotAllowed => false + } +} + +fn browse_root_serves_200() -> Bool { + match serve_gunbhub_request( + req: GunbhubServeRequest { method: GET, path: "/" } + ) { + Served { response: r } => r.status == 200 && r.body != "" + RouteNotFound => false + RenderRejectedBeforeServe { reason: _ } => false + MethodNotAllowed => false + } +} + +data honest_deferral: String = "gunbhub serves the modeled HTTP response by execution (gunbc-run, exit-checked on served bytes); binds a real socket when Lane C emits the server to a host language" + +func main() -> ProcessExit { + if wa_unknown_path_is_not_found() + && wb_unsafe_href_is_rejected() + && wb_unsafe_href_rejected_before_serve() + && browse_root_serves_200() + { + ExitSuccess + } else { + ExitFailure { + code: exit_code_general_error, + reason: "gunbhub serve program assertion failed", + } + } +} diff --git a/dsl/extdeps/languages/html.dag b/dsl/extdeps/languages/html.dag index 31053fcd7e0..5a2781b0cdc 100644 --- a/dsl/extdeps/languages/html.dag +++ b/dsl/extdeps/languages/html.dag @@ -9,6 +9,7 @@ import std.markup { unescape_text, unescape_attribute, unescape_url, validate_href, SafeHref, RejectedHref, attr_is_url_attr, + find_first_rejected_url, } data extdeps_external_authority_anchor: ExternalAuthority = ExternalAuthority { @@ -307,3 +308,16 @@ fn ingest_html_source(src: String) -> HtmlIngestResult { fn html_medium_lossless(node: MarkupNode) -> Medium { Medium { carried: node, fidelity: Lossless } } + +type HtmlEmitResult + = EmitOk { html: String } + | EmitRejected { reason: String } + +fn try_serialize_html_source(node: MarkupNode) -> HtmlEmitResult { + match find_first_rejected_url(node: node) { + Present { value: r } => + EmitRejected { reason: r.url } + Absent => + EmitOk { html: serialize_html_source(node: node) } + } +} diff --git a/dsl/gunbc/gunbhub_serve.dag b/dsl/gunbc/gunbhub_serve.dag index da11b3dae1e..269d4647ebf 100644 --- a/dsl/gunbc/gunbhub_serve.dag +++ b/dsl/gunbc/gunbhub_serve.dag @@ -14,11 +14,10 @@ import std.markup { MarkupAttr, MarkupNode, } -import std.react_markup { +import extdeps.languages.html { EmitOk, EmitRejected, - UntrustedUrlScheme, - serialize_react_markup, + try_serialize_html_source, } import extdeps.http.server { HttpServerRoute, @@ -56,14 +55,39 @@ type GunbhubRenderResult = RenderedHtml { html: String } | RenderRejected { reason: String } -fn gunbhub_browse_entry(name: String) -> MarkupNode { +fn gunbhub_header() -> MarkupNode { + ElementNode { + tag: "header", + attrs: [], + children: [ + ElementNode { + tag: "h1", + attrs: [], + children: [ TextNode { text: "gunbc" } ], + }, + ElementNode { + tag: "nav", + attrs: [], + children: [ + ElementNode { + tag: "a", + attrs: [ MarkupAttr { name: "href", value: "/" } ], + children: [ TextNode { text: "Browse" } ], + }, + ], + }, + ], + } +} + +fn gunbhub_browse_entry(name: String, path: String) -> MarkupNode { ElementNode { tag: "li", attrs: [], children: [ ElementNode { tag: "a", - attrs: [], + attrs: [ MarkupAttr { name: "href", value: path } ], children: [ TextNode { text: name } ], }, ], @@ -72,21 +96,40 @@ fn gunbhub_browse_entry(name: String) -> MarkupNode { fn gunbhub_browse_page() -> MarkupNode { ElementNode { - tag: "div", + tag: "html", attrs: [], children: [ ElementNode { - tag: "h1", + tag: "head", attrs: [], - children: [ TextNode { text: "gunbc" } ], + children: [ + ElementNode { + tag: "title", + attrs: [], + children: [ TextNode { text: "gunbc" } ], + }, + ], }, ElementNode { - tag: "ul", + tag: "body", attrs: [], children: [ - gunbhub_browse_entry(name: "dsl"), - gunbhub_browse_entry(name: "src"), - gunbhub_browse_entry(name: "ROADMAP.md"), + gunbhub_header(), + ElementNode { + tag: "main", + attrs: [], + children: [ + ElementNode { + tag: "ul", + attrs: [], + children: [ + gunbhub_browse_entry(name: "dsl", path: "/dsl"), + gunbhub_browse_entry(name: "src", path: "/src"), + gunbhub_browse_entry(name: "ROADMAP.md", path: "/ROADMAP.md"), + ], + }, + ], + }, ], }, ], @@ -103,20 +146,45 @@ fn gunbhub_hostile_page() -> MarkupNode { fn gunbhub_readme_page() -> MarkupNode { ElementNode { - tag: "article", + tag: "html", attrs: [], children: [ ElementNode { - tag: "h1", + tag: "head", attrs: [], - children: [ TextNode { text: "gunbc" } ], + children: [ + ElementNode { + tag: "title", + attrs: [], + children: [ TextNode { text: "gunbc — README" } ], + }, + ], }, ElementNode { - tag: "p", + tag: "body", attrs: [], children: [ - TextNode { - text: "DAG-modeled compiler and language project. Rust is bootstrap seed.", + gunbhub_header(), + ElementNode { + tag: "main", + attrs: [], + children: [ + ElementNode { + tag: "article", + attrs: [], + children: [ + ElementNode { + tag: "p", + attrs: [], + children: [ + TextNode { + text: "DAG-modeled compiler and language project. Rust is bootstrap seed.", + }, + ], + }, + ], + }, + ], }, ], }, @@ -129,10 +197,9 @@ type GunbhubComposeResult | ComposeRejected { reason: String } fn gunbhub_compose_body(node: MarkupNode) -> GunbhubComposeResult { - match serialize_react_markup(node: node) { + match try_serialize_html_source(node: node) { EmitOk { html: h } => ComposedOk { html: h } - EmitRejected { reason: UntrustedUrlScheme { url: u } } => - ComposeRejected { reason: concat("react markup rejected: ", u) } + EmitRejected { reason: r } => ComposeRejected { reason: r } } } @@ -214,10 +281,9 @@ fn path_matches_template(template: PathTemplate, path: String) -> Bool { fn render_gunbhub_page(source: GunbhubPageSource) -> GunbhubRenderResult { match source { ReactPage { node } => - match serialize_react_markup(node: node) { + match try_serialize_html_source(node: node) { EmitOk { html: h } => RenderedHtml { html: h } - EmitRejected { reason: UntrustedUrlScheme { url: u } } => - RenderRejected { reason: concat("react markup rejected: ", u) } + EmitRejected { reason: r } => RenderRejected { reason: r } } } } @@ -284,12 +350,10 @@ fn gunbhub_served_static_route_table() -> ServedStaticRouteTable { xs: gunbhub_route_table(), init: [], f: (acc, row) => - match gunbhub_compose_body( - node: match row.page { - ReactPage { node: n } => n - } + match try_serialize_html_source( + node: match row.page { ReactPage { node: n } => n } ) { - ComposedOk { html: h } => + EmitOk { html: h } => concat( acc, [ @@ -302,7 +366,7 @@ fn gunbhub_served_static_route_table() -> ServedStaticRouteTable { }, ] ) - ComposeRejected { reason: _ } => acc + EmitRejected { reason: _ } => acc } ) ServedStaticRouteTable { routes: routes } diff --git a/dsl/gunbc/gunbhub_serve_html.dag b/dsl/gunbc/gunbhub_serve_html.dag index b44e8472d5b..fc47fc5522f 100644 --- a/dsl/gunbc/gunbhub_serve_html.dag +++ b/dsl/gunbc/gunbhub_serve_html.dag @@ -2,13 +2,13 @@ module gunbc.gunbhub_serve_html import std.markup { MarkupNode, - Serialized, - Rejected, ElementNode, TextNode, } -import std.html_markup { - try_serialize_html_node, +import extdeps.languages.html { + try_serialize_html_source, + EmitOk, + EmitRejected, } fn sample_html_page() -> MarkupNode { @@ -20,9 +20,9 @@ fn sample_html_page() -> MarkupNode { } fn witness_html_consumer_serializes() -> Bool { - match try_serialize_html_node(node: sample_html_page()) { - Serialized { html: h } => h == "

gunbhub

" - Rejected { reason: _ } => false + match try_serialize_html_source(node: sample_html_page()) { + EmitOk { html: h } => h == "

gunbhub

" + EmitRejected { reason: _ } => false } } diff --git a/dsl/gunbc/plans/emission_ingestion_inverse.dag b/dsl/gunbc/plans/emission_ingestion_inverse.dag index ab0c777658b..979006f2b6b 100644 --- a/dsl/gunbc/plans/emission_ingestion_inverse.dag +++ b/dsl/gunbc/plans/emission_ingestion_inverse.dag @@ -100,7 +100,7 @@ fn emission_ingestion_inverse_body() -> List { row(cells: [cell(text: "GitHub Actions `$\{\{ \}\}` expression language"), cell(text: "**opaque `String`** (🟡 scaffold) — worst"), cell(text: "`actions.dag` `*Expression \{ expression: String \}`; inline `$\{\{ runner.temp \}\}`/`$\{\{ hashFiles(…) \}\}` in `ci_workflow.dag`")]), row(cells: [cell(text: "CI YAML structure + shell-in-`run:`"), cell(text: "partly modeled, values strings; **three nested unmodeled languages** (YAML + GHA-expr + shell) all grepped"), cell(text: "`ci_yaml_serializer_witness_test.dag`, `ci_runner_seam_witness_test.dag`")]), row(cells: [cell(text: "bash intent (`program.dag`)"), cell(text: "sidecar AST, 11 importers"), cell(text: "the §5 guard's existing target")]), - row(cells: [cell(text: "**markup** (react/html/markdown)"), cell(text: "**modeled with escape semantics + MODEL-level discriminating witnesses** — the target state"), cell(text: "`react_markup_witness_test.dag` checks the *reject behavior* (`escape_url`, std/markup SECURITY SCOPE), not a grep")]), + row(cells: [cell(text: "**markup** (react/html/markdown)"), cell(text: "**modeled with escape semantics + MODEL-level discriminating witnesses** — the target state"), cell(text: "`html_emit_witness_test.dag` checks the *reject behavior* (`escape_url`, std/markup SECURITY SCOPE), not a grep")]), ], }, p(text: "Markup already does it right; the CI YAML is the same problem three layers deep, still strings."), diff --git a/dsl/std/react_markup.dag b/dsl/std/react_markup.dag deleted file mode 100644 index 4596e422371..00000000000 --- a/dsl/std/react_markup.dag +++ /dev/null @@ -1,22 +0,0 @@ -module std.react_markup - -import std.markup { - MarkupNode, - find_first_rejected_url, - serialize_markup_node, -} - -type MarkupRejectReason = UntrustedUrlScheme { url: String } - -type MarkupEmitResult - = EmitOk { html: String } - | EmitRejected { reason: MarkupRejectReason } - -fn serialize_react_markup(node: MarkupNode) -> MarkupEmitResult { - match find_first_rejected_url(node: node) { - Present { value: ru } => - EmitRejected { reason: UntrustedUrlScheme { url: ru.url } } - Absent => - EmitOk { html: serialize_markup_node(node: node) } - } -} diff --git a/dsl/test/claim/gunbhub_react_browse_witness_test.dag b/dsl/test/claim/gunbhub_react_browse_witness_test.dag index 67013d4a7d2..121329f3ad0 100644 --- a/dsl/test/claim/gunbhub_react_browse_witness_test.dag +++ b/dsl/test/claim/gunbhub_react_browse_witness_test.dag @@ -1,14 +1,14 @@ module test.claim.gunbhub_react_browse_witness import gunbc.gunbhub_serve { gunbhub_browse_page } -import std.react_markup { +import extdeps.languages.html { EmitOk, EmitRejected, - serialize_react_markup, + try_serialize_html_source, } fn browse_page_html() -> String { - match serialize_react_markup(node: gunbhub_browse_page()) { + match try_serialize_html_source(node: gunbhub_browse_page()) { EmitOk { html: h } => h EmitRejected { reason: _ } => "" } @@ -18,7 +18,7 @@ data gunbhub_browse_html: String = browse_page_html() fn gunbhub_browse_page_serializes_holds() -> Bool { gunbhub_browse_html == - "

gunbc

" + "gunbc

gunbc

" } test fn gunbhub_browse_keystone_holds() -> Bool { diff --git a/dsl/test/claim/gunbhub_serve_witness_test.dag b/dsl/test/claim/gunbhub_serve_witness_test.dag index a2b5bb15464..4696683d97c 100644 --- a/dsl/test/claim/gunbhub_serve_witness_test.dag +++ b/dsl/test/claim/gunbhub_serve_witness_test.dag @@ -28,11 +28,6 @@ import gunbc.gunbhub_serve { import gunbc.gunbhub_serve_html { gunbhub_html_render_keystone_holds } import extdeps.http.server { http_content_type_wire_label } import std.markup { MarkupNode } -import std.react_markup { - EmitOk, - EmitRejected, - serialize_react_markup, -} import std.types { GET, POST } fn witness_compose_ok_html(node: MarkupNode) -> String { diff --git a/dsl/test/claim/react_markup_witness_test.dag b/dsl/test/claim/html_emit_witness_test.dag similarity index 75% rename from dsl/test/claim/react_markup_witness_test.dag rename to dsl/test/claim/html_emit_witness_test.dag index d0bd064295d..4984ab5757c 100644 --- a/dsl/test/claim/react_markup_witness_test.dag +++ b/dsl/test/claim/html_emit_witness_test.dag @@ -1,4 +1,4 @@ -module test.claim.react_markup_witness +module test.claim.html_emit_witness import std.markup { ElementNode, @@ -7,11 +7,10 @@ import std.markup { MarkupNode, serialize_markup_node, } -import std.react_markup { +import extdeps.languages.html { EmitOk, EmitRejected, - UntrustedUrlScheme, - serialize_react_markup, + try_serialize_html_source, } fn sample_button() -> MarkupNode { @@ -22,15 +21,15 @@ fn sample_button() -> MarkupNode { } } -fn witness_react_consumer_reduces_and_serializes() -> Bool { - match serialize_react_markup(node: sample_button()) { +fn witness_html_emit_reduces_and_serializes() -> Bool { + match try_serialize_html_source(node: sample_button()) { EmitOk { html: h } => h == "" EmitRejected { reason: _ } => false } } -fn witness_react_fragment_matches_markup_fold() -> Bool { - match serialize_react_markup(node: sample_button()) { +fn witness_html_emit_matches_markup_fold() -> Bool { + match try_serialize_html_source(node: sample_button()) { EmitOk { html: h } => h == serialize_markup_node(node: sample_button()) EmitRejected { reason: _ } => false } @@ -53,7 +52,7 @@ fn hostile_data_href() -> MarkupNode { } fn witness_javascript_reject_discriminates_from_char_escape() -> Bool { - match serialize_react_markup(node: hostile_javascript_href()) { + match try_serialize_html_source(node: hostile_javascript_href()) { EmitRejected { reason: _ } => { let unchecked = serialize_markup_node(node: hostile_javascript_href()) unchecked == "click" @@ -63,7 +62,7 @@ fn witness_javascript_reject_discriminates_from_char_escape() -> Bool { } fn witness_data_reject_discriminates_from_char_escape() -> Bool { - match serialize_react_markup(node: hostile_data_href()) { + match try_serialize_html_source(node: hostile_data_href()) { EmitRejected { reason: _ } => { let unchecked = serialize_markup_node(node: hostile_data_href()) starts_with(s: unchecked, prefix: " Bool { } fn witness_serialize_rejects_javascript_href() -> Bool { - match serialize_react_markup(node: hostile_javascript_href()) { - EmitRejected { reason: UntrustedUrlScheme { url: u } } => + match try_serialize_html_source(node: hostile_javascript_href()) { + EmitRejected { reason: u } => u == "javascript:alert(1)" EmitOk { html: _ } => false } } fn witness_serialize_rejects_data_href() -> Bool { - match serialize_react_markup(node: hostile_data_href()) { - EmitRejected { reason: UntrustedUrlScheme { url: u } } => + match try_serialize_html_source(node: hostile_data_href()) { + EmitRejected { reason: u } => starts_with(s: u, prefix: "data:") EmitOk { html: _ } => false } } fn witness_http_href_serializes() -> Bool { - match serialize_react_markup( + match try_serialize_html_source( node: ElementNode { tag: "a", attrs: [ MarkupAttr { name: "href", value: "https://gunbc.dev" } ], @@ -118,23 +117,23 @@ fn req_a_hostile_but_trusted_scheme() -> MarkupNode { } fn witness_trusted_href_serializes() -> Bool { - match serialize_react_markup(node: trusted_relative_link()) { + match try_serialize_html_source(node: trusted_relative_link()) { EmitOk { html: h } => h == "dsl" EmitRejected { reason: _ } => false } } fn witness_req_a_hostile_href_still_emits_with_escaping() -> Bool { - match serialize_react_markup(node: req_a_hostile_but_trusted_scheme()) { + match try_serialize_html_source(node: req_a_hostile_but_trusted_scheme()) { EmitOk { html: h } => h == "" EmitRejected { reason: _ } => false } } -test fn react_markup_keystone_holds() -> Bool { - witness_react_consumer_reduces_and_serializes() - && witness_react_fragment_matches_markup_fold() +test fn html_emit_keystone_holds() -> Bool { + witness_html_emit_reduces_and_serializes() + && witness_html_emit_matches_markup_fold() && witness_javascript_reject_discriminates_from_char_escape() && witness_data_reject_discriminates_from_char_escape() && witness_serialize_rejects_javascript_href() diff --git a/src/v1/tests/src/gunbhub_serve_program_test.rs b/src/v1/tests/src/gunbhub_serve_program_test.rs new file mode 100644 index 00000000000..ea34fa20861 --- /dev/null +++ b/src/v1/tests/src/gunbhub_serve_program_test.rs @@ -0,0 +1,46 @@ +use crate::helpers::workspace_root; + +#[test] +fn gunbhub_serve_program_runs_green() { + let ws = workspace_root(); + let gunbc = ws.join("target/release/gunbc"); + assert!( + gunbc.is_file(), + "release gunbc binary required for gunbhub_serve_program (built in ci_floor / ci_floor_parity)" + ); + + let entry = ws.join("dsl/examples/gunbhub_serve_program/gunbhub_serve_program.dag"); + let program_root = ws.join("dsl/examples/gunbhub_serve_program"); + let std_root = ws.join("dsl/std"); + let gunbc_root = ws.join("dsl/gunbc"); + let extdeps_root = ws.join("dsl/extdeps"); + + let output = std::process::Command::new(&gunbc) + .arg("run") + .arg("--source-root") + .arg(program_root) + .arg("--source-root") + .arg(std_root) + .arg("--source-root") + .arg(gunbc_root) + .arg("--source-root") + .arg(extdeps_root) + .arg("--entry") + .arg(&entry) + .arg("--function") + .arg("main") + .current_dir(&ws) + .output() + .expect("spawn gunbc run for gunbhub_serve_program"); + + if output.status.success() { + return; + } + + let stdout = String::from_utf8_lossy(&output.stdout); + let stderr = String::from_utf8_lossy(&output.stderr); + panic!( + "gunbhub_serve_program func main failed (exit {:?}).\n--- stdout ---\n{stdout}\n--- stderr ---\n{stderr}", + output.status.code() + ); +} diff --git a/src/v1/tests/src/lib.rs b/src/v1/tests/src/lib.rs index d34fe11631a..5f6bf8dfdd2 100644 --- a/src/v1/tests/src/lib.rs +++ b/src/v1/tests/src/lib.rs @@ -57,6 +57,8 @@ mod fold_list_generic_instantiation_test; #[cfg(test)] mod generator_match_arm_test; #[cfg(test)] +mod gunbhub_serve_program_test; +#[cfg(test)] mod html_markup_smoke_test; #[cfg(test)] mod infer_semantics; diff --git a/src/v2/workflow/claim_witness_corpus_ci_runner.dag b/src/v2/workflow/claim_witness_corpus_ci_runner.dag index b86cddd3cb8..ec8b289b4fd 100644 --- a/src/v2/workflow/claim_witness_corpus_ci_runner.dag +++ b/src/v2/workflow/claim_witness_corpus_ci_runner.dag @@ -343,10 +343,10 @@ data corpus_ci_gate_row_html_markup_xss_keystone: ClaimWitnessCorpusClaimRunRow expected: ExpectPass } -data corpus_ci_gate_row_react_markup_keystone: ClaimWitnessCorpusClaimRunRow = ClaimWitnessCorpusClaimRunRow { - label: "react markup consumer + XSS reject keystone", - entry: "dsl/test/claim/react_markup_witness.dag", - function: "react_markup_keystone_holds", +data corpus_ci_gate_row_html_emit_keystone: ClaimWitnessCorpusClaimRunRow = ClaimWitnessCorpusClaimRunRow { + label: "html emit consumer + XSS reject keystone", + entry: "dsl/test/claim/html_emit_witness_test.dag", + function: "html_emit_keystone_holds", expected: ExpectPass } @@ -527,7 +527,7 @@ data claim_witness_corpus_shard_b_rows: List = [ corpus_ci_gate_row_probe_selector_cf_import_resolves, corpus_ci_gate_row_markup_serializer_keystone, corpus_ci_gate_row_html_markup_xss_keystone, - corpus_ci_gate_row_react_markup_keystone, + corpus_ci_gate_row_html_emit_keystone, corpus_ci_gate_row_markdown_markup_xss_keystone, corpus_ci_gate_row_filesystem_write_keystone, corpus_ci_gate_row_gunbhub_react_browse_keystone,