Skip to content

Add HEAD and ETag to storage service - #107

Merged
jayvdb merged 6 commits into
mainfrom
anon-s3-api
Aug 6, 2026
Merged

Add HEAD and ETag to storage service#107
jayvdb merged 6 commits into
mainfrom
anon-s3-api

Conversation

@jayvdb

@jayvdb jayvdb commented Aug 6, 2026

Copy link
Copy Markdown
Member

Summary by CodeRabbit

  • New Features

    • Added JavaScript WebSocket storage round-trip support for uploading and retrieving data through S3-compatible storage.
    • Added a HEAD storage endpoint that returns object metadata, including size and ETag.
    • Storage uploads and downloads now expose ETag values.
  • Documentation

    • Added usage, build, and testing guidance for the JavaScript storage module.
    • Expanded API documentation for storage operations.
  • Improvements

    • Standardized Rust toolchain selection across development and coverage workflows.
    • Added automated build and integration-test support for the JavaScript module.

@coderabbitai

coderabbitai Bot commented Aug 6, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@jayvdb, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 30 minutes

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 1a28e220-0e51-40c4-a43e-bfeb7a404923

📥 Commits

Reviewing files that changed from the base of the PR and between 6b256e8 and 135f388.

📒 Files selected for processing (2)
  • CLAUDE.md
  • services/ws-modules/js-data1/README.md
📝 Walkthrough

Walkthrough

The change adds HEAD storage support with ETag metadata, introduces a bundled JavaScript S3 round-trip module, integrates its build and runner checks, centralizes the Rust nightly toolchain, adjusts wasm tooling, and adds CI reproduction guidance.

Changes

Storage API and JavaScript data module

Layer / File(s) Summary
Storage metadata API
services/storage/..., utilities/int-gen/src/openapi.rs, services/storage/tests/put.rs
Storage PUT and GET responses now expose ETags. A new HEAD route returns content length and ETag, with 404 handling. OpenAPI definitions and integration tests cover the behavior.
JavaScript storage round trip
services/ws-modules/js-data1/..., services/ws-web-runner/tests/modules.rs, .mise/config.js.toml, pnpm-workspace.yaml, .gitignore, .dockerignore
A bundled JavaScript module connects through WebSocket, performs an S3 upload/download/HEAD round trip, verifies bytes and ETags, and cleans up resources. Build and runner integration are added.

Toolchain and workflow configuration

Layer / File(s) Summary
Pinned Rust nightly configuration
.mise/config.toml, .mise/config.*.toml, .mise/config.coverage.toml
Rust nightly usage now derives from vars.rust_nightly, pinned to nightly-2026-08-05.
Wasm tooling and CI reproduction guidance
.mise/config.zig.toml, CLAUDE.md
Wasm clang-tidy uses platform-specific resource directories. CI guidance requires local reproduction with matching versions and operating systems.

Independent metadata and lint updates

Layer / File(s) Summary
Package metadata and lint annotations
services/storage/Cargo.toml, services/ws-modules/zig-except1/src/exceptions.cpp
The storage package now has a description. Two intentionally ordered parameter pairs receive lint-suppression annotations.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Sequence Diagram(s)

sequenceDiagram
  participant JSModule
  participant AgentWebSocket
  participant StorageAPI
  participant ObjectStore
  JSModule->>AgentWebSocket: Send et-connect handshake
  AgentWebSocket-->>JSModule: Return agent ID
  JSModule->>StorageAPI: PUT timestamped object
  StorageAPI->>ObjectStore: Store object
  ObjectStore-->>StorageAPI: Return ETag
  StorageAPI-->>JSModule: Return PUT ETag
  JSModule->>StorageAPI: GET and HEAD object
  StorageAPI->>ObjectStore: Read object and metadata
  ObjectStore-->>StorageAPI: Return bytes, size, and ETag
  StorageAPI-->>JSModule: Return object data and metadata
Loading

Possibly related PRs

Suggested reviewers: pierre-tenedero

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the primary storage service changes: adding HEAD support and ETag handling.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
🛠️ Fix failing CI checks 💡
  • Create stacked PR
  • Commit on current branch
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch anon-s3-api

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@deepsource-io

deepsource-io Bot commented Aug 6, 2026

Copy link
Copy Markdown

DeepSource Code Review

We reviewed changes in 72ed322...135f388 on this pull request. Below is the summary for the review, and you can see the individual issues we found as inline review comments.

See full review on DeepSource ↗

Important

Some issues found as part of this review are outside of the diff in this pull request and aren't shown in the inline review comments due to GitHub's API limitations. You can see those issues on the DeepSource dashboard.

PR Report Card

Overall Grade   Security  

Reliability  

Complexity  

Hygiene  

Coverage  

Code Review Summary

Analyzer Status Updated (UTC) Details
C# Aug 6, 2026 7:58a.m. Review ↗
C & C++ Aug 6, 2026 7:58a.m. Review ↗
Docker Aug 6, 2026 7:58a.m. Review ↗
Java Aug 6, 2026 7:58a.m. Review ↗
JavaScript Aug 6, 2026 7:58a.m. Review ↗
Python Aug 6, 2026 7:58a.m. Review ↗
Rust Aug 6, 2026 7:58a.m. Review ↗
Secrets Aug 6, 2026 7:58a.m. Review ↗
Code coverage Aug 6, 2026 8:30a.m. Review ↗

Code Coverage Summary

Language Line Coverage (New Code) Line Coverage (Overall)
Aggregate
96.6%
58.2%
[▲ up 0.1% from main]
Python -
89.1%
Rust
96.6%
55.7%
[▲ up 0.1% from main]

➟ Additional coverage metrics may have been reported. See full coverage report ↗


Important

AI Review is run only on demand for your team. We're only showing results of static analysis review right now. To trigger AI Review, comment @deepsourcebot review on this thread.


_kwargs: dict[str, Any] = {
"method": "head",
"url": "/storage/{agent_id}/{filename}".format(

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Formatting a regular string which could be a f-string


f-strings are the fastest way to format strings as compared to the following methods: * using format specifiers %

@codacy-production

Copy link
Copy Markdown

Not up to standards ⛔

🔴 Issues 7 high · 5 minor

Alerts:
⚠ 12 issues (≤ 0 issues of at least minor severity)

Results:
12 new issues

Category Results
Documentation 5 minor
ErrorProne 6 high
Security 1 high

View in Codacy

🟢 Metrics 45 complexity · 23 duplication

Metric Results
Complexity 45
Duplication 23

View in Codacy

NEW Get contextual insights on your PRs based on Codacy's metrics, along with PR and Jira context, without leaving GitHub. Enable AI reviewer
TIP This summary will be updated as you push new changes.

// shim with the platform-native binary, which pnpm's node-based `.bin` wrapper then fails to execute
// ("Invalid or unexpected token"). The JS API loads the native binary itself and sidesteps that entirely.

import { build } from "esbuild";

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Parsing error: 'import' and 'export' may appear only with 'sourceType: module'


Found non-compliant syntax. Confirm that there are no syntax errors before committing your code to a version control system.

// failure (runner exits non-zero). We throw only on the core round-trip failing, never on an S3 feature the
// service is simply missing.

import { GetObjectCommand, HeadObjectCommand, PutObjectCommand, S3Client } from "@aws-sdk/client-s3";

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Parsing error: 'import' and 'export' may appear only with 'sourceType: module'


Found non-compliant syntax. Confirm that there are no syntax errors before committing your code to a version control system.

@codecov

codecov Bot commented Aug 6, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 93.10345% with 2 lines in your changes missing coverage. Please review.
✅ All tests successful. No failed tests found.

Files with missing lines Patch % Lines
services/storage/src/routes.rs 92.59% 1 Missing and 1 partial ⚠️

📢 Thoughts on this report? Let us know!

@jayvdb

jayvdb commented Aug 6, 2026

Copy link
Copy Markdown
Member Author

Recording a failure

       FAIL [   3.777s] (162/194) et-ws-wasi-runner::modules module_runs_successfully::case_2_wasi_data1
  stdout ───

    running 1 test
    2026-08-06T03:22:06.614600Z  INFO et_ws_wasi_runner: et-ws-wasi-runner: module=et-ws-wasi-data1 server=ws://127.0.0.1:43421/ws
    2026-08-06T03:22:06.757129Z  INFO run_module{module="et-ws-wasi-data1"}: et_ws_wasi_runner: fetching WASI component module="et-ws-wasi-data1" main=et_ws_wasi_data1.wasm
    2026-08-06T03:22:08.982659Z  INFO run_module{module="et-ws-wasi-data1"}: wasi_logging: entered run() context=et-ws-wasi-data1
    2026-08-06T03:22:08.987860Z  INFO run_module{module="et-ws-wasi-data1"}: wasi_logging: websocket connected with agent_id=019fd517-b6db-79a0-9ca7-95101e17bb64 context=et-ws-wasi-data1
    2026-08-06T03:22:08.990134Z  INFO run_module{module="et-ws-wasi-data1"}: wasi_logging: storing 66 bytes to key test_data.txt context=et-ws-wasi-data1
    2026-08-06T03:22:08.994948Z  INFO run_module{module="et-ws-wasi-data1"}: wasi_logging: fetching key test_data.txt context=et-ws-wasi-data1
    2026-08-06T03:22:08.998622Z  INFO run_module{module="et-ws-wasi-data1"}: wasi_logging: VERIFICATION SUCCESS -- keyvalue roundtrip matches context=et-ws-wasi-data1
    2026-08-06T03:22:08.999321Z  INFO run_module{module="et-ws-wasi-data1"}: wasi_logging: workflow complete context=et-ws-wasi-data1
    test module_runs_successfully::case_2_wasi_data1 ... FAILED

    failures:

    failures:
        module_runs_successfully::case_2_wasi_data1

    test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 2 filtered out; finished in 3.77s

  stderr ───
    Error: Wasm(error while executing at wasm backtrace:
        0:   0x52ce - et_ws_wasi_data1.wasm!initializeValueProfRuntimeRecord
        1:   0x4c68 - et_ws_wasi_data1.wasm!writeOneValueProfData
        2:   0x4a41 - et_ws_wasi_data1.wasm!lprofWriteDataImpl
        3:   0x4661 - et_ws_wasi_data1.wasm!lprofWriteData
        4:   0x1ed9 - et_ws_wasi_data1.wasm!et_ws_wasi_data1[ae44f95db91d6aa2]::coverage::dump
        5:   0x2d85 - et_ws_wasi_data1.wasm!et:ws-wasi/entry@0.1.0#run

    Caused by:
        0: memory fault at wasm address 0x99c50a0d in linear memory of size 0x110000
        1: wasm trap: out of bounds memory access
    )

    thread 'module_runs_successfully::case_2_wasi_data1' (63635) panicked at services/ws-wasi-runner/tests/modules.rs:41:33:
    et-ws-wasi-data1 runner failed: `/home/runner/work/core/core/target/debug/et-ws-wasi-runner` failed: exit status: 1
    Command failed: `ET_TEST_WS_WASI_RUNNER_FAST_EXIT=1 RUNNER_MODULE=et-ws-wasi-data1 WS_SERVER_URL=ws://127.0.0.1:43421/ws /home/runner/work/core/core/target/debug/et-ws-wasi-runner`
    note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

@jayvdb
jayvdb marked this pull request as ready for review August 6, 2026 07:29
@jayvdb
jayvdb requested a review from pierre-tenedero August 6, 2026 07:29

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@services/ws-modules/js-data1/README.md`:
- Around line 17-19: Remove the “See ../../../s3.md” sentence from the README
paragraph describing PutObject, GetObject, and HeadObject, leaving the endpoint
mapping and verification details unchanged.

In `@services/ws-modules/js-data1/src/index.js`:
- Around line 124-139: Compare the persisted object ETag with the PUT ETag at
both affected sites: in services/ws-modules/js-data1/src/index.js lines 124-139,
pass put.ETag into verifyHeadObject and require equality with head.ETag; in
services/storage/tests/put.rs lines 167-190, retain the PUT ETag and assert that
both GET and HEAD return the same value.
- Around line 53-72: Update connectAgent’s timeout and WebSocket error handlers
to close ws before rejecting, and guard promise settlement so timeout, error,
and acknowledgement cannot settle the connection more than once. Preserve the
successful acknowledgement path while ensuring no active socket remains after
failure.

In `@services/ws-web-runner/tests/modules.rs`:
- Around line 92-95: Remove the early-return skip for module “et-ws-js-data1” in
the integration test setup and delete the now-unused js_data1_pkg_built helper.
Ensure the test’s prerequisite setup invokes the targeted mise run task to build
the bundle before executing the test, and fail loudly if that build or the
resulting pkg/et_ws_js_data1.js is unavailable.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 402e2fd2-49ba-445d-97de-e4896aa68385

📥 Commits

Reviewing files that changed from the base of the PR and between 72ed322 and 6b256e8.

⛔ Files ignored due to path filters (8)
  • generated/dart-rest/lib/clients/storage.dart is excluded by !**/generated/**
  • generated/dart-rest/lib/clients/storage.g.dart is excluded by !**/generated/**
  • generated/dart-rest/lib/rest_client.dart is excluded by !**/generated/**
  • generated/python-rest/et_rest_client/api/storage/head_file.py is excluded by !**/generated/**
  • generated/rust-rest/src/lib.rs is excluded by !**/generated/**
  • generated/specs/rest.yaml is excluded by !**/generated/**
  • generated/zig-rest/src/et_rest_client.zig is excluded by !**/generated/**
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (23)
  • .dockerignore
  • .gitignore
  • .mise/config.coverage.toml
  • .mise/config.js.toml
  • .mise/config.mingw.toml
  • .mise/config.msvc.toml
  • .mise/config.toml
  • .mise/config.windows.toml
  • .mise/config.zig.toml
  • CLAUDE.md
  • pnpm-workspace.yaml
  • services/storage/Cargo.toml
  • services/storage/src/lib.rs
  • services/storage/src/routes.rs
  • services/storage/tests/put.rs
  • services/ws-modules/js-data1/README.md
  • services/ws-modules/js-data1/build.mjs
  • services/ws-modules/js-data1/package.json
  • services/ws-modules/js-data1/pkg/package.json
  • services/ws-modules/js-data1/src/index.js
  • services/ws-modules/zig-except1/src/exceptions.cpp
  • services/ws-web-runner/tests/modules.rs
  • utilities/int-gen/src/openapi.rs

Comment thread services/ws-modules/js-data1/README.md Outdated
Comment on lines +53 to +72
return new Promise((resolve, reject) => {
const timer = setTimeout(() => reject(new Error("timed out waiting for et-connect-ack")), 10000);
ws.addEventListener("message", (event) => {
let frame;
try {
frame = JSON.parse(event.data);
} catch {
return;
}
if (frame.type === "et-connect-ack" && frame.agent_id) {
clearTimeout(timer);
resolve({ agentId: frame.agent_id, ws });
}
});
ws.addEventListener("error", () => {
clearTimeout(timer);
reject(new Error("websocket error before et-connect-ack"));
});
ws.addEventListener("open", () => ws.send(JSON.stringify({ agent_id: null, type: "et-connect" })));
});

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win

Close the WebSocket when connectAgent fails.

If the acknowledgement times out or the socket errors, connectAgent rejects before run enters its finally block. The socket remains open. Close it in each failure path and guard settlement so the runner does not retain an active socket after failure.

Proposed fix
 function connectAgent() {
   const ws = new WebSocket(websocketUrl());
   return new Promise((resolve, reject) => {
-    const timer = setTimeout(() => reject(new Error("timed out waiting for et-connect-ack")), 10000);
+    let settled = false;
+    const fail = (error) => {
+      if (settled) return;
+      settled = true;
+      clearTimeout(timer);
+      ws.close();
+      reject(error);
+    };
+    const timer = setTimeout(() => fail(new Error("timed out waiting for et-connect-ack")), 10000);
     ws.addEventListener("message", (event) => {
       let frame;
       try {
         frame = JSON.parse(event.data);
       } catch {
         return;
       }
       if (frame.type === "et-connect-ack" && frame.agent_id) {
+        if (settled) return;
+        settled = true;
         clearTimeout(timer);
         resolve({ agentId: frame.agent_id, ws });
       }
     });
-    ws.addEventListener("error", () => {
-      clearTimeout(timer);
-      reject(new Error("websocket error before et-connect-ack"));
-    });
+    ws.addEventListener("error", () => fail(new Error("websocket error before et-connect-ack")));
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
return new Promise((resolve, reject) => {
const timer = setTimeout(() => reject(new Error("timed out waiting for et-connect-ack")), 10000);
ws.addEventListener("message", (event) => {
let frame;
try {
frame = JSON.parse(event.data);
} catch {
return;
}
if (frame.type === "et-connect-ack" && frame.agent_id) {
clearTimeout(timer);
resolve({ agentId: frame.agent_id, ws });
}
});
ws.addEventListener("error", () => {
clearTimeout(timer);
reject(new Error("websocket error before et-connect-ack"));
});
ws.addEventListener("open", () => ws.send(JSON.stringify({ agent_id: null, type: "et-connect" })));
});
return new Promise((resolve, reject) => {
let settled = false;
const fail = (error) => {
if (settled) return;
settled = true;
clearTimeout(timer);
ws.close();
reject(error);
};
const timer = setTimeout(() => fail(new Error("timed out waiting for et-connect-ack")), 10000);
ws.addEventListener("message", (event) => {
let frame;
try {
frame = JSON.parse(event.data);
} catch {
return;
}
if (frame.type === "et-connect-ack" && frame.agent_id) {
if (settled) return;
settled = true;
clearTimeout(timer);
resolve({ agentId: frame.agent_id, ws });
}
});
ws.addEventListener("error", () => fail(new Error("websocket error before et-connect-ack")));
ws.addEventListener("open", () => ws.send(JSON.stringify({ agent_id: null, type: "et-connect" })));
});
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@services/ws-modules/js-data1/src/index.js` around lines 53 - 72, Update
connectAgent’s timeout and WebSocket error handlers to close ws before
rejecting, and guard promise settlement so timeout, error, and acknowledgement
cannot settle the connection more than once. Preserve the successful
acknowledgement path while ensuring no active socket remains after failure.

Comment on lines +124 to +139
if (put.ETag === undefined) {
throw new Error("PutObject returned no ETag");
}
log(`PutObject ok: ETag=${put.ETag}`);

log(`GetObject <- bucket=${agentId} key=${FILENAME}`);
const got = await s3.send(new GetObjectCommand({ Bucket: agentId, Key: FILENAME }));
const retrieved = await got.Body.transformToString();

if (retrieved !== content) {
log(`VERIFICATION FAILED: sent ${JSON.stringify(content)} but got ${JSON.stringify(retrieved)}`);
throw new Error("data mismatch");
}
log("VERIFICATION SUCCESS - data matches!");

await verifyHeadObject(s3, agentId);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win

Compare the PUT ETag with the persisted object ETag.

Both sites only verify ETag presence. A storage implementation that returns one ETag from PUT and a different ETag from later object metadata passes these checks.

  • services/ws-modules/js-data1/src/index.js#L124-L139: pass put.ETag to verifyHeadObject and require equality with head.ETag.
  • services/storage/tests/put.rs#L167-L190: retain the PUT ETag and assert that both GET and HEAD return that value.
📍 Affects 2 files
  • services/ws-modules/js-data1/src/index.js#L124-L139 (this comment)
  • services/storage/tests/put.rs#L167-L190
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@services/ws-modules/js-data1/src/index.js` around lines 124 - 139, Compare
the persisted object ETag with the PUT ETag at both affected sites: in
services/ws-modules/js-data1/src/index.js lines 124-139, pass put.ETag into
verifyHeadObject and require equality with head.ETag; in
services/storage/tests/put.rs lines 167-190, retain the PUT ETag and assert that
both GET and HEAD return the same value.

Comment on lines +92 to +95
if module == "et-ws-js-data1" && !js_data1_pkg_built() {
println!("skipping {module}: pkg/ not built (build-ws-js-data1-module has not run on this host)");
return;
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Do not skip the et-ws-js-data1 integration test.

When pkg/et_ws_js_data1.js is absent, this branch returns successfully. The test then does not verify the new storage and ETag round trip. Build the bundle as a required test prerequisite, or fail the test when it is absent. Remove js_data1_pkg_built after removing this skip.

Based on learnings, use the targeted mise run task to build the bundle before this test. As per coding guidelines, "Never skip, ignore, platform-disable, conditionally compile out, or early-return from a test without explicit user approval; missing tools must fail loudly."

Also applies to: 118-131

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@services/ws-web-runner/tests/modules.rs` around lines 92 - 95, Remove the
early-return skip for module “et-ws-js-data1” in the integration test setup and
delete the now-unused js_data1_pkg_built helper. Ensure the test’s prerequisite
setup invokes the targeted mise run task to build the bundle before executing
the test, and fail loudly if that build or the resulting pkg/et_ws_js_data1.js
is unavailable.

Sources: Coding guidelines, Learnings

@jayvdb
jayvdb merged commit dfaad03 into main Aug 6, 2026
33 of 40 checks passed
@jayvdb
jayvdb deleted the anon-s3-api branch August 6, 2026 10:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants