[GH-ISSUE #7882] fix(mcp): bound input-validation allocation before amplified diagnostics #4651

Closed
opened 2026-10-31 00:51:57 +00:00 by bsakaguchi · 2 comments
Owner

Originally created by @gensokyo-dev on GitHub (Oct 28, 2026).
Original GitHub issue: https://github.com/morluto/rea/issues/7882

Before submitting

  • I searched open and closed issues for related reports.
  • This report contains no credentials or sensitive target data.

Area

MCP / shared input admission and validation resource bounds

Observed behavior

Source-derived finding, subsequently reproduced, on 37827af59: Zod is pinned to 4.6.6, but compare_bundles.record_pairs still has an unbounded object array. MCP registers the canonical parser without a pre-validation resource admission step. Invalid elements can therefore create a separate diagnostic each before REA's response budget is applied. Nested arrays and copied complete observations require the same investigation; merely limiting the eventual error text cannot bound its allocation.

This issue records the validation-resource boundary. #5930 separately records the semantic batch-decompilation limit. #7661 records lost field diagnostics; a resource fix must preserve useful field/index diagnostics for ordinary invalid calls.

Reproduction

Executed on an unchanged 37827af59 control with pinned Node/SDK/Zod and the actual public loopback HTTP entry point. An owned malformed compare_bundles call with 8,192 numeric record_pairs elements had a 16,542-byte argument JSON and returned a 556,706-byte diagnostic. Two calls completed; pings and valid controls before/after continued to work. No provider acquisition or external target was needed. A canonical-schema probe with 65,537 invalid elements produced 65,537 issues and about 43 MiB heapUsed delta before SDK formatting; it did not intentionally crash the process. A further bounded probe of 1,024 empty comparison Evidence objects generated 16,384 missing-field issues and about 26 MiB heapUsed delta, so the default was calibrated for structured-object expansion rather than scalar arrays alone.

Fix PR: #7905. Runtime verification uses 5db72c85f; final fixture-only follow-up c762ffaee leaves production behavior unchanged. The final default is 1,024 combined array elements and object members. With an explicitly selected 8,192-element allowance, the original small HTTP request returns an 824-byte refusal. Actual HTTP and stdio entry points pass. A calibrated patched-only request carrying 2,090,000 numeric elements (4,180,158 argument-JSON bytes, below the SDK body ceiling) returns an 824-byte refusal and keeps serving. Small calibration must prove the guard active before this larger fixture is constructed; no full-size crashing baseline was attempted.

Structured calibration is not a claim that every advertised schema executes through SDK validation: find_changed_behavior already authenticates Evidence individually. The actual build_call_path registration does validate a complete Evidence array. Its final boundary test admits 1,019 empty Evidence objects plus five members, returns the existing ordinary validation error, and refuses 1,020 objects with an 824-byte resource error. The completed isolated workflow used 3.926 s elapsed / 4.863 s CPU / 601.8 MiB sampled family RSS, under a 2 GiB process-family guard. Ordinary admitted error diagnostics can still be large (1,456,474 bytes at this edge); this repair does not promise a fixed diagnostic count or exact heap ceiling.

Real Linux TShark/capinfos 4.0.17 capture → Evidence export → explicit record-pair comparison passes under the default allowance, preserving identity and source bytes. Related source tests (123), public/native cases (5), existing capacity and Evidence workflows, static checks and documentation consistency passed. Larger downstream capacity fixtures select explicit finite transport allowances so their original assertions still execute. Model-token costs and native behavior on other platforms remain unmeasured. Detailed completed-task comparisons and measurement limits are in #7905.

Expected behavior

Reject input exceeding a justified validation resource allowance before element validation allocates amplified diagnostics. Share the MCP admission rule across HTTP and stdio while retaining shared CLI/application canonical parsers; retain normal canonical validation and precise correction facts, expose meaningful resource limits, and keep the advertised schema/client behavior consistent. Preserve full Evidence access and caller-selected values within admitted workflows.

Impact and scope

Observed CPU/memory and returned-diagnostic expansion while rejecting input. The HTTP body limit remains present and was not bypassed. Current-version full-OOM reproduction was not attempted. The repair reuses the pinned SDK's existing pre-validation combined-element counter, defaults to 1,024 and supports a finite operator-selected allowance via REA_MCP_MAX_INPUT_ELEMENTS. No target execution, mutation or HTTP authentication change is proposed. This default is a breaking admission change for formerly accepted larger calls; canonical schemas and ordinary admitted-call semantics remain unchanged.

REA version

Source 37827af5918a20b87698329a13d3705becdd6868, package 6.8.0, Zod 4.6.6, MCP SDK 2.3.1.

Runtime and platform

Linux x64; pinned Node 24.22.1 / npm 11.16.0. Executed runtime measurements and limits are above and in #7905.

Target and artifact context

No external target. Synthetic malformed arguments and owned offline observations only.

Interface / earliest failure stage

MCP input validation before provider/application dispatch; shared CLI/application admission to be checked.

Relevant output or evidence

Typed outcome or recovery expected

Bounded, nonretryable input/resource refusal with the applicable allowance and actionable correction facts. Ordinary malformed input retains its canonical field diagnostics. No provider acquisition for refused calls; subsequent valid calls remain usable.

Analysis / additional context

Inspect the installed SDK and Zod producing boundaries before choosing a structural fix. Account for nested representations and validation-error expansion before allocation. Measure equivalent completed tasks, report elapsed/CPU/peak process-family memory, and leave token costs or real-provider coverage unmeasured where not established.

Originally created by @gensokyo-dev on GitHub (Oct 28, 2026). Original GitHub issue: https://github.com/morluto/rea/issues/7882 ### Before submitting - [x] I searched open and closed issues for related reports. - [x] This report contains no credentials or sensitive target data. ### Area MCP / shared input admission and validation resource bounds ### Observed behavior Source-derived finding, subsequently reproduced, on `37827af59`: Zod is pinned to 4.6.6, but `compare_bundles.record_pairs` still has an unbounded object array. MCP registers the canonical parser without a pre-validation resource admission step. Invalid elements can therefore create a separate diagnostic each before REA's response budget is applied. Nested arrays and copied complete observations require the same investigation; merely limiting the eventual error text cannot bound its allocation. This issue records the validation-resource boundary. #5930 separately records the semantic batch-decompilation limit. #7661 records lost field diagnostics; a resource fix must preserve useful field/index diagnostics for ordinary invalid calls. ### Reproduction Executed on an unchanged `37827af59` control with pinned Node/SDK/Zod and the actual public loopback HTTP entry point. An owned malformed `compare_bundles` call with 8,192 numeric `record_pairs` elements had a 16,542-byte argument JSON and returned a 556,706-byte diagnostic. Two calls completed; pings and valid controls before/after continued to work. No provider acquisition or external target was needed. A canonical-schema probe with 65,537 invalid elements produced 65,537 issues and about 43 MiB heapUsed delta before SDK formatting; it did not intentionally crash the process. A further bounded probe of 1,024 empty comparison Evidence objects generated 16,384 missing-field issues and about 26 MiB heapUsed delta, so the default was calibrated for structured-object expansion rather than scalar arrays alone. Fix PR: #7905. Runtime verification uses `5db72c85f`; final fixture-only follow-up `c762ffaee` leaves production behavior unchanged. The final default is **1,024 combined array elements and object members**. With an explicitly selected 8,192-element allowance, the original small HTTP request returns an 824-byte refusal. Actual HTTP and stdio entry points pass. A calibrated patched-only request carrying 2,090,000 numeric elements (4,180,158 argument-JSON bytes, below the SDK body ceiling) returns an 824-byte refusal and keeps serving. Small calibration must prove the guard active before this larger fixture is constructed; no full-size crashing baseline was attempted. Structured calibration is not a claim that every advertised schema executes through SDK validation: `find_changed_behavior` already authenticates Evidence individually. The actual `build_call_path` registration does validate a complete Evidence array. Its final boundary test admits 1,019 empty Evidence objects plus five members, returns the existing ordinary validation error, and refuses 1,020 objects with an 824-byte resource error. The completed isolated workflow used 3.926 s elapsed / 4.863 s CPU / 601.8 MiB sampled family RSS, under a 2 GiB process-family guard. Ordinary admitted error diagnostics can still be large (1,456,474 bytes at this edge); this repair does not promise a fixed diagnostic count or exact heap ceiling. Real Linux TShark/capinfos 4.0.17 capture → Evidence export → explicit record-pair comparison passes under the default allowance, preserving identity and source bytes. Related source tests (123), public/native cases (5), existing capacity and Evidence workflows, static checks and documentation consistency passed. Larger downstream capacity fixtures select explicit finite transport allowances so their original assertions still execute. Model-token costs and native behavior on other platforms remain unmeasured. Detailed completed-task comparisons and measurement limits are in #7905. ### Expected behavior Reject input exceeding a justified validation resource allowance before element validation allocates amplified diagnostics. Share the MCP admission rule across HTTP and stdio while retaining shared CLI/application canonical parsers; retain normal canonical validation and precise correction facts, expose meaningful resource limits, and keep the advertised schema/client behavior consistent. Preserve full Evidence access and caller-selected values within admitted workflows. ### Impact and scope Observed CPU/memory and returned-diagnostic expansion while rejecting input. The HTTP body limit remains present and was not bypassed. Current-version full-OOM reproduction was not attempted. The repair reuses the pinned SDK's existing pre-validation combined-element counter, defaults to 1,024 and supports a finite operator-selected allowance via `REA_MCP_MAX_INPUT_ELEMENTS`. No target execution, mutation or HTTP authentication change is proposed. This default is a breaking admission change for formerly accepted larger calls; canonical schemas and ordinary admitted-call semantics remain unchanged. ### REA version Source `37827af5918a20b87698329a13d3705becdd6868`, package 6.8.0, Zod 4.6.6, MCP SDK 2.3.1. ### Runtime and platform Linux x64; pinned Node 24.22.1 / npm 11.16.0. Executed runtime measurements and limits are above and in #7905. ### Target and artifact context No external target. Synthetic malformed arguments and owned offline observations only. ### Interface / earliest failure stage MCP input validation before provider/application dispatch; shared CLI/application admission to be checked. ### Relevant output or evidence - [Unbounded bundle pair array](https://github.com/morluto/rea/blob/37827af5918a20b87698329a13d3705becdd6868/src/domain/bundleComparison.ts#L27). - [MCP canonical schema registration](https://github.com/morluto/rea/blob/37827af5918a20b87698329a13d3705becdd6868/src/server/EvidenceMcpServerCore.ts#L263). - Executed public HTTP/stdio, real Linux TShark and process-family measurements are documented above and in #7905; initial source-only notes have been superseded. ### Typed outcome or recovery expected Bounded, nonretryable input/resource refusal with the applicable allowance and actionable correction facts. Ordinary malformed input retains its canonical field diagnostics. No provider acquisition for refused calls; subsequent valid calls remain usable. ### Analysis / additional context Inspect the installed SDK and Zod producing boundaries before choosing a structural fix. Account for nested representations and validation-error expansion before allocation. Measure equivalent completed tasks, report elapsed/CPU/peak process-family memory, and leave token costs or real-provider coverage unmeasured where not established.
Author
Owner

@gensokyo-dev commented on GitHub (Oct 28, 2026):

Detailed validation record for #7905. Production code is unchanged from 655d83965; this snapshot describes runtime-identical head 5db72c85f and the final fixture-only follow-up bc27c15d0. It does not claim that the final-head CI has completed.

Validation performed

Tested final head 5db72c85f, based on main 37827af59. The final follow-up changes verification fixtures/documentation only; production behavior is unchanged from 655d83965.

  • Latest-head source CI: 21,421 passed / 15 skipped across 1,158 files (258.80 s on the CI runner; separate from the local measurements below).
  • Six related source files: 123 passed, covering configuration, default/selected/exact admission, nested members, zero validation/handler invocations on refusal, unchanged ordinary errors/schemas, and deferred runtime loading followed by valid calls.
  • Five public/native cases passed: actual HTTP (three), stdio (one), and real Linux TShark/capinfos 4.0.17 capture → Evidence export → explicit record-pair comparison. Capture digest, record identity, URI/query/path facts and unchanged-pair outcome remain preserved.
  • Existing downstream regressions remain meaningful: analysis-view 29 passed, native matching 6 passed, process comparison 25 passed, and the SQLite bind-capacity case passed. Large fixtures explicitly select finite transport allowances so they still reach their original memory/capacity/cycle boundaries. Original assertions remain in place. SQLite's full file also passed 21 tests with one existing skip before the final default reduction; its affected capacity case was rerun after it.
  • Complete-inline-Evidence conformance now selects a finite 65,536 fixture allowance in the shared application/file-scoped MCP harnesses and native artifact verifiers, with explicit caller environment taking precedence. The production default remains 1,024. Default-policy HTTP/native proof servers do not use that fixture environment.
  • Rechecked all 12 files that failed in the previous CI run: the first local batch had 183 passed / 1 failed; the omitted allowance on the invalid-native-configuration server was corrected and its entire 4-case file passed. All 184 original cases therefore passed across the batch and focused rerun, preserving their content/identity/coverage/error assertions. Additional shared-harness/session lifecycle checks: 11 passed. Batch: 495.539 s / 613.265 s CPU / 2981.8 MiB RSS; final configuration/lifecycle rerun: 45.458 s / 54.388 s CPU / 1704.2 MiB.
  • The native Apple verifier exposed the same missing allowance in its separate artifact harness. Both JavaScript verifiers and TypeScript fixtures now import one dependency-free verification environment; the superseded TypeScript owner was removed. Real portable verification used an owned 128-entry ZIP and 146,420 bytes of inline Evidence: the original helper refused at default admission; the repaired helper delivered 2 of 129 inventory nodes, kept serving and preserved the ZIP digest. Control: 13.934 s / 16.595 s CPU / 901.3 MiB RSS; repaired: 14.578 s / 16.895 s CPU / 932.9 MiB, both under the 2 GiB guard. These verify different outcomes, rather than establish a speed comparison. Shared fixture/session lifecycle tests were rerun: 11 passed (22.701 s / 26.034 s CPU / 881.5 MiB). The existing real macOS scenario remains the native verification owner.
  • npm run check:ci:fast: typecheck, lint, formatting and module boundaries passed — 32.554 s elapsed / 54.014 s CPU / 4649.6 MiB sampled family RSS.
  • npm run docs:check: passed, including 9 consistency tests — 13.441 s / 16.098 s CPU / 671.9 MiB RSS.

Only owned offline artifacts and synthetic arguments were used. Native coverage is Linux; other native platforms and particular agent hosts were not established locally.

Resource evidence and limits

Local runners use two CPUs and a 3 GiB Node heap allowance; the HTTP/stdio/TShark input-capacity proof servers explicitly use the same heap allowance. Other fixture/verifier children retain their existing native limits. Family RSS is sampled every 50 ms and can count shared pages twice. Public HTTP/stdio, isolated structured and native proof runs additionally used a 2 GiB / 120 s family guard. A mixed multi-file run triggered that guard and was stopped; the final runs were separated and passed. No intentionally crashing baseline probe was run.

  • Direct canonical-schema calibration: 1,024 empty Evidence objects produced 16,384 issues / about 26 MiB heapUsed delta before error formatting. This drove the final 1,024 allowance; the earlier 16,384 candidate was too permissive about structured expansion.
  • Actual build_call_path HTTP registration: 1,019 empty Evidence objects + five members exactly fill the allowance and retain canonical validation; the completed isolated workflow used 3.926 s / 4.863 s CPU / 601.8 MiB RSS. Its ordinary error is still 1,456,474 bytes. At 1,020 objects, admission instead returns 824 bytes, followed by successful ping and settings calls. This covers the actual registration path, rather than inferring reachability from the advertised schema alone. Existing find_changed_behavior already authenticates Evidence individually; its direct-schema calibration does not establish bulk diagnostic expansion on that public path.
  • Guarded default-policy HTTP request: 2,090,000 numbers / 4,180,158 argument-JSON bytes, below the SDK's 4-MiB body ceiling, returned an 824-byte refusal (71.1 ms request time) and kept serving. Small calibration must prove the guard active before constructing this larger fixture.
  • Final complete HTTP file, including discovery/valid controls/repeated refusals/structured boundary/large request: 24.322 s / 29.127 s CPU / 1506.1 MiB RSS. Stdio: 3.606 s / 4.448 s CPU / 579.1 MiB.
  • Matched earlier HTTP workflow, with an explicit 8,192 allowance: same 16,542-byte input, 556,706 → 824 error bytes, unchanged 3,804,043-byte catalog. Baseline: 20.274 s / 24.640 s CPU / 1473.9 MiB; previous fixed head 62d3b90: 19.328 s / 23.293 s CPU / 1338.4 MiB. These are separate from the expanded final HTTP file above.
  • Real TShark → bundle → explicit-pair workflow: baseline 6.808 s / 8.360 s CPU / 869.0 MiB; final default 6.884 s / 8.328 s CPU / 864.8 MiB.

Fresh processes were used; filesystem/code-cache warmth and other load are uncontrolled. Earlier fixed startup observations varied (including 35.246 s HTTP and 11.571 s native), and interleaved native repeats overlapped baseline times. No overall speedup claim. Model-token costs are unmeasured. Catalog size and client output-schema compilation are unchanged.

Final independent-stdio and package verification

The final follow-up selects the existing finite conformance environment in tests/boundary/cli/workflowInputIdentities.test.ts, preserving every identity/integrity assertion across inline, retained and mixed operands. No production behavior changes.

  • Expanded selection: 24 independent stdio files that had not established passing coverage in the interrupted CI run. Initial execution: 84 passed / 3 skipped / one Pi path-spelling assertion failed, plus a suite-loading failure because generated catalog metadata was absent. The identity regression itself passed (29.947 s).
  • npm run test:focused -- tests/boundary/mcp/deferredRuntime.test.ts generated the required test-owned catalog and passed all 30 cases: 200.006 s elapsed / 227.517 s CPU / 2180.8 MiB sampled family RSS. Generated metadata is ignored and not committed.
  • The Pi path-spelling failure reproduced on unchanged main 37827af59 with the same toolchain: selected node_modules/.bin/node versus process.execPath at node_modules/node/bin/node, both identifying the pinned binary. No Pi source/assertion was changed. Putting that binary's real directory first after /usr/local/bin on PATH, keeping Node 24.22.1 / npm 11.16.0, passed the whole 8-case file: 57.513 s / 69.346 s CPU / 652.7 MiB. Baseline reproduction: 7.334 s / 8.606 s CPU / 588.5 MiB.
  • Across those executions, 115 unique cases passed and 3 were skipped. The initial expanded batch used 486.578 s / 585.399 s CPU / 2074.5 MiB. This is not a claim that its first invocation passed as a whole.
  • npm run verify:package passed on the final source tree: actual package archive and install, analysis/artifact/managed/platform/Evidence CLI, setup plan/approval/backup/idempotence/uninstall, symlink ownership, failure recovery, extracted plugin MCP, 231 tools and 6 prompts. Complete run: 301.002 s / 330.403 s CPU / 1335.7 MiB. Cleanup verified an empty descendant set. Startup observation: 939.97 ms process-start-to-tools/list; server sampled peak VmRSS 157,032,448 bytes. Cache warmth is uncontrolled; no speed comparison is claimed.
  • Final npm run check:ci:fast passed: 49.611 s / 78.446 s CPU / 4963.7 MiB. Final npm run docs:check passed with 9 consistency cases: 3.945 s / 4.587 s CPU / 544.6 MiB.

Real macOS CI at 5db72c85f passed 6 bundles across directory, ZIP and DMG through CLI/MCP, detached the DMG and preserved Mach-O bytes: https://github.com/morluto/rea/actions/runs/40774172718/job/123139847726 . All four native package platforms and four SQLite Node combinations passed at that runtime-identical head. Portable qualification found the independent identity fixture above; its correction is now on the final follow-up, whose CI is rerunning. Full licensed Hopper GUI execution remains outside the established coverage.

Final fixture follow-up — c762ffaee

Production behavior remains unchanged from 655d83965 (default 1,024). An additional 139-file MCP boundary cohort completed with 136 files passing and three wholly skipped across bounded runs. The first run reached its 1,200-second guard after 126 passing files, one trace-fixture failure and three skips; owned processes were stopped and no OOM occurred. Its sampled family RSS was 3,473.4 MiB; complete CPU accounting is unavailable after interruption. It is not a completed green run.

The trace comparison fixture now explicitly selects the existing shared finite conformance allowance. Its original 200-event input, complete diagnostic assertion and production default are unchanged. Only that fixture and nine unfinished files were resumed: 10 files / 189 cases passed, 155.628 s elapsed / 180.077 s CPU / 2,802.9 MiB sampled process-family RSS, two CPUs. Commands used the existing exact-test/development-artifact plan with one worker.

Fresh npm run check:ci:fast passed (53.927 s / 84.873 s CPU / 5,365.5 MiB), and npm run docs:check passed including 9 tests (4.047 s / 4.732 s CPU / 522.9 MiB). Logs: /tmp/rea-7882-remaining-mcp-boundaries.log, /tmp/rea-7882-remaining-mcp-resume.log, /tmp/rea-7882-trace-fixture-{static,docs}.log. Current-head CI/review is required after this test-only commit. No additional scope or release is requested.

<!-- gh-comment-id:6483583542 --> @gensokyo-dev commented on GitHub (Oct 28, 2026): Detailed validation record for #7905. Production code is unchanged from `655d83965`; this snapshot describes runtime-identical head `5db72c85f` and the final fixture-only follow-up `bc27c15d0`. It does not claim that the final-head CI has completed. ## Validation performed Tested final head `5db72c85f`, based on main `37827af59`. The final follow-up changes verification fixtures/documentation only; production behavior is unchanged from `655d83965`. - Latest-head source CI: **21,421 passed / 15 skipped across 1,158 files** (258.80 s on the CI runner; separate from the local measurements below). - Six related source files: **123 passed**, covering configuration, default/selected/exact admission, nested members, zero validation/handler invocations on refusal, unchanged ordinary errors/schemas, and deferred runtime loading followed by valid calls. - **Five public/native cases passed:** actual HTTP (three), stdio (one), and real Linux TShark/capinfos 4.0.17 capture → Evidence export → explicit record-pair comparison. Capture digest, record identity, URI/query/path facts and unchanged-pair outcome remain preserved. - Existing downstream regressions remain meaningful: analysis-view **29 passed**, native matching **6 passed**, process comparison **25 passed**, and the SQLite bind-capacity case passed. Large fixtures explicitly select finite transport allowances so they still reach their original memory/capacity/cycle boundaries. Original assertions remain in place. SQLite's full file also passed 21 tests with one existing skip before the final default reduction; its affected capacity case was rerun after it. - Complete-inline-Evidence conformance now selects a finite **65,536** fixture allowance in the shared application/file-scoped MCP harnesses and native artifact verifiers, with explicit caller environment taking precedence. The production default remains **1,024**. Default-policy HTTP/native proof servers do not use that fixture environment. - Rechecked all 12 files that failed in the previous CI run: the first local batch had **183 passed / 1 failed**; the omitted allowance on the invalid-native-configuration server was corrected and its entire **4-case file passed**. All 184 original cases therefore passed across the batch and focused rerun, preserving their content/identity/coverage/error assertions. Additional shared-harness/session lifecycle checks: **11 passed**. Batch: 495.539 s / 613.265 s CPU / 2981.8 MiB RSS; final configuration/lifecycle rerun: 45.458 s / 54.388 s CPU / 1704.2 MiB. - The native Apple verifier exposed the same missing allowance in its separate artifact harness. Both JavaScript verifiers and TypeScript fixtures now import one dependency-free verification environment; the superseded TypeScript owner was removed. Real portable verification used an owned 128-entry ZIP and **146,420 bytes of inline Evidence**: the original helper refused at default admission; the repaired helper delivered **2 of 129 inventory nodes**, kept serving and preserved the ZIP digest. Control: 13.934 s / 16.595 s CPU / 901.3 MiB RSS; repaired: 14.578 s / 16.895 s CPU / 932.9 MiB, both under the 2 GiB guard. These verify different outcomes, rather than establish a speed comparison. Shared fixture/session lifecycle tests were rerun: **11 passed** (22.701 s / 26.034 s CPU / 881.5 MiB). The existing real macOS scenario remains the native verification owner. - `npm run check:ci:fast`: typecheck, lint, formatting and module boundaries passed — **32.554 s elapsed / 54.014 s CPU / 4649.6 MiB sampled family RSS**. - `npm run docs:check`: passed, including 9 consistency tests — **13.441 s / 16.098 s CPU / 671.9 MiB RSS**. Only owned offline artifacts and synthetic arguments were used. Native coverage is Linux; other native platforms and particular agent hosts were not established locally. ## Resource evidence and limits Local runners use two CPUs and a 3 GiB Node heap allowance; the HTTP/stdio/TShark input-capacity proof servers explicitly use the same heap allowance. Other fixture/verifier children retain their existing native limits. Family RSS is sampled every 50 ms and can count shared pages twice. Public HTTP/stdio, isolated structured and native proof runs additionally used a 2 GiB / 120 s family guard. A mixed multi-file run triggered that guard and was stopped; the final runs were separated and passed. No intentionally crashing baseline probe was run. - Direct canonical-schema calibration: 1,024 empty Evidence objects produced **16,384 issues / about 26 MiB heapUsed delta before error formatting**. This drove the final 1,024 allowance; the earlier 16,384 candidate was too permissive about structured expansion. - Actual `build_call_path` HTTP registration: **1,019 empty Evidence objects + five members** exactly fill the allowance and retain canonical validation; the completed isolated workflow used **3.926 s / 4.863 s CPU / 601.8 MiB RSS**. Its ordinary error is still **1,456,474 bytes**. At **1,020 objects**, admission instead returns **824 bytes**, followed by successful ping and settings calls. This covers the actual registration path, rather than inferring reachability from the advertised schema alone. Existing `find_changed_behavior` already authenticates Evidence individually; its direct-schema calibration does not establish bulk diagnostic expansion on that public path. - Guarded default-policy HTTP request: **2,090,000 numbers / 4,180,158 argument-JSON bytes**, below the SDK's 4-MiB body ceiling, returned an **824-byte** refusal (71.1 ms request time) and kept serving. Small calibration must prove the guard active before constructing this larger fixture. - Final complete HTTP file, including discovery/valid controls/repeated refusals/structured boundary/large request: **24.322 s / 29.127 s CPU / 1506.1 MiB RSS**. Stdio: **3.606 s / 4.448 s CPU / 579.1 MiB**. - Matched earlier HTTP workflow, with an **explicit 8,192 allowance**: same 16,542-byte input, **556,706 → 824 error bytes**, unchanged 3,804,043-byte catalog. Baseline: **20.274 s / 24.640 s CPU / 1473.9 MiB**; previous fixed head `62d3b90`: **19.328 s / 23.293 s CPU / 1338.4 MiB**. These are separate from the expanded final HTTP file above. - Real TShark → bundle → explicit-pair workflow: baseline **6.808 s / 8.360 s CPU / 869.0 MiB**; final default **6.884 s / 8.328 s CPU / 864.8 MiB**. Fresh processes were used; filesystem/code-cache warmth and other load are uncontrolled. Earlier fixed startup observations varied (including 35.246 s HTTP and 11.571 s native), and interleaved native repeats overlapped baseline times. **No overall speedup claim. Model-token costs are unmeasured.** Catalog size and client output-schema compilation are unchanged. ## Final independent-stdio and package verification The final follow-up selects the existing finite conformance environment in `tests/boundary/cli/workflowInputIdentities.test.ts`, preserving every identity/integrity assertion across inline, retained and mixed operands. No production behavior changes. - Expanded selection: 24 independent stdio files that had not established passing coverage in the interrupted CI run. Initial execution: 84 passed / 3 skipped / one Pi path-spelling assertion failed, plus a suite-loading failure because generated catalog metadata was absent. The identity regression itself passed (29.947 s). - `npm run test:focused -- tests/boundary/mcp/deferredRuntime.test.ts` generated the required test-owned catalog and passed all 30 cases: 200.006 s elapsed / 227.517 s CPU / 2180.8 MiB sampled family RSS. Generated metadata is ignored and not committed. - The Pi path-spelling failure reproduced on unchanged main `37827af59` with the same toolchain: selected `node_modules/.bin/node` versus `process.execPath` at `node_modules/node/bin/node`, both identifying the pinned binary. No Pi source/assertion was changed. Putting that binary's real directory first after `/usr/local/bin` on PATH, keeping Node 24.22.1 / npm 11.16.0, passed the whole 8-case file: 57.513 s / 69.346 s CPU / 652.7 MiB. Baseline reproduction: 7.334 s / 8.606 s CPU / 588.5 MiB. - Across those executions, 115 unique cases passed and 3 were skipped. The initial expanded batch used 486.578 s / 585.399 s CPU / 2074.5 MiB. This is not a claim that its first invocation passed as a whole. - `npm run verify:package` passed on the final source tree: actual package archive and install, analysis/artifact/managed/platform/Evidence CLI, setup plan/approval/backup/idempotence/uninstall, symlink ownership, failure recovery, extracted plugin MCP, 231 tools and 6 prompts. Complete run: 301.002 s / 330.403 s CPU / 1335.7 MiB. Cleanup verified an empty descendant set. Startup observation: 939.97 ms process-start-to-tools/list; server sampled peak VmRSS 157,032,448 bytes. Cache warmth is uncontrolled; no speed comparison is claimed. - Final `npm run check:ci:fast` passed: 49.611 s / 78.446 s CPU / 4963.7 MiB. Final `npm run docs:check` passed with 9 consistency cases: 3.945 s / 4.587 s CPU / 544.6 MiB. Real macOS CI at `5db72c85f` passed 6 bundles across directory, ZIP and DMG through CLI/MCP, detached the DMG and preserved Mach-O bytes: https://github.com/morluto/rea/actions/runs/40774172718/job/123139847726 . All four native package platforms and four SQLite Node combinations passed at that runtime-identical head. Portable qualification found the independent identity fixture above; its correction is now on the final follow-up, whose CI is rerunning. Full licensed Hopper GUI execution remains outside the established coverage. ### Final fixture follow-up — c762ffaee Production behavior remains unchanged from 655d83965 (default 1,024). An additional 139-file MCP boundary cohort completed with 136 files passing and three wholly skipped across bounded runs. The first run reached its 1,200-second guard after 126 passing files, one trace-fixture failure and three skips; owned processes were stopped and no OOM occurred. Its sampled family RSS was 3,473.4 MiB; complete CPU accounting is unavailable after interruption. It is not a completed green run. The trace comparison fixture now explicitly selects the existing shared finite conformance allowance. Its original 200-event input, complete diagnostic assertion and production default are unchanged. Only that fixture and nine unfinished files were resumed: 10 files / 189 cases passed, 155.628 s elapsed / 180.077 s CPU / 2,802.9 MiB sampled process-family RSS, two CPUs. Commands used the existing exact-test/development-artifact plan with one worker. Fresh `npm run check:ci:fast` passed (53.927 s / 84.873 s CPU / 5,365.5 MiB), and `npm run docs:check` passed including 9 tests (4.047 s / 4.732 s CPU / 522.9 MiB). Logs: `/tmp/rea-7882-remaining-mcp-boundaries.log`, `/tmp/rea-7882-remaining-mcp-resume.log`, `/tmp/rea-7882-trace-fixture-{static,docs}.log`. Current-head CI/review is required after this test-only commit. No additional scope or release is requested.
Author
Owner

@gensokyo-dev commented on GitHub (Oct 29, 2026):

Final qualification for c762ffaeef64f351c27d353e3d08a2438d104d6c: all eight test shards, source tests, static checks, documentation, package build, real Apple artifact CLI/MCP E2E, all four SQLite Node combinations, Windows capability/package and Linux x64/arm64 plus macOS arm64 package baselines passed. Required Portable tests and CI required are successful. Exact-head CI.

Source CI: 1,159 files passed, 21,532 cases passed / 15 skipped. Codex completed with no findings; Greptile 5/5 on this exact commit; no unresolved review threads. The manual author declaration remains unchecked; it is not an implementation/test failure and no claim of human review is made.

Runtime default remains 1,024 combined elements/members, explicitly configurable; completed measurements and coverage limits remain as recorded above. No release or advisory publication is part of this change.

<!-- gh-comment-id:6489191052 --> @gensokyo-dev commented on GitHub (Oct 29, 2026): Final qualification for `c762ffaeef64f351c27d353e3d08a2438d104d6c`: all eight test shards, source tests, static checks, documentation, package build, real Apple artifact CLI/MCP E2E, all four SQLite Node combinations, Windows capability/package and Linux x64/arm64 plus macOS arm64 package baselines passed. Required `Portable tests` and `CI required` are successful. [Exact-head CI](https://github.com/morluto/rea/actions/runs/40794804693). Source CI: 1,159 files passed, 21,532 cases passed / 15 skipped. Codex completed with no findings; Greptile 5/5 on this exact commit; no unresolved review threads. The manual author declaration remains unchecked; it is not an implementation/test failure and no claim of human review is made. Runtime default remains 1,024 combined elements/members, explicitly configurable; completed measurements and coverage limits remain as recorded above. No release or advisory publication is part of this change.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
morluto/rea#4651
No description provided.