diff --git a/DISASMER_PUBLIC_TREE.json b/DISASMER_PUBLIC_TREE.json index c16e065..2b0c387 100644 --- a/DISASMER_PUBLIC_TREE.json +++ b/DISASMER_PUBLIC_TREE.json @@ -1,7 +1,7 @@ { "kind": "disasmer-filtered-public-tree", - "source_commit": "4336e3b85b5865fca9979c69ebb3906eab7601da", - "release_name": "dryrun-4336e3b85b58", + "source_commit": "5375c152bd76192d0bd8422f42e9a7c49601b10c", + "release_name": "dryrun-5375c152bd76", "filtered_out": [ "private/**", "experiments/**", diff --git a/scripts/cli-first-contract-smoke.js b/scripts/cli-first-contract-smoke.js index a9ff626..50f1236 100644 --- a/scripts/cli-first-contract-smoke.js +++ b/scripts/cli-first-contract-smoke.js @@ -38,6 +38,7 @@ const outputModeSmoke = read("scripts/cli-output-mode-smoke.js"); const errorExitSmoke = read("scripts/cli-error-exit-smoke.js"); const browserLoginFlowSmoke = read("scripts/cli-browser-login-flow-smoke.js"); const nodeAttachSmoke = read("scripts/node-attach-smoke.js"); +const dapSmoke = read("scripts/dap-smoke.js"); expect(criteria, "header", /^# Disasmer CLI-First MVP Acceptance Criteria/m); expect( @@ -133,6 +134,16 @@ expect( "community tier CLI wording criteria", /Community tier language is used instead of "free[ -]tier" in user-facing CLI output/ ); +expect( + criteria, + "DAP launch-critical surface criteria", + /launch-critical DAP surface required by the MVP[\s\S]*`initialize`[\s\S]*`source`[\s\S]*`next`\/step-over[\s\S]*`restartFrame`/ +); +expect( + criteria, + "DAP variables experience criteria", + /normal debugger variables path exposes the MVP debugging experience[\s\S]*selected source locals around Disasmer API calls[\s\S]*runtime-captured Wasmtime frame locals/ +); expect( cliFirstAcceptance, "CLI-first acceptance report", @@ -289,6 +300,17 @@ expect( "node attach smoke verifies auto-detection evidence", /plan\.detection\.auto_detected[\s\S]*plan\.detection\.command_backend[\s\S]*source_provider_backends/ ); +for (const [name, pattern] of [ + ["DAP smoke verifies source request", /client\.send\("source"[\s\S]*assert\.match\(source\.content, \/compile_linux\//], + ["DAP smoke verifies next step-over", /client\.send\("next", \{ threadId: 2 \}\)[\s\S]*await client\.response\(nextRequest, "next"\)[\s\S]*reason === "step"/], + ["DAP smoke verifies DAP variables scopes", /Source Locals[\s\S]*Task Args and Handles[\s\S]*Disasmer Runtime[\s\S]*Recent Output/], + ["DAP smoke verifies source-local values", /sourceLocals\.some[\s\S]*variable\.name === "linux"[\s\S]*TaskHandle[\s\S]*virtual_thread_id = 2[\s\S]*linux_thread[\s\S]*linux_artifact/], + ["DAP smoke verifies Wasmtime frame locals", /wasmLocals\.some[\s\S]*wasm_local_0[\s\S]*wasm-frame-local[\s\S]*product node runtime/], + ["DAP smoke verifies live-services worker placement", /runtimeBackend: "live-services"[\s\S]*startExplicitWorker[\s\S]*client\.send\("continue", \{ threadId: 1 \}\)[\s\S]*threadId === 2/], + ["DAP smoke verifies continue to next breakpoint", /breakpointLines: \[42, 43\][\s\S]*client\.send\("continue", \{ threadId: 1 \}\)[\s\S]*assert\.strictEqual\(secondMainStack\[0\]\.line, 43\)/], +]) { + expect(dapSmoke, name, pattern); +} expect( coordinator,