d81d6b67077b5acdcdb13330eb4e140905bc4e2a
86
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
5940600a22 | fix(reference): preserve historical backslash import bases | ||
|
|
1a48a82020 |
feat(analysis)!: default function MCP output to retained summaries (#5660)
* feat(ghidra): bound one procedure's decompile without closing the session Fixes #5340 * fix(ghidra): report decompile limit as a request timeout Keeps BinarySession from marking every Ghidra operation unavailable after one procedure's decompile reaches the limit, and names the MCP tool-call deadline in the remediation. * fix(ghidra): budget the decompile limit and report cancellation-closed sessions Adds REA_GHIDRA_DECOMPILE_TIMEOUT_SECONDS to the derived Codex/Kimi tool deadline and forwards it through setup. Marks a remote failure that settles after caller cancellation so the timeout projection no longer promises session reuse. * feat(ghidra)!: default analyze_function to a retained summary analyze_function was the one analysis tool never wired into REA's detail: summary|complete convention, so it always returned the complete native dossier inline (0.2-10 MB, dominated by value-flow and references). Agents on tool-result-capped harnesses never reached the pseudocode. Add `detail` to analyze_function, defaulting to summary: return a compact dossier (procedure identity, pseudocode size, facet counts, value-flow availability) and retain the complete dossier Evidence in the session. Page pseudocode, references, assembly and value-flow through normalized_result.parent_evidence_id with inspect_analysis_view, which already projects every native facet. detail: complete returns the full dossier inline as before. Delivery detail never reaches the provider or Evidence identity. BREAKING CHANGE: analyze_function now defaults to the compact summary view instead of the complete dossier inline. Pass detail: "complete" for the previous behavior. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AoJZDPcrgmMsCqLG4LfiFb * feat(cli): expose analyze_function detail on the function command Wire `rea function` into the shared CLI detail-delivery convention (--detail, --evidence_output) so the CLI and MCP adapters offer the same summary | complete choice for analyze_function. Summary delivery writes the complete dossier Evidence to a bundle and returns the compact summary view; it fails before analysis when --evidence_output is missing, so no provider work is wasted. The CLI default stays complete because a one-shot command has no in-process Evidence retention. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AoJZDPcrgmMsCqLG4LfiFb * refactor(ghidra): harden analyze_function summary after independent review FlatlineRoundtable cross-model review (6 lanes) converged on the summary projection's availability semantics being underspecified. Document that facet_availability is authoritative over raw pseudocode length, that code_units are UTF-16 (the unit inspect_analysis_view pages by), and that value_flow.truncated is meaningful only when value-flow is available. Parenthesize the nullish-coalescing/comparison for clarity. No behavior change; declined claims (value-flow "truncated collapse", unresolved_calls dead code) were schema-impossible or already correct. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AoJZDPcrgmMsCqLG4LfiFb * test(ghidra): cover analyze_function detail wiring on both adapters Close the roundtable's top convergent finding: the summary path had only domain-projection coverage, not the server/CLI wiring where the breaking behavior lives. MCP server (registerEnhancedTools): the default delivers a retained summary whose complete parent is recorded for paging; delivery detail is stripped before the provider request; detail: complete returns the full dossier inline; a registration without retention rejects a summary request before any provider work. CLI (rea function): the default returns the complete dossier; --detail summary without --evidence_output fails before analysis; with the bundle sink it returns the compact summary and writes the complete Evidence bundle. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AoJZDPcrgmMsCqLG4LfiFb * fix(ghidra): keep analyze_function delivery detail out of provider inputs Address the five automated review findings on #5660. P1: `detail` lived in the shared enhancedInputSchemas.analyze_function, so inspect_native_api composed `{procedure, detail: "summary"}` and the strict Ghidra analyze_function schema rejected it. Delivery detail is now owned by the analyze_function MCP tool contract; the handler separates it before any provider call, and executeFunctionAnalysisEvidence parses the provider input only. The MCP regression test validates provider input exactly as the production Ghidra client does and exercises inspect_native_api. P2: the analyze_function summary Evidence now carries the parent's relationship_coverage like native facet views, so partial or unknown caller/callee discovery is not reported as complete. P2: the summary reports the dossier's declared facet_availability, nulls the counts of facets the provider declared unavailable, and lists each reason in unknowns, so Kuna's empty references, comments and basic blocks are not mistaken for observed absence. P2: inspect-analysis-view evidence-file sources accept the Evidence bundle that --evidence_output writes, selecting a record with source.evidence_id when the bundle holds several; the CLI test reads the saved bundle back through that route. Tests that assert the complete dossier over public analyze_function now pass detail complete, and the oversized-dossier test asserts the summary view it previously expected to be unsupported. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AoJZDPcrgmMsCqLG4LfiFb * fix(ghidra): keep omitted function facets unknown in the summary The analyze_function summary coerced an omitted unresolved_calls record to a count of 0 while the native facet view reports the same dossier as "not recorded", and it carried no counts at all for the pageable swift_string_literals facets. Count optional records as null when the dossier omits them, name them in unknowns, and add nullable counts for both Swift literal facets. The summary Evidence envelope also dropped the function address: createAnalysisViewEvidence now derives one function-view predicate for both the address location and relationship coverage. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AoJZDPcrgmMsCqLG4LfiFb * fix(scripts): request complete analyze_function dossiers in real-provider checks The real-provider check scripts call analyze_function over MCP and then consume the complete dossier: requireFunctionDossier, functionDossierSchema, .procedure/.pseudocode reads, operation assertions, compare_functions inputs and the oversized-dossier rejection path. The summary default broke them. Every such call site now passes detail: "complete". Provider-direct callers are unchanged because detail is an MCP contract field; the admission-error sites stay unchanged because provider failures return before the summary branch. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AoJZDPcrgmMsCqLG4LfiFb * fix(ghidra): keep unavailable value-flow counts unknown in the summary summarizeDossier coerced the five value_flow_* counts to zero when native_value_flow was null (IDA, Kuna) or declared unavailable (Ghidra), so the summary reported empty collections while value_flow.available said otherwise. The counts are now null unless value flow is available, with the reason already named in unknowns. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AoJZDPcrgmMsCqLG4LfiFb * fix(evidence): budget authentication headroom by file shape and serialized size The evidence-file headroom reserved two parsed copies, calibrated for one record, and charged strings at two bytes per character. Bundle authentication additionally holds the schema-parsed bundle, the re-parsed records and two JSON.stringify results, which expand control characters and lone surrogates sixfold: a bundle whose raw_result is a million NUL characters estimated at 2 MB parsed but needed 12 MB of serialized text. The budget now has a parsed term and a serialized term per file shape, owned by EvidenceAuthenticationHeadroom and shared by the analysis-view reader and the bundle importer, which had no guard. Two transient peaks the budget did not name are removed at their producers: the canonical digest hashes a large leaf directly instead of concatenating it into its buffer, and the JSON validator walks containers by cursor so a wide array no longer queues one entry per member. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AoJZDPcrgmMsCqLG4LfiFb * fix(mcp): route analyze_function summary replies to dossier consumers in docs and prompts The MCP guide, the version-comparison and crash-triage prompt contracts, the authored skill and the Kuna, IDA and function-matching docs still told agents to pass analyze_function replies straight to compare_functions or build_call_path. Under the summary default those consumers reject the reply. They now name the retained-evidence reference for compare_functions, the observations fields of match_native_functions, and detail: "complete" for build_call_path, which accepts only inline dossiers. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AoJZDPcrgmMsCqLG4LfiFb * test(evidence): pin validator member order and keep interrupted validation yielding Independent review of the cursor validator found the interrupted-validation fixture relied on the old last-first walk: its over-deep head was reached before the first cooperative yield. The padding now precedes the deep element so the walk yields first, which is the invariant the test guards. A new case pins first-defect-in-member-order reporting, skipped non-enumerable keys no longer count toward the yield cadence, and the import-headroom test loads the reader through a fresh module graph so it holds under the services project's shared workers. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AoJZDPcrgmMsCqLG4LfiFb * fix(ghidra): align deadline bounds and cancellation outcomes * refactor(ghidra): shorten deadline recovery guidance * fix(mcp): clarify the scope of inferred decompile deadlines * test(ghidra): verify deadline workflows and document measured costs Separate failure and registration cases by their distinct contracts. Record actual Linux Ghidra, CLI and MCP evidence with measured context, elapsed time, CPU and memory, and explicit remaining coverage limits. * docs(ghidra): pin integration and distinguish baseline format failures * fix(ghidra): own failure lifecycle wording in the provider * test(ghidra): budget timeout fixture generation before allocation * fix(analysis): preserve summary provenance and bound bundle guidance * fix(ghidra): align capability and traversal deadline guidance * style(config): align deadline guidance formatting * docs(ghidra): record capability and traversal verification * docs(analysis): use absolute paths for Evidence files * docs(analysis): record completed function summary measurements * docs(analysis): update main integration validation --------- Co-authored-by: Syed Rishad <rishadzzzz@gmail.com> Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> Co-authored-by: gensokyo-dev <342580529+gensokyo-dev@users.noreply.github.com> |
||
|
|
9d7779d365 |
fix(cli): validate selected local paths before resolution
Reuse the nonempty NUL-free local path contract before normalization in artifact commands, auxiliary inputs, and output destinations. Empty selections now fail at parsing instead of selecting the working directory; explicit relative paths preserve their target. Public CLI checks cover primary and auxiliary empty paths, exact relative-file digest, explicit current-directory selection, symlink parent semantics, and environment export inputs. Correct the desktop fixture to assert the existing CLI validation envelope. |
||
|
|
13fcf58276 |
fix(session): own selected snapshot read cleanup
Route MCP snapshot reads through the session's existing file-resource owner so cleanup remains visible, blocks replacement, and can be retried by close_binary. Keep reads inside the serialized open callback and remove superseded adapter resource plumbing. Validate typed errors, exact descriptor recovery, unchanged source bytes, replay provenance, and same-connection lifecycle ordering. Focused snapshot, target cleanup, and MCP lifecycle checks passed with simulated providers; no live provider was exercised. Fixes #6216 |
||
|
|
60bb202ca3 |
test(providers): assert runtime and snapshot ownership contracts
Keep the selected running JVM visible when its version is unsupported, while retaining missing-runtime fallback controls. Assert the native snapshot binding and composed workflow Evidence profiles separately, preserving their exact commitments through a rejected snapshot switch. |
||
|
|
d5df7fd944 |
fix(reference): preserve source scope and loader authority
Share parser-owned package and runtime facts across dependency consumers. Preserve uncertain loader requests and explicit wrapper bindings without inventing unbound require authority in known modules. Cover selected source grammar through the public MCP boundary and retain ambient/type dependencies. Open each selected directory before loading its scoped policy, retaining partial directory failures and cleanup ownership. Preserve explicit caller negation precedence and source diagnostics across inventory projections. Clarify how version comparison retains container provenance without claiming semantic drift. Use independent unknown source inputs to keep candidate-limit fixtures meaningful as conditional branch evaluation becomes more precise. Fixes #6891 Fixes #6882 Fixes #6883 Fixes #6859 |
||
|
|
a31b4a393a | fix(cli): unify builtin and global completion scope | ||
|
|
77ebfb5f8a | fix(environment): retain primary facts through server cleanup failure | ||
|
|
6f8dc9c139 | fix(session): preserve binding commitments during restoration | ||
|
|
59f0eb4244 | fix(cli): validate output windows and finish pending writes | ||
|
|
fc404f008d | fix(cli): count emitted documents and normalize token windows | ||
|
|
3f5d879414 | fix(cli): retain nested facts in Markdown tables | ||
|
|
cae03361cf | fix(reference): separate local filesystem diagnostics from graph commitments | ||
|
|
7479f0a464 | fix(environment): distinguish destination refusal and write access failures | ||
|
|
4a24b7e154 | fix(evidence): preserve valid output paths near filesystem pathname limits | ||
|
|
ca8b6727c3 | fix(cli): reject surplus positional arguments before execution | ||
|
|
b885f44bef | fix(cli): preserve explicit Evidence record pairing in bundle comparison | ||
|
|
0c4bf68ce8 | merge: reconcile concurrent main fixes with issue remediation | ||
|
|
c3e4c116d5 | fix(reference): retain unknown package scope for JavaScript loaders | ||
|
|
80bc0f5ede | docs: correct setup capture and recovery boundary guidance | ||
|
|
f2e5fd148a | fix(reference): preserve module syntax and loader request identity | ||
|
|
ddb3987bb4 | fix(reference): project import failures through the canonical error contract | ||
|
|
1998640669 | fix(reference): scope ignore rules and honor local Git case policy | ||
|
|
5d2c8c2b78 |
feat(cli)!: export row-oriented results as JSON Lines (#5629)
* feat(cli): add JSON Lines output for row-oriented results (#5487) - Support opt-in JSON Lines format (--format jsonl) for row-oriented results and collection views with clear record boundaries - Preserve stable source identities and stream records deterministically line-by-line - Emit final coverage and limitation metadata as a distinct line with https://rea.dev/schemas/jsonl-coverage-v1.json to prevent confusion with data rows - Distinguish error outputs with https://rea.dev/schemas/jsonl-error-v1.json - Reject non-row-oriented results that lack record boundaries with an unreadable_output error - Document JSON Lines streaming conventions in docs/cli.md - Add boundary tests covering empty results, multiline strings, partial coverage, large fields, and non-row rejection * fix(cli): preserve diagnostics, provenance, and nested collections in JSONL * fix(cli): frame classified failures and reject unrepresented JSONL facets --------- Co-authored-by: gensokyo-dev <342580529+gensokyo-dev@users.noreply.github.com> |
||
|
|
8aa40e9a61 | fix(cache): scope Evidence display refresh to matching snapshot bindings | ||
|
|
7ba05210fe |
fix(reference): preserve raw symlink target identity
Read link targets as bytes before strict UTF-8 admission. Retain malformed targets as unreadable with source hex; preserve literal replacement characters and valid BOM-prefixed targets. Fixes #6765 |
||
|
+12 |
169512a35b |
feat(cli): report version and runtime with an explicit output format (#6530)
* feat(cli): report version and runtime with an explicit output format `rea --version --json` and `--version --format <format>` ignored the format and printed only the bare version, so support reports gathered the runtime and platform by hand. A root --version request that selects a format now renders a documented report: package name and version, JavaScript runtime and version, platform, architecture, and whether the runtime satisfies the supported range. It contains no paths, environment values, user or host names, and starts no provider. Plain --version is unchanged, --help keeps precedence, and other output controls keep Incur's plain version. The runtime verdict uses a new shared supportsJavaScriptRuntime rule that rea doctor now uses too, so both judge Bun by its Node.js compatibility version. mcp doctor's private JSON/format renderer moves to cliOutput as renderCliDocument and is shared with the version report. Closes #5483 * refactor(errors): centralize input failure construction Carry caller messages through the existing schema issue owner instead of constructing and discarding an intermediate input error. Remove forwarding schema helpers and migrate equivalent constructors across investigation, firmware, dylib, process, and screenshot workflows while preserving diagnostic paths and causes. * docs(readme): add Roman Urdu edition (#6499) * docs(readme): add Roman Urdu edition Register ur-Latn with a pending website catalog and preserve English command examples. Script-tag handling follows morluto's shared helper proposed in PR #2043 (c46f606c899e27b2e51c16500493413daf57ddad). * test(website): cover completed script-tag page metadata * fix(process): parse native teardown relation sentinels * fix(cli): make version report privacy checks environment-independent The CLI test rejected any report containing the OS account name, so an account named node, linux or rea failed a correct report. Check unique caller-controlled HOME, cwd and environment markers instead; the strict schema still rejects any additional field. The CLI guide said --version with other output controls prints the plain version, but invalid combinations such as --json with --token-limit report their existing output-flag error first. Describe both outcomes and test them. * refactor(nativeaot): share report facts across budget stages Centralize parse-wide identity and coverage facts while keeping conservative admission values separate from measured rows and counters. Reuse the derived truncation reason and retain the final serialization bound. Tighten the report-budget regression so unexpected parser finalization errors cannot be swallowed by its budget search. * fix(adb): preserve empty properties and verbatim version names * fix(artifacts): recognize empty Zip64 containers Fixes #6540 * fix(erlang): accept uninterpreted BEAM alignment bytes Fixes #6517 * fix(gpu): accept PTX entries without parameter lists Fixes #6493 * fix(python): preserve signed code-object line numbers Fixes #6490 * refactor(ghidra): centralize load image check recording Share expected and observed check construction across MZ, COM, and raw-binary attestations. Preserve format-specific rules and source coordinates, and derive mapping callback types from the recording owner. * fix(inspector): preserve script identity and parse-failure facts Fixes #6535 Fixes #6546 * fix(artifacts): recover malformed PYZ sizes without losing siblings Fixes #6120 * fix(erlang): accept extended BEAM atom lengths Fixes #6503 * refactor(erlang): reject overflowing BEAM atom lengths * fix(gpu): preserve PTX and AMD target facts Fixes #6469 Fixes #6483 * refactor(targets): preserve ambiguous MZ header evidence * fix(adb): retain refused activity launch reports Parse complete nonzero Activity Manager reports while preserving other command failures and their captured output. Admit dollar signs only in the activity component name for nested Android classes. Fixes #6528 Fixes #6527 * fix(mcp): retain partial evidence through shared delivery * fix(python): honor version-specific code equality Fixes #6547 * fix(pyinstaller): preserve namespace declarations Project PYZ namespace packages as metadata so their query paths do not claim output directories. This lets independent CArchive files retain the same logical path and remain inspectable and extractable. Fixes #6539 * docs: clarify evidence ownership and verification guidance * docs(adb): clarify emulator observation field * docs(artifacts): clarify active-reader extraction scope * fix(erlang): select the last repeated BEAM chunk Fixes #6518 * fix(il2cpp): distinguish rank-one array types Fixes #6534 * fix(python): align pyc and PYZ marshal decoding Fixes #6560 Fixes #6559 * fix(browser): preserve frame identity across captures (#4040) * fix(browser): preserve capture evidence fidelity * fix(browser): align frame identity comparisons * fix(browser): retain historical frame evidence * fix(electron): retain same-document script owners * fix(electron): bind frame proof to tree reads * fix(browser): retain malformed frame scope * fix(browser): retain WebMCP event scope * fix(browser): retain malformed timeline identity * fix(browser): unify frame identity and scope * fix(electron): prove enclosing frame ancestry * fix(electron): separate ancestry from file policy * fix(browser): preserve transient fragment semantics * fix(browser): retry uncertain initial frame scope * fix(browser): preserve runtime frame identity * refactor(browser): separate independent capture fixes * fix(electron): detect tree-first document replacement * fix(electron): retain same-document tree authority --------- Co-authored-by: eco-null <eco-null@users.noreply.github.com> Co-authored-by: morluto <76467478+morluto@users.noreply.github.com> * fix(elf): resolve symbol versions from requirements Fixes #6533 * fix(elf): follow loader version index precedence VERDEF entries replace VERNEED names for shared indices, matching glibc lookup behavior. * test(firmware): bind owned producers and exercise real limits * fix(adb): preserve push target semantics Fixes #6566 Fixes #6567 * fix(cli): merge sibling output filter slices Fixes #6542 * fix(browser): preserve Link context semantics Fixes #6504 Fixes #6505 Fixes #6506 * fix(python): classify historical headers and signed flags Fixes #6568, #6487 * fix(python): normalize legacy code flags for equality Preserve CPython 3.7–3.10 constructor flag semantics in code keys. * fix(environment): compare captured bodies by representation Keep JSON, text, and retained bytes distinct through fidelity comparison. Compare binary bodies by bytes, including valid UTF-8 bytes against equivalent text, and keep empty-body compatibility explicit. Fixes #6564 * docs: clarify derived values and comparison controls * fix(environment): scope fidelity ID normalization Reserve equal global ID pairs and stop normalizing contested pairings. Keep numeric measurements literal, scope keyed collection identities through learning and comparison, and normalize string references only where learning established the same field as an ID. Fixes #6565 Fixes #6550 Fixes #6557 * test(process): print the progress frames when the sparse-child bound fails (#6427) The sparse-child capture test asserted the frame bound with a bare boolean, so a failure only printed "expected false to be true". The assertion now carries the running progress details (elapsed time, frames, samples, interactions) as its failure message. This only adds diagnostics to a failure; it does not change what passes and does not fix the flake. Refs #5889. 🤖 Generated with Claude Code (Sonnet 5.5) 🦊 Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com> * fix(il2cpp): name the metadata file when linking finds malformed metadata (#6425) * fix(flutter): honor ELF note alignment when reading build IDs (#6423) * fix(flutter): honor ELF note alignment when reading build IDs * test(flutter): key shared note ranges by effective alignment Cover a program and section declaration that share one note range: differing effective alignments (8 and 4) must both be read, while declarations that both normalize to four bytes (1 and 4) still share one read. 24-byte build IDs pad identically at both alignments, so only the range key decides the read count. * refactor(firmware): centralize audited tool requirements * fix(javascript): associate requested bindings only with resolved native addons (#6402) * fix(javascript): associate requested bindings only with resolved native addons * test(javascript): cover the exact native addon association --------- Co-authored-by: morluto <76467478+morluto@users.noreply.github.com> * fix(python): reject code keys and set members with unhashable consts (#6424) * fix(python): reject code keys and set members with unhashable consts * fix(python): refuse to hash a tuple that is still being read * fix(python): hash a code object's co_consts tuple, not its item list --------- Co-authored-by: morluto <76467478+morluto@users.noreply.github.com> * fix(model): recognize named chat templates in summaries Count retained template content rather than only the default key; keep names-only inventories distinct. Fixes #6569 * fix(model): retain resolved GGUF alignment under cancellation Publish alignment from the parser when explicit metadata validates it, or when metadata completion establishes the default. Preserve that fact through later parsing and hashing failures. Fixes #6579 * fix(environment): reject out-of-range clock offsets Reject invalid ISO offsets while preserving valid boundary values. Validate stored clock-format offsets through the same parser so malformed imported formats cannot reach rendering. Fixes #6524 * fix(environment): preserve submillisecond insert ordering Compare retained submillisecond components after milliseconds, so ordered collections recognize and place distinct timestamps correctly. Fixes #6525 * fix(environment): restrict epoch normalization to clock fields Require a time-field token boundary before treating numeric values as epoch clocks, so identifiers such as media format codes remain literal. Clarify recognized field forms and clock offset and precision semantics in the fidelity guide. Fixes #6551 * fix(process): preserve sibling path identities Keep aliases on selected paths at clear text delimiters so a longer sibling filename is not rewritten as the executable. Version the normalization contract and cover source and actual PTY behavior. Fixes #6586 * fix(sigrok): retain recording suffix for autodetection Copy recordings under a private filename that retains the caller-selected final suffix, and pass that filename to sigrok. This restores filename-based autodetection without exposing the source directory. Fixes #6580 * test(go): assert unresolved MZ candidate boundary * fix(pe): ignore unused export ordinal slots Fixes #6577 * fix(macho): recognize arm64_32 binaries Fixes #6581 * fix(go): honor amd64p32 pointer width Fixes #6590 * fix(pe): accept BER indefinite CMS values Fixes #6574 * fix(browser): reject overlapping indexed source maps Fixes #6562 * fix(browser): resolve prefixed XHTML form actions Fixes #6561 * fix(browser): preserve well-known path case Fixes #6571 * docs(browser): clarify parser evidence contracts * fix(gpu): accept percent-prefixed PTX entry names Fixes #6592 * fix(gpu): accept PTX compute target aliases Preserve the source spelling of NVIDIA's documented compute_xx target synonym. Fixes #6494 * fix(gpu): parse legacy PTX body parameters PTX 1.0 through 1.3 declares kernel parameters inside the entry body. Keep later-version parameter-list parsing unchanged. Fixes #6594 * fix(gpu): keep unknown targets out of exact filters Fixes #6599 * fix(gpu): resolve extended CUBIN symbol sections Fixes #6600 * docs(firmware): document the Windows Unblob submodule checkout (#6464) On Windows, the pinned Unblob commit cannot be checked out because 11 upstream fixture paths under tests/integration/ are invalid on NTFS. Document the verified sparse-checkout workaround and point Windows contributors to it from CONTRIBUTING. Claude-Session: https://claude.ai/code/session_01LjhoPGpqAwHwcCgectzRsp Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(recovery): retain file outcomes and cleanup ownership Use shared owned-file and directory primitives throughout Wakaru discovery, snapshots, report parsing and publication. Preserve primary read failures and completed fingerprints when final close fails or receives cancellation. Retain exact cleanup capabilities before retiring workspaces, block new work while cleanup is unresolved, and bind error status to the aggregate owner so partial cleanup and later retry keep resource attribution current. * fix(pe): preserve biased export ordinals Accept the format-derived ordinal range for PE export slots. * docs: clarify parser authority and compatibility evidence * fix(python): preserve code-name identity Fixes #6593 * fix(managed): validate metadata operands and locals declarations Classify MemberRef operands from parsed signatures, validate signature table references and LocalVarSig blobs, and compare observed locals declaration presence. Keep partial CIL facts and transient-budget ownership at the method reader. Fixes #6578 Fixes #6572 Fixes #6558 Fixes #6513 * fix(python): preserve historical signed code fields Keep signed co_stacksize and co_flags for historical magic entries whose constructors accepted them. Preserve magic 3410 with a constructor-revision limitation; reject negative values from 3411 onward. Fixes #6487 * fix(python): compare code objects without inline caches Fixes #6597 * fix(tests): stabilize process fixtures and malformed input coverage (#6570) Preserve renamed-executable identity, complete-line readiness and bounded child lifetimes. Use genuinely malformed Inspector input and explicit ADB file-probe/push/hash facts while preserving cancellation, cleanup, Evidence and completeness assertions. Adopt current main Go fixtures and retain malformed COFF coverage. Fixes #6556 Refs #6480 * test(apktool): own lifecycle fixtures and process observations * refactor(mcp): reuse parsed Evidence tool parameters * fix(runtime): align remaining Node security pins and setup guidance (#6316) Derive exported Docker image versions from .nvmrc through generated package metadata. Align active setup translations with patched Node release floors and verify actual CLI exports, real Docker/agentenv, package and website workflows. Eight built-test shards pass; three unrelated managed source failures reproduce on clean main and remain tracked in #6650. Refs #6480 Co-authored-by: gensokyo-dev <342580529+gensokyo-dev@users.noreply.github.com> * fix(model): retain exact safetensors shape dimensions Keep unsigned integer declarations exact until their owning field is interpreted. Bound actual offsets at conversion and validate shape products in declaration order, preserving large empty tensor shapes without hiding an earlier overflow. Fixes #6627 * fix(python): read legacy TYPE_INT64 marshal values Fixes #6609 * fix(apk): read constructed BER signer signatures Share the bounded BER tree reader between PE certificates and APK v1 CMS, then accept constructed OCTET STRING signature values while retaining the declared signer and certificate facts. Embedded X.509 certificate decoding keeps its DER requirement. Fixes #6603 * fix(adb): count Unicode requested permissions Count requested-permission rows containing Unicode names, and keep counting subsequent rows in the same dumpsys section. Fixes #6584 * fix(signals): reject missing sigrok channels Recognize the exact selected-channel diagnostic even when sigrok-cli exits successfully, while preserving partial producer output in the invalid-input details. Cover both public JSON adapters and add the missing-channel case to the Linux real-tool verifier. Fixes #6631 * fix(elf): reuse recognized machine architecture facts Preserve the shared EM_HEXAGON classification in Go and Rust image reports. Fixes #6629 * fix(asn1): decode four-byte BER lengths unsigned Accumulate length octets arithmetically so a four-octet length with bit 31 set remains a positive unsigned value and is rejected by the containing-range check rather than becoming a negative length. * fix(gpu): preserve parameter and target declarations Decode observed V2 CUDA parameters, retain qualified PTX parameter names and entry resource counts, and preserve family and feature target declarations through selection and consistency checks. Fixes #6624 Fixes #6625 Fixes #6626 Fixes #6618 Fixes #6613 Fixes #6606 * fix(captures): preserve canonical TShark alias fields TShark resolves selected field aliases before writing packet JSON. Keep the requested selector in Evidence while accepting the canonical field key produced for it. Fixes #6595 * fix(qlog): mark records with unknown STREAM FIN incomplete Keep known STREAM ranges and the unknown FIN value, while listing the source event among incomplete fact records so summary and retained views agree. Fixes #6598 * fix(pcap): retain absolute HTTP request targets Reuse parsed URI facts and preserve uncertainty when mixed request records cannot all be resolved from the producer output. Fixes #6537 * fix(rust): preserve historical cargo-auditable feature facts Accept observed feature arrays, preserve omitted values as unknown across producer revisions, and keep older retained reports compatible. Reuse bounded JSON sizing before graph expansion. Fixes #6622 * fix(ptx): normalize parameter declarators once Fixes #6606 * fix(managed): compare observed call targets Compare aligned managed call edges by their reported declaring type and method name, keeping missing target facts unknown without comparing build-local tokens. Document the static comparison limits. Fixes #6630 * fix(artifacts): compare PyInstaller declaration facts Compare stable producer-tagged declarations independently of materialized payloads. Preserve missing facts as unknown without applying PyInstaller rules to foreign metadata or nested container entries. Fixes #6484 Fixes #6485 * test(managed): retain derived facts in cloned method fixtures Clone caller-scoped call and field facts with the fixture methods. Keep known CIL changes alongside unavailable target metadata in the missing-row controls. * refactor(apk): consume shared BER node facts Remove the APK reader's pass-through children and content projections so format consumers read the shared BER owner's nodes directly. Keep only the encoded-span helper needed for exact issuer and certificate bytes, and describe CMS BER as this parser's structural owner. * fix(adb): delimit permission section by indentation * test(managed): preserve field-access owner identities * fix(managed): share reference instruction semantics Use the same parsed method/field operand predicate when producing member edges and comparing call and field shapes. Exclude ldtoken and operands without a value from both interpretations. * test(managed): align source goldens with metadata validation Fixes #6650 * fix(native): consolidate observed address validation * fix(gdb): separate queued work from MI synchronization Queued console followers have not dispatched MI records. Use active protocol requests when deciding whether the admitted close can verify and detach its inferior. Fixes #6661 * fix(gdb): wait for the outer console command to finish After a running result, queue a tokenized read-only MI query to establish that GDB has returned to its command loop. Keep collecting through intermediate inferior stops and retain the query reply as protocol Evidence. Fixes #6660 * fix(erlang): retain admission cancellation reason Preserve the caller's AbortSignal reason when BEAM inspection is cancelled before provider admission. Keep the production filesystem boundary and late-completion contracts covered. Fixes #6658 * fix(desktop): probe GameMaker data filenames Select conventional Linux and macOS game data files for the existing bounded FORM/GEN8 probe. Add service-boundary regressions and document the selected names. Fixes #6659 * fix(harmony): exclude raw resources from manifests Classify known resource paths once and keep a raw resource named module.json from changing the package model or appearing as a manifest. Add a filesystem-boundary regression and clarify the documented hint. Fixes #6638 * fix(gpu): bound embedded section reads Fixes #6657 * fix(gpu): retain resources across entry pragmas Fixes #6651 * fix(reference-source): preserve raw POSIX filename identity Mark directories with non-UTF-8 names unsupported without following replacement-character paths, while retaining readable sibling observations. Fixes #6653 * fix(reference-imports): retain exact dynamic import targets Use the shared exact-literal reader for dynamic imports, preserving expression-free templates and transparent TypeScript wrappers while leaving computed targets unknown. Fixes #6654 * fix(reference-imports): retain exported import-equals dependencies Route exported external import-equals declarations through the same relationship owner as plain declarations so their required target is not dropped. Fixes #6655 * fix(managed): respect native module case semantics Preserve the observed native format when comparing module identities so ELF case-only differences remain mismatches while unknown platform behavior stays unresolved. Fixes #6652 * fix(il2cpp): reject duplicate method tokens per image Reject duplicate MethodDef row identities within one owning image before publishing native addresses or Ghidra seeds, while retaining cross-image reuse and folded code addresses. Fixes #6610 * refactor(reference-imports): share exact literal parsing Route legacy nested import-expression handling through the same exact-literal owner as dynamic imports, removing a duplicate string-only check. Fixes #6654 * fix(model): preserve optional metadata and tensor alignment Fixes #6656 Fixes #6637 Fixes #6636 * fix(macho): infer legacy Intel simulator platforms Fixes #6649 * fix(macho)!: preserve ambiguous chained import names Keep the exact producer expression and report unknown symbol identity when chained-import text cannot distinguish a binding addend from a literal name suffix. Fixes #6648 BREAKING CHANGE: inspect_macho import names can be null when identity is ambiguous. Use raw_name for the observed expression and name_status to distinguish it from an exact symbol name. * fix(elf): retain raw export name bytes Fixes #6647 * refactor(macho): separate dyld import and export parsing Keep mode-specific inputs and parsed row types at their respective parser boundaries. * fix(macho): preserve import identity in retained views Use distinct row contracts for imports and exports, retaining ambiguous names and historical import defaults without adding import-only fields to export pages. Verify the SDK-advertised schemas and both facets through MCP. * style(desktop): format GameMaker probe coverage * chore(deps): update Vite security patch and dependency inventory (#6416) Update Vite/PostCSS and refresh the lock-derived inventory while retaining TSRS platform selection and runtime dependency versions. Source/static checks, installed-platform signatures, full/production audits, real CLI/MCP workflows and all four package platforms pass. Portable CI retains the independently reproduced main PTX fixture failure tracked in #6675; use the owner-authorized existing PR-only baseline exception. Refs #6480. * fix(release): isolate npm publication from dependency execution (#6681) Keep dependency execution in read-only release jobs and validate the original qualified archive with Node built-ins before publication. Refresh registry state on every publisher attempt; retain exact bytes/channel verification, v1 read-only recovery, and installed CLI/MCP checks before MCP publication. Static/docs checks, artifact/registry/recovery tests and real package/rehearsal verification pass. All four hosted package platforms pass. Portable CI retains the independently reproduced main PTX failure in #6675 and fail-fast missing coverage; use the owner-authorized existing PR-only exception, with limitations documented in the PR. Refs #6480. * refactor(json): consolidate representation size accounting Share bounded UTF-8 and UTF-16 JSON measurements across state serving, write retention and source-map admission. Remove duplicate counters and distinguish retained state estimates from encoded bytes while preserving limits and exact refusal diagnostics. * refactor(android): own search summaries at the producer boundary Reuse validated class pages for inline pagination audits while retaining complete provider replies. Move retention into the shared Android workflow and remove the MCP-only service wrapper and application text reparser. Preserve unknown JSON metadata, late cancellation and retention failures. * test: align boundary fixtures with producer contracts Model GDB console completion, use real directory reads and cleanup for late-enumeration failures, and distinguish supported PTX pointer qualifiers from unknown declarations. Preserve original assertion and cleanup failures through scoped test finalizers. * fix(rust): retain parsed defaults in cached Evidence views Borrow sealed reports only when they match the parsed facts; otherwise cache the owned normalized snapshot. Keep historical feature omissions unknown through saved bundles and repeated retained pages without changing the source Evidence. Fixes #6689 * fix(model): retain parsed headers when hashing is interrupted Share partial observation ownership across GGUF and Safetensors. Preserve completed header facts through cancellation and MCP error delivery without claiming finalized digests or file identity. Fixes #6684 * fix(gpu): preserve PTX parameter and target facts Fixes #6664 Fixes #6675 Fixes #6680 Fixes #6695 * fix(go): read inline build strings from ELF mappings Fixes #6716 * fix(rust): scan read-only ELF load data Fixes #6663 * fix(il2cpp): deduplicate consistent ELF registration aliases Fixes #6715 * fix(il2cpp): track unresolved ELF relocation widths Fixes #6701 * fix(artifacts): preserve raw directory name identity Fixes #6665 * fix(desktop): retain unsupported filename coverage Fixes #6665 * fix: preserve unknown historical module resolution Fixes #6679 Fixes #6678 Fixes #6612 * fix: retain proven createRequire URL bases Fixes #6612 Fixes #6678 * fix(apple): preserve keyed archive table identity Fixes #6662 * fix(plist): reject XML dictionary keys without values Fixes #6682 * fix(apple): preserve NIBArchive special real values Fixes #6583 * fix(signals): reject missing targets and invalid UTF-8 Fixes #6671 Fixes #6693 * fix(beam): accept bytes after declared form Fixes #6717 * fix(artifacts): compare source map target identity Fixes #6706 * fix(pyinstaller): retain executable member metadata Fixes #6702 * fix(pyinstaller): decode interned unicode names Fixes #6676 * fix(pyinstaller): retain colliding archive observations Keep source-distinct CArchive rows and decoded PYZ children in inventory. Refuse only when extraction reaches a destination conflict. Fixes #6674 * fix(dotnet): preserve managed metadata comparison facts Decode VARARG sentinels and allow omitted empty blob heaps while retaining failures for referenced missing data. Compare field and catch targets using owning parsed facts instead of build-local tokens. Fixes #6720 Fixes #6686 Fixes #6713 Fixes #6712 * fix(dotnet): keep TypeRef catch identity unknown Fixes #6712 * test(apple): assert projected interface builder facts * fix(dotnet): correct metadata comparison regressions * fix(il2cpp): deduplicate aliased registration fields Fixes #6715 * test(pyinstaller): match interned name producer encoding Use Python 3.13 PYZ magic with the matching archive version and exercise FLAG_REF with TYPE_INTERNED. Fixes #6676 * test(dotnet): split managed comparison blocks * test(apple): isolate NIBArchive real projection group * fix(parsers): correct Rust import and PTX alignment control * fix: recognize aliased createRequire bindings Fixes #6612 Fixes #6678 * test(apple): retain NIBArchive limitation path * fix(il2cpp): deduplicate aliased metadata registration Fixes #6715 * test(managed): retain observed target changes across member remaps * fix: track require.resolve references Fixes #6678 * test(pyinstaller): encode PYZ list length correctly Write the marshal list length as its raw little-endian count and surface inventory limitations when completeness regresses. Fixes #6676 * fix(managed): retain unknown catch identity beside observed name changes * fix: retain require.resolve source facts Fixes #6678 * refactor(javascript): name retained require call facts explicitly * fix: resolve selected require call members Fixes #6678 * fix(javascript): keep unresolved created-loader bases unknown * refactor(artifacts): centralize completed file outcomes Project completed values and cancellation from the descriptor owner once across artifact consumers. Preserve completed void outcomes and format-specific validation and cleanup policies. Keep later aborts from replacing captured APK and SQLite close failures, and retain the exact APK cancellation reason. Exercise real descriptors, public workflows and cleanup retries. * fix(javascript): isolate package facts from host prototypes Build frozen package field snapshots with a null prototype and restrict reference-source main lookup to own properties. Preserve declared null and empty values, index fallback, source identity and unavailable manifest evidence. Compare inherited main and exports lookup with the native Node resolver, retain package observation coverage and verify CLI/MCP package workflows. * fix(captures): advertise offline capture inspection without a browser provider (#6725) * fix(parsers): preserve format boundaries and query occurrence identity Normalize parsed facts at their owning boundaries across PE exports and certificates, ELF section names, GPU bundles, IL2CPP generic types, dyld slice selection, source maps, environment replay, and JavaScript mapped arguments. Preserve partial facts and explicit unsupported cases; clarify the corresponding documentation. Validation: 831 affected tests passed with one existing skip across 23 files; build, typecheck/lint, documentation, formatting, and 2133-file test discovery passed. Format controls are synthetic; real Unity, GPU, and ARM-device execution is unverified. Fixes #6709 Fixes #6688 Fixes #6719 Fixes #6718 Fixes #6704 Fixes #6703 Fixes #6692 Fixes #6723 Fixes #6687 Fixes #6726 Fixes #6696 Fixes #6691 Fixes #6727 * fix(process): require observed environment ownership tokens Centralize run-token extraction at the environment observation boundary and require an own field. Build decoded OS environment records without host prototypes while retaining source names, empty values and last-assignment precedence. Reject inherited matching tokens before cleanup signaling, preserve normal owned-group behavior, and verify live Linux process environments alongside native CLI/MCP capture workflows. * fix(parsers): retain independent facts and boundary identity Share bounded ELF section-name decoding across native and note readers; retain read-only ranges and coverage reasons when names are unknown. Preserve ELF symbol-version bytes, dyld-bound method uncertainty, partial gRPC-Web trailers, and per-parent model identity checks. Compare GPU signatures as bytes and require a PTX module header. Share selected-path errno classification across EVM and BEAM. Validation: 397 shared-parser tests passed (one existing skip), 5 MCP schema tests passed, 14 EVM error-mapping tests passed, and 23 protobuf CLI/MCP matrix cases passed across focused runs. Build, typecheck/lint, docs, formatting, and 2134-file discovery passed. Full EVM provider workflow remains locally unverified on Darwin arm64; format controls are synthetic. Fixes #6738 Fixes #6737 Fixes #6745 Fixes #6740 Fixes #6749 Fixes #6747 Fixes #6739 * fix(setup): preserve source keys across configuration boundaries * fix(setup): keep the CLI-only skill choice offered under a client ID (#6401) * fix(setup): keep the CLI-only skill choice offered under a client ID * test(setup): cover the accept-all CLI-only skill selection * fix(apple): report a read-denied selected archive as host access denial (#6479) * fix(apple): report a read-denied selected archive as host access denial inspect-keyed-archive reported a host read refusal on the caller-selected bundle entry as artifact_operation_failed/execution_failure with reason io, leaving EACCES or EPERM only inside message text. The caller selected that entry, so the refusal is a selection outcome with its own typed classification, system code and read-access recovery. DirectoryArtifactReader now marks a refused entry open with DirectoryArtifactEntryAccessDenied, which retains the host system code and the selected entry path. KeyedArchiveReader, which owns the caller's selection, maps it to the shared AnalysisAccessDeniedError, and artifact failure translation keeps that typed error instead of replacing it with a generic io failure. Other readers and other reader failures are unchanged; every existing reason keeps its current projection. Adds the access_denied projection coverage plus a real host refusal through the production reader and a non-permission control. * fix(apple): carry cleanup ownership and cover raw refusals for a denied selection Addresses the two review findings on the denied-selection classification: - The typed host access denial now carries the reader's cleanup observation, so a denied open that left a resource owned does not project as fully cleaned. - Adds coverage that starts from raw host EACCES/EPERM/EIO refusals with the real DirectoryArtifactReader open path, so the marker itself is exercised rather than constructed by the test. EIO stays an artifact failure. * fix(native): report plist symlink loops and overlong paths as selection failures (#6371) Co-authored-by: Abelo9996 <Abelo9996@users.noreply.github.com> * docs(cli): document opt-in Bash completion setup (#6250) * fix(doctor): check only the current platform's Hopper launcher candidates (#6253) * fix(doctor): check only the current platform's Hopper launcher candidates Doctor built one launcher list for every platform, so on macOS it could report a Linux-only path as a healthy Hopper ahead of a renamed bundle, and setup then registered that path. Give per-platform automatic candidates one owner that runtime configuration and doctor both read, scan renamed macOS bundles and probe the Homebrew cask only on macOS, and share runtime's renamed-bundle scan with the doctor host. Fixes #6228 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(doctor): keep the renamed Hopper bundle scan asynchronous Sharing runtime's synchronous scan made the doctor host read ~/Applications with readdirSync, which blocks the event loop on a slow or network-mounted home. Give MacHopperPaths an asynchronous scan for doctor beside runtime's lazy synchronous one, sharing the directory filter and candidate builder, and check that both return the same candidates. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test(doctor): model renamed launchers with runtime's POSIX joins Since #5235, runtime builds macOS launcher paths with posix.join, so on Windows the discovery table's native-join renamed launcher no longer matched runtime's candidate. Model launchers with posix.join and keep filesystem setup native, as MacHopperPaths.test.ts does. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(entropy): name offset when the byte window starts past EOF (#6495) Fixes #6482 Co-authored-by: Abelo9996 <Abelo9996@users.noreply.github.com> * fix(sqlite): report result-column capacity refusals as capacity (#6327) A projection wider than SQLite's native result-column limit failed with the generic "too many columns in result set" SQL error. The inspector could not attribute that error to a generated column, so the worker reported "format" and the parent blamed the caller's path as invalid_format even though the selected database was readable. Classify the refusal from SQLite's own column limit for the private connection, carry the selected and engine counts through the worker reply, and project it as a capacity resource constraint. The database stays readable, no partial rows are returned, and the recovery names the column counts and splitting the projection across calls. * fix(web): refuse an existing script-export destination as invalid input (#6313) * fix(web): refuse an existing script-export destination as invalid input export_web_scripts refused an existing output directory or link correctly, but reported it as artifact_operation_failed / execution_failure with no field issue or recovery. SafeOutputTree.create raises that refusal as a path failure before any output tree exists, and the export mapper wrapped it as an artifact failure. Attribute pre-admission path refusals to output_directory as an AnalysisInputError, as environment export already does for its directory. Both now share one helper owned beside SafeOutputTree; failures after the tree is admitted keep their artifact semantics. Fixes #6029 * fix(artifacts): type SafeOutputTree destination refusals Admission conversion treated any cleanup-free path failure raised before admission as a refusal of the selected directory, so an acquired-tree setup failure, such as being unable to restrict a created root to 0700, blamed valid output_directory or directory input. SafeOutputTree.create now raises SafeOutputTreeDestinationRefusal for the refusals of the selection itself: a relative or reserved root, an existing root, and an accepted existing root that is not an empty directory. The shared conversion accepts only that type, directly or wrapped by SafeOutputTreeCreationFailure, so script and environment export no longer track admission separately. * fix(evm): reject repeated container keys in Solidity metadata (#6230) * fix(evm): reject repeated container keys in Solidity metadata * test(evm): check the repeat-key diagnostic for deeply nested keys * docs(ci): add a repeatable static analysis example (#6496) * docs(ci): add a repeatable static analysis example * fix(ci): isolate example reports and repair the guide link --------- Co-authored-by: gongfpp <22683417+gongfpp@users.noreply.github.com> * fix(setup): retain unresolved environment facts when deriving budgets * fix(parsers): preserve format evidence and caller input identity Retain bounded FAT and offset-tagged PE observations through archive hashing, classification, and content nodes. Preserve PyInstaller member paths according to the observed carrier dialect and share APK v1 signing-name semantics. Read SQLite's implicit sqlite_schema table without inventing a stored schema declaration. Distinguish unsupported ELF numbering and decoded-name admission from malformed data and fixed scan allowances. Preserve Sigrok basenames and classify matching explicit input-format refusals at their owning boundary. Validation: 554 distinct tests passed, 3 skipped across serial focused runs; build, typecheck/lint, docs, formatting, and discovery (2141 files) passed. Sigrok command-boundary simulators do not establish real-tool decoding. Small repeated public PyInstaller CLI runs had equivalent inventory facts; warm median elapsed 0.5431s before / 0.5426s after, with no speed claim. Fixes #6733 Fixes #6741 Fixes #6722 Fixes #6732 Fixes #6736 Fixes #6734 Fixes #6764 Fixes #6766 Refs #6739 * fix(parsers): respect container facts and real decoding boundaries Use zip.js's parsed symlink fact for inventory and open refusal. Treat an unmatched Godot trailer as an unconfirmed candidate while preserving failures for confirmed malformed packs. Report entropy path-resolution failures at the selected-input boundary. Separate Go header discovery from inline string extents in ELF and Mach-O, and apply the aggregate content allowance after validating real source ranges. Normalize binary plist UID widths through the existing scalar-copy owner, budget exact clone growth, preserve source identity, and refuse inexact UIDs. Validation: 389 distinct tests passed, one Linux /proc test skipped on Darwin; build, typecheck/lint, docs, single-thread formatting, and discovery (2142 files) passed. CLI/MCP Go fixtures and public ZIP/Godot/keyed-archive workflows ran. Real producer prevalence and external provider execution were not established. Repeated ordinary keyed-archive CLI inventory facts and estimated reply tokens were equal before/after. Warm median elapsed was 0.5166s / 0.5177s; no speed claim. Fixes #6751 Fixes #6763 Fixes #6754 Fixes #6767 Fixes #6762 Fixes #6779 * refactor(mcp): consolidate Evidence recording and operation progress * fix(setup): reuse URL component admission for Hopper releases * perf(cli): avoid loading analysis commands for version reports --------- Co-authored-by: morluto <76467478+morluto@users.noreply.github.com> Co-authored-by: Hifza Zafar <152292315+hifzabuildsai@users.noreply.github.com> Co-authored-by: Can <159528514+eco-null@users.noreply.github.com> Co-authored-by: eco-null <eco-null@users.noreply.github.com> Co-authored-by: Cassie_Fox <249835913+CassieFox23@users.noreply.github.com> Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com> Co-authored-by: Wade <160517347+Sriram-PR@users.noreply.github.com> Co-authored-by: RRFZ <247457381+Plastic-time@users.noreply.github.com> Co-authored-by: pablodiazjorge <102741971+pablodiazjorge@users.noreply.github.com> Co-authored-by: Ezra Brilliant <64943463+ezrabrilliant@users.noreply.github.com> Co-authored-by: gensokyo-dev <342580529+gensokyo-dev@users.noreply.github.com> Co-authored-by: GamerDubz <105694977+GamerDubz@users.noreply.github.com> Co-authored-by: raidnouredden-ux <raidnouredden@gmail.com> Co-authored-by: 吴佳浩Alben <35291372+XiaoBinGan@users.noreply.github.com> Co-authored-by: Abel Yagubyan <abelyagubyan@berkeley.edu> Co-authored-by: Abelo9996 <Abelo9996@users.noreply.github.com> Co-authored-by: ShuaixinHuang <1836656514@qq.com> Co-authored-by: Paritosh Lahre <155938586+SandstromPL@users.noreply.github.com> Co-authored-by: Dery Ferdika <114888155+DeryFerd@users.noreply.github.com> Co-authored-by: gongfpp <1360187968@qq.com> Co-authored-by: gongfpp <22683417+gongfpp@users.noreply.github.com> |
||
|
|
17cd07342d |
fix(cli): preserve selected JSON members and Markdown table text
Preserve boundary facts and uncertainty through their consumers. Add focused production-boundary regressions and update affected documentation. Fixes #6756 Fixes #6752 Fixes #6755 |
||
|
|
1b3d57ca8a |
docs(ci): add a repeatable static analysis example (#6496)
* docs(ci): add a repeatable static analysis example * fix(ci): isolate example reports and repair the guide link --------- Co-authored-by: gongfpp <22683417+gongfpp@users.noreply.github.com> |
||
|
|
c9204b96d4 | docs(cli): document opt-in Bash completion setup (#6250) | ||
|
|
e966b9f9a5 | refactor(javascript): name retained require call facts explicitly | ||
|
|
4bad48d873 |
fix: retain proven createRequire URL bases
Fixes #6612 Fixes #6678 |
||
|
|
857a75baac |
fix: preserve unknown historical module resolution
Fixes #6679 Fixes #6678 Fixes #6612 |
||
|
|
9200adea61 |
fix(reference-imports): retain exported import-equals dependencies
Route exported external import-equals declarations through the same relationship owner as plain declarations so their required target is not dropped. Fixes #6655 |
||
|
|
a4bf6f83a6 |
fix(cli): merge sibling output filter slices
Fixes #6542 |
||
|
|
edccb430c4 |
feat(environment): compare an environment with probe captures of its application (#5699)
* chore: restack environment fidelity onto main Keep probe comparison, paging, and tied-create behavior on main after #5600. Capture parsing keeps field-path errors and records whether a probe kept request and response bodies. Co-authored-by: morluto <morluto@users.noreply.github.com> * fix(environment): keep served collection order with the fidelity checks The tied-create collection order lives with the checks that match encoded parents. The write simulation reads field checks from that attribution, and taint uses the same segment match. Co-authored-by: morluto <morluto@users.noreply.github.com> * fix(environment): translate an object's keys only when it is keyed by learned ids Differ.object mapped every key through the probe's id map, so a field named like a learned id was compared with another field, and a real rename could pass as a mapped key. Keys now translate only for an object keyed by learned ids as learning reads one: a key both sides share needs every key evidently an id, and otherwise each entry is an entity or each key evidently an id. Any other object compares field by field. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: morluto <morluto@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: morluto <76467478+morluto@users.noreply.github.com> |
||
|
|
2c3dd946d5 |
feat(python): inspect CPython pyc headers and marshal code objects (#4826)
* feat(python): inspect CPython pyc headers and marshal code objects Add inspect_python_pyc / inspect-python-pyc to read one explicit local CPython 3.7–3.13 .pyc without executing bytecode or recovering source. * chore(python): drop unused PythonPycHeader export Knip reported the type as unused after inspect_python_pyc landed. * fix(python): bound pyc expansion and decode marshal like CPython - Count a nested code object reached through TYPE_REF once per copy the report carries, against max_objects and max_file_bytes, before counting or validating the tree - Charge long digits to max_string_bytes, reject out-of-range and unnormalized digits, build the value in one pass, and report integers above 256 bits by bit length only - Decode TYPE_UNICODE with surrogatepass semantics and reject other ill-formed UTF-8 - Map only 3.11 magics 3494-3495 to the py311 layout - Report non-finite float and complex parts as inf, -inf or nan - Allow an empty co_filename - Require bytes for co_linetable and co_exceptiontable - Bind cleanup-failure errors to their retained descriptor leases * fix(python): list pyc code objects once instead of a recursive tree Report each distinct code object once in code_objects, top-level first, with nested_code as indexes. A child shared through TYPE_REF is no longer copied per reference, and the MCP output schema is no longer recursive. Names repeated through TYPE_REF still count against max_file_bytes for each copy the report carries. * fix(python): bound shared pyc constants and reject malformed tables - Cache byte-string digests so a buffer shared through TYPE_REF is hashed once instead of on every reference. - Charge every reported co_consts entry, including tables shared through TYPE_REF, against max_objects before summaries are built. - Resolve the inspect-python-pyc path with absoluteCallerPath so link/../file.pyc reads the file the filesystem selects. - Reject TYPE_NULL inside marshal sequences, as CPython does. - Reject a co_localspluskinds length that does not match co_localsplusnames in the parser and the report schema. * fix(python): bound shared pyc names and read CPython marshal graphs Charge each reported code-constant name, keep integer bit lengths on the decoded value, and list code objects nested inside constant containers. Accept self-referential lists and dicts, marshal version 0 text floats, empty code names, the original string byte count, and Python set and dict lengths. Pass the CLI cancellation signal into command cleanup. Co-authored-by: morluto <morluto@users.noreply.github.com> * fix(python): bound pyc key expansion and shared nested code Charge set and dictionary keys before a shared tuple doubles them, list each nested code object once per owner, and accept code objects as CPython keys. Co-authored-by: morluto <morluto@users.noreply.github.com> * fix(python): correct pyc equality, counts, and nested walks Summarize code objects only after the marshal graph is complete, and collect nested code with an iterative walk that shares wrapper results instead of copying every descendant list. Keep tuple boundaries and the original string bytes in equality keys, and reject negative CPython counts. Co-authored-by: morluto <morluto@users.noreply.github.com> * fix(python): bound shared pyc names and keep the first dict key Charge every copied name-table entry against the object budget before building the report array, including empty strings that add no bytes. When dictionary keys compare equal, keep the first key object and replace only its value, matching CPython. Co-authored-by: morluto <morluto@users.noreply.github.com> * fix(python): walk each pyc dictionary child list once Keep a container's child array on the nested-code frame so a wide dictionary is not copied on every step of the synchronous marshal walk. Co-authored-by: morluto <morluto@users.noreply.github.com> * fix(python): reuse stored pyc dictionary children when combining The nested walk keeps each container's child list on its frame. Combining nested code rebuilt that list, and the 8,000-key regression still accepted the old per-key copy. Use the stored list, and require that dictionary to finish well under the copy's runtime while still reporting a nested code object. Co-authored-by: morluto <morluto@users.noreply.github.com> * fix(python): keep distinct pyc code objects and reject corrupt ones Encode each name table's length and entry boundaries in the equality key so a different name list cannot share a memo key. Walk tuple and frozenset keys on an explicit stack so a long TYPE_REF chain does not overflow. Treat code objects CPython rejects for an odd co_code or an undersized local table as malformed instead of complete coverage. Co-authored-by: morluto <morluto@users.noreply.github.com> --------- Co-authored-by: Matt Van Horn <455140+mvanhorn@users.noreply.github.com> Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: morluto <morluto@users.noreply.github.com> |
||
|
|
bfba99827e |
feat(erlang): inspect BEAM IFF chunks and tables (#4833)
* feat(erlang): inspect BEAM IFF chunks and tables Replay the Erlang BEAM inspection workflow, including table bounds, OTP 28+ atom layouts, the shared absolute-path policy, and empty-path CLI coverage, without carrying GitHub workflow edits. Co-authored-by: morluto <morluto@users.noreply.github.com> * fix(erlang): use publicInputStrictObject for BEAM tool input inspect_erlang_beam advertised a public input built with bare z.strictObject, so later shared input-policy changes would miss it. Result and internal objects stay on their own constructors. Co-authored-by: morluto <morluto@users.noreply.github.com> --------- Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: morluto <morluto@users.noreply.github.com> |
||
|
|
ca4ca65c5e |
feat(pe): inspect Authenticode certificate tables (#4830)
* feat(pe): inspect Authenticode certificate tables Add inspect_pe_certificates for IMAGE_DIRECTORY_ENTRY_SECURITY WIN_CERTIFICATE entries and structurally decoded PKCS#7 signer and X.509 identity fields. The workflow reads a stable PE image without executing it or verifying signatures, chains, timestamps, or Authenticode digest coverage. * fix(pe): bound and validate certificate DER decoding - Cap decoded DER values with a shared node budget so sibling fan-out cannot exhaust memory before the PKCS#7 check - Require SignedData version, encapContentInfo and a final signerInfos SET in RFC 5652 order, and a signature OCTET STRING in each SignerInfo - Decode OBJECT IDENTIFIER arcs as unbounded base-128 values, including a multi-byte first combined arc - Decode UniversalString names as UTF-32BE and reject invalid values - Share PE header admission with the resource layout so a section table that does not fit SizeOfHeaders is rejected * docs: list PE certificates in the translated READMEs * fix(pe): cap OBJECT IDENTIFIER length and arc size A crafted type-2 certificate with a 262,144-byte contentType OID stalled decodeOid for about 20 seconds, because one arc kept growing a BigInt before the signedData check ran. decodeOid now rejects an OID longer than 256 bytes and an arc longer than 32 bytes before decoding it. Certificate OIDs, including 2.25 UUID arcs, fit under both caps. * fix(pe): reject truncated certificate tables and PKCS#7 SignedData now requires one SignerInfo with a non-empty signature and a complete issuerAndSerialNumber. Certificate names share a 64 KiB decoded-byte budget and are copied once. A security directory that ends in a short WIN_CERTIFICATE header fails instead of reporting a complete table. The certificate CLI forwards the caller abort signal into cleanup. Co-authored-by: morluto <morluto@users.noreply.github.com> * chore(ci): keep fork workflow files unchanged The certificate restack follows current main. Workflow files stay at the fork tip so this branch update does not rewrite .github/workflows. Co-authored-by: morluto <morluto@users.noreply.github.com> * fix(pe): charge serial and validity text to the decoded budget Certificate and signer serial numbers and validity times now count against the shared decoded-text budget before they are converted, so a crafted certificate cannot push megabytes of text into the hashed evidence. The budget error now names certificate text rather than only names. Restore the CI workflow to match main: the CI_TIMING_TIER input, the tier-named timing artifacts and their publication conditions, the Windows typecheck, and the path and snapshot suites in the curated Windows lane. * fix(pe): require certificate fields and preserve signer key ids Reject X.509 records that omit subjectPublicKeyInfo or signatureValue, return subjectKeyIdentifier bytes as bounded hex, and advertise an absolute path in the PE certificate input schema. Co-authored-by: morluto <morluto@users.noreply.github.com> * fix(pe): reject extra PKCS#7 wrappers and invalid UTF-8 names ContentInfo and its signedData wrapper no longer ignore trailing values, and directory strings must round-trip as UTF-8 instead of becoming U+FFFD. Co-authored-by: morluto <morluto@users.noreply.github.com> --------- Co-authored-by: Matt Van Horn <455140+mvanhorn@users.noreply.github.com> Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: morluto <morluto@users.noreply.github.com> Co-authored-by: morluto <76467478+morluto@users.noreply.github.com> |
||
|
|
2edf3b23c1 |
feat(elf): inspect PT_NOTE and SHT_NOTE tables (#4837)
Inspect selected ELF32/ELF64 PT_NOTE and SHT_NOTE declarations without executing the artifact, retaining independent table identities, source ranges, descriptor digests, GNU build-id/ABI fields and explicit coverage limitations. Integrate mvanhorn's implementation and hardening with current main while preserving byte-entropy registration and the Windows curated regression suite. The maintainer follow-up uses ordinary merges/pushes, not history rewriting. Executed validation: 96 focused/shared/docs tests, complete static/docs checks, eleven real CLI/MCP pairs including GCC ELF32 and Clang big-endian PowerPC64, and two actual Codex task traces checked against their Evidence. Full costs, grader correction and verification limits are recorded in PR #4837. Refs #6262. |
||
|
|
538017d1d2 |
feat(environment): apply evidence-gated write effects to the served state (#5600)
* feat(environment): render more read tools from the state and describe responses Keep main's environment serving and fold in coverage for non-entity reads, response summaries, and MCP tool annotations. Squashed rebase of #5352 onto main. * fix(environment): keep rendered documents and quoted samples inside their budgets A recorded body of exponential numbers can render past 256 KiB and turn a working read into a state size error, so that document stays a recorded replay. Description samples are measured after JSON quoting, and the replay-fallback catalog check uses a tool count the longer response descriptions still separate. Co-authored-by: morluto <morluto@users.noreply.github.com> * feat(environment): apply evidence-gated write effects to the served state Serve write tools whose later reads confirm the effect, and keep main's state-file ownership and part-wise reply measurement. Squashed rebase of #5600 onto the rebased #5352 tip. * fix(environment): bound and validate write state history * feat(environment): render more read tools from the state and describe responses Keep main's environment serving and fold in coverage for non-entity reads, response summaries, and MCP tool annotations. Squashed rebase of #5352 onto main. * fix(environment): keep rendered documents and quoted samples inside their budgets A recorded body of exponential numbers can render past 256 KiB and turn a working read into a state size error, so that document stays a recorded replay. Description samples are measured after JSON quoting, and the replay-fallback catalog check uses a tool count the longer response descriptions still separate. Co-authored-by: morluto <morluto@users.noreply.github.com> * feat(environment): apply evidence-gated write effects to the served state Serve write tools whose later reads confirm the effect, and keep main's state-file ownership and part-wise reply measurement. Squashed rebase of #5600 onto the rebased #5352 tip. * fix(environment): bound and validate write state history * fix(environment): bound additional collection history * fix(environment): credit sent fields, negative sequences, and encoded targets A later overwrite copied surviving derived fields into the sent-member claim, so a members-only check rejected an update whose sent field still matched. Serving floored sequences at zero and stored missing history as zero, so a collection sequence learned from negative ranks skipped the next value. An absence after a delete forgot the resolved collection, and an encoded read could not observe an update spelled with another collection encoding. Regression tests cover each case. Co-authored-by: morluto <morluto@users.noreply.github.com> * test(environment): cover resolved encoded update identities * fix: validate timed update observations * fix(environment): share write overlap and check clocks on earlier calls Observation search skips a read begun before the write ended. That comparison now uses the same overlap as the check path. A clock learned on a later call was not checked against earlier calls that kept the field. Serving would stamp those calls too, so the plan stays unserved. A clock learned earlier is still refused when a later call does not advance it. Regression tests cover an overlapping empty update and a published_at clock that one recorded call leaves unchanged. Co-authored-by: morluto <morluto@users.noreply.github.com> * fix: preserve partial update evidence * fix(environment): let an unmodelled write explain only the list members that differ A failed whole-list read now reports which members alone account for the difference. An unmodelled write excuses the read's writes only when it came after each such member's last check and pending writes, so an older change elsewhere no longer hides a newer write the list shows undone. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit 7b6aab9d7191e600051693f2c192afcfc743d083) * fix(environment): explain added fields, tie creates to serving's collection, and bound write descriptions An update explains a field the entity lacked before when the observing view had shown the entity, so a server-filled field is not dropped. A create is tied to the held collection serving picks for its path. Write descriptions and body refusals quote member names and sample them within a byte bound. The request body is indexed once per explanation, so copied and slugged fields no longer rescan it. Replays 07aca54e onto the restacked branch. Its rule that a read begun before a write ended teaches nothing is already here (fb6785dc), so only its test is kept. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * docs(environment): state how list reads weigh unmodelled writes, added update fields and quoted members Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * refactor(environment): keep the observing view helpers with the observations shownBefore and the item-or-list fields check move to the observe module, keeping the write effects within the line limit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(environment): resolve unmodelled writes onto the held collection An unmodelled path kept the request's collection spelling. An archive under the plain spelling of a collection held encoded marked only that plain collection unknown, so a later update was blamed for the archive's fields and dropped. Name that entity the way a modelled write does. Co-authored-by: morluto <morluto@users.noreply.github.com> * fix(environment): confirm no write through volatile fields or overwritten replacements, and bound the served clock A members-only check no longer compares volatile fields, which render from the read itself. A document replacement credits the members it wrote or removed at its object, so a later merge that overwrites them takes its confirmation away. A recorded time past the range of a date gives no served clock instead of throwing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(environment): leave unknown entities unchecked by failed reads, volatile fields and unchecked calls A failed item read that is no absence leaves an unknown entity unknown, so a later usable read still checks its writes. A read showing an unknown entity again checks no write on a volatile field. An update of an unknown entity takes its recorded outcome and adds nothing to a built plan. A later update that does not answer with its entity is observed only by a read whose view shows every learned clock; without one it is unmodelled. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(environment): fill a create's path fields from the collection serving selects The gate built a later create's path fields from the recorded request path, while serving fills them from the held collection it selects for that path, so a read showing the other spelling's parent could confirm a create serving cannot reproduce. Rules still learn from the recorded path. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(environment): name unmodelled writes as modelled ones, count fields updates write, and keep later members' types An unmodelled write below an item path names its entity through itemTarget, and one at or above a collection resolves the held collection, as modelled writes do, so an encoded spelling no longer hides the entity it changed. An update's answer counts the fields its rules write, other than increments, as available, so a field only the update writes no longer makes it incomplete-entities. A member a later call first stores keeps that call's JSON type in the body's kinds, which the body check falls back to. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(environment): let a document replacement overwrite everything under its object A replacement claims only the members it wrote or removed, but it now overwrites every earlier effect under its object, so a merge that wrote the object it replaces loses its confirmation. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(environment): start the served clock from the records whose times a date can hold A record timed past the range of a date no longer leaves the served clock without a start, which the store read as zero and stamped writes in 1970; the clock starts after the latest record a date can hold. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: morluto <morluto@users.noreply.github.com> Co-authored-by: morluto <76467478+morluto@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
4a4bbab3c3 |
fix(cli): keep committed evidence bundle receipts after cancellation (#6221)
Summary delivery with --evidence_output wrote the bundle, then let the
command's close/cancellation check replace the result. A SIGINT/SIGTERM
during staging cleanup after commit returned typed cancellation without
the receipt, and a persistent staging cleanup failure after commit was
rewrapped as a provider cleanup error that dropped published_path.
Every --evidence_output command now selects its view first and publishes
through publishEvidenceDelivery, the owner inspect-managed-members already
used. Post-commit cancellation keeps {path, bytes} under
details.diagnostics.evidence_bundle; incomplete cleanup keeps
details.published_path and bytes; a cleanup retry that succeeds returns
the normal receipt; pre-commit cancellation creates nothing and names
the command's operation.
Fixes #6095
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
|
||
|
|
57fd3ea5d8 |
feat(cli): summarize managed members with durable Evidence paging (#5167)
Fixes #5148. Add opt-in durable managed member summaries and authenticated paging while preserving complete default output, original Evidence, cleanup ownership and queued cancellation. Verified with bounded real Newtonsoft/Redux/Rust tasks, independent oracles, 556 focused tests and the expanded domain gate; paired token estimates and latency tradeoffs are recorded in experiments/analysis-efficiency/managed-cli.md. |
||
|
|
166fb0820f |
feat(environment)!: serve the environment state by default (#5351)
* feat(environment): extract the initial state a capture's reads observed Add the environment-state analysis view. From the parents the environment manifest accepts, it extracts the data the capture's reads observed before the first related write: entity types with an identity field (proved by a path parameter or inferred from an identity name), entities with their recorded values and provenance, documents for written non-entity paths, and a render plan per read tool that is kept only when it reproduces the tool's latest initial recordings from the state; every other read tool is a recorded view with the reason. The Evidence is always inferred. Response-body decoding moves to a domain owner shared with replay, exact JSON parsing moves to the owner of the exact-number policy, the manifest and state views share parent admission and record grouping, and projectAnalysisView takes its accumulators as one object. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(environment): bound state at redacted writes; infer identity only from items A scenario write whose URL was redacted has no request line, so it was dropped and reads after it counted as initial state. Such a successful write now joins the timeline with an empty path, whose root relates to every type, so it ends every type's state; a limitation counts them. A list whose recordings were all empty passed the "every listed item carries it" check vacuously and published an identity field nothing showed; it now needs at least one item, else the view stays recorded as no-identity. A value that differed between two request lines of one item tool, such as a query variant, was called volatile, and the gate then substituted each recording's own value; only repeats of one request line now show volatility, so differing lines go through fields-differ. List membership is compared only while a list can still be the whole collection, and merged entities are indexed by type and collection once, so paged captures no longer cost pages times entities (8,000 pages of 40,000 entities: 5.7 s to 0.23 s). Docs and the tool contract say scenario state keeps the capture's redaction markers and how redacted writes bound it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(environment): keep first sightings, one list pointer and linear field unions Entities took the order of the first plan observed, and item plans run before list plans, so a complete list read before its detail reads came out reordered and lost "all" membership; each entity now keeps its earliest recorded sighting. A list plan reused the first recording's pointer for later recordings, so a later response that was itself an entity wrapping a list was read as that list; every recording must now locate the same list. The field union scanned its ordered list for every key, quadratic in an object's width; a set now answers membership. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(environment): keep post-write values and partial lists out of the initial state A value that changed between repeats of one request line was named volatile whenever no write under the type's own root lay between, so a write under another root (for example POST /api/dashboards/db before a second GET /api/search) left its effect in the initial state. Any recorded write between the two observations now leaves every tool of the type recorded with reason fields-differ instead. A list was published with membership "all" even when a total or count envelope member exceeded the number it listed. Such a counter now makes the membership "recorded". Also drop a stale doc comment on ObservedEntity.order. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * docs(environment): scope item-shaped and deleted written paths out of documents State documents are held only for list-shaped paths a POST, PUT or PATCH tool writes. Reads of item-shaped written paths and of paths that are only deleted stay recorded views; the guide now says so and the spec defers them to a later increment of #4933. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(environment): count writes in flight when a value changes between reads The volatility check compared write start positions with the two reads, so a write already in flight when the earlier read started was missed and its effect was named volatile. A write now counts when its interval overlaps the span from the earlier read's start to the later read's end. The check also ran once per changed field and scanned every write. It now runs once per pair of observations, answered by a binary search over the writes in timeline order and the latest end among each prefix. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(environment): catch cross-tool changes across writes; read only item totals A value that changed across a write was caught only between repeats of one tool's request line, so a list read before a write and an item read after it put the post-write value into the initial state. Changes are now classified per entity in timeline order after observation: across any recorded write, a change between repeats of a line or between two lines of the type rewrites the type (every tool recorded as fields-differ); with no write between, a repeat's change is volatile. The classification lives in environmentStateMerge.ts. Any numeric member whose name contained "total" or "count" counted as an item total, so total_pages, account_id or page_count made complete lists partial. Item totals are now members whose name tokens include total or count and none of page, pages or per; a string of digits counts as a number; and a set has_more, next or next-page token member also marks the list partial. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(environment): keep post-write observations out of initial state * fix(environment): retain field provenance and bound state inference work * feat(environment): serve tool calls from the environment state `environment-serve --state <state.json>` serves an environment from the initial state an environment-state view extracted. Read tools whose views are state-backed answer from a live state store: item views render the held entity into the recorded envelope, list views render the collection or the recorded members, and document views return the held value; a missing entity or one lacking a required field is refused, and requests the state cannot answer fall back to their recordings with the reason. The /agentenv data plane implements data/reset, data/add (a rea-state/v1 document as a data part, base64 bytes, a file:// path or an https URL, validated and replaced atomically) and data/get, and the card advertises those operations and an intake declaration. Stage 1 is read-only: write tools are not served in state mode. Without --state nothing changes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * docs(environment): record verification after merging the state view's review fixes Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * feat(environment)!: serve the environment state by default environment-serve derives the environment state at startup by running the environment-state view in-process on the capture with the manifest's template rules, so an environment comes with its state and a user supplies nothing extra. The derived Evidence is the same one inspect-analysis-view produces by hand. --state is removed; --replay-only serves exactly the stateless replay of main. When the state cannot be derived, or its catalog does not fit the discovery budget, the server starts in replay mode, logs the reason and reports it in the stop summary's `state`. Exported bundles serve the state by default too: export derives it the same way, so the verifier's tool count and checked answer match what is served, and the README describes the served mode. BREAKING CHANGE: environment-serve answers read tools from the derived state and does not serve write tools unless --replay-only is given; the stop summary reports `state` instead of `state_evidence_id`. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(environment): bound data-plane replies, keep batch order, cancel intake on stop - One /agentenv response is held to 64 MiB: replies are measured as they are produced and one past the budget becomes a -32000 error stating it. - Every message of a batch enters the arrival-order queue on arrival, so another request's reset never lands between them. - Stopping the server, or a caller leaving, cancels the active download and answers queued calls `cancelled` without running them. - file:// URIs name only this host: another host or a network share is refused before anything is opened. - A loaded view value may not give an entity another identity. - List answers refuse a member lacking a field every recording carried, as item answers do. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(environment): keep bodies too deep for the state's nesting out of the state A recorded body at the JSON depth limit was accepted by extraction, then nested a few levels deeper as a document or entity value, so sealing the state Evidence threw and environment-serve and environment-export stopped instead of falling back. stateBodyJson, the one rule extraction and serving share, now treats a body nesting deeper than the limit minus 16 levels as unusable, so its tool stays a recorded view. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(environment): measure data-plane replies before building them 83fcc739 bounded one /agentenv response to 64 MiB, but it still serialized each reply whole before measuring it, so a batch of data/get calls on a large state built every refused reply in full only to drop it. Each reply is now measured in bounded JSON parts (the shared jsonParts encoder), its parts kept only while it fits; a reply past the budget is counted for its exact reply_bytes but never assembled. A test checks that a refused read is never handed to JSON.stringify whole and that its reply_bytes is exact. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(environment): release batch replies as they are encoded; judge exact numbers by value answerBatch kept every settled reply in its pending array until the batch ended, so a batch alternating data/add and data/get held each loaded state alive; each reply now leaves the queue as it is encoded. The exact-number policy judged a number by its recorded spelling, so a state loaded with 1e20 came back from data/get as 100000000000000000000, which data/add refused, breaking the promise that data/get output loads back unchanged. A number is exact only when both its recorded spelling and the one serialization writes are safe, so integers from 2^53 below 1e21 are refused in any spelling; replay keeps such bodies as recorded text. A domain test checks that every accepted number is accepted again once written back. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(environment): keep room for refusals and framing in the reply budget The response budget counted accepted replies only: a budget error that replaced a reply, and a batch's brackets and commas, were not charged, so near 64 MiB later refusals pushed the body past the advertised limit. Every reply still to come now keeps room for its own budget error, and a batch keeps room for its framing, so a refusal always fits and the body never passes the budget. Reply ids and which messages are answered come from one place shared by the replies and the reserve. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(environment): refuse a loaded state that data/get would write past the intake limit data/add measured only the document it was given, while data/get writes the state back with the members a document may omit (types, the state Evidence id, view fields and record citations). A document just under 32 MiB could therefore load and be reported larger than any intake accepts, breaking the data/get then data/add round trip. replace now measures the state as data/get writes it, part by part, and refuses it past the limit, leaving the state unchanged. The limit moves to the state document module, so the application store can read it; the intake re-exports it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(environment): keep merged export checks on the shared test graph Main's export tests installed module mocks for the whole services project, which reuses one module graph. A tarball read failure then missed its importer, and a one-shot heap mock could be taken by another file. Read those through bindings the tests replace for one case. Co-authored-by: morluto <morluto@users.noreply.github.com> * fix(environment): keep a state file whose close failed owned until it closes A file:// data/add that could not close its descriptor dropped the handle, and an admission failure whose cleanup close failed dropped its owner, so nothing could retry the close or report it. The read now runs through withOwnedRegularFile, and a failed close is retained in a server-lifetime ArtifactResourceScope. The next file read retries it first and answers -32000 while it is still open; inline and https documents still load. Closing the served environment retries it again and rejects with the unfinished close. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: Kaoru0822 <208281322+kaoru0822-kitauji@users.noreply.github.com> Co-authored-by: gensokyo-dev <gensokyo-dev@users.noreply.github.com> Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: morluto <morluto@users.noreply.github.com> Co-authored-by: morluto <76467478+morluto@users.noreply.github.com> |
||
|
|
fd64b1c240 | docs(cli): include Kuna in supported doctor providers (#4624) (#5011) | ||
|
|
bd8d73ab1d |
fix(environment): report later bundle write failures as host failures (#5581)
* fix(environment): report later bundle write failures as host failures Only destination admission now refuses the selected directory as invalid input. A path failure on a nested bundle file after admission, such as a host pathname-length limit, is reported as an output failure that names the host cause and the absolute failed path, with recovery guidance for the partial folder it leaves in place. Fixes #5522 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(environment): name the host-refused path in export permission failures A permission failure after earlier bundle files were written was reported as access denied for the bundle root, so the documented failed path was lost. The refusal now names the absolute path the host reported, falling back to the root, and keeps the root as `output_directory`. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(environment): attribute pathless bundle write failures to their file Descriptor operations such as `write` and `fsync` fail without a path, so a disk-full failure after earlier files named only the bundle root. The bundle writer now attributes such failures to the file it was writing. Host-write recovery is applied only to actual host failures; an integrity refusal keeps its own message without disk-space advice. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(environment): attribute package tarball read failures to the tarball The destination-write attribution also caught failures from reading the admitted package tarball during the copy, so a source `EIO` named the destination file and advised freeing disk space. Host failures are now attributed by direction: tarball reads name the tarball with read recovery, bundle writes name the file being written. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * docs(environment): state which export failures name a path The export documentation and host-write message promised a failed path for every later write failure, but a directory sync at commit time fails without one. They now promise the failed bundle file or package tarball when the failure is on one, and only the cause for a folder sync. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
98f4072f1f | feat(model): inspect GGUF and safetensors declarations (#5603) | ||
|
|
52d1a72af0 |
feat(il2cpp): link native methods and export Ghidra seeds
Link IL2CPP metadata names to native addresses and types through shared CLI/MCP workflows, with bounded queries and atomic Ghidra seed export. Preserve the original implementation by 8rulerstar and follow-up correctness, resource, provenance, and CI dependency repairs. Verified against real Windows/Android artifacts, independent references, actual Ghidra, and focused CLI/MCP tests. Fixes #5112. |
||
|
|
00a055be0f | chore: merge latest main before publishing audit fixes | ||
|
|
4714c7eaa3 | fix(cli): preserve typed failures through output filters |