Skip to content

new release 0.10.0 - #79

Merged
kalwalt merged 4 commits into
masterfrom
dev
Oct 7, 2026
Merged

kalwalt merged 4 commits into
masterfrom
dev

Conversation

@kalwalt

@kalwalt kalwalt commented Oct 6, 2026 •

Copy link
Copy Markdown
Member

Release 0.10.0. Please merge with a merge commit (not squash), as for #73.

The Qodo findings on this PR are answered in their threads: 2, 3 and 5 are fixed by #80; 1 (existing marker set overwritten on failure) and 4 (NUL bytes in .zft data) are not changed, with the reasons given there.

Tested with jsartoolkitNFT (webarkit/jsartoolkitNFT#687): full rebuild, vitest and node tests, and all examples, including the threaded ones.

After merging, tag 0.10.0 on master and publish the release notes.

🤖 Generated with Claude Code

kalwalt and others added 3 commits October 6, 2026 16:24
…tNFT (#75) (#76)

* feat(nft): import NFT tracking helpers from jsartoolkitNFT (#75)

Copy trackingMod, trackingMod2d, trackingSub, markerDecompress and
NFTMarkerState from jsartoolkitNFT/emscripten (master) into
WebARKit/WebARKitTrackers/WebARKitNFT. Local includes now use
<WebARKitTrackers/WebARKitNFT/...>. No functional changes; build
integration and fixes follow in separate commits.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(nft): make WebARKitNFT helpers build outside emscripten (#75)

- rename ar2Tracking2dSub to ar2Tracking2dSubMod: it is public here but
  static in AR2/tracking2d.c
- markerDecompress.c: drop unused <emscripten.h>, use <zlib.h>
- markerDecompress.h: add include guard

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* build(nft): add WEBARKIT_BUILD_NFT CMake option and WebARKitNFT target (#75)

- WEBARKIT_BUILD_OPTICAL (ON): the existing OpenCV WebARKitLib target
- WEBARKIT_BUILD_NFT (OFF): static WebARKitNFT library with the NFT
  helpers plus the AR, ARICP, AR2, KPM and ARUtil sources they need
  (lists mirror jsartoolkitNFT/tools/makem.js); no OpenCV
- WEBARKIT_NFT_THREADS (OFF): adds trackingSub and ARUtil/thread_sub

Emscripten uses the libjpeg/zlib ports; native builds use find_package.
Built with emsdk 4.0.17; linked and smoke-tested with threads on.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(nft): return -1 from markerDecompress on errors instead of exit()

decompressMarkers() and extractDataAndSave() killed the whole process on a missing or malformed .zft. They now free their buffers and return -1; extractDataAndSave() returns int. Callers in jsartoolkitNFT already ignore the result.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(nft): initialise icpHandle and cparamLT in ar2CreateHandleSubMod

The function is public, but left icpHandle uninitialised, so ar2DeleteHandleMod() freed a garbage pointer on a handle made with it directly (segfault on native builds; wasm memory starts zeroed, so it went unnoticed).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(kpm): add missing <limits> and <unordered_map> includes

FreakMatcher relied on libc++ pulling them in transitively; GCC 13 (libstdc++) fails without them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* test(nft): add WebARKitNFT gtest suite and run it in CI (#75)

- webarkit_nft_test: markerDecompress (round trip, missing file, malformed data), NFTMarkerState defaults, ar2 handle create/delete, trackingSub worker start/quit
- WebARKitNFT also builds the minizip sources file_utils.c needs (crypt, ioapi, unzip, zip), with USE_FILE32API on Emscripten
- CI installs zlib1g-dev and runs webarkit_nft_test

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* docs: document the WebARKitNFT helpers and CMake options (#75)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(nft): always build ARUtil thread helpers in WebARKitNFT

AR2 handle.c and tracking.c call threadInit()/threadStartSignal() whatever WEBARKIT_NFT_THREADS says, so thread_sub.c is now always compiled and native builds always link Threads. The option now only adds trackingSub (and -pthread on Emscripten). Reported by Qodo on #76.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(nft): harden markerDecompress against malformed and large .zft files

- check zlib init/inflate results, grow the output buffer past 4 MB and NUL-terminate it before searching it
- validate field order and non-empty lengths before writing anything
- write marker files in binary mode, check fopen/fwrite/fclose and remove partial output on failure
- drop the remove() of the source archive: it built a wrong name and never deleted anything
Reported by Qodo on #76.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(nft): guard trackingSub against overlapping scans and failed init

- trackingInitStart() returns -1 while the previous search is uncollected, instead of overwriting the image the worker reads
- trackingInitInit() checks the image allocation and thread creation and frees everything on failure
- tests: >4 MB marker, binary bytes, field order, non-zlib data, source archive kept, start rejected until results are collected
Reported by Qodo on #76.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…#77)

RAND_MAX + 1.0F converted 2147483647 to float (-Wimplicit-const-int-float-conversion). A double holds RAND_MAX + 1 exactly, and j * rand() no longer loses precision. k stays in [0, j-1].

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
@qodo-free-for-open-source-projects

Copy link
Copy Markdown

PR Summary by Qodo

Release 0.10.0 with standalone NFT helpers and AR2 precision fix

✨ Enhancement 🐞 Bug fix 🧪 Tests 📝 Documentation ⚙️ Configuration changes 🕐 40+ Minutes

Grey Divider

AI Description

• Add an independently buildable NFT library without requiring OpenCV.
• Fix AR2 random template selection and expand native NFT test coverage.
• Document NFT build options and update the reported version to 0.10.0.
Diagram

graph TD
  Config["CMake options"] --> NFT["WebARKitNFT"] --> ARTK["ARToolKit sources"]
  Config --> Optical["Optical library"]
  NFT --> Deps["JPEG and zlib"]
  NFT --> Worker["Optional KPM worker"]
  Tests["Test suites"] --> NFT
  Tests --> Optical
Loading
High-Level Assessment

The following are alternative approaches to this PR:

1. Keep NFT helpers in jsartoolkitNFT
  • ➕ Avoids maintaining a local copy of the helper sources.
  • ➖ Leaves WebARKitNFT builds dependent on another repository's source layout and integration.

Recommendation: Keep the standalone WebARKitNFT target: it establishes a buildable, OpenCV-independent home for the helpers while preserving the existing optical target's default behavior. The external-source alternative reduces duplication but does not provide the same self-contained build.

Files changed (19) +2163 / -10

Enhancement (9) +1931 / -0
CMakeLists.txtDefine the standalone WebARKitNFT static library +94/-0

Define the standalone WebARKitNFT static library

• Compiles NFT helpers with their ARToolKit dependencies, optionally includes the KPM worker, and configures native or Emscripten compression and threading dependencies.

WebARKit/WebARKitTrackers/WebARKitNFT/CMakeLists.txt

NFTMarkerState.hAdd per-marker NFT tracking state +22/-0

Add per-marker NFT tracking state

• Defines C++ state for a marker's tracking status, pose, error, and pose-filter lifecycle.

WebARKit/WebARKitTrackers/WebARKitNFT/include/WebARKitTrackers/WebARKitNFT/NFTMarkerState.h

markerDecompress.hExpose marker archive decompression declarations +26/-0

Expose marker archive decompression declarations

• Declares the C-compatible .zft extraction API and adds an include guard.

WebARKit/WebARKitTrackers/WebARKitNFT/include/WebARKitTrackers/WebARKitNFT/markerDecompress.h

trackingMod.hExpose modified AR2 tracking APIs +83/-0

Expose modified AR2 tracking APIs

• Declares single-threaded AR2 handle and tracking functions, including a distinct name for the public 2D tracking helper.

WebARKit/WebARKitTrackers/WebARKitNFT/include/WebARKitTrackers/WebARKitNFT/trackingMod.h

trackingSub.hExpose threaded KPM detection APIs +95/-0

Expose threaded KPM detection APIs

• Declares worker lifecycle methods, multi-page results, and a legacy-compatible best-page result method.

WebARKit/WebARKitTrackers/WebARKitNFT/include/WebARKitTrackers/WebARKitNFT/trackingSub.h

markerDecompress.cDecompress .zft archives into marker files +231/-0

Decompress .zft archives into marker files

• Inflates zlib archives with a growing buffer and writes their iset, fset, and fset3 fields in binary mode. Reports malformed input and cleans up files after partial write failures.

WebARKit/WebARKitTrackers/WebARKitNFT/markerDecompress.c

trackingMod.cProvide single-threaded AR2 tracking +913/-0

Provide single-threaded AR2 tracking

• Adds modified AR2 handle management, feature matching, and pose estimation without AR2 tracking worker threads.

WebARKit/WebARKitTrackers/WebARKitNFT/trackingMod.c

trackingMod2d.cProvide renamed 2D template tracking helper +216/-0

Provide renamed 2D template tracking helper

• Adds the 2D feature-template matching routine under ar2Tracking2dSubMod, avoiding a symbol conflict with AR2's implementation.

WebARKit/WebARKitTrackers/WebARKitNFT/trackingMod2d.c

trackingSub.cImplement threaded multi-page KPM detection +251/-0

Implement threaded multi-page KPM detection

• Runs marker searches on a worker thread, collects matched pages, and retains best-match selection for single-page callers. Prevents another scan until the previous results have been collected.

WebARKit/WebARKitTrackers/WebARKitNFT/trackingSub.c

Bug fix (3) +4 / -1
selectTemplate.cUse double precision for random template selection +1/-1

Use double precision for random template selection

• Computes the random candidate index in double precision to avoid single-precision rounding at RAND_MAX.

lib/SRC/AR2/selectTemplate.c

visual_database_facade.cppInclude unordered_map explicitly +1/-0

Include unordered_map explicitly

• Adds the standard-library header required by the KPM source for native compilation.

lib/SRC/KPM/FreakMatcher/facade/visual_database_facade.cpp

hamming.hInclude limits explicitly +2/-0

Include limits explicitly

• Adds the standard-library header required by the Hamming-distance code for native compilation.

lib/SRC/KPM/FreakMatcher/math/hamming.h

Documentation (1) +25 / -1
README.mdDocument NFT APIs and build options +25/-1

Document NFT APIs and build options

• Describes the moved helpers, the OpenCV-independent NFT target, its CMake switches, an Emscripten build command, and the new test suite.

README.md

Other (6) +203 / -8
test.ymlRun NFT tests in native CI +3/-3

Run NFT tests in native CI

• Installs zlib development headers alongside libjpeg and runs the new NFT test executable after the existing optical tests.

.github/workflows/test.yml

CMakeLists.txtMake optical and NFT targets independently selectable +11/-0

Make optical and NFT targets independently selectable

• Adds switches to include the NFT subdirectory and to skip the existing OpenCV-based optical target when it is not needed.

WebARKit/CMakeLists.txt

WebARKitConfig.cppReport version 0.10.0 +2/-2

Report version 0.10.0

• Changes the optical library's version string and minor version constant from 0.9.0 to 0.10.0.

WebARKit/WebARKitTrackers/WebARKitOpticalTracking/WebARKitConfig.cpp

CMakeLists.txtBuild and register NFT GoogleTests +9/-1

Build and register NFT GoogleTests

• Enables the NFT and threaded targets for the test build, links a new NFT executable, and registers it with GoogleTest discovery.

tests/CMakeLists.txt

webarkit_nft_test.ccCover decompression and NFT helper lifecycles +176/-0

Cover decompression and NFT helper lifecycles

• Tests .zft extraction, malformed and large archives, binary preservation, default marker state, AR2 handle cleanup, and threaded worker behavior.

tests/webarkit_nft_test.cc

webarkit_test.ccExpect the 0.10.0 version +2/-2

Expect the 0.10.0 version

• Updates optical configuration and manager version assertions to match the release.

tests/webarkit_test.cc

@kalwalt kalwalt self-assigned this Oct 6, 2026
@qodo-free-for-open-source-projects

qodo-free-for-open-source-projects Bot commented Oct 6, 2026 •

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (3) 📘 Rule violations (0) 📎 Requirement gaps (0) 🎨 UX issues (0) 🔗 Cross-repo conflicts (0) 📜 Skill insights (0)

Grey Divider


Action required

1. A failed extraction erases existing markers 🐞 Bug ☼ Reliability
Description
saveMarkerFile opens each destination with wb, and extractDataAndSave removes earlier outputs
if a later write fails. When extraction replaces an existing marker set and .fset or .fset3
cannot be written, the previous files are not restored.
Code

WebARKit/WebARKitTrackers/WebARKitNFT/markerDecompress.c[R189-192]

+    if (saveMarkerFile(name, ".iset", iset, isetSize) != 0) return -1;
+    if (saveMarkerFile(name, ".fset", fset, fsetSize) != 0) {
+        removeMarkerFile(name, ".iset");
+        return -1;
Evidence
wb truncates an existing destination. The later failure branches remove files already written, and
the failing write can remove its destination too; none of those branches restores an overwritten
file.

WebARKit/WebARKitTrackers/WebARKitNFT/markerDecompress.c[116-136]
WebARKit/WebARKitTrackers/WebARKitNFT/markerDecompress.c[189-199]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
Extracting over an existing marker set truncates files before all three replacements succeed. Failure cleanup then deletes outputs without restoring the originals.
## Fix Focus Areas
- WebARKit/WebARKitTrackers/WebARKitNFT/markerDecompress.c[115-145]
- WebARKit/WebARKitTrackers/WebARKitNFT/markerDecompress.c[189-199]
## Recommended Fix
Write all three files to temporary paths first, and replace existing destinations only after every write and close succeeds. Preserve or restore the prior set if replacement fails.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Remediation recommended

2. A compressed marker can exhaust memory ✓ Resolved
Description
inflateAll doubles its output allocation until the entire stream has expanded, without a
decompressed-size limit. A small .zft with a large expansion ratio reaches repeated allocations
before its contents can be checked or rejected.
Code

WebARKit/WebARKitTrackers/WebARKitNFT/markerDecompress.c[R39-46]

+        if (strm.total_out == cap) {
+            char *bigger = realloc(out, cap * 2 + 1);
+            if (bigger == NULL) {
+                ret = Z_MEM_ERROR;
+                break;
+            }
+            out = bigger;
+            cap *= 2;
Evidence
The output buffer starts at four megabytes and doubles whenever full. Parsing occurs only after
inflateAll has expanded the complete stream.

WebARKit/WebARKitTrackers/WebARKitNFT/markerDecompress.c[22-52]
WebARKit/WebARKitTrackers/WebARKitNFT/markerDecompress.c[105-109]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
Inflating a `.zft` has no output-size bound, allowing a high-expansion stream to consume available memory before parsing begins.
## Fix Focus Areas
- WebARKit/WebARKitTrackers/WebARKitNFT/markerDecompress.c[22-62]
- WebARKit/WebARKitTrackers/WebARKitNFT/markerDecompress.c[105-109]
## Recommended Fix
Set an explicit maximum expanded archive size, reject growth beyond it before reallocating, and check capacity arithmetic for overflow. Add a test for an archive exceeding the limit.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


3. Adaptive-template builds fail 🐞 Bug ≡ Correctness
Description
ar2TrackingMod calls ar2Tracking2dSubMod without the extra template argument required by its
adaptive-template definition. When AR2_CAPABLE_ADAPTIVE_TEMPLATE is enabled, that definition also
redeclares templ2 locally, so the new helper cannot compile in that configuration.
Code

WebARKit/WebARKitTrackers/WebARKitNFT/trackingMod2d.c[R59-62]

+#if AR2_CAPABLE_ADAPTIVE_TEMPLATE
+int ar2Tracking2dSubMod ( AR2HandleT *handle, AR2SurfaceSetT *surfaceSet, AR2TemplateCandidateT *candidate,
+                              ARUint8 *dataPtr, ARUint8 *mfImage, AR2TemplateT **templ,
+                              AR2Template2T **templ2, AR2Tracking2DResultT *result )
Evidence
The adaptive branch adds a templ2 parameter and then declares a local variable of the same name.
The call supplies only the non-adaptive arguments; the current configuration disables the branch,
which is why the default build does not reveal it.

WebARKit/WebARKitTrackers/WebARKitNFT/trackingMod2d.c[49-71]
WebARKit/WebARKitTrackers/WebARKitNFT/trackingMod.c[216-220]
include/AR2/config.h[81-81]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The adaptive-template branch defines a different helper signature from its call and redeclares a parameter name. Enabling that compile-time configuration fails to build the NFT helper.
## Fix Focus Areas
- WebARKit/WebARKitTrackers/WebARKitNFT/trackingMod2d.c[49-71]
- WebARKit/WebARKitTrackers/WebARKitNFT/trackingMod.c[216-221]
- WebARKit/WebARKitTrackers/WebARKitNFT/include/WebARKitTrackers/WebARKitNFT/trackingMod.h[67-69]
## Recommended Fix
Make the adaptive declaration, definition, public header, and call agree on the `templ2` argument. Remove the conflicting local declaration and compile-test both macro settings.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


4. Marker data containing zero bytes fails to unpack 🐞 Bug ≡ Correctness
Description
extractDataAndSave uses strncmp/strstr to find field boundaries in inflated data, while
decompressMarkers discards the decompressed length returned in outLen. When a .zft contains
raw binary .iset or .fset data with a NUL byte, the parser cannot find later delimiters such as
","fset":" and returns -1 instead of writing the three files.
Code

WebARKit/WebARKitTrackers/WebARKitNFT/markerDecompress.c[R105-109]

+    c = inflateAll(in, (size_t)filesize, &outLen);
+    free(in);
+    if (c == NULL) return -1;
+
+    int result = extractDataAndSave(c, outTemp);
Evidence
ar2WriteImageSet writes imageSet->num as a raw int with fwrite, so a real .iset can begin
with bytes such as 01 00 00 00; the .fset writer also emits binary values. The extractor obtains
outLen but passes only the buffer to extractDataAndSave, whose strstr calls treat the first
0x00 as the end of the data and cannot find subsequent fields. The KeepsBinaryBytesUnchanged
test uses bytes without zeros, so it does not expose this failure.

lib/SRC/AR2/imageSet.c[211-211]
WebARKit/WebARKitTrackers/WebARKitNFT/markerDecompress.c[147-178]
WebARKit/WebARKitTrackers/WebARKitNFT/markerDecompress.c[105-110]
WebARKit/WebARKitTrackers/WebARKitNFT/markerDecompress.c[147-183]
lib/SRC/AR2/featureSet.c[129-149]
lib/SRC/AR2/imageSet.c[207-226]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
`extractDataAndSave` searches inflated binary marker data as a NUL-terminated string, so embedded zero bytes hide later field delimiters. `decompressMarkers` obtains the decompressed length in `outLen` but does not pass it to the parser.
## Fix Focus Areas
- WebARKit/WebARKitTrackers/WebARKitNFT/markerDecompress.c[105-110]
- WebARKit/WebARKitTrackers/WebARKitNFT/markerDecompress.c[147-200]
- WebARKit/WebARKitTrackers/WebARKitNFT/include/WebARKitTrackers/WebARKitNFT/markerDecompress.h[20-20]
## Recommended Fix
Pass `outLen` to a length-aware parser, such as a static `extractDataAndSaveN(const char *str, size_t len, const char *name)`. Use portable, length-bounded searches to find each key and the end marker (the last `"}`), rather than NUL-terminated string searches. Keep the public `extractDataAndSave` as a wrapper that passes `strlen(str)`, and add a round-trip test with an embedded NUL byte in the `.iset` payload.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Informational

5. Worker thread skips its null check on the handle ✓ Resolved
Description
In trackingInitMain, the second guard re-checks threadHandle instead of the trackingInitHandle
it just got from threadGetArg, so this check can never be true. If the thread arg is NULL, the
next line trackingInitHandle->kpmHandle dereferences a null pointer on the worker thread instead
of logging and exiting.
Code

WebARKit/WebARKitTrackers/WebARKitNFT/trackingSub.c[R212-216]

+    trackingInitHandle = (TrackingInitHandle *)threadGetArg(threadHandle);
+    if (!threadHandle) {
+        ARLOGe("Error starting tracking thread: empty trackingInitHandle.\n");
+        return (NULL);
+    }
Evidence
Line 213 tests !threadHandle, which was already checked at line 208. Line 217 then dereferences
trackingInitHandle without any check.

WebARKit/WebARKitTrackers/WebARKitNFT/trackingSub.c[208-218]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The null check after `threadGetArg` tests the wrong variable.
## Fix Focus Areas
- WebARKit/WebARKitTrackers/WebARKitNFT/trackingSub.c[212-216]
## Recommended Fix
Change `if (!threadHandle)` to `if (!trackingInitHandle)`.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

Tip of the day
💡 Did you know, you can route each severity your way: inline, summary, both, or drop

More tips ↗ | Customize Qodo ↗ | Qodo docs ↗

Grey Divider

Qodo Logo

Comment thread WebARKit/WebARKitTrackers/WebARKitNFT/markerDecompress.c
Comment thread WebARKit/WebARKitTrackers/WebARKitNFT/markerDecompress.c Outdated
Comment thread WebARKit/WebARKitTrackers/WebARKitNFT/trackingMod2d.c
Comment thread WebARKit/WebARKitTrackers/WebARKitNFT/markerDecompress.c
Comment thread WebARKit/WebARKitTrackers/WebARKitNFT/trackingSub.c
* fix(nft): check the right pointer in trackingInitMain

After threadGetArg() the guard re-tested threadHandle, so a NULL trackingInitHandle was dereferenced on the worker thread instead of logged. Reported by Qodo on #79.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(nft): cap the decompressed size of .zft archives

inflateAll() doubled its buffer with no upper bound, so a small archive with a huge expansion ratio could exhaust memory. Archives expanding past MARKER_DECOMPRESS_MAX_SIZE (128 MB, overridable at build time) are now rejected with -1. Also documents that decompressMarkers() should write to new paths: an existing marker set there is not preserved on failure. Reported by Qodo on #79.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(nft): fail clearly when AR2_CAPABLE_ADAPTIVE_TEMPLATE is enabled

The Mod tracking path never supported adaptive templates: with the option on, trackingMod2d.c did not compile (mismatched signature, redeclared templ2). trackingMod.h now stops the build with an explicit #error, and trackingMod2d.c includes it so it uses the public declaration of ar2Tracking2dSubMod(). Reported by Qodo on #79.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(nft): enforce small decompression limits and accept streams ending at the limit

- the initial inflate buffer is now capped at MARKER_DECOMPRESS_MAX_SIZE, so limits below 4 MB are enforced
- at the limit, zlib gets one spare output byte to finish the stream (final block, trailer); only output written there means the archive is too large
- MARKER_DECOMPRESS_MAX_SIZE below 1 is a build error
- new webarkit_nft_limit_test builds markerDecompress with a 1 MB limit: exactly at the limit, one byte over, and a limit below the initial buffer; run in CI
Reported by Qodo on #80.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
@kalwalt
kalwalt merged commit 4fd3034 into master Oct 7, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

1 participant